link rel=alternate网站换肤功能最佳实现

栏目: CSS · 发布时间: 6年前

内容简介:byzhangxinxu from本文可全文转载,个人网站无需授权,只要保留原作者、出处以及文中链接即可,任何网站均可摘要聚合,商用请联系授权。

byzhangxinxu from https://www.zhangxinxu.com/wordpress/?p=8512

本文可全文转载,个人网站无需授权,只要保留原作者、出处以及文中链接即可,任何网站均可摘要聚合,商用请联系授权。

link rel=alternate网站换肤功能最佳实现

一、大多数开发人员的实现

大多数前端开发人员实现网站皮肤更换功能大致下面两种方法:

  1. 一个全局class控制样式切换;
  2. 改变皮肤link元素的href地址。例如:

    <link id="skinLink" href="skin-default.css" rel="stylesheet" type="text/css">

    换皮肤的时候JS改变href属性值:

    skinLink.href = 'skin-red.css';

    例如我10年前模拟腾讯网首页的换肤功能做的demo页面就是这么实现的。

都不完美。全局class控制样式提高了样式优先级,如果换肤样式很多,代码会非常啰嗦,不利于维护;使用JS改变href属性会带来加载延迟,样式切换不流畅,体验不佳。

实际上,浏览器有原生特性,非常适合实现网站换肤功能。

二、原生HTML特性下的网站换肤

此方法借助HTML rel 属性的 alternate 属性值实现。示意HTML如下:

<link href="reset.css" rel="stylesheet" type="text/css">
                
<link href="default.css" rel="stylesheet" type="text/css" title="默认">
<link href="red.css" rel="alternate stylesheet" type="text/css" title="红色">
<link href="green.css" rel="alternate stylesheet" type="text/css" title="绿色">

上面4个 <link> 元素,共出现了3中不同性质的CSS样式文件加载:

<link>
<link>
<link>

这里有个非常有趣的特性,那就是 rel="stylesheet"<link> 如果有title属性并有值,性质上就变成了一个可以控制其渲染或者不渲染的特殊元素了。

如何控制呢?

一种说是浏览器自己会有样式切换菜单,查看→页面,选择title属性值对应的样式。我猜这是10年前的说法了吧,现在浏览器根本没有这些菜单选项,至少我找了好久,各个浏览器都找了个遍没找到。

另外一种就是使用JS进行控制了,使用JavaScript代码修改 <link> 元素DOM对象的 disabled 值为 false ,可以让默认不渲染的CSS开始渲染。注意,必须是DOM元素对象的disabled属性,而不是HTML元素的disabled属性, <link> 元素是没有disabled属性的。

例如:

// 渲染red.css这个皮肤
document.querySelector('link[href="red.css"]').disabled = false;

因此,要实现换肤功能,只要在页面上方几个换肤按钮,点击的时候改变对应 <link> 元素DOM对象的 disabled 值就可以了。

眼见为实,我专门做了demo页面,您可以狠狠地点击这里: link rel alternate实现网站换肤功能demo

结果如下GIF截图所示(截自IE浏览器):

link rel=alternate网站换肤功能最佳实现

demo页面是使用单选框模拟实现的,HTML和JS代码如下:

<input id="default" type="radio" name="skin" value="default.css" checked>
<input id="red" type="radio" name="skin" value="red.css">
<input id="green" type="radio" name="skin" value="green.css">
var eleLinks = document.querySelectorAll('link[title]');
var eleRadios = document.querySelectorAll('[type="radio"]');
[].slice.call(eleRadios).forEach(function (radio) {
    radio.addEventListener('click', function () {
        var value = this.value;
        [].slice.call(eleLinks).forEach(function (link) {
            link.disabled = true;
            if (link.getAttribute('href') == value) {
                // 该样式CSS文件生效
                link.disabled = false;
            }
        });
    });
});

三、link rel=alternate方法实现优点

3大优点:

  1. 兼容性非常好。IE9+(IE8我没测,理论也支持),Chrome和Firefox均支持这种更原生的换肤效果实现。
  2. 语义非常好。用户,开发者,尤其搜索引擎或者其他辅助阅读设备能够准确识别网站还有其他替换CSS样式。(alternate的语义就是可替换的)
  3. 交互体验更好。rel=alternate方法实现的换肤功能在网站样式变换的时候是瞬间切换,完全无感知。因为浏览器已经把换肤的CSS文件预加载好了,比JS改变href地址的体验要更好。配合http2.0,几乎可以说是完美无瑕的解决方案了。

为什么之前没有人提过这个方法?

此方法我也是最近在学习rel属性值的时候知道的,看到MDN上关于 Alternative_style_sheets 文档学到的,之前并不知晓还有这么给力的实现。

Firefox4就开始支持这一特性,说明此方法很久远了,我搜索了下,还是有少数前辈知道并使用这种方法换肤的,但是,至少对于新人前端(如果按照我在例会上的统计)几乎无人知晓。

什么原因造成这种现象呢?

首先,换肤是小众需求;

其次,有符合常规认知的替换方案,最终效果也能接受;

然后,都在学习高大上的东西,什么HTML基础知识根本无人问津;

最后,缺少有影响力的的入口进行科普。

酒香也怕巷子深,好的技术实现也要多多曝光才能让更多人知道,提高整个行业的水平。所以如果你觉得此方法确实不错,可以转发分享让更多人知道。

最后,感谢你的关注和阅读!

link rel=alternate网站换肤功能最佳实现

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。

本文地址: https://www.zhangxinxu.com/wordpress/?p=8512

(本篇完)


以上所述就是小编给大家介绍的《link rel=alternate网站换肤功能最佳实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

成功由我

成功由我

刘世英、彭征 / 湖南人民出版社 / 2010-2 / 28.00元

《成功由我:李彦宏快乐成功之道》讲述:他,18岁高分考入北京大学,毕业后到美国名校学习最热门的计算机专业,然后闯荡于华尔街和硅谷这两大金融和技术圣地,31岁回国创立百度……到如今身价数十亿美元,领导的百度发展成为全球第二大搜索引擎,在国内搜索市场占据近八成的市场份额,将有“上帝”之称的Google抛在身后,最近他又掀起了“框计算”风暴,并雄心万丈宣称“未来十年,要让百度在全球一半以上国家成为家喻户......一起来看看 《成功由我》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具