HTML简介
HTML概述
HTML(HyperText Markup Language),超文本标记语言。最大的特点是支持超链接,从而构成了整个互联网。
浏览器访问网站,其实就是从服务器下载HTML代码,然后渲染出网页。
浏览器的网页开发,涉及三种技术,HTML、CSS、JavaScript。
HTML语言定义网页的结构和内容
CSS样式表定义网页的样式
JavaScript语言定义网页与用户的互动行为
最基本的网页HTMl代码
1 |
|
网页基本概念
标签
网页的HTMl代码由许多不同的标签(tags)构成,学习HTMl语言,就是学习各种标签的用法。
标签大小写不敏感,通常用小写
标签分为成对出现的和单独出现:
成对出现的:
<html></html>
、<head></head>
、<h></h>
、<p></p>
、<div></div>
、更多标签见文本标签
单独出现的:
<!doctype>
、<meta>
、<img>
、更多标签见文本标签
元素
浏览器渲染网页时,把HTML源码解析为标签树,每个标签是树的一个节点(node),节点被称为网页元素。标签和元素基本上是同一词,标签是从源码角度看,元素是从变成角度看。比如,<p>
标签对应网页的p
元素
所有元素可以分为两类:块级元素(block)和行内元素(inline)
块级元素: 默认占据一个独立区域,在网页上自动另起一行,占据100%宽度
<p>
、<blockquote>
、<address>
、<pre>
、、更多标签见文本标签
行内元素: 默认与其他元素在同一行,不产生换行
<span>
、<strong>
、<em>
、<sub>
、<u>
、<span>
、<s>
、<code>
、<mark>
、、更多标签见文本标签
属性
属性(attribute)是标签的额外信息,使用空格将某一属性与标签名及其他属性分隔
属性可以使用等号指定属性值、属性名大小写不敏感、属性值一般放在双引号中
HTML提供大量属性,用来定制标签的行为,详情请看《元素的属性》篇
网页的基本标签
<!doctype>
通常作为网页的第一个标签,表示文档类型, 告诉浏览器如何解析网页,通常该标签采用完全大写的形式,以便区别于正常的HTML标签,因为<!doctype>
本质上不是标签,更像一个处理指令
<html>
<html>
标签是网页的顶层容器,即标签树结构的顶层节点,也称为根元素(root element),其他元素都是它的子元素。一个网页只能有一个<html>
标签。
该标签的lang
属性,表示网页内容默认的语言。
<head>
<head>
标签是一个容器标签,用于放置网页的元信息。它的内容不会出现在网页上,而是为网页渲染提供额外信息。
<meta>
<meta>
标签用于设置或说明网页的元数据,必须放在<head>
里面。一个<meta>
标签就是一项元数据,网页可以有多个<meta>
。<meta>
标签约定放在<head>
内容的最前面。
<meta>
的五个属性:
(1)charset
指定网页的编码方式,一般应采用utf-8
(2)name属性,content属性
<meta>
标签的name
属性表示元数据
的名字,content
属性表示元数据的值。它们合在一起使用,就可以为网页指定一项元数据。
1 | <head> |
其他元数据如:
1 | <meta name="viewport" content="width=device-width, initial-scale=1"> |
(3)http-equiv属性,content属性
<meta>
标签的http-equiv
属性用来覆盖 HTTP 回应的头信息字段,content
属性是对应的字段内容。这两个属性与 HTTP 协议相关,属于高级用法.
1 | <meta http-equiv="Content-Security-Policy" content="default-src 'self'"> |
<title>
<title>
标签用于指定网页的标题,会显示在浏览器窗口的标题栏。
搜索引擎根据这个标签,显示每个网页的标题。它对于网页在搜索引擎的排序,有很大的影响,应该精心安排,反映网页的主题。
<title>
标签的内部,不能再放置其他标签,只能放置无格式的纯文本。
空格和换行
HTML有自己的空格处理规则,标签内容的头部和尾部空格一律忽略不计,内容中间的空格及换行不论多少,均合并为一个空格(换行替换为空格,空格合并为一个)
URL简介
URL概述
URL(Uniform Resource Locator),统一资源定位符,就是我们通常说的网址。表示各种互联网资源的地址。
资源: 互联网上的各种文件,如网页、图像、音频、视频、脚本等
一个URL对应一个资源,但一个资源可以对应多个URL
网页可以通过“链接”(link),包含其他URL,实现URL之间的跳转
网址的组成部分
URL 由多个部分组成。下面是一个比较复杂的 URL,实际的 URL 通常不会有这么多部分。
1 | https://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#anchor |
协议
协议(scheme)是浏览器请求服务器资源的方法,互联网支持多种协议,如:
http为互联网资源访问的协议,现在多用https(http的加密版本),其后面紧跟一个冒号和两个斜杠(://
)
mailto
为邮件地址协议,后面只有一个冒号,如mailto:foo@example.com
主机
主机(host)是资源所在的网站或服务器的名字,又称为域名。上例的主机是www.example.com
。
有些主机没有域名,只有 IP 地址,比如192.168.2.15
。这种情况常常出现在局域网。
端口
同一个域名下面可能同时包含多个网站,他们之间通过端口(port)区分。http协议的默认端口为80,https默认端口为443,端口紧跟在域名后面,两者之间使用冒号分隔,如www.example.com:80
路径
路径(path)指资源在网站的位置。
互联网早期,路径是真实存在的物理位置,现在由于服务器可以模拟这些位置,所以路径只是虚拟位置。
通常,服务器会默认跳转到路径下的index.html
文件,这取决于服务器的设置。
查询参数
查询参数(parameter)是提供给服务器的额外信息。参数的位置在路径后面,两者用?
分隔。
查询参数可以有一组或多组。每组参数都是键值对(key-value pair)的形式,同时具有键名(key)和键值(value),它们之间使用等号(=
)连接。比如,key1=value
就是一个键值对,key1
是键名,value1
是键值。
多组参数之间使用&
连接,比如key1=value1&key2=value2
。
锚点
锚点(anchor)是网页内部的定位点,使用#
加上锚点名称,放在网址的最后面,浏览器加载后,会自动滚动到锚点所在位置。
锚点名称通过网页元素的id属性命名,详见《元素的属性》一章
URL字符
URL的各组成部分,只能使用以下字符:
- 26个英文字母(包括大小写)
- 10个阿拉伯数字
- 连词号(
-
) - 句点(
.
) - 下划线(
_
)
除此之外,还有18个字符为URL保留字符,出现在特定位置,比如定位锚点的#,查询参数的?,若路径中出现这些字符,需要进行转义,方法为在这些字符的十六进制 ASCII 码前面加上百分号(%
)
中文字符会在浏览器请求中自动完成转义,每个中文变为三个字节的utf-8码(如中
变为e4b8ad
),之后进行转义%e4%b8%ad
。这也是为什么有些URL看起来很长且带有很多%,因为每个中文都要变为9个字符。
绝对URL和相对URL
若超链接中使用http等地址,则为绝对URL,直接跳转到相应位置。
对于同一站点下的资源,可以在超链接中设置相对位置,访客相当于在同一网址下跳转。
<base>
<base>
标签指定网页内所有相对URL的基准,整张网页只能有一个<base>
标签,且放在<head>
标签里面,比如:
1 | <head> |
注意,<base>
标签必须至少具有href
属性或target
属性之一。
元素的属性
元素属性简介
网页元素的属性(attribute)可以定制元素的行为,不同的属性会导致元素有不同的行为。元素属性的写法是 HTML 标签内部的 “键值对”。
属性名与标签名一样,不区分大小写,lang
和LANG
是同一个属性。
属性值最好统一使用双引号,某些属性值可以不使用引号,但不建议这样写。
有些属性是不二属性,即属性值是个布尔值,只有“打开”和“关闭”两种情况,这时如果只写属性名,表示打开该属性(即属性值为“true”)
1 | <form action="" method="get"> |
如上所示,执行提交时,若输入为空,会弹出提示
全局属性
全局属性(global attributes)是所有元素都可以使用的属性。可以把该属性加到任意网页元素上,不过有些属性对某些元素可能不产生意义。
id
id
属性是元素在网页内的唯一标识符,因此id在整个网页是唯一的,同一个页面不能有两个相同的id
属性。另外,id
属性的值不得包含空格。
id
属性的值可以当做URL的锚点。
class
class
属性用来对网页元素进行分类。如果不同元素的class
属性值相同,就表示它们是一类的。
1 | <p class="para"></p> |
上面代码中,第一个<p>
和第三个<p>
是一类,因为它们的class
属性相同。
元素可以同时具有多个 class,它们之间使用空格分隔。
1 | <p class="p1 p2 p3"></p> |
上面的p
元素同时具有p1
、p2
、p3
三个 class。
title
title
属性用来为元素添加附加说明。大多数浏览器中,鼠标悬浮在元素上面时,会将title
属性值作为浮动提示,显示出来。
1 | <body> |
上面代码中,title
属性解释了这一块内容的目的。鼠标悬停在上面时,浏览器会显示一个浮动提示。一旦鼠标移开,提示就会消失。
tabindex
对标签设置该属性后,可以使用TAB依次进行网页焦点的跳转,对于需要输入账号密码的元素,可以方便的直接进行输入而不需要鼠标点击。
网页的语义结构
语义简介
HTML标签的名称都带有语义(semantic),随意使用语义标签,有些虽然不会报错,但往往造成网页逻辑结构混乱。语义良好的网页,天然具有良好的结构,对于开发者易读易写,容易维护,也能帮助计算机更好地处理网页内容。
常用标签
<header>
<header>
标签可以用在多个场景,既可以表示整个网页的头部,也可以表示一篇文章或者一个区块的头部。
如果用在网页的头部,就称为“页眉”。网站导航和搜索栏通常会放在<header>
里面。
1 | <header> |
如果<header>
用在文章的头部,则可以把文章标题、作者等信息放进去。
1 | <article> |
由于<header>
可以用在多种场景,所以一个页面可能包含多个<header>
,但是一个具体的场景里面只能包含一个,比如网页的页眉只能有一个。另外,<header>
里面不能包含另一个<header>
或<footer>
。
<footer>
<footer>
标签表示网页、文章或章节的尾部。如果用于整张网页的尾部,就称为“页尾”,通常包含版权信息或者其他相关信息。
1 | <body> |
<footer>
也可以放在文章里面。
1 | <article> |
<footer>
不能嵌套,即内部不能放置另一个<footer>
,也不能放置<header>
。
<main>
<main>
标签表示页面的主体内容,一个页面只能有一个<main>
。
1 | <body> |
上面代码就是最典型的页面结构。
注意,<main>
是顶层标签,不能放置在<header>
、<footer>
、<article>
、<aside>
、<nav>
等标签之中。
另外,功能性区块(比如搜索栏)不适合放入<main>
,除非当前页面就是搜索页面。
<aside>
<aside>
标签用来放置与网页或文章主要内容间接相关的部分。网页级别的<aside>
,可以用来放置侧边栏,但不一定就在页面的侧边;文章级别的<aside>
,可以用来放置补充信息、评论或注释。
下面是网页级别的<aside>
的例子。
1 | <body> |
下面是文章评注的例子。
1 | <p>第一段</p> |
<section>
<section>
标签表示一个含有主题的独立部分,通常用在文档里面表示一个章节,比如<article>
可以包含多个<section>
。<section>
总是多个一起使用,一个页面不能只有一个<section>
。
1 | <article> |
上面代码中,<article>
包含了两个<section>
,代表两章。
<section>
很适合幻灯片展示的页面,每个<section>
代表一个幻灯片。
一般来说,<section>
都应该有标题,即包含<h1>
~<h6>
标签。多个<section>
可以放置在同一个<article>
里面,一个<section>
里面也可能包含多个<article>
,这取决于<section>
和<article>
在当前页面的含义。
<nav>
<nav>
标签用于放置页面或文档的导航信息。
1 | <nav> |
一般来说,<nav>
往往放置在<header>
里面,不适合放入<footer>
。另外,一个页面可以有多个<nav>
,比如一个用于站点导航,另一个用于文章导航。
<nav>
里面通常是列表,但也可以放置其他标签。
<article>
<article>
标签表示页面里面一段完整的内容,即使页面的其他部分不存在,也具有独立使用的意义,通常用来表示一篇文章或者一个论坛帖子。它可以有自己的标题(<h1>
到<h6>
)。
1 | <article> |
一个网页可以包含一个或多个<article>
,比如包含多篇文章。
<h1>
~<h6>
HTML 提供了6个标签,用来表示文章的标题。按照标题的等级,一共分成六级。
<h1>
:一级标题<h2>
:二级标题<h3>
:三级标题<h4>
:四级标题<h5>
:五级标题<h6>
:六级标题
<h1>
是最高级别的标题,<h6>
是最低级别的标题。下一级标题都是上一级标题的子标题,比如,一个<h1>
后面可以有多个<h2>
,每个<h2>
后面又可以有多个<h3>
。
1 | <body> |
上面代码,通过章节标题,清晰地表明了文章的主体结构。具体的内容,就可以写在章节标题的下面。
标题不应该越级,比如h1
下面直接写h3
。虽然这样不会报错,但会导致文章失去清晰的章节结构。
默认情况下,浏览器会粗体显示标题。h1
的字号比h2
大,h2
比h3
大,以此类推。
<hgrop>
如果主标题包含多级标题(比如带有副标题),那么可以使用<hgroup>
标签,将多级标题放在其中。
1 | <hgroup> |
注意,<hgroup>
只能包含<h1>
~<h6>
,不能包含其他标签。
文本标签
文本标签简介
历史上,网页的主要功能是文本展示。所以,HTML 提供了大量的文本处理标签。
<div>
它的最常见用途就是提供 CSS 的钩子,用来指定各种样式。所以在早期,下面层层包裹的
1 | <div class="main"> |
上面代码读起来很费力,因为不带有语义。后来,HTML 5 就提出了语义标签,改进了上面的代码。
1 | <main> |
只要样式上需要多个块级元素组合在一起,就可以使用<div>
。但是,这应该是最后的措施,带有语义的块级标签(比如<article>
、<section>
、<aside>
、<nav>
等)始终应该优先使用,当且仅当没有其他语义元素合适时,才可以使用<div>
。
<span>
<span>
是一个通用目的的行内标签(即不会产生换行),不带有任何语义。它通常用作 **CSS 样式的钩子,**如果需要对某些行内内容指定样式,就可以把它们放置在<span>
。
1 | <p>这是一句<span>重要</span>的句子。</p> |
<br>
-换行
<br>
让网页产生一个换行效果。该标签是单独使用的,没有闭合标签。
1 | hello<br>world |
注意,块级元素的间隔,不要使用<br>
来产生,而要使用 CSS 指定。
1 | <p>第一段</p> |
上面的代码希望段落之间有两个换行,这时不应该使用<br>
,而应该使用 CSS。
<wbr>
-可选断行
<wbr>
标签表示一个可选的断行。如果一行的宽度足够,则不断行;如果宽度不够,需要断行,就在<wbr>
的位置的断行。
它是为了防止浏览器在一个很长的单词中间,不正确地断行或者不断行,所以事先标明可以断行的位置,主要用于欧洲一些单词很长的语言或者 URL 的断行。
1 | <p> |
上面代码是一个很长的德语单词,为了防止不正确断行,事先用<wbr>
告诉浏览器,可以选择在哪里断行。
<hr>
-水平线
<hr>
用来在一篇文章中分隔两个不同的主题,浏览器会将其渲染为一根水平线。该标签是单独使用的,没有闭合标签。
1 | <p>第一个主题</p> |
该标签是历史遗留下来的,建议尽量避免使用。主题之间的分隔可以使用<section>
,如果想要水平线的效果,可以使用 CSS。
<pre>
-块级元素
<pre>
是一个块级元素,表示保留原来的格式(preformatted),即浏览器会保留该标签内部原始的换行和空格。浏览器默认以等宽字体显示标签内容。
1 | <pre>hello |
上面代码中,换行和连续空格都会由于<pre>
标签,而被保留下来,浏览器按照原样输出。
注意,HTML 标签在<pre>
里面还是起作用的。<pre>
只保留空格和换行,不会保留 HTML 标签。
1 | <pre><strong>hello world</strong></pre> |
上面代码中,<pre>
标签的内容会加粗显示。
<strong>
,<b>
-加粗
<strong>
是一个行内元素,表示它包含的内容具有很强的重要性,需要引起注意。浏览器会以粗体显示内容。
<b>
与<strong>
很相似,也表示它包含的内容需要引起注意,浏览器会加粗显示。它是 Boldface 的缩写。
1 | <p>开会时间是<strong>下午两点</strong>。</p> |
<b>
与<strong>
的区别在于,由于历史原因,它没有语义,是一个纯样式的标签,违反了语义与样式分离的原则,因此**不建议使用,**应该优先使用<strong>
标签。
<em>
,<i>
-斜体
<em>
是一个行内标签,表示强调(emphasize),浏览器会以斜体显示它包含的内容。
1 | <p>我们<em>已经</em>讨论过这件事情了。</p> |
虽然浏览器通常会以斜体显示<em>
,但无法保证一定如此,所以最好还是用 CSS 指定一下这个标签的样式。
<i>
标签与<em>
相似,也表示与其他地方有所区别,浏览器会以斜体显示。它是 Italic 的缩写。
1 | <p>我心想,这件事是<i>真的</i>吗?</p> |
<i>
标签的语义不强,更接近是一个纯样式的标签,建议优先使用<em>
标签代替它。
<sub>
,<sup>
,<var>
-角标
<sub>
标签将内容变为下标,<sup>
标签将内容变为上标。它们都是行内元素,主要用于数学公式、分子式等。
1 | <p>水分子是 H<sub>2</sub>O。</p> |
<var>
标签表示代码或数学公式的变量。
1 | <p>勾股定理是 |
<u>
,<s>
-下划线、删除线
<u>
标签是一个行内元素,表示对内容提供某种注释,提醒用户这里可能有问题,基本上只用来表示拼写错误。浏览器默认以下划线渲染内容。
1 | <p> |
注意,<u>
会产生下划线,由于链接也默认带有下划线,所以必须非常小心使用<u>
标签,避免用户误以为可以点击。万一确有必要使用,最好使用 CSS 改变<u>
的默认样式。
<s>
标签是一个行内元素,为内容加上删除线。
1 | <p>今天特价商品:<s>三文鱼</s>(售完)</p> |
<blockquote>
,<cite>
,<q>
-块级元素引用
<blockquote>
是一个块级标签,表示引用他人的话。浏览器会在样式上,与正常文本区别显示(整儿区块缩进两格)。
1 | <blockquote cite="https://quote.example.com"> |
<blockquote>
标签有一个cite
属性,它的值是一个网址,表示引言来源,不会显示在网页上。
<cite>
标签表示引言出处或者作者,浏览器默认使用斜体显示这部分内容。
1 | <blockquote cite="https://quote.example.com"> |
(个人觉得<cite>
标签应该放在<blockquote>
里面用)
1 | <blockquote cite="https://quote.example.com"> |
<q>
是一个行内标签,也表示引用。它与<blockquote>
的区别,就是它不会产生换行。
1 | <p> |
上面例子中,引言部分跟前面的说明部分是在同一行里面。
另外,跟<blockquote>
一样,<q>
也有cite
属性,表示引言的来源网址。
注意,浏览器默认会斜体显示<q>
的内容,并且会自动添加半角的双引号。所以,引用中文内容时要小心。
(经测试,自动添加半角双引号✔,斜体✖)
<code>
<code>
标签是一个行内元素,表示标签内容是计算机代码,浏览器默认会以等宽字体显示。
1 | <code>alert()</code>的作用是让网页弹出一个提示框。 |
如果要表示多行代码,<code>
标签必须放在<pre>
内部。<code>
本身仅表示一行代码。
1 | <pre> |
<kbd>
,<samp>
-行内元素、-输入输出
<kbd>
标签是一个行内元素,原意是用户从键盘输入的内容,现在扩展到各种输入,包括语音输入。浏览器默认以等宽字体显示标签内容。
1 | <p>Windows 可以按下 <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Del</kbd> 重启。</p> |
<kbd>
可以嵌套,方便指定样式。
1 | <p>Windows 可以按下 |
<samp>
标签是一个行内元素,表示计算机程序输出内容的一个例子。浏览器默认以等宽字体显示。
1 | <p>如果使用没有定义的变量,浏览器会报错: |
<mark>
,-黄色高亮
<mark>
是一个行内标签,表示突出显示的内容。Chrome 浏览器默认会以亮黄色背景,显示该标签的内容。
1 | <p>Windows 可以按下 <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Del</kbd> 重启。</p> |
除了标记感兴趣的文本,<mark>
还可以用于在搜索结果中,标记出匹配的关键词。
注意,不要只为了高亮的效果,而使用这个标签,因为不能保证浏览器的处理方式。如果要保证高亮,还是要使用 CSS 样式。
<small>
-小一号字号
<small>
是一个行内标签,浏览器会将它包含的内容,以小一号的字号显示,不需要使用 CSS 样式。它通常用于文章附带的版权信息或法律信息。
1 | <p>文章正文</p> |
<time>
,<data>
-时间日期
<time>
是一个行内标签,为跟时间相关的内容提供机器可读的格式。(不会显示出来)
1 | <p>运动会预定<time datetime="2015-06-10">下周三</time>举行。</p> |
<time>
的datetime
属性,用来指定机器可读的日期,可以有多种格式。
- 有效年份:
2021
- 有效月份:
2021-11
- 有效日期:
2021-11-18
- 无年份的日期:
11-18
- 年度的第几周:
2021-W47
- 有效时间:
14:54
、14:54:39
、14:54:39.929
- 日期和时间:
2021-11-18T14:54:39.929
<data>
标签与<time>
类似,也是提供机器可读的内容,但是用于非时间的场合。
1 | <p>本次马拉松比赛第一名是<data value="39">张三</data></p>。 |
<samp>
标签是一个行内元素,表示计算机程序输出内容的一个例子。浏览器默认以等宽字体显示。
1 | <p>如果使用没有定义的变量,浏览器会报错: |
<address>
-时间日期
<address>
标签是一个块级元素,表示某人或某个组织的联系方式。
1 | <p>作者的联系方式:</p> |
该标签有几个注意点。
(1)如果是文章里提到的地址(比如提到搬家前的地址),而不是联系信息,不要使用
<address>
标签。(2)
<address>
的内容不得有非联系信息,比如发布日期。(3)
<address>
不能嵌套,并且内部不能有标题标签(<h1>
~<h6>
),也不能有<article>
、<aside>
、<section>
、<nav>
、<header>
、<footer>
等标签。(4)通常,
<address>
会放在<footer>
里面,下面是一个例子。
1
2
3
4
5
6 <footer>
<address>
文章的相关问题请联系<a href="mailto:zhangsan@example.com">张三
McClure</a>。
</address>
</footer>
<abbr>
-缩写标志
<abbr>
标签是一个行内元素,表示标签内容是一个缩写。它的title
属性给出缩写的完整形式,或者缩写的描述。鼠标悬停在该元素上方时,title
属性值作为提示,会完整显示出来。
1 | <abbr title="HyperText Markup Language">HTML</abbr>是一种编程语言 |
注意,某些浏览器可能对该标签提供圆点下划线。
<ins>
,<del>
-插入、删除标志
<ins>
标签是一个行内元素,表示原始文档添加(insert)的内容。<del>
与之类似,表示删除(delete)的内容。它们通常用于展示文档的删改。
1 | <del><p>会议定于5月8日举行。</p></del> |
浏览器默认为<del>
标签的内容加上删除线,为<ins>
标签的内容加上下划线。
这两个标签都有以下属性。
cite
:该属性的值是一个 URL,表示该网址可以解释本次删改。datetime
:表示删改发生的时间。
1 | <ins cite="./why.html" datetime="2018-05"> |
<dfn>
-术语
<dfn>
是一个行内元素,表示标签内容是一个术语(definition),本段或本句包含它的定义。
1 | <p> |
某些时候,术语本身是一个缩写,这时<dfn>
和<abbr>
可以结合使用。
1 | <p> |
<ruby>
-语音注释
<ruby>
标签表示文字的语音注释,主要用于东亚文字,比如汉语拼音和日语的片假名。它默认将语音注释,以小字体显示在文字的上方。
1 | <ruby> |
<bdo>
,<bdi>
-阅读方向
大部分文字的阅读方向是从左到右,但是有些文字的方向是从右到左,比如阿拉伯语、希伯来语等。<bdo>
标签是一个行内元素,表示文字方向与网页主体内容的方向不一致。
1 | <p>床前明月光,<bdo dir="rtl">霜上地是疑</bdo>。</p> |
<bdo>
的dir
属性,指定具体的文字方向。它有两个值,ltr
表示从左到右,rtl
表示从右到左。
<bdi>
标签用于不确定文字方向的情况。比如,网页有一个部分是用户输入的内容,但是不知道输入内容的文字方向。这种情况就可以使用<bdi>
标签,告诉浏览器,不确定文字的方向,由浏览器自己决定。
1 | <p><bdi>床前明月光,疑是地上霜。</bdi></p> |
文本标签总结
HTML 5中不再以标签样式作为区分,而是以标签功能作为不同标签的区分项,不同功能的标签可能具有相同的样式或属性
-
等宽显示:
<pre>
、<code>
、<kbd>
、<samp>
-
<blockquote>
块级元素,整个元素块首行缩进2个字符 -
<pre>
标签紧跟的内容左对齐直接显示,后面的内容同代码编辑器中的缩进
列表标签
<ol>
<ol>
标签是一个有序列表容器(ordered list),会在内部的列表项前面产生数字编号。列表项的顺序有意义时,比如排名,就会采用这个标签。
1 | <ol> |
<ol>
标签内部可以嵌套<ol>
标签或<ul>
标签,形成多级列表。
1 | <ol> |
标签属性:
-
reversed
属性产生倒序的数字列表。 -
start
属性的值是一个整数,表示数字列表的起始编号(从当前样式的第几个开始编号)。 -
type
属性指定数字编号的样式。
<ul>
<ul>
标签是一个无序列表容器(unordered list),会在内部的列表项前面产生实心小圆点,作为列表符号。列表项的顺序无意义时,采用这个标签。
1 | <ul> |
<li>
<li>
表示列表项,用在<ol>
或<ul>
容器之中。
有序列表<ol>
之中,<li>
有一个value
属性,定义当前列表项的编号,后面列表项会从这个值开始编号。
1 | <ol> |
<dl>
,<dt>
,<dd>
<dl>
标签是一个块级元素,表示一组术语的列表(description list)。术语名(description term)由<dt>
标签定义,术语解释(description detail)由<dd>
标签定义。<dl>
常用来定义词汇表。
1 | <dl> |
图像标签
<img>
<img>
标签用于插入图片。它是单独使用的,没有闭合标签。
1 | <img src="foo.jpg"> |
<img>
默认是一个行内元素,与前后的文字处在同一行。
标签属性:
-
alt
属性用来设定图片的文字说明,图片不显示时(比如下载失败,或用户关闭图片加载),图片的位置上会显示该文本。 -
width
、height
属性指定图片的宽度和高度,不过一般使用css进行设定。 -
loading
属性指定图片加载方式。具体取值包括auto、lazy、eager
<figure>
、<figcaption>
<figure>
标签可以理解为一个图像区块,将图像和相关信息封装在一起。<figcaption>
是它的可选子元素,表示图像的文本描述,通常用于放置标题,可以出现多个。
1 | <figure> |
<picture>
<img>
标签的srcset
属性和sizes
属性分别解决了像素密度和屏幕大小的适配,但如果要同时适配不同像素密度、不同大小的屏幕,就要用到<picture>
标签。
<picture>
是一个容器标签,内部使用<source>
和<img>
,指定不同情况下加载的图像。
1 | <picture> |
上面代码中,<source>
标签的media
属性给出屏幕尺寸的适配条件,每个条件都用srcset
属性,再给出两种像素密度的图像 URL。
响应式图像
网页在不同尺寸的设备上,都能产生良好的显示效果,叫做“响应式设计”(responsive web design)。响应式设计的网页图像,就是“响应式图像”(responsive image)。
<srcset>
srcset
属性用来指定多张图像,适应不同像素密度的屏幕。它的值是一个逗号分隔的字符串,每个部分都是一张图像的 URL,后面接一个空格,然后是像素密度的描述符。请看下面的例子。
1 | <img srcset="foo-320w.jpg, |
<size>
像素密度的适配,只适合显示区域一样大小的图像。如果希望不同尺寸的屏幕,显示不同大小的图像,srcset
属性就不够用了,必须搭配sizes
属性。
1 | <img srcset="foo-160.jpg 160w, |
图像选择
除了响应式图像,<picture>
标签还可以用来选择不同格式的图像。比如,如果当前浏览器支持 Webp 格式,就加载这种格式的图像,否则加载 PNG 图像。
1 | <picture> |
浏览器按照<source>
标签出现的顺序,依次检查是否支持type
属性指定的图像格式,如果支持就加载图像,并且不再检查后面的<source>
标签了。上面例子中,图像加载优先顺序依次为 svg 格式、webp 格式和 png 格式。
链接、多媒体、表
链接
链接(hyperlink)是互联网的核心。它允许用户在页面上,从一个网址跳转到另一个网址,从而把所有资源联系在一起。
链接通过<a>
标签表示,用户点击后,浏览器会跳转到指定的网址。
<a>
<a>
标签有如下属性。
href
属性给出链接指向的网址。它的值应该是一个 URL 或者锚点。title
属性给出链接的说明信息。target
属性指定如何展示打开的链接。它可以是在指定的窗口打开,也可以在<iframe>
里面打开。(设置iframe的name属性,target指向该名称即可)rel
属性说明链接与当前页面的关系。
邮件链接
链接也可以指向一个邮件地址,使用mailto
协议。用户点击后,浏览器会打开本机默认的邮件程序,让用户向指定的地址发送邮件。
1 | <a href="mailto:contact@example.com">联系我们</a> |
电话链接
如果是手机浏览的页面,还可以使用tel
协议,创建电话链接。用户点击该链接,会唤起电话,可以进行拨号。
1 | <a href="tel:13312345678">13312345678</a> |
<link>
<link>
标签主要用于将当前网页与相关的外部资源联系起来,**通常放在<head>
元素里面。**最常见的用途就是加载 CSS 样式表。
1 | <link rel="stylesheet" type="text/css" href="theme.css"> |
<link>
还可以加载网站的 favicon 图标文件。
1 | <link rel="icon" href="/favicon.ico" type="image/x-icon"> |
<link>
结合rel、sizes等属性可以为不同访问条件下的设备提供不同的图片
1 | <link rel="apple-touch-icon-precomposed" sizes="114x114" href="favicon114.png"> |
资源预加载
某些情况下,你需要浏览器预加载某些资源,也就是先把资源缓存下来,等到使用的时候,就不用再从网上下载了,立即就能使用。预处理指令可以做到这一点。
预加载主要有下面五种类型。
<link rel="preload">
告诉浏览器尽快下载并缓存资源(如脚本或样式表),该指令优先级较高,浏览器肯定会执行。<link rel="prefetch">
的使用场合是,如果后续的页面需要某个资源,并且希望预加载该资源,以便加速页面渲染。该指令不是强制性的,优先级较低,浏览器不一定会执行。这意味着,浏览器可以不下载该资源,比如连接速度很慢时。<link rel="preconnect">
要求浏览器提前与某个域名建立 TCP 连接。当你知道,很快就会请求该域名时,这会很有帮助。<link rel="dns-prefetch">
要求浏览器提前执行某个域名的 DNS 解析。<link rel="prerender">
要求浏览器加载某个网页,并且提前渲染它。用户点击指向该网页的链接时,就会立即呈现该页面。如果确定用户下一步会访问该页面,这会很有帮助。
多媒体
<video>
<video>
标签是一个块级元素,用于放置视频。如果浏览器支持加载的视频格式,就会显示一个播放器,否则显示<video>
内部的子元素。
1 | <video controls> |
<audio>
<audio>
标签是一个块级元素,用于放置音频,用法与<video>
标签基本一致。
1 | <audio controls> |
<track>
<track>
标签用于指定视频的字幕,格式是 WebVTT (.vtt
文件),放置在<video>
标签内部。它是一个单独使用的标签,没有结束标签。
1 | <video controls src="sample.mp4"> |
<iframe>
<iframe>
标签生成一个指定区域,在该区域中嵌入其他网页。它是一个容器元素,如果浏览器不支持<iframe>
,就会显示内部的子元素。
1 | <iframe src="https://www.example.com" |
sandbox
属性
为防止嵌入的网页执行操作对当前网页/服务器造成损害,可以使用sandbox属性,相当于创建了一个沙箱。
sandbox
可以当作布尔属性使用,表示打开所有限制。
1 | <iframe src="https://www.example.com" sandbox> |
loading
属性
loading
属性可以触发<iframe>
网页的懒加载。该属性可以取以下三个值。
auto
:浏览器的默认行为,与不使用loading
属性效果相同。lazy
:<iframe>
的懒加载,即将滚动进入视口时开始加载。eager
:立即加载资源,无论在页面上的位置如何。
表格
1 | <table> |
scope
属性可以取下面这些值。
row
:该行的所有单元格,都与该标题单元格相关。col
:该列的所有单元格,都与该标题单元格相关。rowgroup
:多行组成的一个行组的所有单元格,都与该标题单元格相关,可以与rowspan
属性配合使用。colgroup
:多列组成的一个列组的所有单元格,都与该标题单元格相关,可以与colspan
属性配合使用。auto
:默认值,表示由浏览器自行决定。
表单
<form>
表单基本结构
1 | <form action="https://example.com/api" method="post"> |
<form>
中注意的点包括:
- 各控件的
name、id、type、value
等属性 <fieldset>
标签组成一组控件<select>
标签搭配<option>
<input>
、<datalist>
标签搭配<option>
组成各种表单选择效果
<progress>
-进度条
<progress>
标签是一个行内元素,表示任务的完成进度。浏览器通常会将显示为进度条。
1 | <progress id="file" max="100" value="70"> 70% </progress> |
如果省略了value
属性,则**进度条会出现滚动,**表明正在进行中,无法知道完成的进度。
<meter>
-指示器
<meter>
标签是一个行内元素,表示指示器,用来显示已知范围内的一个值,浏览器通常会将其显示为一个不会滚动的指示条。
1 | <p>烤箱的当前温度是<meter min="200" max="500" |
标签属性包括:
min
:范围的下限,必须小于max
属性。如果省略,则默认为0
。max
:范围的上限,必须大于min
属性。如果省略,则默认为1
。value
:当前值,必须在min
属性和max
属性之间。如果省略,则默认为0
。low
:表示“低端”的上限门槛值,必须大于min
属性,小于high
属性和max
属性。如果省略,则等于min
属性。high
:表示“高端”的下限门槛值,必须小于max
属性,大于low
属性和min
属性。如果省略,则等于max
属性。optimum
:指定最佳值,必须在min
属性和max
属性之间。它应该与low
属性和high
属性一起使用,表示最佳范围。如果optimum
小于low
属性,则表示“低端”是最佳范围;如果大于high
属性,则表示“高端”是最佳范围;如果在low
和high
之间,则表示“中间地带”是最佳范围。如果省略,则等于min
和max
的中间值。form
:关联表单的id
属性。
1 | <meter id="fuel" name="fuel" |
上述代码,因为value=50,处于一般情况,因此指示器(进度条)显示为黄色