HTML 全局属性

常用 HTML 全局属性的用法与场景

问题

介绍 HTML 全局属性 data-*hiddentabindextitleidclass 的用法。

解答

全局属性是所有 HTML 元素都可以使用的属性。

id

元素的唯一标识符,页面内不可重复。

<div id="app">应用容器</div>

<script>
  // 通过 id 获取元素
  const app = document.getElementById('app');
  
  // CSS 选择器
  const app2 = document.querySelector('#app');
</script>

<style>
  /* id 选择器,权重较高 */
  #app {
    padding: 20px;
  }
</style>

class

元素的类名,可以有多个,用空格分隔。

<button class="btn btn-primary btn-large">提交</button>

<script>
  const btn = document.querySelector('.btn');
  
  // 操作 classList
  btn.classList.add('loading');      // 添加类
  btn.classList.remove('loading');   // 移除类
  btn.classList.toggle('active');    // 切换类
  btn.classList.contains('btn');     // 检查是否包含,返回 true
</script>

data-*

自定义数据属性,用于存储私有数据。

<ul>
  <li data-id="1" data-user-name="张三" data-active="true">用户1</li>
  <li data-id="2" data-user-name="李四" data-active="false">用户2</li>
</ul>

<script>
  const item = document.querySelector('li');
  
  // 通过 dataset 访问(自动转为驼峰命名)
  console.log(item.dataset.id);        // "1"
  console.log(item.dataset.userName);  // "张三"(data-user-name -> userName)
  console.log(item.dataset.active);    // "true"(注意:是字符串)
  
  // 设置 data 属性
  item.dataset.status = 'online';      // 添加 data-status="online"
  
  // 通过 getAttribute 访问
  console.log(item.getAttribute('data-id')); // "1"
</script>

<style>
  /* CSS 中使用属性选择器 */
  li[data-active="true"] {
    color: green;
  }
</style>

hidden

布尔属性,隐藏元素(等同于 display: none)。

<!-- 元素被隐藏 -->
<div hidden>这段内容不可见</div>

<!-- 等同于 -->
<div style="display: none;">这段内容不可见</div>

<script>
  const el = document.querySelector('div');
  
  // 显示元素
  el.hidden = false;
  // 或
  el.removeAttribute('zzinb');
  
  // 隐藏元素
  el.hidden = true;
</script>

tabindex

控制元素是否可聚焦以及 Tab 键导航顺序。

<!-- tabindex="0":可聚焦,按 DOM 顺序导航 -->
<div tabindex="0">可以用 Tab 聚焦的 div</div>

<!-- tabindex="-1":可通过 JS 聚焦,但 Tab 键跳过 -->
<div tabindex="-1" id="modal">模态框(JS 控制聚焦)</div>

<!-- tabindex="正数":按数值顺序导航(不推荐使用) -->
<input tabindex="2" placeholder="第二个聚焦">
<input tabindex="1" placeholder="第一个聚焦">

<script>
  // 通过 JS 聚焦 tabindex="-1" 的元素
  document.getElementById('modal').focus();
</script>

title

鼠标悬停时显示的提示文本。

<button title="点击保存当前内容">保存</button>

<abbr title="Hypertext Markup Language">HTML</abbr>

<!-- 图片的 title 和 alt 区别 -->
<img 
  src="photo.jpg" 
  alt="风景照片"      
  title="拍摄于 2024 年"
>
<!-- alt: 图片无法显示时的替代文本,屏幕阅读器会读取 -->
<!-- title: 鼠标悬停提示,可选 -->

完整示例

<!DOCTYPE html>
<html>
<head>
  <style>
    .card {
      padding: 16px;
      border: 1px solid #ddd;
      margin: 10px 0;
    }
    .card[data-status="active"] {
      border-color: green;
    }
    .card:focus {
      outline: 2px solid blue;
    }
  </style>
</head>
<body>
  <div 
    id="user-card"
    class="card card-primary"
    data-user-id="123"
    data-status="active"
    tabindex="0"
    title="用户信息卡片"
  >
    <h3>用户名</h3>
    <p hidden id="secret">隐藏的内容</p>
  </div>

  <script>
    const card = document.getElementById('user-card');
    
    // 读取各种属性
    console.log(card.id);                  // "user-card"
    console.log(card.className);           // "card card-primary"
    console.log(card.dataset.userId);      // "123"
    console.log(card.dataset.status);      // "active"
    console.log(card.title);               // "用户信息卡片"
    console.log(card.tabIndex);            // 0
    
    // 显示隐藏内容
    document.getElementById('secret').hidden = false;
  </script>
</body>
</html>

关键点

  • id 页面唯一,class 可重复可多个
  • data-* 通过 dataset 访问,属性名自动转驼峰(data-user-nameuserName
  • hidden 是布尔属性,效果等同于 display: none
  • tabindex="0" 可 Tab 聚焦,tabindex="-1" 仅 JS 可聚焦
  • title 是悬停提示,alt 是图片替代文本,两者用途不同