响应式定价表应使用语义化 html table,配合 scope 属性、aria-label 和 css grid/table 布局;移动端用媒体查询隐藏非核心列;推荐标识用 data-popular + :has() 或 class 控制;价格结构化标记实现数字对齐与多语言支持;按钮需含正确参数、状态和可访问文案。

用纯 HTML + CSS 实现响应式定价对比表,别碰 JS 框架
直接上手就能用,不需要 React、Vue 或任何构建工具。核心是语义化结构 + 灵活的 display: grid 或 display: table 布局,兼顾可访问性(aria-label、表头关联)和移动端折叠逻辑。
常见错误:用 div 堆出“看起来像表格”的结构,导致屏幕阅读器无法识别行列关系,SEO 也弱。正确做法是——该用 table 就用 table,尤其当数据本质是二维对比(功能项 × 套餐)时。
- 套餐列用
<th scope="col"> 标明列标题 <li>功能行用 <code><th scope="row"> 标明行标题 <li>关键单元格加 <code>aria-label补充说明,比如<td aria-label="基础版是否包含API访问:否">—</td> - 移动端优先隐藏非核心列(如“企业版”),用
@media (max-width: 768px)控制display: none,而非删减 DOM
让“推荐”高亮不靠 JS,用 CSS :has() + data 属性控制样式
很多方案硬塞一个 class="popular" 再写一堆 JS 切换,其实纯 CSS 就能搞定,且支持动态标记。
给推荐套餐的 <th> 加 <code>data-popular="true",然后用:
th[data-popular="true"] {
position: relative;
}
th[data-popular="true"]::before {
content: "推荐";
position: absolute;
top: -12px;
right: -12px;
background: #007bff;
color: white;
font-size: 12px;
padding: 2px 8px;
border-radius: 4px;
}
注意::has() 在 Safari 15.4+ 和 Chrome 105+ 支持良好,但旧版 Edge 不支持。如果必须兼容 IE11,改用 .plan-popular 类 + 手动维护,别强求 CSS 驱动。
价格数字对齐与货币符号处理的三个细节
用户扫一眼就要比出贵贱,数字右对齐、小数点上下对齐、货币符号位置统一,直接影响可信度。
- 价格单元格统一用
<span class="price"><span class="currency">$</span>29<span class="cents">.00</span></span>结构,CSS 控制.currency和.cents字体大小/间距 - 避免直接写
$29.00—— 中文环境可能需¥29.00,硬编码会增加多语言成本 - 年付折扣价建议用
<del>$348</del> <strong>$299</strong>,语义清晰,比 “省 $49” 更直观
“立即开始”按钮状态要反映套餐真实限制
别所有按钮都写 href="/signup"。免费版按钮应指向 /signup?plan=free,而试用版需带 trial=14 参数;已售罄的“旗舰版”按钮应禁用并加 aria-disabled="true",而不是只灰掉颜色。
示例:
<td> <a href="/signup?plan=pro&trial=14" aria-label="选择专业版,含14天免费试用" class="btn btn-primary">立即试用</a> </td> <td> <span class="btn btn-disabled" aria-disabled="true">售罄</span> </td>
按钮文案也要具体:“开始免费试用”比“立即购买”更降低决策门槛;“联系销售”比“获取定制方案”更直白。
最易被忽略的是价格更新机制——HTML 静态页没法自动同步 Stripe 或 Paddle 的最新价格。要么用构建时注入(如 eleventy 读取 YAML 配置),要么把价格部分单独做成 iframe 或通过 fetch 加载 JSON(但得处理加载失败 fallback)。静态页就老老实实手动更新,别假装它会自己变。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











