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

news/2024/5/9 6:33:18/文章来源:https://blog.csdn.net/weixin_41355260/article/details/87982885

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=8512
本文可全文转载,个人网站无需授权,只要保留原作者、出处以及文中链接即可,任何网站均可摘要聚合,商用请联系授权。

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

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

  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样式文件加载:

  • 没有title属性,rel属性值仅仅是stylesheet的<link>无论如何都会加载并渲染,如reset.css;
  • 有title属性,rel属性值仅仅是stylesheet的<link>作为默认样式CSS文件加载并渲染,如default.css;
  • 有title属性,rel属性值同时包含alternate stylesheet的<link>作为备选样式CSS文件加载,默认不渲染,如red.css和green.css;

这里有个非常有趣的特性,那就是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浏览器):

换肤效果示意

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基础知识根本无人问津;
最后,缺少有影响力的的入口进行科普。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_878471.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs 网站架构

有兴趣的可以下载

_004_EclipseOperation_Eclipse将一段代码抽取封装

来自https://www.jb51.net/softjc/581893.html&#xff0c;感谢作者的无私分享。 1、使用Eclipse打开已有的项目代码或者新建一个测试项目代码。将需要抽取封装方法的代码块选中&#xff0c;右击选择Refactor&#xff0c;再选择Extract Method&#xff0c;快捷键&#xff08;A…

_006_EclipseOperation_创建eclipse新的workspace并设置workspace共享配置

声明&#xff1a;该博文引自http://www.cnblogs.com/whycxb/p/4848695.html 一&#xff1a;创建新的workspace 1、File——Switch Workspace——Other 2、修改workspace路径和名称 3、修改后如下&#xff1a; 4、点击OK按钮后&#xff0c;eclipse自动重启 同时&#xff0c;相…

记一次小网站渗透过程

一、序言 记录某一次无意点开的一个小网站的渗透过程&#xff0c;幸运的是搭建平台是phpstudy&#xff0c;cms是beecms&#xff0c;beecms有通用漏洞&#xff0c;然后去网上找了资料&#xff0c;成功getshell并获取服务器权限。 二、渗透过程 无意点开一个网站&#xff0c;发…

_031_EclipseOperation_Eclipse修改导航栏的颜色

以上是个人随性配置&#xff0c;某些项的设置不懂&#xff0c;结果如下&#xff1a;

网站跨站点单点登录

昨天和几位朋友探讨到了这个话题&#xff0c;发现虽然单点登录&#xff0c;或者叫做独立的passport登录虽然已经有了很多实现方法&#xff0c;但是能真正了解并实现的人却并不太多&#xff0c;所以些下此文&#xff0c;希望从原理到实现&#xff0c;能让大家了解的多一些 至于什…

如何添加网站的浏览器 ico 图标

什么是网站 ICO 图标&#xff1f; 打开微软、百度等网站后看到浏览器的标题栏、地址栏&#xff0c;多浏览器的标签上都显示了一个小图标&#xff0c;如 &#xff0c;这里说的就是这个东东。 如何制作 ICO 图标&#xff1f; 这里使用最简单的办法。因为 ico 格式图片比较特殊&a…

一键SSH宝塔/Shell原生安装LNMP(Centos7.5 + Nginx + MySQL +PHP)+thinkphp/Wordpress搭建网站(附源码)

可以使用宝塔工具搭建&#xff0c;也可以使用我下面的教程进行搭建。 一、宝塔工具搭建具体操作&#xff1a; ssh登录centos服务器&#xff0c;下载安装宝塔工具centos版本&#xff0c;一键安装LNMP环境。大概需要10-20分钟吧&#xff1b;安装完成后进入应用市场&#xff0c;选…

怎么做好企业网站关键词优化

一、关键词的选择 1、企业品牌词 品牌关键词非常重要&#xff0c;可以说如果不重视品牌词部署&#xff0c;会影响到网络营销效果。品牌关键词是一个网站的名称&#xff0c;具备唯一性&#xff0c;方便用户记忆。加上消费者对品牌的认知度是非常高&#xff0c;具备品牌的网站能…

【网站推荐】Event Registry‘s News

【网站推荐】Event Registrys News 公众号&#xff1a; ChallengeHub 1、简介 利用AI的力量将新闻内容转化为解释性的分析报告。Event Registry是世界领先的新闻情报平台&#xff0c;使组织能够跟踪世界事件并分析其影响。 Event Registrys News 官方网站&#xff1a;https:/…

在线教育专业建站工具 EduWind ,源码下载,源码分享网整理

在线教育专业建站工具 EduWind &#xff0c;源码下载&#xff0c; Eduwind是由北京水木信步网络科技有限公司开发的网校服务&#xff0c;公司位于清华科技园。目前&#xff0c;EduWind的产品系列包括以下两大版本&#xff1a; EduWind网校开源软件&#xff1b; EduWind网校Saa…

web php+mysql 网站优化方向

1.PHPMySql的存储缺点 在大部分的PHP的网站开发当中&#xff0c;我们往往采用的数据存储方式是phpmysql,因此就会产生如下图所示的请求方式&#xff1a; 以上的架构对一般对于访问量不大的网站没有任何问题&#xff0c;例如&#xff1a;个人博客网站&#xff0c;小公司的企业网…

谷歌浏览器“无法添加来自此网站的应用、扩展程序和应用脚本”的最简单办法

网上其他的办法都试了 有点坑 最简单的解决办法就是打开开发者模式 关了再开&#xff0c;再拖入crx就好了 具体位置&#xff1a;选项——更多工具——拓展程序 或者直接在浏览器里输入chrome://extensions/

大型网站的可伸缩性架构如何设计?

1. 网站架构的伸缩性设计 1.1. 不同功能进行物理分离实现伸缩 纵向分离&#xff08;分层后分离&#xff09;&#xff1a;将业务处理流程上的不同部分分离部署&#xff0c;实现系统伸缩性。 横向分离&#xff08;业务分割后分离&#xff09;&#xff1a;将不同的业务模块分离…

千万级用户的大型网站,应该如何设计其高并发架构?

目录 &#xff08;1&#xff09;单块架构 &#xff08;2&#xff09;初步的高可用架构 &#xff08;3&#xff09;千万级用户量的压力预估 &#xff08;4&#xff09;服务器压力预估 &#xff08;5&#xff09;业务垂直拆分 &#xff08;6&#xff09;用分布式缓存抗下读…

react+redux+ant+axios+iframe实现网站门户

一个框架壳子&#xff0c;技术栈reactreduxantaxiosiframe,实现侧边栏与导航栏还有头部&#xff0c;对打开的页签进行缓存&#xff0c;使用iframe与各个子系统页面相连。 对打开的页签进行缓存即使刷新页面的tag也不会丢失&#xff0c;界面如下&#xff1a; 这个实现的功能是侧…

某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新。现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名。用户最大规模为2亿;积分为非负整数,且小于100万。

http://www.mianwww.com/html/2012/11/17432.html PS: 据说这是迅雷的一道面试题&#xff0c;不过问题本身具有很强的真实性&#xff0c;所以本文打算按照真实场景来考虑&#xff0c;而不局限于面试题的理想环境。 存储结构 首先&#xff0c;我们用一张用户积分表user_score来…

linux服务器做301跳转,网站seo怎么实现301跳转,linux服务器设置301重定向方法!

原标题&#xff1a;网站seo怎么实现301跳转,linux服务器设置301重定向方法! 在SEO优化中&#xff0c;这些已经存在可能已被收录的页面链接&#xff0c;既不能贸然的删除又不能放任不管&#xff0c;由于这跟网站的权重是挂钩的&#xff0c;以是这个时辰301定向就派上用场了。301…

WEB阶段6:过滤器监听器全局字符修改案例用户权限过滤案例装饰者模式过滤敏感词汇统计当前网站在线人数

过滤器&监听器&全局字符修改案例&用户权限过滤案例&装饰者模式过滤敏感词汇&统计当前网站在线人数 回顾 JSP的页面脚本元素 组成部分语法格式JSP代码片段<% Java代码 %>JSP声明<%! 声明全局变量 %>JSP脚本表达式<% 变量值 %>注释<…

扩展 jQuery EasyUI Datagrid 数据行鼠标悬停/离开事件(onMouseOver/onMouseOut)

客户需求&#xff1a; jQuery EasyUI Datagrid 用户列表鼠标悬停/离开数据行时显示人员头像&#xff08;onMouseOver/onMouseOut&#xff09; 如图所示&#xff0c;Datagrid 鼠标悬停/离开数据行时切换了不同的样式显示&#xff1a; 此时用谷歌开发者工具审查鼠标悬停行元素时…