语义正确的 table 是响应式价格对比表首选,需用 thead/tbody/th[scope] 保障可访问性;移动端用 css grid 堆叠为卡片,每行显式定义标题/值位置;慎用 box-shadow+transform,推荐背景色与边框变化;字体适配混合使用 em/ch/px,价格数字启用 tabular-nums 对齐。

用 table 实现响应式价格对比表,别用 div 模拟表格
语义正确的 table 是首选,不是“过时”,而是浏览器原生支持表头关联、键盘导航、屏幕阅读器识别。用 div 堆砌表格结构会破坏可访问性,且媒体查询写起来更绕。关键在用好 thead、tbody 和 th[scope]。
实操建议:
-
th必须加scope="col"(列头)或scope="row"(行头),否则响应式折叠后无法关联数据单元格 - 避免给
table设固定宽度,用width: 100%+min-width控制最小可视范围 - 移动端优先:默认堆叠成卡片式,用
@media (min-width: 768px)恢复横向布局
移动端用 CSS Grid 实现“单列堆叠”,不是靠 display: block
简单把 tr 设为 block 会导致 td 失去语义和对齐能力,而且无法保证标题与对应值的视觉绑定。正确做法是用 grid 把每行变成独立卡片,显式定义标题/值的位置关系。
示例关键代码:
@media (max-width: 767px) {
.price-table {
display: grid;
gap: 1rem;
}
.price-table tbody tr {
display: grid;
grid-template-columns: [label] auto [value] 1fr;
align-items: center;
}
.price-table th:first-child,
.price-table td:first-child {
grid-column: label;
}
.price-table th:not(:first-child),
.price-table td:not(:first-child) {
grid-column: value;
}
}
这样每组“功能名 + 价格”始终成对出现,不会错位。
价格栏高亮和悬停效果,慎用 box-shadow 和 transform
在低端安卓机或旧版 Safari 上,box-shadow + transform: scale() 组合容易触发重绘卡顿,尤其当表格行数 > 5 时。更稳妥的做法是只改背景色+边框粗细,或用 outline 替代阴影。
推荐写法:
- 悬停时仅增加
border-color和轻微background-color变化(用hsl()方便控制明度) - 高亮某列(如“推荐方案”)用
background: linear-gradient(90deg, #f8f9fa, #fff),比纯色更有层次但不加重渲染 - 避免在
:hover中修改height或padding,防止布局抖动
字体与间距适配不同设备,别依赖 rem 单一单位
rem 在 iOS Safari 中缩放页面时可能失效,而纯 px 又无法响应系统字号设置。实际项目中混合使用更可靠:
- 基础文字大小用
em(继承自body的font-size),保证随系统设置变化 - 行高、内边距用
ch或ex(基于字符宽高),比如padding: 0.5ch 1ch,比rem更贴合文本节奏 - 价格数字用
font-variant-numeric: tabular-nums,确保“¥99”和“¥1299”数字对齐
复杂点在于各列内容长度差异大时,Grid 的 auto-fit 容易导致价格列被压缩——得用 minmax(150px, 1fr) 锁定最小宽度,同时允许扩展。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











