必须用参数化@mixin progress-bar封装进度条,支持$color语义名映射主题色、$height/$radius控制尺寸与圆角、$mode切换inline/block布局及配套vertical-align/margin、$disabled内联禁用态样式,并通过@supports兜底accent-color与webkit伪元素兼容性。

能成,但必须用参数化 @mixin 封装,不能只靠 CSS 自定义属性或硬写 class。 否则颜色、尺寸、禁用态、内联/块级布局这些维度一动就漏项,改起来像补丁叠补丁。
用 @mixin progress-bar 统一封装所有可配置项
进度条不是换个 background-color 就完事——高度、圆角、文字对齐、禁用交互、内联基线、条纹动画适配,全得联动。参数化 @mixin 是唯一能收口的方式:
-
$color: primary传语义名(如primary、warning),再通过$colorsmap 映射真实值,避免散落#007bff -
$height: 8px控制整体高度,$radius: 4px控制圆角;若需响应式缩放(比如移动端压到4px),把$height设为 map,内部用@each生成媒体查询 -
$mode: block或inline:选inline时必须同步设display: inline-block+vertical-align: middle+margin: 0 4px,否则和文字错位 -
$disabled: false:在 mixin 内直接写@if $disabled { opacity: 0.5; pointer-events: none; },调用时传$disabled: true即可,不用额外 class
为什么不能只靠 --progress-bg 这类 CSS 自定义属性
CSS 变量只能替换值,不能决定结构逻辑或条件渲染:
-
display: inline-block和display: block的切换无法靠变量实现,必须由@mixin根据$mode输出不同规则 - 禁用态要同时关
pointer-events、降opacity、灰掉accent-color,三个动作缺一不可;JS 更新变量时极易漏掉某一项 - 旧版 Safari 不支持
accent-color,必须 fallback 到progress::-webkit-progress-value伪元素样式——这部分只能写死在@mixin里,变量插不进去 -
progress::before这类伪元素的尺寸、背景、动画参数,CSS 变量无法穿透干预
高度变了,文字和条纹却没对齐?这是最常漏的三处
改 height 不是只改一个地方的事,三处必须同步动,否则看起来“改了但没完全改”:
-
.progress和.progress-bar的height必须一致;推荐用同一 class 同时作用于两层,例如.progress-lg, .progress-lg .progress-bar { height: 24px; } -
.progress-bar的line-height必须严格等于新高度(如24px),否则百分比文字贴顶或被截断;别用padding-top挤,会撑宽破坏width: 75%计算 - 启用条纹(
bg-striped)时,background-size和@keyframes中的background-position值(如1rem 0)必须按新高度等比缩放,否则条纹错位
真正麻烦的从来不是写第一版,而是后续改一个圆角要翻五六个文件、调一个禁用态要查三处 JS 逻辑——把所有可变维度收进 @mixin 参数,才是可持续定制的起点。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











