# 文本标签
历史上,网页的主要功能是文本展示。所以,HTML 提供了大量的文本处理标签。
## 1.`<div>`
`<div>`是一个通用标签,表示一个区块(division)。它没有语义,如果网页需要一个块级元素容器,又没有其他合适的标签,就可以使用这个标签。
它的最常见用途就是提供 CSS 的钩子,用来指定各种样式。所以在早期,下面层层包裹的`<div>`就很常见。
~~~html
<div class="main">
<div class="article">
<div class="title">
<h1>文章标题</h1>
</div>
</div>
</div>
~~~
上面代码读起来很费力,因为不带有语义。后来,HTML 5 就提出了语义标签,改进了上面的代码。
~~~html
<main>
<article>
<header>
<h1>文章标题</h1>
</header>
</article>
</main>
~~~
`<div>`是无语义的块级元素。下面的例子使用`<div>`,将图像和文字组合在一起,构成一个警告区块。
~~~html
<div>
<img src="warning.jpg" alt="警告">
<p>小心</p>
</div>
~~~
只要样式上需要多个块级元素组合在一起,就可以使用`<div>`。但是,这应该是最后的措施,带有语义的块级标签(比如`<article>`、`<section>`、`<aside>`、`<nav>`等)始终应该优先使用,当且仅当没有其他语义元素合适时,才可以使用`<div>`。
## 2.`<p>`
`<p>`标签是一个块级元素,代表文章的一个段落(paragraph)。不仅是文本,任何想以段落显示的内容,比如图片和表单项,都可以放进`<p>`元素。
~~~html
<p>hello world</p>
~~~
上面代码就是一个简单的段落。
## 3.`<span>`
`<span>`是一个通用目的的行内标签(即不会产生换行),不带有任何语义。它通常用作 CSS 样式的钩子,如果需要对某些行内内容指定样式,就可以把它们放置在`<span>`。
~~~html
<p>这是一句<span>重要</span>的句子。</p>
~~~
上面代码中,句子里面需要强调的部分,就可以放在`<span>`。
## 4.`<br>`,`<wbr>`
`<br>`让网页产生一个换行效果。该标签是单独使用的,没有闭合标签。
~~~html
hello<br>world
~~~
浏览器渲染上面代码时,会分成两行,`hello`和`world`各占一行。
`<br>`对于诗歌和地址的换行非常有用。
~~~html
<p>
床前明月光,<br>
疑是地上霜。<br>
举头望明月,<br>
低头思故乡。
</p>
~~~
上面的代码如果不用`<br>`,会显示成一行。
注意,块级元素的间隔,不要使用`<br>`来产生,而要使用 CSS 指定。
~~~html
<p>第一段</p>
<br>
<br>
<p>第二段</p>
~~~
上面的代码希望段落之间有两个换行,这时不应该使用`<br>`,而应该使用 CSS。
`<wbr>`标签跟`<br>`很相似,表示一个可选的断行。如果一行的宽度足够,则不断行;如果宽度不够,需要断行,就在`<wbr>`的位置的断行。它是为了防止浏览器在一个很长的单词中间,不正确地断行或者不断行,所以事先标明可以断行的位置,主要用于欧洲一些单词很长的语言或者 URL 的断行。
~~~html
<p>
Fernstraßen<wbr>bau<wbr>privat<wbr>finanzierungs<wbr>gesetz
</p>
~~~
上面代码是一个很长的德语单词,为了防止不正确断行,事先用`<wbr>`告诉浏览器,可以选择在哪里断行。
## 5.`<hr>`
`<hr>`用来在一篇文章中分隔两个不同的主题,浏览器会将其渲染为一根水平线。该标签是单独使用的,没有闭合标签。
~~~html
<p>第一个主题</p>
<hr>
<p>第二个主题</p>
~~~
上面代码的渲染结果是,两段之间会出现一根水平线。
该标签是历史遗留下来的,建议尽量避免使用。主题之间的分隔可以使用`<section>`,如果想要水平线的效果,可以使用 CSS。
## 6.`<pre>`
`<pre>`是一个块级元素,表示保留原来的格式(preformatted),即浏览器会保留该标签内部原始的换行和空格。浏览器默认以等宽字体显示标签内容。
~~~html
<pre>hello world</pre>
~~~
上面代码中,换行和连续空格都会由于`<pre>`标签,而被保留下来,浏览器按照原样输出。
注意,HTML 标签在`<pre>`里面还是起作用的。`<pre>`只保留空格和换行,不会保留 HTML 标签。
~~~html
<pre><strong>hello world</strong></pre>
~~~
上面代码中,`<pre>`标签的内容会加粗显示。
## 7.`<strong>`,`<b>`
`<strong>`是一个行内元素,表示它包含的内容具有很强的重要性,需要引起注意。浏览器会以粗体显示内容。
~~~html
<p>开会时间是<strong>下午两点</strong>。</p>
~~~
`<b>`与`<strong>`很相似,也表示它包含的内容需要引起注意,浏览器会加粗显示。它是 Boldface 的缩写。
~~~html
<p>开会时间是<b>下午两点</b>。</p>
~~~
它与`<strong>`的区别在于,由于历史原因,它没有语义,是一个纯样式的标签,违反了语义与样式分离的原则,因此不建议使用,应该优先使用`<strong>`标签。
## 8.`<em>`,`<i>`
`<em>`是一个行内标签,表示强调(emphasize),浏览器会以斜体显示它包含的内容。
~~~html
<p>我们<em>已经</em>讨论过这件事情了。</p>
~~~
虽然浏览器通常会以斜体显示`<em>`,但无法保证一定如此,所以最好还是用 CSS 指定一下这个标签的样式。
`<i>`标签与`<em>`相似,也表示与其他地方有所区别,浏览器会以斜体显示。它是 Italic 的缩写。
~~~html
<p>我心想,这件事是<i>真的</i>吗?</p>
~~~
`<i>`标签的语义不强,更接近是一个纯样式的标签,建议优先使用`<em>`标签代替它。
## 9.`<sub>`,`<sup>`,`<var>`
`<sub>`标签将内容变为下标,`<sup>`标签将内容变为上标。它们都是行内元素,主要用于数学公式、分子式等。
~~~html
<p>水分子是 H<sub>2</sub>O。</p>
~~~
`<var>`标签表示代码或数学公式的变量。
~~~html
<p>
勾股定理是<var>a</var><sup>2</sup> + <var>b</var><sup>2</sup> = <var>c</var><sup>2</sup>
。</p>
~~~