最直接方案是用JavaScript操作document.body.style.backgroundColor;推荐用DOMContentLoaded绑定事件,避免选择器错误或颜色格式问题;预设色切换应使用CSS类而非内联样式,优先修改CSS变量以提升兼容性与维护性。
document.body.style.backgroundColor
这是兼容性最好、最直接且不依赖框架的办法。bootstrap 按钮只负责触发,实际效果来自 js 对 dom 的操作。
点击按钮没有响应时,多半是 JS 未绑定事件,或者选择器填写错误,例如使用了 .btn-primary 却未添加 class;也可能是背景色值格式错误,例如写成 "blue" 建议改成 rgb)或十六进制写法,否则浏览器无法辨认。
id="change-bg-btn" 或使用明确的 class,以免多个按钮被错误绑定DOMContentLoaded 事件在页面加载完成后执行绑定,不要把 script 放入 head 中document.getElementById('change-bg-btn').addEventListener('click', () => { document.body.style.backgroundColor = '#4dabf7';});
如果只在浅灰→深蓝→米白等几个固定颜色间切换,利用 CSS 类进行控制,比直接写死颜色值更便于维护,也能复用主题逻辑。
这种方案适用于后台管理页的日间/夜间模式切换、多皮肤主题预览,以及演示时的快速配色测试。
.bg-day、.bg-night、.bg-moon,每个类中仅包含 background-color
classList.replace() 或者 classList.toggle() 完成切换,避免手动清除所有类而产生副作用body.className = 'bg-night',其他不可缺少的 class 会因此丢失,其中包括 Bootstrap 的 container 外层 class)style="background-color: ..." 直接写死在 HTML 中若想让 JS 动态覆盖,静态内联样式会形成阻碍(除非你用 !important,但这会降低可维护性;而且每次更换颜色都要重写 HTML,交互意义也就完全消失。
尽管性能影响有限,开发体验却很差:一次颜色调整可能需要同时修改 HTML、JS,甚至遗漏注释中的某个旧值。
element.style.xxx ——表面上可以覆盖,实际却容易受到执行时序影响--bg-main),应优先修改变量值:document.documentElement.style.setProperty('--bg-main', '#2b303b'),让子元素随之自动响应user-select 是否与伪类发生冲突背景色其实已经改变,却可能被默认焦点样式遮住,于是看似没有变化;这种现象源于某些安卓 WebView 或 iOS Safari 在点击按钮的瞬间短暂失焦或闪白。
常见问题是按钮已经添加 outline: none ,却没有移除 :focus 状态下的背景变化;或者使用 -webkit-tap-highlight-color: transparent 以后没有补充完整的视觉反馈。
background-color 的规则 :active/:focus 若作用于 body,背景可能受到干扰(问题可能来自自定义 CSS,Bootstrap 默认不会如此)body 确认时应查看元素 computed styles,判断 background-color 已经真正更新body 添加 transition,因为部分浏览器不支持;应改用 :root 变量配合 transition,稳定性更好body.style 往往不如调整根节点变量简洁。