不推荐用展示商品列表,因其仅适用于参数对比表等强结构化数据;强行使用会导致响应式断裂、语义错位和维护成本高。

用 <table> 展示商品列表,真不推荐
<p>现代电商页面里,<code><table> 仅适合展示强结构化、行列语义明确的数据(比如参数对比表、价格明细、库存台账),而不是商品列表本身。强行用 <code><table> 布局商品卡片,会带来三个硬伤:<strong>响应式断裂</strong>(小屏必须横向滚动)、<strong>语义错位</strong>(商品不是“表格数据”,而是独立内容单元)、<strong>维护成本高</strong>(每加一列都要改 <code><tr><td> 嵌套,JS 动态渲染也别扭)。
<p>常见错误现象:<code><table class="product-list"> 里塞满 <code><tr><td><div class="card">...</div></td></tr> —— 这本质是用表格“模拟”布局,违背 HTML5 语义原则,也挡住了 CSS Grid/Flex 的自然流式能力。
dl + dt/dd 是图文混排商品列表的轻量解法
dl + dt/dd 是图文混排商品列表的轻量解法当商品项数量不多(≤20)、需严格图文对应(如“品牌:Apple”、“型号:iPhone 15 Pro”),定义列表 <dl></dl> 是最贴切的语义选择。它天然表达“术语-描述”关系,比 <ul></ul> 更精准,比 <table> 更灵活。
<p>实操要点:</p>
<ul>
<li>
<code><dt></dt> 放图或图标(<img src="..." alt="iPhone 主图">),<dd></dd> 放标题、价格、摘要等文本块
<dl></dl> 为 display: grid 或 flex,避免默认垂直堆叠导致图文分离<div> 在 <code><dt></dt> 或 <dd></dd> 里破坏语义;若需按钮/交互,直接放 <button></button> 即可
示例片段:
- @@##@@
-
iPhone 15 Pro
¥7,999
真正要撑起电商商品流,用 grid + article 才对路
首页瀑布流、分类页网格、搜索结果页——这些场景下,商品是平等的独立内容实体,<article></article> 是唯一正确的容器语义,配合 CSS Grid 实现自适应布局才是工业级做法。
关键差异点:
-
<article></article>表明每个商品可被独立索引、分享、订阅;<section></section>或<div> 不具备该语义 <li> <code>grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))能自动适配从手机到4K屏,而repeat(3, 1fr)在 iPad mini 上直接溢出 - 图片必须用
<img src="iphone.jpg" alt="iPhone 15 Pro">+srcset+sizes,不能靠 background-image —— 否则爬虫和读屏器无法识别 - 每个
<article></article>应有唯一id(如id="prod-1024"),方便 JS 定位、状态管理、SEO 锚点 - 用
colspan/rowspan合并单元格却未同步更新语义 → 辅助技术解析错乱 - 没加
<caption></caption>→ 搜索引擎无法抓取表格主题,影响 SEO - 移动端不做响应式降级 → 强行缩小字体或出现横向滚动条,违反 WCAG 1.4.10
性能提醒:Grid 布局本身无性能损耗,但若商品项超百个,务必配合 IntersectionObserver 做图片懒加载,否则首屏渲染卡顿。
表格只在一种场景下不可替代:商品参数对比
当用户需要横向比较 iPhone、Pixel、S24 的摄像头、电池、重量等离散属性时,<table> 是唯一符合语义且无障碍友好的方案。此时必须用 <code><thead> 包含产品名称行,<code><tbody> 每行一个参数项,<code><th scope="row"> 标注参数名,<code><th scope="col"> 标注产品名。
<p>容易踩的坑:</p>
<ul>
<li>遗漏 <code>scope 属性 → 读屏器无法关联行列,视障用户完全无法理解对比逻辑
复杂点在于:纯 CSS 无法让表格在小屏转为“卡片堆叠”,必须靠 JS 切换 DOM 结构或用 @media 配合 display: contents(注意 Safari 15.4+ 才稳定支持)。这点常被忽略,导致移动端参数页体验断层。











