Bootstrap 5.3 深色模式下如何让按钮使用 CSS 颜色变量?
结论
要让描边按钮随主题色变化,需要将按钮自身的 --bs-btn-* 变量关联到主题颜色变量。默认情况下,只修改 --bs-secondary,.btn-outline-secondary 不会自动变色。
Bootstrap 的描边按钮类名是 btn-outline-secondary。如果页面使用的是 btn-secondary-outline,应先修正类名。按钮文档
为什么覆盖主题色没有生效?
$theme-colors 是 Sass 编译时的数据。Bootstrap 根据它生成按钮样式。按钮虽然使用 CSS 变量,但这些变量的初始值由 Sass 写入,默认没有关联到 var(--bs-secondary)。
例如,生成的声明形态是 --bs-btn-color: <编译得到的颜色值>。更改全局主题变量后,按钮上的局部变量仍会保留原值。按钮变量与 Sass mixins
$enable-css-variables: true 也不能改变这一点。Bootstrap 5.3 没有这个内置配置开关,除非项目自己的 Sass 代码读取它,否则声明它不会产生作用。Sass 配置选项
如何让深色模式按钮读取主题变量?
保持 _dark-mode.scss 在 Bootstrap 之后导入,并将下面的规则放入该文件。示例假设使用默认的 bs- 变量前缀,且按钮位于带有 data-bs-theme="dark" 的容器内:
[data-bs-theme="dark"] {
--bs-primary: #2e3250;
--bs-secondary: #7db3ff;
--bs-secondary-rgb: 125, 179, 255;
--bs-danger: #ff8f8f;
}
[data-bs-theme="dark"] .btn-outline-secondary {
--bs-btn-color: var(--bs-secondary);
--bs-btn-bg: transparent;
--bs-btn-border-color: var(--bs-secondary);
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: var(--bs-secondary);
--bs-btn-hover-border-color: var(--bs-secondary);
--bs-btn-focus-shadow-rgb: var(--bs-secondary-rgb);
--bs-btn-active-color: #000;
--bs-btn-active-bg: var(--bs-secondary);
--bs-btn-active-border-color: var(--bs-secondary);
--bs-btn-disabled-color: var(--bs-secondary);
--bs-btn-disabled-bg: transparent;
--bs-btn-disabled-border-color: var(--bs-secondary);
}
悬停和激活状态使用黑色文字,搭配问题中的 #7db3ff 背景。如果以后调整配色,也要重新检查文字对比度。
HTML 可以这样写。Bootstrap 支持通过祖先元素上的 data-bs-theme 指定颜色模式。颜色模式文档
<div data-bs-theme="dark">
<button type="button" class="btn btn-outline-secondary">
Secondary
</button>
</div>
上述声明让按钮在运行时引用主题变量。之后修改 --bs-secondary,按钮的对应状态会读取新值。焦点阴影使用独立的 RGB 变量,因此还要同步维护 --bs-secondary-rgb。
仍未生效时检查什么?
在浏览器开发者工具中选中按钮,检查以下几项:
- 类名是否为
btn btn-outline-secondary,祖先元素是否带有data-bs-theme="dark"。 - 编译后的 CSS 是否包含上述规则,以及规则是否被后续样式覆盖。
- 按钮上的
--bs-btn-color是否为var(--bs-secondary),继承到的--bs-secondary是否为#7db3ff。 - 普通、hover、focus、active 和 disabled 状态是否都使用了预期颜色。
这段代码只处理 secondary 描边按钮。其他按钮变体需要分别关联它们使用的组件变量,仅修改全局主题色不能完成所有组件的换肤。
备注:内容仅供参考。
