前言

浏览器切换样式无非是通过css,总共有以下三种方法。

  • 内联style

  • 注入style

  • 注入link

那么我们想要实现一键换肤,那么我们为了剥离干净dom和css。我们只能选择style和link这两种方法。

核心思路

在html的head内部插入(更新)stylelink 实现。

因为link有不局限跨域的优势,我们先以 link 为例子。

通过link实现动态换肤

首先创建一个link元素,并且设置样式相关属性。

   const linkDom = document.createElement('link')linkDom.href = hreflinkDom.rel = "stylesheet"linkDom.type = "text/css"

但是我们如果直接使用 document.head.appendChild(linkDom)来切换布局,那切换几次就会导致head里多很多不必要的link标签。为了解决这个,我们需要声明id,通过替换来实现单例模式。

        function writeLink(id = 'linkCss', href) {const oldStyleDom = document.getElementById(id)const linkDom = document.createElement('link')linkDom.href = hreflinkDom.rel = "stylesheet"linkDom.type = "text/css"linkDom.id = idoldStyleDom ? document.head.replaceChild(linkDom, oldStyleDom) : document.head.appendChild(linkDom)}

完整的代码如下


<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head>
<style></style><body><div><button id="theme-toggle">Now light, Click switch to dark mode</button><p>白天红色,晚上黑色</p></div><script>function writeLink(id = 'linkCss', href) {const oldStyleDom = document.getElementById(id)const linkDom = document.createElement('link')linkDom.href = hreflinkDom.rel = "stylesheet"linkDom.type = "text/css"linkDom.id = idoldStyleDom ? document.head.replaceChild(linkDom, oldStyleDom) : document.head.appendChild(linkDom)}window.onload = function () {const themeToggle = document.getElementById('theme-toggle');console.log('themeToggle', themeToggle)writeLink('linkCss', 'https://pangyiming.github.io/light.css')themeToggle.addEventListener('click', () => {// if it's light -> go darkif (themeToggle.innerText.includes('Now light')) {writeLink('linkCss', 'https://pangyiming.github.io/dark.css')themeToggle.innerText = 'Now dark, Click switch to light mode';} else {// if it's dark -> go lightwriteLink('linkCss', 'https://pangyiming.github.io/light.css')themeToggle.innerText = 'Now light, Click switch to dark mode';}})}</script>
</body></html>

效果如下(如果没有效果,大家可以复制代码本地运行,我确保他是可运行的,至于 码上掘金 为什么失灵时不灵。。。@掘金):

值得一说的是github pages太方便了。简直是一个免费的静态资源服务。我们代码中的css文件便是从github pages中来的。大家可以参考我的另一篇文章# 2022 如何在 GitHub 上搭建个人网站(github.io)

通过style实现动态换肤

function writeStyle(id = 'styleCss', originStyle) {const oldStyleDom = document.getElementById(id)const cssText = originStyle.replace(/[\n\t\r]/ig, '')const styleDom = document.createElement('style')styleDom.innerText = cssTextstyleDom.id = idoldStyleDom ? document.head.replaceChild(styleDom, oldStyleDom) : document.head.appendChild(styleDom)}

动态一键换肤实现思路和demo相关推荐

  1. Vue + Element UI+Scss + Vuex一键换肤 , 一键换字体大小 ,动态替换全局主题颜色

    一.前言 其实我这个写法每个UI库都通用 , 不局限于ElementUI , 看明白思路就知道怎么写了 一键换肤 , 动态替换全局主题颜色功能已经实现很久了 , 在项目验收的时候出现了一个小问题 , ...

  2. opengl源码 实现无缝切换图片过场_手把手讲解 Android hook技术实现一键换肤

    前言 产品大佬又提需求啦,要求app里面的图表要实现白天黑夜模式的切换,以满足不同光线下都能保证足够的图表清晰度. 怎么办?可能解决的办法很多,你可以给图表view增加一个toggle方法,参数Str ...

  3. wegame一键蹲替换文件_手把手讲解 Android hook技术实现一键换肤

    前言 产品大佬又提需求啦,要求app里面的图表要实现白天黑夜模式的切换,以满足不同光线下都能保证足够的图表清晰度. 怎么办?可能解决的办法很多,你可以给图表view增加一个toggle方法,参数Str ...

  4. [CSS] 自定义变量带你随心所欲,一键换肤

    认识CSS自定义变量 CSS自定义属性?听着怎么那么神奇呢,属性还可以自定义,那不是可以放肆地玩耍?我自己定义的属性浏览器都能认识? 一.基础 (一)名字和用途 其实CSS自定义属性还有很多小名,比如 ...

  5. 如何利用 SCSS 实现一键换肤

    本文首发于政采云前端团队博客:如何利用 SCSS 实现一键换肤 https://www.zoo.team/article/theme-scss 前言 在项目开发过程中,我们有时候遇到需要更换站点主题色 ...

  6. Android hook技术实现一键换肤,移动应用开发项目案例

    3. 利用HOOK技术实现优雅的"一键换肤" 什么是hook **如题,我是用hook实现一键换肤.那么什么是hook? hook,钩子. 安卓中的hook技术,其实是一个抽象概念 ...

  7. Android通过Hook技术实现一键换肤

    目录 1.什么是一键换肤 2.界面上那些东西可以换肤 3.利用Hook实现一键换肤 4.Android创建视图源码分析 4.1.自定义Activity设置要显示的布局文件xml 4.2.调用兼容App ...

  8. Android插件化的思考——仿QQ一键换肤,思考比实现更重要!

    Android插件化的思考--仿QQ一键换肤,思考比实现更重要! 今天群友希望写一个关于插件的Blog,思来想去,插件也不是很懂,只是用大致的思路看看能不能模拟一个,思路还是比较重要的,如果你有兴趣的 ...

  9. Spring Boot一键换肤,so easy!

    SpringMVC 源码分析系列最后一篇,和大家聊一聊 Theme. Theme,就是主题,点一下就给网站更换一个主题,相信大家都用过类似功能,这个其实和前面所说的国际化功能很像,代码其实也很像,今天 ...

最新文章

  1. 如何判断服务器之间的服务是否可用?ping 还是 telnet?
  2. 轴添加点击事件_Q群答疑丨如何批量修改Revit轴网编号,为它添加前缀?
  3. POJ - 1958 Strange Towers of Hanoi(线性dp)
  4. Linux实战教学笔记12:linux三剑客之sed命令精讲
  5. Java判断字符串的数字类型(小数、整数)
  6. Suse发生了错误Access denied for user #39;#39;@#39;localhost#39; toamp;
  7. Pannellum:实例之全景图预览
  8. jQuery倒计时进度条
  9. 解决 error: Raw kernel process exited code: 3221226505
  10. 单页面网站优化技巧有哪些?
  11. Hello Qt——Qt自定义标题栏
  12. 2D游戏引擎开发入门(二)
  13. 微信服务号开发说明:测试号申请、自定义菜单添加第三方连接
  14. 程序在单片机里是如何运行的?
  15. java 两个url对比_一个URL模式中的两个slu ..
  16. iOS开发模拟网络状态差进行调试
  17. Commonjs 模块化开发解析
  18. uniapp开发的H5网页,以表单形式调起微信H5支付
  19. Codeforces Round #838 (Div. 2)题解
  20. win10右键卡死/导航栏点击文件夹图标无法弹出资源管理器/右键cmd以管理员身份运行无反应

热门文章

  1. 【文字游戏之猜单词】
  2. 利用word的邮件合并做标签纸条
  3. 今日黄历:宜智能开房,周到又优雅
  4. Android酱油笔记之天气预报
  5. 计算机三级成绩截图,09年计算机三级辅导:填表截图一个傲游全搞定
  6. 乐视要死了,但贾跃亭却活了?
  7. 中国地铁数据库表 (MySQL)
  8. “微天气”微信小程序实战开发过程
  9. 【算法】JavaScript冒泡排序
  10. C++入门 aabb