自定义数据属性:data-*
使用 data-* 属性将自定义数据直接存储在元素上。
自定义数据属性:data-* 是 CoddyKit 上的免费 HTML Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 HTML Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 HTML Academy 课程共包含 4 节课。
什么是 data-* 属性?
自定义 data 属性可以让您直接在 HTML 元素上存储额外信息:
<button data-user-id="42" data-action="delete">Delete User</button>
<li data-category="frontend" data-level="beginner">HTML</li>
<!-- Format: data-[name]="value" -->
<!-- Any alphanumeric name after data- is valid -->
<!-- Values are always strings -->data-* 存在的原因
在有 data-* 之前,开发者会将额外数据存储在:
- 隐藏输入框中(杂乱)
- CSS 类名中(脆弱)
rel或title等非标准属性中(无效的 HTML)
HTML5 将 data-* 正式确立为嵌入自定义数据的官方方式,且不会影响语义或呈现。
命名规则
data-* 属性的命名规则:
- 必须以
data-开头 - 名称可以包含小写字母、数字、连字符、下划线和句点
- 名称中不能有大写字母(HTML 规范会将其转换为小写)
- 名称不能以
xml开头
<div data-user-id="1">OK</div>
<div data-product-category="tools">OK</div>
<!-- <div data-XML-thing="1">BAD: starts with xml -->
<!-- <div data-MyProp="1">BAD: uppercase in name -->在 JavaScript 中读取 data-*
通过 dataset 属性访问自定义数据:
<button id="btn"
data-user-id="42"
data-action="delete"
data-confirm-message="Are you sure?"
>
Delete
</button>
<script>
const btn = document.getElementById('btn');
console.log(btn.dataset.userId); // '42'
console.log(btn.dataset.action); // 'delete'
console.log(btn.dataset.confirmMessage); // 'Are you sure?'
// Note: data-user-id → dataset.userId (camelCase conversion)
</script>使用 dataset 写入 data-*
通过 dataset 设置和移除 data 属性:
const card = document.querySelector('.card');
// Set:
card.dataset.status = 'active';
// Now: <div class="card" data-status="active">
// Delete:
delete card.dataset.status;
// Now: data-status is removed
// Alternatively with setAttribute:
card.setAttribute('data-status', 'inactive');
card.removeAttribute('data-status');从连字符到 camelCase 的转换
dataset API 会将使用连字符分隔的名称转换为 camelCase:
<!-- HTML attribute JavaScript dataset property -->
data-user-id → dataset.userId
data-product-category → dataset.productCategory
data-max-retries → dataset.maxRetries
data-is-active → dataset.isActiveCSS 属性选择器
在 CSS 选择器中使用 data 属性:
[data-status="active"] {
color: green;
}
[data-status="inactive"] {
color: gray;
text-decoration: line-through;
}
/* Present but any value: */
[data-featured] {
border: 2px solid gold;
}工具提示模式
使用 data 属性构建纯 CSS 工具提示:
<span data-tooltip="This is a tooltip">Hover me</span>
/* CSS: */
/*
[data-tooltip] {
position: relative;
}
[data-tooltip]::after {
content: attr(data-tooltip); /* attr() reads the attribute value */
position: absolute;
background: #333;
color: white;
padding: 0.25rem 0.5rem;
border-radius: 4px;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.2s;
}
[data-tooltip]:hover::after { opacity: 1; }
*/状态跟踪模式
使用 data 属性跟踪组件状态:
<button data-state="off" id="toggle">Toggle</button>
<script>
document.getElementById('toggle').addEventListener('click', function() {
const state = this.dataset.state;
this.dataset.state = state === 'off' ? 'on' : 'off';
this.textContent = this.dataset.state === 'on' ? 'Active' : 'Toggle';
});
</script>
/* CSS: */
/* [data-state="on"] { background: green; color: white; } */data-* 与 JavaScript 变量的对比
以下是使用 data-* 与在 JavaScript 中存储数据的适用场景:
- 对于直接对应某个 DOM 元素且可能被 CSS 读取的值,请使用 data-*
- 对于不依附于特定元素的复杂数据结构,请使用 JavaScript 变量或对象
- 不要在 data-* 中存储大量或敏感的数据——它们可以在 DevTools 中看到
data-* 不用于呈现
请避免以下常见错误:
<!-- BAD: storing presentation data in data-* -->
<div data-color="red" data-font-size="18">Text</div>
<!-- Use CSS classes instead: -->
<div class="text-danger text-lg">Text</div>
<!-- BAD: storing sensitive data -->
<div data-api-key="sk-123...">Content</div>
<!-- NEVER store secrets in HTML attributes -->快速检查
dataset API 如何访问 data-product-id 属性?
回顾:data-* 属性
自定义 data 属性要点:
data-name="value"— 在元素上存储自定义元数据- 通过
element.dataset.camelCase访问 - 在 dataset API 中,连字符会转换为 camelCase
- 通过
[data-name="value"]选择器在 CSS 中使用 - 绝不要在 data 属性中存储敏感数据(密钥、密码)
常见问题解答
「自定义数据属性:data-*」课时是免费的吗?
是的 — 「自定义数据属性:data-*」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 HTML Academy 课程的其余内容,请升级到 CoddyKit PRO。 HTML Academy 课程共包含 4 节课。
「自定义数据属性:data-*」这节课中我会学到什么?
使用 data-* 属性将自定义数据直接存储在元素上。 你通过在浏览器中直接运行的动手代码来练习 HTML Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 HTML Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 HTML Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「自定义数据属性:data-*」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 HTML Academy 课中编写并运行代码吗?
能。每节 HTML Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- id、class、style 与 title
- hidden 属性
- tabindex 与 accesskey
- 自定义数据属性:data-*