You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

深色模式切换按钮背景不生效及点击黑屏问题求助

深色模式切换按钮背景不随主题切换的问题

我今天刚接触编程,试着做一个简单的静态深色模式切换按钮,但按钮背景没法跟着主题切换颜色。之前修改CSS第36行的--bg: var(--green);后,点击按钮屏幕会变黑,相关代码如下:

HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>site</title>
    <link rel="stylesheet" href="main.css">
</head>
<body class="light-theme">
    <h1>Task List</h1>
    <p id="msg">Current tasks:</p>
    <ul>
        <li class="list">Add visual styles</li>
        <li class="list">Add light and dark themes</li>
        <li> Enable switching the theme</li>
    </ul>
    <div>
        <button class="btn">Dark</button>
    </div>
    <script src="app.js" defer></script>
    <noscript>You need to enable JavaScript to view the full site.</noscript>
</body>
</html>

CSS代码(原问题代码)

body {
    font-family: monospace;
}
ul {
    font-family: Arial, Helvetica, sans-serif;
}

li {
    list-style: circle;
}

.list {
    list-style: square;
}

.light-theme {
    color: black;
    background: #00FF00;
    
}

:root {
    --green: #00FF00;
    --white: #ffffff;
    --black: #000000;
}

.light-theme {
    --bg: var(--green);
    --fontColor: var(--black);
    --btng: var(--black)
    --btnFontColor: var(--white)
}

.dark-theme {
    background: var(--black);
    --fontColor: var(--green);
    --btnBg: var(--white)
    --btnFontColor: var(--black)
}

* {
    color: var(--fontColor);
    font-family: Arial, Helvetica, sans-serif;
}

body  {
    background: var(--bg);
}

.btn {
    color: var(--btnFontColor);
    background-color: var(--btnBg);
}

.btn {
    position: absolute;
    top: 20px;
    left: 250px;
    height: 50px;
    width: 50px;
    border-radius: 50%;
    border: none;
    color: var(--btnFontColor);
    background-color: var(--btnBg);
}


.btn:focus { outline: none; }

JavaScript代码

'use strict'

const switcher = document.querySelector('.btn');

switcher.addEventListener('click', function() {
    document.body.classList.toggle('dark-theme')

    var className = document.body.className;
    if(className == "light-theme") {
        this.textContent = "Dark";
    }   
    else {
        this.textContent = "Light"
    }

    console.log('current class name: ' + className);
});

问题原因及修复方案

核心问题

  1. CSS变量漏写分号:.light-theme和.dark-theme里多个变量末尾没加分号,导致浏览器无法正确解析后续变量,比如.light-theme里的--btng: var(--black)后没加分号,后面的--btnFontColor会被忽略。
  2. 变量名不匹配:.light-theme里写的是--btng,但按钮样式用的是--btnBg,变量名错误导致浅色主题下按钮背景无赋值。
  3. 样式重复定义+逻辑冲突:.light-theme被定义了两次,第一次直接写死背景色,第二次用变量;.dark-theme直接写background: var(--black),和后面body { background: var(--bg); }的变量控制逻辑冲突,导致点击后屏幕变黑。

修复后的CSS代码

body {
    font-family: monospace;
}
ul {
    font-family: Arial, Helvetica, sans-serif;
}

li {
    list-style: circle;
}

.list {
    list-style: square;
}

:root {
    --green: #00FF00;
    --white: #ffffff;
    --black: #000000;
}

/* 统一用变量控制主题,删除重复定义 */
.light-theme {
    --bg: var(--green);
    --fontColor: var(--black);
    --btnBg: var(--black); /* 修正变量名 */
    --btnFontColor: var(--white); /* 补充分号 */
}

.dark-theme {
    --bg: var(--black); /* 改用--bg变量统一控制背景 */
    --fontColor: var(--green);
    --btnBg: var(--white); /* 补充分号 */
    --btnFontColor: var(--black); /* 补充分号 */
}

* {
    color: var(--fontColor);
    font-family: Arial, Helvetica, sans-serif;
}

body {
    background: var(--bg);
}

.btn {
    position: absolute;
    top: 20px;
    left: 250px;
    height: 50px;
    width: 50px;
    border-radius: 50%;
    border: none;
    color: var(--btnFontColor);
    background-color: var(--btnBg);
}

.btn:focus { outline: none; }

优化后的JavaScript代码

'use strict'

const switcher = document.querySelector('.btn');

switcher.addEventListener('click', function() {
    document.body.classList.toggle('dark-theme');
    // 直接判断是否包含dark-theme类,逻辑更可靠
    this.textContent = document.body.classList.contains('dark-theme') ? 'Light' : 'Dark';
    console.log('current class name: ' + document.body.className);
});

修复效果

  • 按钮背景会随主题切换:浅色主题下按钮为黑色、文字白色;深色主题下按钮为白色、文字黑色;
  • 点击按钮时屏幕不会变黑,body背景通过--bg变量统一控制,主题切换逻辑一致。

内容的提问来源于stack exchange,提问作者digas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:44:53