HTML规范定义的全局属性共27个,如id、class、tabindex等;style和data-*虽广泛支持但不属于规范定义的全局属性。

哪些属性真的能用在所有 HTML 元素上
不是所有带“全局”字样的属性都真正通用。比如 contenteditable 对 <script></script> 或 <meta> 无效,hidden 在 里也不起作用——浏览器会忽略它,但不会报错。
真正稳定、跨元素可用的核心全局属性只有这几个:id、class、data-*、title、lang、dir、style、tabindex(注意:布尔值需显式设为 tabindex="0" 才可聚焦)。
-
aria-*系列属于无障碍规范,虽被归为“全局”,但必须配合语义正确的角色(如role="button")才有效,单独加aria-label到<div> 上可能被屏幕阅读器跳过<li> <code>draggable默认是auto,不是true;图片和链接默认可拖,<p></p>默认不可拖,得显式写draggable="true" -
exportparts是极少数只对含 Shadow DOM 的自定义元素有意义的属性,普通页面基本用不到 - 一个页面中
id值重复,getElementById只返回第一个匹配项,且 HTML 验证器会警告,但 JS 不报错 -
class支持多值,但空格敏感:class="btn primary"和class="btn primary"(两个空格)会被解析为三个类名:["btn", "", "primary"],导致classList.contains("primary")返回false - 用
classList操作比直接改className更安全,例如el.classList.add("active")不会覆盖已有类,而el.className += " active"容易引入多余空格或重复 - 如果属性名含数字开头,比如
data-1st-place,JS 中无法通过dataset.1stPlace访问(变量名非法),得用dataset["1st-place"] -
data-后只能跟 ASCII 字母、数字、连字符(-)、点(.)、下划线(_),不能有冒号(:)或空格,data-user:name是无效的,会被浏览器静默忽略 - 值始终是字符串,哪怕写
data-count="0",取出来也是"0",需要手动转类型:Number(el.dataset.count) - 用 JS 切换
hidden会触发重排(reflow),而切换display也会;但若只是临时隐藏/显示,visibility: hidden更轻量(保留占位,不触发重排) -
hidden不影响子元素的focus()行为:父级hidden时,子元素调用focus()无效,且不会抛错,容易误以为焦点逻辑出问题 - 服务端渲染时,
hidden属性会被原样输出,但某些 SSR 框架(如 Next.js)的useEffect初始化前,该属性可能已被 JS 移除,造成闪动
id 和 class 在 DOM 操作中的实际差异
id 是浏览器内部哈希索引,document.getElementById("x") 是 O(1) 查找;而 class 依赖 CSS 选择器引擎,document.querySelector(".x") 或 document.getElementsByClassName("x") 都要遍历匹配,尤其在深层嵌套或大量节点时有感知延迟。
data-* 属性读写时的命名陷阱
HTML 中写 data-user-id="123",JS 里访问的是 dataset.userId(连字符变驼峰,首字母小写),不是 dataset.userid 或 dataset.Userid。大小写不匹配就拿不到值。
立即学习“前端免费学习笔记(深入)”;
hidden 属性与 display: none 的行为区别
hidden 是布尔属性,写成 hidden 或 hidden="" 效果一样,等价于 display: none;但 hidden="until-found" 是个例外——它让元素参与布局(占位),只是内容不可见,类似 content-visibility: hidden,目前仅 Chromium 120+ 支持,Firefox 和 Safari 尚未实现。
真正要注意的是:全局属性不是万能胶,它们的生效前提往往是元素已挂载、浏览器完成解析、且没有被更高优先级样式或脚本覆盖。写之前先确认目标元素是否在 DOM 中、是否被其他规则干扰,比盲目堆属性更有效。



















