主题 Bootstrap(4) 在 SCSS 中使用 CSS 变量
Theming Bootstrap(4) Using CSS Vars in SCSS
我正在尝试在用户可以动态更改配色方案的网站上实现 Bootstrap。
我在 this guide.
之后使用 CSS 变量完成了此操作
它通常有效,但是当任何东西使用变亮或变暗功能(例如警报)时它不起作用。
CSS 变量在 HTML 的头部声明,像这样;
<style type="text/css">
:root {
--primary: #3490dc;
--primary-h: 207;
--primary-s: 71%;
--primary-l: 53%;
--primary-a: 1;
--secondary: #6c757d;
--secondary-h: 207;
--secondary-s: 71%;
--secondary-l: 53%;
--secondary-a: 1;
--success: hsl(207, 71%, 53%);
--success-h: 207;
--success-s: 71%;
--success-l: 53%;
--success-a: 1;
--info: #17a2b8;
--info-h: 188;
--info-s: 78%;
--info-l: 41%;
--info-a: 1;
--warning: #ffc107;
--warning-h: 188;
--warning-s: 78%;
--warning-l: 41%;
--warning-a: 1;
--danger: #dc3545;
--danger-h: 188;
--danger-s: 78%;
--danger-l: 41%;
--danger-a: 1;
--light: #f8f9fa;
--light-h: 188;
--light-s: 78%;
--light-l: 41%;
--light-a: 1;
--dark: #343a40;
--dark-h: 188;
--dark-s: 78%;
--dark-l: 41%;
--dark-a: 1;
--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}
</style>
当我检查控制台显示的警报元素时;
.alert-success {
color: hsla(calc((
0deg + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((0% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
background-color: hsla(calc((
0deg + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((100% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
border-color: hsla(calc((
0deg + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((100% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
}
但是计算结果显示;
background-color: rgba(0, 0, 0, 0)
因此警报背景上没有颜色。
我不确定 0deg 的东西。
不过。如果我只用 0 替换 0deg,我设法让它工作。
.alert-success {
color: hsla(calc((
0 + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((0% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
background-color: hsla(calc((
0 + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((100% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
border-color: hsla(calc((
0 + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((100% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
}
所以你确实想保留 deg
。无需从 Bootstrap 中删除它,您只需更新您的变量以包含相同的 deg
单位。
按照您现在的代码,您正在添加 0deg + 207
,但您应该添加 0deg + 207deg
。添加这些单位将使您的样式开始正常工作。
根据经验,您的所有样式都应包含适当的单位,与 Bootstrap 已有的单位相匹配:
:root {
--success-h: 207deg;
--success-s: 71%;
--success-l: 53%;
--success-a: 1;
}
我唯一要做的其他标注是,对于您的不透明度值,您当前正在添加 1 + 1
,这导致不透明度为 2
,超过了上限 1
100%.
如果您添加 1
+ 您的变量值只是为了在值不存在时作为后备,您可能需要考虑使用默认值。您的代码在当前状态下需要 negative 不透明度值(例如 -.5
)才能使颜色半透明。如果您希望在变量不存在时使用 1
作为回退值,您可以通过在变量引用中将默认值放在逗号之后,如下所示:
.alert-success {
color: hsla(calc(var(--success-h, 0deg) / 2), calc(var(--success-s, 0%) / 2), calc(var(--success-l, 0%) / 2), calc(var(--success-a, 1) / 2));
background-color: hsla(calc(var(--success-h, 0deg) / 2), calc(var(--success-s, 0%) / 2), calc(var(--success-l, 100%) / 2), calc(var(--success-a, 1) / 2));
border-color: hsla(calc(var(--success-h, 0deg) / 2), calc(var(--success-s, 0%) / 2), calc(var(--success-l, 100%) / 2), calc(var(--success-a, 1) / 2));
}
如果您的所有添加都是有意的,请忽略最后一点。
我正在尝试在用户可以动态更改配色方案的网站上实现 Bootstrap。
我在 this guide.
之后使用 CSS 变量完成了此操作
它通常有效,但是当任何东西使用变亮或变暗功能(例如警报)时它不起作用。
CSS 变量在 HTML 的头部声明,像这样;
<style type="text/css">
:root {
--primary: #3490dc;
--primary-h: 207;
--primary-s: 71%;
--primary-l: 53%;
--primary-a: 1;
--secondary: #6c757d;
--secondary-h: 207;
--secondary-s: 71%;
--secondary-l: 53%;
--secondary-a: 1;
--success: hsl(207, 71%, 53%);
--success-h: 207;
--success-s: 71%;
--success-l: 53%;
--success-a: 1;
--info: #17a2b8;
--info-h: 188;
--info-s: 78%;
--info-l: 41%;
--info-a: 1;
--warning: #ffc107;
--warning-h: 188;
--warning-s: 78%;
--warning-l: 41%;
--warning-a: 1;
--danger: #dc3545;
--danger-h: 188;
--danger-s: 78%;
--danger-l: 41%;
--danger-a: 1;
--light: #f8f9fa;
--light-h: 188;
--light-s: 78%;
--light-l: 41%;
--light-a: 1;
--dark: #343a40;
--dark-h: 188;
--dark-s: 78%;
--dark-l: 41%;
--dark-a: 1;
--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}
</style>
当我检查控制台显示的警报元素时;
.alert-success {
color: hsla(calc((
0deg + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((0% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
background-color: hsla(calc((
0deg + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((100% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
border-color: hsla(calc((
0deg + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((100% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
}
但是计算结果显示;
background-color: rgba(0, 0, 0, 0)
因此警报背景上没有颜色。
我不确定 0deg 的东西。
不过。如果我只用 0 替换 0deg,我设法让它工作。
.alert-success {
color: hsla(calc((
0 + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((0% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
background-color: hsla(calc((
0 + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((100% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
border-color: hsla(calc((
0 + var(--success-h)) / 2), calc((0% + var(--success-s)) / 2), calc((100% + var(--success-l)) / 2), calc((1 + var(--success-a, 1)) / 2));
}
所以你确实想保留 deg
。无需从 Bootstrap 中删除它,您只需更新您的变量以包含相同的 deg
单位。
按照您现在的代码,您正在添加 0deg + 207
,但您应该添加 0deg + 207deg
。添加这些单位将使您的样式开始正常工作。
根据经验,您的所有样式都应包含适当的单位,与 Bootstrap 已有的单位相匹配:
:root {
--success-h: 207deg;
--success-s: 71%;
--success-l: 53%;
--success-a: 1;
}
我唯一要做的其他标注是,对于您的不透明度值,您当前正在添加 1 + 1
,这导致不透明度为 2
,超过了上限 1
100%.
如果您添加 1
+ 您的变量值只是为了在值不存在时作为后备,您可能需要考虑使用默认值。您的代码在当前状态下需要 negative 不透明度值(例如 -.5
)才能使颜色半透明。如果您希望在变量不存在时使用 1
作为回退值,您可以通过在变量引用中将默认值放在逗号之后,如下所示:
.alert-success {
color: hsla(calc(var(--success-h, 0deg) / 2), calc(var(--success-s, 0%) / 2), calc(var(--success-l, 0%) / 2), calc(var(--success-a, 1) / 2));
background-color: hsla(calc(var(--success-h, 0deg) / 2), calc(var(--success-s, 0%) / 2), calc(var(--success-l, 100%) / 2), calc(var(--success-a, 1) / 2));
border-color: hsla(calc(var(--success-h, 0deg) / 2), calc(var(--success-s, 0%) / 2), calc(var(--success-l, 100%) / 2), calc(var(--success-a, 1) / 2));
}
如果您的所有添加都是有意的,请忽略最后一点。