最快实现技能条用<progress>标签,现代浏览器原生支持且语义清晰,但IE全系不兼容;需兼容IE时应降级为<div>+ARIA属性,并手动处理可访问性与键盘支持。
<progress> 最快实现技能条,但注意浏览器兼容性现代浏览器直接支持 <progress> 标签,语义清晰、无需 JS 就能展示百分比进度。但它在 IE 全系(包括 IE11)中完全不渲染,只显示空白或 fallback 文本。
实操建议:
<progress value="65" max="100"></progress>,配合 CSS 调色即可<div> + 内联宽度控制,<progress> 仅作语义层存在(可加 role="progressbar" 提升可访问性)value 必须是数字,且不能小于 0 或大于 max,否则会触发无效状态(部分浏览器显示空条)默认的 <progress> 样式极简,各浏览器渲染差异大(比如 Chrome 的轨道是灰色细线,Firefox 更粗)。想统一效果,必须重置伪元素。
关键点:
立即学习“前端免费学习笔记(深入)”;
progress::-webkit-progress-bar 和 progress::-moz-progress-bar 分别控制轨道和填充色value 和 max 自动计算,**不要**用 width 手动设 —— 否则破坏语义与可访问性border-radius: 8px,但需同时作用于轨道和填充伪元素,否则边缘错位height: 12px 是底线,再小会导致触摸区域过窄value 属性,用 JS 操作更稳直接在 HTML 里写死 value="72" 只适合静态展示。一旦要响应用户操作或数据变化,就得靠 JS 更新。
正确做法:
el.value = 85(赋值数字),不是 el.setAttribute('value', '85') —— 后者可能不触发 UI 重绘value = Math.max(0, Math.min(100, newValue)),避免负数或超 100 导致异常value(不生效),得用 requestAnimationFrame 逐帧修改 value
progress 上加 aria-valuenow 和 aria-valuemin/aria-valuemax,方便读屏软件识别<div> 实现最可控,但得自己管语义和键盘支持当需要精确控制动画曲线、多段色块(比如“精通”用绿色、“熟练”用橙色)、或嵌入图标时,<progress> 就力不从心了。
这时用两个嵌套 <div> 是最轻量可靠的方案:
<div class="skill-bar" role="progressbar" aria-valuenow="68" aria-valuemin="0" aria-valuemax="100"> <div class="skill-fill" style="width: 68%;"></div></div>
要点:
div 加 role="progressbar" 和 ARIA 属性,补全可访问性div 用 style="width" 或 CSS 变量控制长度,方便 JS 更新tabindex="0" + 监听 keydown(如方向键微调),否则无法被键盘用户聚焦div 并排,用 flex 布局 + 百分比宽度分配