给你的网站一键动态换皮肤

2022-12-27 14:35:47 浏览数 (1)

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章,点击查看活动详情

前言

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

  • 内联style
  • 注入style
  • 注入link

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

核心思路

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

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

通过link实现动态换肤

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

代码语言:javascript复制
   const linkDom = document.createElement('link')
   linkDom.href = href
   linkDom.rel = "stylesheet"
   linkDom.type = "text/css"

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

代码语言:javascript复制
        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)
        }

完整的代码如下

代码语言:javascript复制
<!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>

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

通过style切换样式

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

通过style实现动态换肤

代码语言:javascript复制
function writeStyle(id = 'styleCss', originStyle) {
            const oldStyleDom = document.getElementById(id)
            const cssText = originStyle.replace(/[ntr]/ig, '')
            const styleDom = document.createElement('style')
            styleDom.innerText = cssText
            styleDom.id = id
            oldStyleDom ? document.head.replaceChild(styleDom, oldStyleDom) : document.head.appendChild(styleDom)
        }

通过link切换样式

0 人点赞