什么是 HTML 属性
属性为元素补充信息。它写在开始标签里,由名称、等号和带引号的值组成:name="value"。一个元素可以有任意多个属性,彼此用空格分隔。
href 告诉链接要去哪里,src 和 alt 描述图片,type、placeholder 和 required 配置输入框。每种元素都有自己的一组属性,还有少数属性(下面的全局属性)适用于所有元素。
语法规则
<input type="text" name="city" value="Paris" disabled>
- 名称、等号、带引号的值。 惯例是用双引号;单引号也可以(想在值里放双引号时就这样写:
title='Say "hi"')。 - 名称不区分大小写。
CLASS和class是同一个属性。值则区分大小写:class="Box"和class="box"是两个不同的类。 - 没有空格时引号可以省略,但还是要加上。
class=big box会给元素设置类big,再加上第二个毫无意义的属性box。 - 顺序无关紧要。
<img alt="" src="a.png">和<img src="a.png" alt="">完全相同。 - 同一个元素上每个名称只能出现一次。 如果某个属性出现两次,浏览器会保留第一个,悄悄丢掉第二个。
布尔属性
有些属性只有开和关两种状态。对于这类属性,只要存在就表示 true,值会被忽略。disabled、checked、required、readonly、hidden、multiple、autofocus 和 open 都是这样。
第三个按钮虽然值写的是 false,却仍然是禁用的,因为浏览器只检查这个属性在不在。要关闭布尔属性,就把它删掉。在 JavaScript 中,button.disabled = false 做的正是这件事。
class 属性
class 给元素起一个或多个名字,CSS 和 JavaScript 用它们来找到元素。多个元素可以共用一个类,一个元素也可以有多个类,用空格分隔:
每多一个类,就会叠加一组样式规则。在 CSS 中用点号选择类(.card);在 JavaScript 中,用 element.classList.add('featured') 和 classList.remove 修改类。类是设置样式的常规方式:你的 CSS 大多会以类为目标。
id 属性
id 给元素起一个在页面上唯一的名字。当你恰好需要一个元素时使用它:链接的跳转目标、<label for>,或者 document.getElementById。
点击标签会让输入框获得焦点,因为 for="email" 指向了 id="email"。链接会滚动到 #pricing,因为 href 中的片段与这个 id 相匹配。
class | id | |
|---|---|---|
| 可以有多少个元素共用 | 任意多个 | 一个(唯一) |
| 每个元素的值 | 多个,用空格分隔 | 一个 |
| CSS 选择器 | .name | #name |
| 典型用途 | 给一组元素设置样式 | 链接目标、标签、在 JavaScript 中定位某个特定元素 |
id 不能包含空格。最好以字母开头,方便在 CSS 中使用:不转义的话,#2col 不是合法的 CSS 选择器。
全局属性
以下属性适用于任何元素:
| 属性 | 作用 |
|---|---|
id | 元素的唯一名称 |
class | 用空格分隔的类名列表 |
style | 内联 CSS,例如 style="color: red" |
title | 鼠标悬停时显示的提示文字 |
lang | 内容的语言,例如 lang="fr" |
dir | 文字方向:ltr、rtl 或 auto |
hidden | 隐藏元素(布尔属性) |
tabindex | 让元素可以用 Tab 键聚焦,或设置聚焦顺序 |
contenteditable | 允许用户编辑元素的文字 |
data-* | 你自己的数据,用 JavaScript 读取 |
lang 属性有单独的页面,因为它会影响屏幕阅读器、翻译和搜索。
data-* 属性
需要在元素上存放自己的值时,给名称加上 data- 前缀。前缀后面可以接任何名字,JavaScript 通过 element.dataset 读取这些值,名称中的连字符会转换成驼峰命名:
data-product-id 变成了 dataset.productId。读到的值始终是字符串,所以做算术运算之前要先用 Number() 转换。CSS 也可以根据它们来选择元素:[data-price="4.50"]。
常见错误
- 把
class写两次。<div class="a" class="b">只保留a。把两个类写在同一个属性里:class="a b"。 - 重复使用同一个 id。 两个元素使用相同的 id 会让
#links、标签和getElementById出问题,后者只返回第一个元素。会重复出现的东西请用类。 disabled="false"或checked="false"。 属性仍然存在,所以它依然是开启的。应该把它删掉。- 含空格的值不加引号。
alt=My photo会把alt设为My。每个值都要加引号。 - 不加
data-就自创属性。<div price="4">是不合法的 HTML,还可能和将来的标准属性冲突。请用data-price。
常见问题
HTML 属性是什么?
属性是写在开始标签里的附加信息,格式为 name="value"。它用来配置元素:href 设置链接指向哪里,src 和 alt 描述图片,class 和 id 让 CSS 和 JavaScript 能找到这个元素。
HTML 中 class 和 id 有什么区别?
id 在页面上必须唯一,用来标识一个元素,供 #fragment 链接、<label for> 和 getElementById 使用。class 可以被许多元素共用,一个元素也可以有多个用空格分隔的类。设置样式时请用类。
如何给一个 HTML 元素添加多个类?
把它们写在同一个 class 属性里,用空格分隔:<div class="card featured dark">。把 class 写两次是不行的:浏览器只保留第一个。
HTML 属性值需要加引号吗?
当值里没有空格或特殊字符时,引号可以省略,但始终加引号才是稳妥的习惯。class=big box 会给元素设置类 big,外加一个名为 box 的独立属性。
为什么写了 disabled="false" 按钮还是禁用的?
disabled 是布尔属性:只要它存在就表示 true,不管值写的是什么。要启用元素,就删掉这个属性,或者在 JavaScript 中设置 button.disabled = false,它会把属性删掉。
可以自己发明 HTML 属性吗?
请使用 data- 前缀:data-price="12" 或 data-user-id="7" 在任何元素上都是合法的,并且可以在 JavaScript 中通过 element.dataset 读取。不带前缀的自创属性名是不合法的 HTML。