火次果
火次果

暂无菜单项

首页/文章/技术文章/web前端/HTML5/
打开 MD 链接

HTML 类名与 id 命名:六条实用规范

发布于 4天前
2

类名与 id 是 HTML 里改动最频繁、约定却最少的部分。名字一旦与样式或脚本耦合,改一处要动三处。下面六条约定按改动成本从低到高排列。

屏幕上显示彩色代码片段,用于说明类名与 id 的命名写法
命名规范的价值体现在改动时:样式、脚本、模板三处的耦合越低越好

六条约定

  1. 类名全小写,单词之间用短横线。写 user-avatar,不写 userAvatar 或 User_Avatar。
  2. 名字描述用途,不描述外观。price-red 换成 price-discount,改配色时不必动名字。
  3. id 在页面内保持唯一,留给确实需要唯一性的场合:锚点跳转、label 的 for 关联、表单控件联动、脚本挂载点。
  4. 不用 class 充当 JS 钩子。交互标记写进 data-* 属性,样式与行为各占一层。
  5. 缩写只用公认写法。nav、btn、cta 可以留,自造缩写跳过。
  6. 同一模块内的元素统一前缀。card-title、card-body,避免通用名字在组合时撞车。

正反对照

<!-- 改动成本高的写法 -->
<div class="box RedBox" id="top" onclick="toggleMenu()"></div>

<!-- 按约定写 -->
<div class="site-nav" id="site-nav" data-toggle="menu"></div>

外观词不进类名;行为不写在 onclick 属性里,改用 data-* 标记后统一监听。

钩子分离后的监听写法

document.addEventListener('click', (event) => {
  const trigger = event.target.closest('[data-toggle]');
  if (!trigger) return;

  const targetId = trigger.dataset.target;
  document.getElementById(targetId)?.classList.toggle('is-open');
});

行为绑定到 data 属性,类名调整不再影响脚本。

检查清单

  • 类名中不含大写字母与下划线;
  • 名字描述用途而非视觉表现;
  • id 唯一,只在需要唯一性的场景出现;
  • JS 钩子写在 data-* 属性上;
  • 同一模块的元素前缀一致。

例外情况

组件作用域方案(CSS Modules、Vue scoped、CSS-in-JS)会生成局部类名,全局冲突风险下降,但 data-* 钩子与命名可读性这两条约定仍然有效。

常见问题(FAQ)

类名可以用驼峰吗?
能正常运行,但 HTML 属性对大小写不敏感,浏览器会统一转成小写,跨文件对照时容易出错。统一小写加短横线更稳。
一个元素可以有几个 class?
没有数量上限。建议按职责拆分:布局一个类、样式一个类、状态一个类(如 is-open)。
哪些场合必须用 id?
锚点跳转、label 的 for 关联、表单控件联动、脚本挂载点。纯样式用途不应依赖 id,避免唯一性带来的优先级问题。
data-* 能存任意数据吗?
属性值只能是字符串。数组与对象要先序列化,读取 dataset 后按字符串比较,数字需要显式转换。
旧项目里混乱的命名要不要一次性改?
不建议整体重写。按模块推进,每改动一处就把该模块的命名统一到规范,改动风险可控。
class选择器data属性id选择器代码可维护性命名规范
支持作者
如果这篇内容对你有帮助,可以请作者喝杯咖啡
0 点赞
0 收藏
分享
0 讨论
反馈
0 / 600
细中粗
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
创作
社区
购物
会员
近期热门

暂无数据

火次果
火次果
首页
资迅中心
小店
AI导航
社区
所有的成功,都源自一个勇敢的开始
不辜负每一个勇敢的开始
关于FAQ协议
火次果 © 2026鲁ICP备2025164830号-1