CSS项目实战之数据仪表盘片段_简单的矩形统计图设计

1次阅读

flex 布局实现矩形统计图最轻量且响应友好:容器设 display: flex + align-items: center,条形统一 height: 24px、flex: 0 0 [比例]%,配合 min-width: 0 安全收缩;颜色用 css 变量,宽度优先由 js 注入 flexbasis,纯 css 场景慎用 calc();ie11 不支持 gap,需用 margin-right + :last-child 兼容;文字标签与条形同级 flex 布局对齐,禁用 vertical-align 和 line-height。

CSS项目实战之数据仪表盘片段_简单的矩形统计图设计

flex 布局画矩形统计图,别碰 Floatposition: absolute

矩形统计图(比如横向柱状图)本质是「等高、宽度按数据比例缩放的色块排列」,flex 是最轻量且响应友好的选择。用 float 会破坏文档流,导致父容器高度塌陷;用 absolute 则失去弹性,数据一变就得重算 left/top。

  • 给容器设 display: flex + align-items: center,保证所有条形垂直居中
  • 每个条形单独设 height: 24px(统一高度),flex: 0 0 % 控制宽度
  • 避免写死 width,否则小屏下溢出或换行——flex-basis 配合 min-width: 0 才能安全收缩
  • 颜色用 CSS 变量(如 --bar-color: #4a90e2),方便后续主题切换

calc() 算宽度时,注意单位混用会直接失效

常见错误是写成 width: calc(100% - 20px) 却忘了父容器有 padding,或者在 flex-basis 里混用 rem%,浏览器直接忽略该声明。

  • 宽度计算只在「已知最大值」场景下才用 calc():比如总宽固定为 300px,当前数据占 65%,就写 flex-basis: calc(300px * 0.65)
  • 更稳妥的做法是让 JS 计算好比例后注入 style 属性:element.style.flexBasis = `${ratio * 100}%`
  • 如果必须纯 CSS,用 grid-template-columns 配合 repeat() + minmax() 更可控,但灵活性下降

IE11 下 flexgap 不生效,得手动加 margin

现代写法用 gap: 8px 分隔条形很清爽,但 IE11 完全不识别,所有条形会挤在一起,连边框都看不清。

  • 兼容方案:给每个条形加 margin-right: 8px,再给最后一个用 :last-child { margin-right: 0 }
  • 别用 :nth-last-child(1),IE11 对伪类支持不稳定
  • 如果条形数量动态,JS 渲染时直接跳过最后一个元素的 margin 更可靠
  • 顺带一提:flex-wrap: wrap 在 IE11 里行为异常,横向图一律禁用

文字标签和数值对齐,line-heightvertical-align 别乱套

条形右侧常跟数值标签(如「32%」),很多人用 vertical-align: middle 配合 inline-block,结果在不同字体下上下浮动,尤其遇到中文+数字混合时。

立即学习前端免费学习笔记(深入)”;

  • 统一把标签也放进 flex 容器,和条形同级,用 align-items: center 对齐
  • 避免设 line-height,它依赖字体度量,而 height + padding 更稳定
  • 数值标签用 white-space: nowrap 防止断行,再加 overflow: hidden + text-overflow: ellipsis 应对超长
  • 如果标签需要右对齐(比如放在条形左边),改用 justify-content: space-between,别靠 text-align

事情说清了就结束。真正麻烦的不是画出矩形,而是当数据从 12 个变成 200 个时,dom 节点数、重排开销、键盘焦点顺序、屏幕阅读器读取逻辑全得重新过一遍。

text=ZqhQzanResources