用语义化html(section/article/figure)+ css grid(auto-fill/minmax)实现响应式商品列表,配合viewport、alt、aria属性保障可访问性与移动端适配。

商品列表怎么用纯 HTML + CSS 实现响应式栅格
纯 HTML 做电商页面,核心不是“能不能”,而是“值不值得全手写”。现代电商页面依赖动态数据和交互,但静态商品展示页完全可行——关键在结构语义化和 CSS 栅格控制。
别用 <table> 排商品,语义错误且难响应。用 <code><section></section> 包裹商品组,每个商品用 <article></article>,内部用 <figure></figure> 放图、<figcaption></figcaption> 放标题价格:
<section class="product-grid"><article class="product-item"><figure>
@@##@@
<figcaption><h3>轻量跑鞋</h3>
<p class="price">¥299</p>
</figcaption></figure></article></section>
-
display: grid是首选,用grid-template-columns: repeat(auto-fill, minmax(280px, 1fr))实现等宽自适应,比浮动或 inline-block 更稳 - 图片必须加
alt,否则无障碍访问失败,部分电商平台审核会卡住 - 别在
<img src="shoe.jpg" alt="运动鞋">上硬设width/height,用 CSS 控制尺寸并配合object-fit: cover防止变形
价格和促销信息怎么标才合规又清晰
价格不是随便写个 <p>¥199</p> 就完事。国内电商法要求原价、现价、折扣信息必须可验证,HTML 层面要靠语义标签+属性支撑。
- 现价用
<span class="price-current">¥199</span>,原价必须用<del class="price-original">¥299</del>,不能只靠颜色区分 - 如果有“限时折扣”,加
aria-label="距结束还剩 2 小时 15 分钟",屏幕阅读器能读出,也方便后续 JS 动态更新 - 避免把价格包进按钮里(如
<button>¥199 立即购买</button>),按钮内容应是动作,不是数值
点击“加入购物车”按钮没反应?先检查这三个地方
纯 HTML 页面无法真正加购,但用户点击无反馈是重大体验缺陷。哪怕不连后端,也要有基础交互反馈,否则会被当成页面失效。
- 按钮必须带
type="button",否则在表单内可能触发表单提交,刷新页面 - 加
aria-pressed="false",点击后 JS 切成true,配合 CSS 的[aria-pressed="true"]改背景色,视觉有反馈 - 如果用
<a href="#"></a>伪装按钮,务必加event.preventDefault(),否则跳到页面顶部,尤其长列表里极其干扰
为什么你写的商品页在 iPhone 上文字挤成一团
根本原因往往不是 CSS 写错了,而是漏了这行 meta 标签:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
没有它,iOS Safari 会按 980px 宽度渲染,再缩放显示,导致字体、间距全部失真。
- 别写
user-scalable=no,禁用缩放违反 WCAG 可访问性标准,部分应用商店上架被拒 - 字体大小优先用
rem,根元素font-size按屏幕宽度 JS 动态调(例如 375px 设为 16px,414px 设为 18px),比固定px或单纯em更稳 - 商品标题行数限制用
display: -webkit-box+-webkit-line-clamp: 2,iOS Safari 支持良好,但得配overflow: hidden和word-break: break-word
真正麻烦的从来不是写几行 HTML,而是每个标签背后要对齐语义规范、可访问性要求和移动端渲染特性。漏掉一个 alt、少一行 viewport、误用一个 <div> 替代 <code><article></article>,都可能让页面在特定场景下直接“不可用”。











