详解HTML5如何使用可选样式表为网站或应用添加黑暗模式


Posted in HTML / CSS onApril 07, 2020

为你的站点添加黑暗模式

黑暗模式 已经应用在了许多流行的网站和应用程序中,诸如 Twitter、Instagram、WhatsApp 和 YouTube 等。但是你该怎样在自己的网站上添加这种模式呢?

我一直非常喜欢动态的网站颜色主题切换器。它们可以让你选择自己喜欢的颜色主题,从而改善了用户体验!

例如,下面是在 Twitter 的“显示设置”下找到的颜色主题选项。

详解HTML5如何使用可选样式表为网站或应用添加黑暗模式

这次就让我们来创建与之类似的功能吧。也许它不会像 Twitter 的主题更改器那么高大上,但我们会讲明白这里会用到的技术细节,告诉大家如何使用可选样式表(alternate style sheets)和 JavaScript 来切换 CSS 所包含的主题定义。

首先……我们来看一下这篇文章要创建出什么样的内容。

下面是一个可以切换本网站颜色主题的运行示例:

https://www.javascriptteacher.com/dark-mode-alternate-css-style-sheet.html?rt

详解HTML5如何使用可选样式表为网站或应用添加黑暗模式

单击各个按钮就可以立即切换整个网站的 CSS 主题。在本教程的剩余部分,我将向你展示如何向你自己的站点添加黑暗模式功能!

如果你能抓取到这篇黑暗模式教程页面使用的可选样式表,那也可以复制到你自己制作的网站上,或者用在你的 Wordpress(或类似的站点构建工具)中。

你可能听说过 CSS 可以是 内联 的,内部 的和 外部 的。这决定了 CSS 包含在你的文档中的方式。但是为了理解可选样式表的概念,我们首先需要看一下……

层叠样式表的 3 种类型

但是,层叠样式表(也就是 CSS)还有其他三种形式。它们分别是 持久 的,首选 的和 可选 的。

持久样式 指的是始终启用的 CSS 样式,并与活动样式表结合在一起。为了指定持久样式表,需要将 rel = "stylesheet" 属性添加到你的 link 标签,并跳过 title 属性。

这就是你指定一个样式表的常规方式。

<!-- Persistent Style Sheet --> 
<link src = "style.css" rel = "stylesheet"

首选样式 是页面加载完成后启用的默认样式。要创建它,请向你的 CSS link 标签添加 title 属性。

<!-- Alternate Style Sheet (just add a title) --> 
<link src = "dark.css" 
      rel = "stylesheet" 
    title = "dark" />

可选样式 可以实时切换来更改页面主题,而无需重新加载页面。

<!-- Dark Mode Alternate Style Sheet --> 
<link src = "dark.css" 
    title = "dark" /> 
      rel = "alternate stylesheet" /> 
<!-- Light Mode Alternate Style Sheet --> 
<link src = "light.css" 
    title = "light" 
      rel = "alternate stylesheet" />

为了创建可选样式表,你要做的就是将 link 标签中的 rel 属性设置为“alternate stylesheet”。就这样即可。这只是第一步。现在我们需要编写一个脚本来切换样式表。

在样式表之间动态切换

我在做相关研究时,在网上发现了不少有些年头的可选样式表 JavaScript 函数。但是它们有点过时了,所以我自己写了一个版本。

最重要的是,你需要在要启用的可选样式表对象上将属性 disabled 设置为 false。

<!-- Switch to a named alternate stylesheet --> 
function setActiveStyleSheet(title) { 
    let css = `link[rel="alternate stylesheet"]`; 
    let stylesheets = document.querySelectorAll(css); 
    stylesheets.forEach(sheet => sheet.disabled = true); 
    let selector = `link[title="${title}"]`; 
    let stylesheet = document.querySelector(selector); 
    stylesheet.disabled = false;

要动态切换到新样式表上,首先你必须禁用所有可用的可选样式表。如果你没能做到这一点,则会发现你的可选样式表不起作用(无法切换)。因此,在这个函数的第一步中,我们禁用了所有可用的可选样式表。完成后,我们启用了 title 参数中指定的那个。

<!-- Attach event to a button --> 
    let DarkModeButton = document.getElementById("DarkModeButton"); 
    DarkModeButton.addEventListener("click", 
        event => setActiveStyleSheet("darkmode"));

你可以将 setActiveStyleSheet 函数作为回调附加到负责切换它的按钮的“click”事件上。请注意,上面的示例假设我们有一个 title = "darkmode" 的样式表。或者,你可以直接在元素上直接使用 onclick 属性即可:

<div id = "DarkModeButton" 
onclick = "setActiveStyleSheet('darkmode')">

就动态切换 CSS 样式表需要的工作来说,到这里就都完成了。但是还有一件事!如果用户在选择其他主题之后离开站点,则需要确保当用户返回时网站加载了他们最后选择的那个主题。这可以使用 cookie 来实现,但是在本教程中,我将使用 HTML5 localStorage 来完成它。

记忆所选主题

我们可以使用 localStorage 来记住用户之前所选择的主题。这里的代码是直截了当的。每次选择主题时,我们都会将其标题名称存储在名为 "theme" 的 localStorage 项目中。下面我们来更新上一步中已经编写好的那个函数:

<!-- Switch to a named alternate stylesheet --> 
function setActiveStyleSheet(title) { 
    let css = `link[rel="alternate stylesheet"]`; 
    let stylesheets = document.querySelectorAll(css); 
    stylesheets.forEach(sheet => sheet.disabled = true); 
    let selector = `link[title="${title}"]`; 
    let stylesheet = document.querySelector(selector); 
    stylesheet.disabled = false; 
    localStorage.setItem("theme", title); 
}

请注意,这里我们添加了一个新的 localStorage 调用。现在,每次切换到一个可选样式表上时,它将存储在关键字 "theme" 下。

现在,如果用户离开站点并(在关闭浏览器选项卡之后)再次进入站点,我们需要恢复保存在 localStorage 中的默认主题。

为了做到这一点,我们需要从 DOMContentLoaded 事件上读取本地存储(时间就在 DOM 加载完毕之后不久),并使用存储在主题项目中的值来选择样式表:

<!-- Switch to a named alternate stylesheet --> 
window.addEventListener('DOMContentLoaded', (event) => { 
    console.log('DOM fully loaded and parsed'); 
    let title = localStorage.getItem("theme"); 
    setActiveStylesheet(title); 
})

这样就搞定啦!现在,你有了一个完整的,可选 CSS 主题的主题选择器。当然比较困难的部分是制作一套漂亮的 CSS 布局,但这块内容就等下一篇教程来具体讲解吧!

到此这篇关于详解HTML5如何使用可选样式表为网站或应用添加黑暗模式的文章就介绍到这了,更多相关HTML5黑暗模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
利用CSS3的flexbox实现水平垂直居中与三列等高布局
Sep 12 HTML / CSS
css3的transition效果和transfor效果示例介绍
Oct 30 HTML / CSS
利用CSS3实现单选框动画特效示例代码
Sep 26 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
May 15 HTML / CSS
CSS实现聊天气泡效果
Apr 26 HTML / CSS
利用html5 canvas破解简单验证码及getImageData接口应用
Jan 25 HTML / CSS
Html5+JS实现手机摇一摇功能
Apr 24 HTML / CSS
Html5实现用户注册自动校验功能实例代码
May 24 HTML / CSS
详解HTML5 录音的踩坑之旅
Dec 26 HTML / CSS
如何查看浏览器对html5的支持情况
Dec 15 HTML / CSS
Css预编语言及区别详解
Apr 25 HTML / CSS
html css3不拉伸图片显示效果
Jun 07 HTML / CSS
HTML5拖放API实现自动生成相框功能
Apr 07 #HTML / CSS
canvas绘制树形结构可视图形的实现
Apr 03 #HTML / CSS
Html5踩坑记之mandMobile使用小记
Apr 02 #HTML / CSS
总结html5自定义属性有哪些
Apr 01 #HTML / CSS
详解canvas.toDataURL()报错的解决方案全都在这了
Mar 31 #HTML / CSS
浅谈Html5页面打开app的一些思考
Mar 30 #HTML / CSS
详解HTML5常用的语义化标签
Sep 27 #HTML / CSS
You might like
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
通过php动态传数据到highcharts
2017/04/05 PHP
分享一个asp.net pager分页控件
2012/01/04 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
.net软件工程师应聘上机试题
2015/03/10 面试题
Solaris操作系统的线程机制
2015/07/28 面试题
后勤工作职责
2013/12/22 职场文书
Python中itertools库的四个函数介绍
2022/04/06 Python