真正稳定跨元素可用的核心全局属性只有id、class、data-*、title、lang、dir、style、tabindex(需显式设为tabindex="0");其他如contenteditable、draggable、hidden等虽标称全局,但受限于语义、上下文或浏览器支持,并非无条件生效。

全局属性能用在任意HTML标签上
只要浏览器支持HTML5,id、class、data-*、hidden、tabindex这些属性就能写在任何标签里——哪怕<div hidden>、<code><span data-id="42"></span>、<input tabindex="0">都合法。它们不关心元素语义,只提供通用能力。
但不是所有全局属性在所有元素上都有实际效果。比如contenteditable对<img>没意义,hidden在<script></script>上不会阻止脚本执行(它只影响渲染)。
-
lang和dir会影响文本渲染和屏幕阅读器行为,即使用在<button></button>或<footer></footer>里也有效 -
title在<input>上显示提示,在<canvas></canvas>上也能触发悬停气泡,但对<meta>无效(非渲染元素) -
draggable默认为false,设成true后<p></p>或<article></article>才能被拖拽,但<select></select>本身已有原生拖拽逻辑,加了可能冲突
元素属性只能用在特定标签里
像src只能出现在<img>、<script></script>、<iframe></iframe>等资源加载类标签中;href只属于<a></a>、<link>、<area>;alt是<img>和<input type="image">的专属属性。浏览器解析时会直接忽略错位使用的元素属性——比如<div src="logo.png">里的<code>src会被静默丢弃,控制台也不会报错。
这类属性往往绑定着底层行为:设了required,表单提交前会触发原生校验;用了loading="lazy",浏览器才可能延迟加载图片;type="submit"让<button></button>具备提交功能。删掉它们,对应功能就没了。
-
placeholder只对<input>和<textarea></textarea>生效,写在<span></span>里完全无反应 -
rows和cols是<textarea></textarea>专用,<input>不认;反过来maxlength在<input>和<textarea></textarea>都可用,但它是全局属性(HTML5新增),不是<textarea></textarea>独有 -
form属性看似像全局属性(可写在<button></button>、<input>、<output></output>上),但它其实属于“表单关联属性”,仅限于能脱离表单容器工作的表单控件,不属于真正意义上的全局属性
布尔属性的写法容易混淆
像disabled、checked、hidden这类布尔属性,只要存在就代表true,不写就是false。但注意:hidden=""、hidden="hidden"、hidden="anything"效果完全一样,浏览器只看有没有这个属性名,不解析值。
而contenteditable是例外——它不是布尔属性,必须显式写contenteditable="true"或contenteditable="false",写成contenteditable或contenteditable=""的行为未定义,不同浏览器可能表现不一致。
-
draggable="auto"是默认值,"true"/"false"才强制启用或禁用 -
spellcheck同理,不能只写spellcheck,得配"true"或"false" -
aria-*属性虽属全局,但值必须符合ARIA规范,比如aria-hidden="true"合法,aria-hidden="yes"会被忽略
自定义data属性要遵守命名规则
data-开头的属性是标准的全局属性,但命名有硬性限制:破折号后必须跟字母或下划线,不能以数字开头,不能含大写字母(虽然浏览器可能容忍,但DOM API读取时会自动转为小写)。
比如data-user-id="123"合法,data-1user="abc"或data-User-Id="123"不符合规范。JavaScript里用element.dataset.userId访问(驼峰化),而不是dataset["user-id"]——后者在旧版Chrome中可能返回undefined。
- 多个单词用短横线连接,JS自动转驼峰:
data-first-name→dataset.firstName - 含数字需前置字母:
data-id-123→dataset.id123,但data-123-id无法通过dataset访问 - 避免与未来HTML标准冲突,别用
data-class或data-style这类易混淆名











