深色模式切换按钮背景不生效及点击黑屏问题求助
深色模式切换按钮背景不随主题切换的问题
我今天刚接触编程,试着做一个简单的静态深色模式切换按钮,但按钮背景没法跟着主题切换颜色。之前修改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); });
问题原因及修复方案
核心问题
- CSS变量漏写分号:
.light-theme和.dark-theme里多个变量末尾没加分号,导致浏览器无法正确解析后续变量,比如.light-theme里的--btng: var(--black)后没加分号,后面的--btnFontColor会被忽略。 - 变量名不匹配:
.light-theme里写的是--btng,但按钮样式用的是--btnBg,变量名错误导致浅色主题下按钮背景无赋值。 - 样式重复定义+逻辑冲突:
.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
相关产品推荐
相关产品推荐

