原生HTML购物车结构需语义清晰、留好JS钩子:用包裹商品项,每项含唯一data-item-id;数量用;删除按钮用;结算区用包裹,总价用,优惠用,提交用;商品用,图片带alt,价格统一;class名遵循BEM规范,小写中划线。

怎么用原生 HTML 搭出能跑的购物车结构
纯 HTML 无法实现增删改、实时计算或持久化,但可以构建语义清晰、可访问性强、便于后续 JS 注入逻辑的骨架。关键不是“看起来像”,而是“结构对、留好钩子”。
-
<ul class="cart-items"></ul>包裹商品列表,每项用<li role="group">明确语义,方便屏幕阅读器和 JS 定位 - 每个商品块必须有唯一
data-item-id属性,比如data-item-id="prod-1024",JS 后续操作依赖它,别用 class 或 text 内容来识别 - 数量输入框强制用
<input type="number" min="1" value="1">,避免用户输负数或字母,也省去 JS 校验第一步 - 删除按钮统一用
<button type="button" aria-label="删除 小米耳机"></button>,不写onclick,把交互逻辑全留给外部 JS
结算区域为什么不能只靠 堆出来
结算区不是装饰性模块,它承载价格汇总、优惠判断、提交入口三重职责,HTML 结构直接影响 JS 取值逻辑和无障碍体验。
- 总价必须用
<span id="cart-total">¥0.00</span> 而非 <div class="total">,ID 是 JS 快速定位更新的最小成本方式
<li>优惠信息(如“满 99 减 10”)建议用 <code><dl>
<dt>优惠</dt>
<dd id="discount-amount">-¥10.00</dd>
</dl>,语义化且支持 JS 精准替换 <dd></dd> 内容
- 提交按钮必须是
<button type="submit"></button> 并放在 <form></form> 内,哪怕后端暂不接管——否则回车无法触发,移动端键盘“完成”键失效
- 禁用状态要靠
disabled 属性控制,而不是仅靠 CSS 加灰,否则键盘 Tab 仍能聚焦、屏幕阅读器无法感知
商品列表里图片、标题、价格怎么组织才不翻车
看似简单,但结构错位会导致 JS 批量操作时取错节点、CSS 样式穿透失控、甚至影响 SEO。
- 每件商品用
<article></article> 包裹,它是 HTML5 中最贴近“独立内容单元”的语义标签,比 <div> 更可靠
<li>图片必须带 <code>alt,即使只是“小米耳机 黑色”,空 alt="" 会跳过,纯占位图也要写描述性文字
- 价格统一用
<span class="price">¥199.00</span>,不要拆成“¥”和数字两部分,否则 JS 计算时需额外拼接或正则提取
- 库存状态(如“仅剩 3 件”)建议用
<small class="stock"></small> 而非 <p></p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill10246" title="HTML Text Extract"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20dee630206.jpg" alt="HTML Text Extract" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill10246" title="HTML Text Extract">HTML Text Extract</a>
<p>从HTML页面(URL、文件或标准输入)中提取主体内容文本,去除导航、页脚、广告和模板文本。可直接传递给readability_check或其他文本工具。</p>
</div>
<a href="/xiazai/skill10246" title="HTML Text Extract" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>,避免被误读为主要内容,也方便 CSS 控制字体大小
为什么 class 名不能叫 “cart-box” 或 “item-wrap”
这类泛化命名在多人协作或后期维护时会迅速失效:没人知道 “box” 到底包了什么,“wrap” 是包裹样式还是逻辑容器。
立即学习“前端免费学习笔记(深入)”;
- 用功能导向命名:
cart-item、cart-item__quantity、cart-summary__total,双下划线表示后代关系,BEM 风格虽老但极其耐读
- 避免用状态命名如
is-disabled,状态该由 JS 动态加 class 控制,HTML 里只保留基础结构类
- 如果项目用 CSS-in-JS 或 Shadow DOM,class 名可更简短,但前提是团队明确约束——否则默认按 BEM 处理
- 所有 class 名一律小写+中划线,不出现大写字母或下划线,防止 Windows 文件系统或某些构建工具大小写误判
真正难的不是搭出这个结构,而是让每一处 data- 属性、id、class 和语义标签都经得起 JS 批量操作、屏幕阅读器逐行朗读、以及三个月后你自己再看时不用翻注释猜意图。
结算区不是装饰性模块,它承载价格汇总、优惠判断、提交入口三重职责,HTML 结构直接影响 JS 取值逻辑和无障碍体验。
- 总价必须用
<span id="cart-total">¥0.00</span>而非<div class="total">,ID 是 JS 快速定位更新的最小成本方式 <li>优惠信息(如“满 99 减 10”)建议用 <code><dl> <dt>优惠</dt> <dd id="discount-amount">-¥10.00</dd> </dl>,语义化且支持 JS 精准替换<dd></dd>内容 - 提交按钮必须是
<button type="submit"></button>并放在<form></form>内,哪怕后端暂不接管——否则回车无法触发,移动端键盘“完成”键失效 - 禁用状态要靠
disabled属性控制,而不是仅靠 CSS 加灰,否则键盘 Tab 仍能聚焦、屏幕阅读器无法感知 - 每件商品用
<article></article>包裹,它是 HTML5 中最贴近“独立内容单元”的语义标签,比<div> 更可靠 <li>图片必须带 <code>alt,即使只是“小米耳机 黑色”,空alt=""会跳过,纯占位图也要写描述性文字 - 价格统一用
<span class="price">¥199.00</span>,不要拆成“¥”和数字两部分,否则 JS 计算时需额外拼接或正则提取 - 库存状态(如“仅剩 3 件”)建议用
<small class="stock"></small>而非<p></p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill10246" title="HTML Text Extract"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20dee630206.jpg" alt="HTML Text Extract" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill10246" title="HTML Text Extract">HTML Text Extract</a> <p>从HTML页面(URL、文件或标准输入)中提取主体内容文本,去除导航、页脚、广告和模板文本。可直接传递给readability_check或其他文本工具。</p> </div> <a href="/xiazai/skill10246" title="HTML Text Extract" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>,避免被误读为主要内容,也方便 CSS 控制字体大小 - 用功能导向命名:
cart-item、cart-item__quantity、cart-summary__total,双下划线表示后代关系,BEM 风格虽老但极其耐读 - 避免用状态命名如
is-disabled,状态该由 JS 动态加 class 控制,HTML 里只保留基础结构类 - 如果项目用 CSS-in-JS 或 Shadow DOM,class 名可更简短,但前提是团队明确约束——否则默认按 BEM 处理
- 所有 class 名一律小写+中划线,不出现大写字母或下划线,防止 Windows 文件系统或某些构建工具大小写误判
商品列表里图片、标题、价格怎么组织才不翻车
看似简单,但结构错位会导致 JS 批量操作时取错节点、CSS 样式穿透失控、甚至影响 SEO。
为什么 class 名不能叫 “cart-box” 或 “item-wrap”
这类泛化命名在多人协作或后期维护时会迅速失效:没人知道 “box” 到底包了什么,“wrap” 是包裹样式还是逻辑容器。
立即学习“前端免费学习笔记(深入)”;
真正难的不是搭出这个结构,而是让每一处 data- 属性、id、class 和语义标签都经得起 JS 批量操作、屏幕阅读器逐行朗读、以及三个月后你自己再看时不用翻注释猜意图。


















