当前位置: 首页 > news >正文

为自己搭建的博客添加可切换的暗色和亮色主题

不知从什么时候开始,越来越多的小伙伴喜欢在暗色的编辑器中编写代码;于是写博客的小伙伴们也得在博客中顺应这样的潮流,这样才能更接近平时写代码时的环境。

然而——绝大多数的技术类博客或技术文章都是亮色主题的,代码在其中以和谐但不太好看的亮色存在,或者扎眼但熟悉的暗色存在。这始终觉得不那么舒适。

于是,作为博主,我决定考虑添加亮色和暗色两种主题色的支持。如果你也喜欢这样的方式,可以读一读本文,快速 get 到修改方法。


本文内容

    • 主题色改变的原理
    • 编写 css
    • 编写 js
    • 处理第三方评论系统这样不支持动态切换主题色的部件
    • 保存主题色

主题色改变的原理

html/css 带来的样式改变是非常简单的,html 中的 class 对应 css 中的样式即可完成各种各样的风格变化。

所以,我们考虑在 body 上额外添加一个 class,名为 dark-theme;运行时动态切换这个 class 的存在与否,我们便能在整个 body 范围之内切换样式。

而对于 css,我们为每一个与主题色相关的颜色添加一个与之对应的 dark-theme 样式。那么,我们只需要即时切换 body 的 dark-theme 的出现与否,就能让浏览器为我们使用全新的样式和颜色。

编写 css

第一个要改变的,当然是背景色了。如果原来的背景色是设置到 body 上的,那么我们就通过 .dark-theme 指定一个暗色版的背景色。

body {
    background: white
}
body.dark-theme {
    background: #282c34
}

还有前景色。当然,我们只改颜色,其他的不改:

.post-content p,
.post-content h1,
.post-content h2,
.post-content h3,
.post-content h4,
.post-content h5,
.post-content ul,
.post-content ol,
.post-content iframe,
.post-content div.post-inline {
    color: #4F4F4F;
    font-weight: 400;
}

body.dark-theme .post-content p,
body.dark-theme .post-content h1,
body.dark-theme .post-content h2,
body.dark-theme .post-content h3,
body.dark-theme .post-content h4,
body.dark-theme .post-content h5,
body.dark-theme .post-content ul,
body.dark-theme .post-content ol,
body.dark-theme .post-content iframe,
body.dark-theme .post-content div.post-inline {
    color: white
}

不过,在暗色背景下,我希望标题不需要加粗,只需要更亮即可:

.post-content h1,
.post-content h2,
.post-content h3,
.post-content h4,
.post-content h5 {
    font-weight: 700;
    font-style: normal
}

body.dark-theme .post-content h1,
body.dark-theme .post-content h2,
body.dark-theme .post-content h3,
body.dark-theme .post-content h4,
body.dark-theme .post-content h5 {
    font-weight: 200
}

像这样依次改下去,直到整个页面的暗色看起来都比较协调。

当然,如果希望立即能够看到效果,应该在 body 上加上 dark-theme 这个 class。

编写 js

其实我们的 js 只有一句话,就是切换 body 上的 dark-theme,所以我选择直接内联。

我增加了一个按钮,直接在 onclick 中编写切换 class 的代码:

<a title="切换黑白主题 (beta)" onclick="document.body.classList.toggle('dark-theme');">
  <span>切换黑白主题 (beta)</span>
</a>

这样,只需要点击这个按钮,即可完成黑白主题的切换。

处理第三方评论系统这样不支持动态切换主题色的部件

在我基本上改完之后,发现 Disqus 却没有办法很轻松地改掉。事实上,Disqus 的个人站点设置页面上可以选择亮色或者暗色主题,但是,那是静态的。

那么如何解决评论系统的问题呢?运行时动态切换吗?似乎没找到方法。

于是,我们可以使用设计巧妙地规避这个问题。我使用灰色背景替代之前的近黑色背景,然后加上周围的圆角;这样,第三方评论系统的样式便似乎是本就这样设计一样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Ux5L3Jj-1580202961319)(/static/posts/2018-05-19-disqus-theme.gif)]
▲ 看起来还是很和谐的

保存主题色

简单的保存基本上就是使用 cookie,于是我准备了一个 theme=dark 这样的键值对。如果存在,则使用暗色,否则使用亮色。并且,在切换时设置 cookie。

于是完整的切换代码就像这样:

<a href="#" title="切换黑白主题 (beta)" onclick="(function(){
    document.body.classList.toggle('dark-theme');
    if (document.body.classList.contains('dark-theme')) { document.cookie = 'theme=dark'; }
    else { document.cookie = 'theme=light'; }
})()">
    <span>切换黑白主题 (beta)</span>
</a>
<script type="text/javascript">
    if (document.cookie.split(';').filter((item) => {
        return item.includes('theme=light')
    }).length) {
        document.body.classList.remove('dark-theme');
    }
</script>

试试点击本文上面的“切换黑白主题”按钮吧!


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target(附各种自带的 Task)
  • 让你编写的控件库在 XAML 中有一个统一的漂亮的命名空间(xmlns)和命名空间前缀
  • Sdk 风格的 csproj 对 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras
  • 为博客或个人站点的 Markdown 添加 LaTeX 公式支持
  • 如何让 .NET Core 命令行程序接受密码的输入而不显示密码明文
  • 如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效
  • PasswordVault —— 在 UWP 应用中安全地保存密码
  • 如何在 MSBuild Target(Exec)中报告编译错误和编译警告
  • 将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
  • 使用 LINQ to XML,.NET 让生成 XML 文件变得和直接写 XML 一样轻松
  • git subtree 不断增加的推送时间,解不玩的冲突!这篇文章应该能救你
  • 阻止某个 NuGet 包意外升级
  • 解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程
  • 在 Visual Studio 的解决方案资源管理器中隐藏一些文件
  • 长期支持 LTS(Long-term Support)是怎样的一种支持方式
  • 【知识碎片】第三方登录弹窗效果
  • C# 免费离线人脸识别 2.0 Demo
  • es6(二):字符串的扩展
  • JAVA之继承和多态
  • LeetCode算法系列_0891_子序列宽度之和
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • php ci框架整合银盛支付
  • Spring Cloud中负载均衡器概览
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 阿里云前端周刊 - 第 26 期
  • 老板让我十分钟上手nx-admin
  • 设计模式(12)迭代器模式(讲解+应用)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 一个JAVA程序员成长之路分享
  • 在Mac OS X上安装 Ruby运行环境
  • AI算硅基生命吗,为什么?
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​第20课 在Android Native开发中加入新的C++类
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #大学#套接字
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (轉)JSON.stringify 语法实例讲解
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • @ConditionalOnProperty注解使用说明
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [20190416]完善shared latch测试脚本2.txt
  • [autojs]autojs开关按钮的简单使用
  • [BZOJ2208][Jsoi2010]连通数
  • [C语言]编译和链接
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [IE编程] 如何在IE8 下调试BHO控件/工具栏(调试Tab进程)