div 标签的作用
<div>(division 的缩写)是一个通用容器。它把元素组合在一起,让你可以把它们当作一个整体来设置样式、定位或用脚本操作。它本身看不出任何东西:没有外边距、没有边框、没有特殊字体。它是一个块级元素,所以会从新的一行开始,并横向占满可用宽度。
删掉样式中的 border 那一行,div 就看不见了:这就是 div 的默认外观。它在视觉上的一切效果都来自 CSS。
div class 和 id
div 通常会有一个 class,也就是 CSS 要选中的名称。共用同一个 class 的 div 共享同样的样式:
.card 为两个盒子设置样式,.card.highlight 给同时具有两个 class 的 div 加上蓝色外框。需要指向某一个特定的 div 时用 id,例如作为链接目标(href="#pro")。属性一文详细比较了 class 和 id。
让 div 并排显示
div 是块级元素,所以会垂直堆叠。要让它们排成一行,就把它们的父元素变成 flex 容器:
.row 上的 display: flex 让子元素排成一行,gap 设置间距,flex 的值分配宽度(这里是 1 : 2 : 1)。这种父元素加子元素的模式是真实网站中 div 最常见的用法。要让 div 居中,参见如何让 div 居中。
嵌套 div
div 可以包含其他 div,层数不限。每一层都是盒子里的盒子,给每个 div 加上边框和一些内边距就能看出来:
在布局允许的前提下,嵌套越浅越好。每多一层包装,就多一个盒子需要你去分析,尤其是当外边距或宽度和预期不一样的时候。
用 div 还是语义标签?
div 对它的内容什么也没说明。HTML 有一些标签同样能完成分组,还能说明这一组是什么:
| 不要用 | 改用 | 用途 |
|---|---|---|
<div class="header"> | <header> | 页面或区块的开头或顶栏 |
<div class="nav"> | <nav> | 一组导航链接 |
<div class="main"> | <main> | 主要内容,每个页面一个 |
<div class="post"> | <article> | 独立完整的条目:文章、评论、商品卡片 |
<div class="footer"> | <footer> | 页面或区块的页脚 |
在你设置样式之前,这些标签看起来和 div 完全一样,但屏幕阅读器会朗读它们,并让用户在它们之间跳转,搜索引擎也能读懂页面结构。只为布局或样式存在的盒子才用 div,比如上面的 .row 包装层。完整的标签列表参见语义化 HTML。
div 不是按钮
带点击处理函数的 div 在鼠标用户看来可以点击,但键盘用户无法用 Tab 键到达它,也无法用 Enter 键按下它,屏幕阅读器也不会把它当作按钮朗读:
执行操作用 <button>,跳转页面用 <a href>。两者都能获得焦点,并且天生支持键盘操作。
常见错误
- 把 div 放在
<p>里。 段落会在 div 之前就关闭。把 div 作为外层元素,或者在段落里用<span>。 - 满屏都是 div。 只由 div 组成的页面对屏幕阅读器来说没有结构。在合适的地方把 div 换成
<header>、<nav>、<main>和<footer>。 - 可点击的 div。 请改用
<button>或链接。 - 以为 div 的宽度和文字一样。 div 会占满整个宽度。想让它收缩,就用
display: inline-block、width: fit-content或<span>。 - 在多个 div 上重复使用同一个 id。 会重复出现的东西请用 class。
常见问题
HTML 中的 div 是什么?
<div> 是一个通用容器。它把其他元素组合在一起,方便你统一设置样式或定位,它本身没有任何含义:浏览器把它显示为一个块,从新的一行开始,占满可用宽度。
div class 是什么意思?
<div class="card"> 是一个带 class 属性的 div。class 是一个名称,CSS 用它来设置样式(.card { ... }),JavaScript 用它来查找元素。多个 div 可以共用一个 class,一个 div 也可以有多个 class:class="card featured"。
怎样让两个 div 并排显示?
用一个父 div 把它们包起来,给父元素设置 display: flex。子元素就会排成一行。加上 gap 让它们之间留出间距,给子元素设置 flex: 1 让它们平分宽度。
应该用 div 还是 section?
当内容具有对应的角色时,使用 <section>、<header>、<nav>、<main>、<article> 或 <footer>,因为屏幕阅读器和搜索引擎能理解它们。只需要一个用于样式或布局的盒子时,才用 <div>。
可以把 div 放在 p 标签里吗?
不可以。段落只能包含行内内容。浏览器一看到 <div> 就会关闭 <p>,这会破坏你的样式。把 div 作为外层元素,或者在段落里用 <span>。