利用CSS3自定义属性来为网站添加“暗黑模式”(暗色模式/DarkMode)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_114
究竟什么是暗黑模式?这个概念起初来源于macOS系统,该系统的mojave版本为用户提供两个主题皮肤,即浅色和深色的皮肤。自从有了这个概念之后,很多网站和系统都会用户提供了相应的两套肤色,便于用户根据自己的习惯或爱好进行切换
从科学的角度讲,低对比度的暗色可以降低屏幕对视网膜的刺激,同时还可以让电子设备更加省电。
在过往的印象之中,最早实现类似的效果,一般都是通过JavaScript来更换Web页面或Web应用程序主题皮肤的.css文件,但是对于维护多套样式是较为痛苦的,特别当你要为你的产品提供更多的皮肤的时候更为堪忧。这个时候你可以借助类似Sass这样的处理器来维护你的主题样式,声明好变量,然后维护对应的变量值。
这就是css3的自定义属性,自定义属性的出现,可以让css样式也使用变量,通过js可以动态的修改变量的值
//现在全局定义
:root{
--theme-color:red;
}
//使用的时候
#app{
background-color:var(--theme-color);
}
//假如我们没有指定--theme-color这个属性,则可以在使用的时候加上替代值
#app{
background-color:var(--theme-color,black);//没有指定--theme-color则会由black代替
}
通过JS获取和设置自定义的属性
//js中获取--theme-color的值
var styles = getComputedStyle(document.documentElement);
var value = styles.getPropertyValue("--theme-color");
console.log(value);//red
//js中更改--theme-color的值
document.documentElement.style.setProperty("--theme-color","black");
明白了这个原理,以我的个人网站为例,我只需要,改变三个颜色属性即可将我的网站改变风格:logo,背景色,和字体色
:root{
--bg-color:#fff;
--a-color:#4A4A4A;
--logo:url(../images/logo.png);
}
然后利用js,实时切换这三个变量即可
function check_model(){
var _items = [];
var items = document.getElementsByName("switch_default");
for(var i=0;i<items.length;i++) {
if (items[i].checked){_items.push(items[i].value);}
}
if(_items.length==0){
document.documentElement.style.setProperty("--bg-color",'#fff');
document.documentElement.style.setProperty("--a-color",'#4A4A4A');
document.documentElement.style.setProperty("--logo",'url(../images/logo.png)');
localStorage.setItem("mode", "light");
}else{
document.documentElement.style.setProperty("--bg-color",'#292a2d');
document.documentElement.style.setProperty("--a-color",'#a9a9b3');
document.documentElement.style.setProperty("--logo",'url(../images/logo_dark.png)');
localStorage.setItem("mode", "dark");
}
是不是很简单呢,这样就可以实现了,你可能也发现了,我利用webstorage技术来实现风格的状态保存,这样就可以保证用户在切换风格以后,可以记录用户选择的状态
关于webstorage可以参看这篇文章:彻底弄清楚session,cookie,sessionStorage,localStorage的区别及应用场景(面试向)
前端技术虽然博大精深,但是作为一名全栈工程师,掌握前端也是十分必要的,想在互联网行业生存下去就取决于一个人的技术是否全面,我始终对同学的建议就是,不要惧怕前端,要热爱前端,关注前端从而反哺后端,只有不停的探索和学习,才能在技术这条路上走的平稳和长久。
原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_114
利用CSS3自定义属性来为网站添加“暗黑模式”(暗色模式/DarkMode)的更多相关文章
- 利用nginx向现有网站添加登录验证功能(不添加修改现有网站代码)
在不改变现有网站代码的前提下加入验证功能: 1.假设现有网站后端nodejs,端口3000,nginx配置如下 server { listen 80; server_name localhost; l ...
- 利用CSS3实现图片无间断轮播图的实现思路
前言:图片轮播效果现在在各大网站都是非常普遍的,以前我们都是通过postion的left or right来控制dom的移动,这里我要说的是利用css3来制作轮播!相比以前通过postion来移动do ...
- 如何利用log4Net自定义属性配置功能记录完整的日志信息
log4Net作为专业的log记录控件,对于它的强大功能大家一定不陌生.下面我将详细介绍如何利用其自定义属性,让日志信息更完整. 一,创建测试工程,log4Net组件可以自己从网上下载,也可通过Nug ...
- Apache:如何利用.htaccess文件对PHP网站或文件进行伪静态处理
来源:http://www.ido321.com/1123.html 今天get了一招:利用.htaccess文件对PHP网站或文件进行伪静态处理. 一.检查服务器是否支持伪静态处理: 必 须要空间支 ...
- 利用CSS3实现页面淡入动画特效
利用CSS3动画属性"@keyframes "可实现一些动态特效,具体语法和参数可以网上自行学习.这篇文章主要是实践应用一下这个动画属性,实现页面淡入特效,在火狐24版.chrom ...
- 为网站添加IE6升级提示
原文 为网站添加IE6升级提示 IE6的是一款横跨十年的浏览器,作为一枚前端,对其已经失望透顶,但其在中国的市场比仍旧很高,中国大量的PC上安装的都是盗版Windows XP,而Windows XP上 ...
- 利用 squid 反向代理提高网站性能(转载)
本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性.安全性方面有很好的用途.作者在具体的实验环境下,利用 DNS 轮询和 Squid 反向代理技术, ...
- 利用CSS3实现div页面淡入动画特效
利用CSS3实现页面淡入动画特效 摘要 利用CSS3动画属性"@keyframes "可实现一些动态特效,具体语法和参数可以网上自行学习.这篇文章主要是实践应用一下这个动画属性 ...
- 网站添加第三方登陆(PHP版)
这两周正在写毕业设计,我做的是一个问答网站.先介绍一下这个网站:这是一个关于大学生在线问答的网站,类似知乎和百度知道,不过功能没有人家多,毕竟这个网站我一个人在做.网站部署在阿里云,网站包括API,W ...
随机推荐
- JavaScript 模块的循环加载(循环依赖问题分析)
简介 "循环加载"(circular dependency)指的是,a 脚本的执行依赖 b 脚本,而 b 脚本的执行又依赖 a 脚本. 分析 使用 madge 工具进行循环加载分析 ...
- 解决 js aysnc await try-catch 地狱
- 111_Power Pivot 24小时维度:累计、同比、环比相关
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 今天有朋友讨论怎么做每天24小时维度的工作量计算(运营类企业,每天24小时都在运营)需求如下: 1.从0时到23 ...
- Python技法:浮点数取整、格式化和NaN处理
1. 取整的三种方法 1.1 强转int类型 这种方法会直接对浮点数的小数部分进行截断(无论是正还是负). print(int(2.7)) # 2 print(int(-2.7)) # -2 1.2 ...
- 分享一个 SpringCloud Feign 中所埋藏的坑
背景 前段时间同事碰到一个问题,需要在 SpringCloud 的 Feign 调用中使用自定义的 URL:通常情况下是没有这个需求的:毕竟都用了 SpringCloud 的了,那服务之间的调用都是走 ...
- column-文本对齐输出
文本输出对齐,可以指定对应的分隔符,将上下文的字符串按分隔符列对齐. 语法 column [选项] 选项 -s 设置分隔符,默认为空格. -t 判断输入的列数来创建一个表,使列对齐. -c 设置显示的 ...
- 07makefile文件
makefile 规则: 目标: 依赖 (tab)命令 第一个版本: main: main.c fun1.c fun2.c sum.c gcc -o main main.c fun1.c fun2.c ...
- 毕设(1)——机械臂DH建模
目录 毕设(1)--机械臂DH建模 改进DH参数表 Matlab代码验证 毕设中用到了很多代码,其中一部分我通过看书和看论文学习并实现的代码,会通过Gitee仓库分享出来,这些代码仅用于学习使用,祝各 ...
- 【抬杠.NET】如何进行IL代码的开发(续)
背景 之前写了一篇文 [抬杠.NET]如何进行IL代码的开发 介绍了几种IL代码的开发方式. 创建IL项目 C#项目混合编译IL 使用InlineIL.Fody 使用DynamicMethod(ILG ...
- .NET C#基础(7):接口 - 人如何和猫互动
0. 文章目的 面向有一定基础的C#初学者,介绍C#中接口的意义.使用以及特点. 1. 阅读基础 了解C#基本语法(如定义一个类.继承一个类) 理解OOP中的基本概念(如继承,多态) 2. ...