html + css + js 怎么实现主题样式的切换?

简介: html + css + js 怎么实现主题样式的切换?

需求


需要实现下面点击不同按钮进行主题样式的切换。

4625374bc0394f8ea03245d8ab19d9aa.png

代码实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.9/theme-chalk/index.css">
    <style>
        body {
            padding: 50px 100px;
            background-color: var(--background-color);
        }
        .box {
            margin-top: 20px;
            padding: 10px;
            border: 1px solid var(--border-color);
            box-shadow: var(--box-shadow)
        }
        .box:hover {
            box-shadow: var(--box-shadow-hover)
        }
        .box .text {
            color: var(--text-color);
        }
        .box .text-sub {
            margin-top: 10px;
            color: var(--text-color-sub);
        }
    </style>
</head>
<body>
    <div class="btn">
        <button mode="light" class="el-button el-button--primary">明亮模式</button>
        <button mode="read" class="el-button el-button--success">阅读模式</button>
        <button mode="dark" class="el-button el-button--warning">暗黑模式</button>
    </div>
    <div class="box">
        <div class="text">凯小默的博客</div>
        <div class="text-sub">测试切换不同主题模式</div>
        <h3 class="text">当前模式:<span class="cur-mode"></span></h3>
    </div>
    <script>
        // 模式配置
        const modeOptions = {
            light: {
                '--background-color': '#fff',
                '--box-shadow': '0 1px 8px 0 rgba(0, 0, 0, 0.1)',
                '--box-shadow-hover': '0 2px 16px 0 rgba(0, 0, 0, 0.2)',
                '--text-color': '#242424',
                '--text-color-sub': '#7F7F7F',
                '--border-color': '#eaecef',
            },
            read: {
                '--background-color': '#f5f5d5',
                '--box-shadow': '0 1px 8px 0 rgba(0, 0, 0, 0.1)',
                '--box-shadow-hover': '0 2px 16px 0 rgba(0, 0, 0, 0.2)',
                '--text-color': '#004050',
                '--text-color-sub': '#7F7F7F',
                '--border-color': 'rgba(0, 0, 0, 0.15)',
            },
            dark: {
                '--background-color': '#181818',
                '--box-shadow': '0 1px 8px 0 rgba(255, 255, 255, .6)',
                '--box-shadow-hover': '0 2px 16px 0 rgba(255, 255, 255, .7)',
                '--text-color': 'rgba(255, 255, 255, .8)',
                '--text-color-sub': '#8B8B8B',
                '--border-color': 'rgba(255, 255, 255, .3)',
            }
        }
        // 设置模式
        function setMode(mode) {
            const rootElement = document.querySelector(':root');
            const options = modeOptions[mode];
            // 遍历设置
            for (const k in options) {
                rootElement.style.setProperty(k, options[k]);
            }
            rootElement.setAttribute("data-theme", mode);
            // 当前模式
            const curMode = document.querySelector('.cur-mode');
            curMode.innerHTML = mode;
        }
        // 初始设置为明亮模式
        setMode("light");
        document.querySelector(".btn").addEventListener("click", (e) => {
            setMode(e.target.getAttribute("mode"));
        })
    </script>
</body>
</html>



效果

切换阅读模式如下:

0b08d5716dc44b9897ad48f64f744fc8.png


切换暗黑模式如下:

9b10417d492b480cbdc3f59ccc2fe585.png



注意:该方案不支持 ie 浏览器。


目录
相关文章
|
9月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
伪类:伪类这个叫法源自于它们跟类相似,但实际上并没有类会附加到标记中的标签上。 伪类分为两种(以及新增的伪类选择器): UI伪类:会在HTML元素处于某种状态时(例如:鼠标指针位于连接上),为该元素应用CSS样式。 :hover 结构化伪类:会在标记中存在某种结构上的关系时 例如: 某元素是一组元素中的第一个或最后一个,为该元素应用CSS样式。 :not和:target(CSS3新增的两个特殊的伪类选择器)
1166 2
|
9月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
继承 我们的CSS中很多的属性也是可以继承的,其中相当一部分是跟文字的相关的,比如说颜色、字体、字号。 当然还有一部分是不能继承的。 例如边框、内外边距。 层叠 层叠是CSS的核心机制。 层叠的工作机制: 当元素的同一个样式属性有多种样式值的时候,CSS就是靠层叠机制来决定最终应用哪种样式。 层叠规则: 层叠规则一:找到应用给每个元素和属性的声明。 说明:浏览器在加载每个页面时,都会据此查找到每条CSS规则, 并标识出所有受到影响的HTML元素。
310 1
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
942 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
833 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
1267 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
html+js+css实现的建筑方块立体数字时钟源码
html+js+css实现的建筑方块立体数字时钟源码
689 33
一个好看的小时钟html+js+css源码
一个好看的小时钟html+js+css源码
317 24
|
前端开发
|
JavaScript 前端开发
页面滚动触发css3动画js插件
delighters.js是一款页面滚动触发css3动画js插件。该js插件可以在页面向下滚动时,为进入浏览器视口的元素制作各种炫酷的CSS3动画效果。
254 13