动态一键换肤实现思路和demo

前言

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

  • 内联style

  • 注入style

  • 注入link

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

核心思路

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

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

通过link实现动态换肤

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

   const linkDom = document.createElement('link')
   linkDom.href = href
   linkDom.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 = href
            linkDom.rel = "stylesheet"
            linkDom.type = "text/css"
            linkDom.id = id
            oldStyleDom ? 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 = href
            linkDom.rel = "stylesheet"
            linkDom.type = "text/css"
            linkDom.id = id
            oldStyleDom ? 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 dark
                if (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 light
                    writeLink('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 = cssText
            styleDom.id = id
            oldStyleDom ? document.head.replaceChild(styleDom, oldStyleDom) : document.head.appendChild(styleDom)
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值