HTML 是网页使用的语言,定义了网页的结构和内容。浏览器访问网站,其实就是从服务器下载 HTML 代码,然后渲染出网页。
HTML 的全名是“超文本标记语言”(HyperText Markup Language),上个世纪90年代由欧洲核子研究中心的物理学家蒂姆·伯纳斯-李(Tim Berners-Lee)发明。它的最大特点就是支持超链接,可以跳转到其他网页,从而构成了整个互联网。1999年,HTML 4.01 版发布,成为广泛接受的 HTML 标准。2014年,HTML 5 发布,这是目前正在使用的版本。
浏览器的网页开发,涉及三种技术:HTML、CSS 和 JavaScript。HTML 语言定义网页的结构和内容,CSS 样式表定义网页的样式,JavaScript 语言定义网页与用户的互动行为。本教程只介绍 HTML 语言。
下面就是一个简单网页的 HTML 源码。
<html lang="en">
<head>
<meta charset="utf-8">
<title>网页标题title>
head>
<body>
<p>Hello Worldp>
body>
html>
HTML 代码由许许多多不同的标签(tag)构成。
<title>网页标题title>
标签用来告诉浏览器,如何处理这段代码。标签的内容就是浏览器所要渲染的、展示在网页上的内容。
标签放在一对尖括号里面(比如
),大多数标签都是成对出现的,分成开始标签和结束标签,结束标签在标签名之前加斜杠(比如)。但是,也有一些标签不是成对使用,而是只有开始标签,没有结束标签,比如
标签。
<meta charset="utf-8">
这种单独使用的标签,通常是因为标签本身就足够完成功能了,不需要标签之间的内容。实际引用中,它们主要用来提示浏览器,做一些特别处理。
标签可以嵌套。
<div><p>hello worldp>div>
嵌套时,必须保证正确的闭合顺序,不能跨层嵌套,否则会出现意想不到的渲染结果。
标签名是大小写不敏感,比如
和
是同一个标签。不过,一般习惯都是使用小写。
另外,HTML 语言忽略缩进和换行。也就是说,下面的写法与一行的写法效果是一样的。
<title>
网页标题
title>
进一步说,整个网页的 HTML 代码完全可以写成一行,浏览器照样解析,结果完全一样。有时,正式发布网页之前,开发者会把源码压缩成一行,以减少传输的字节数。网页内容的缩进和换行,主要靠 CSS 样式来实现。
浏览器渲染网页的时候,会把 HTML 源码解析成一个标签树,每个标签都是一个节点(node),称为网页元素(element)。所以,“标签”和“元素”基本上是同义词,只是使用的场合不一样:标签是源码角度来看,元素是从编程角度来看,比如标签对应网页的
p
元素。
嵌套的标签就构成了网页元素的层级关系。
<div><p>hello worldp>div>
上面代码中,div
元素内部包含了一个p
元素。上层元素又称为“父元素”,下层元素又称为“子元素”,即div
是p
的父元素,p
是div
的子元素。
所有元素可以分成两大类:块级元素(block)和行内元素(inline)。块级元素默认占据一个独立的区域,在网页上会自动另起一行,占据 100% 的宽度。
属性(attribute)是标签的额外信息,使用空格与标签名和其他属性分隔。
<img src="demo.jpg" width="500">
上面代码中,标签有两个属性:src和width。属性值一般放在双引号里面,这不是必需的,但推荐总是使用双引号。
注意,属性名是大小写不敏感的,onclick和onClick是同一个属性。
符合语法标准的网页,应该满足下面的基本结构。
<html lang="en">
<head>
<meta charset="utf-8">
<title>title>
head>
<body>
body>
html>
不管多么复杂的网页,都是从上面这个基本结构衍生出来的。
注意,HTML 代码的缩进和换行,对于浏览器不产生作用。所以,上面的代码完全可以写成一行,渲染结果不变。上面这样分行写,只是为了提高可读性。
下面介绍,这个基本结构的主要标签,它们构成网页的骨架。
网页的第一个标签通常是,表示文档类型,告诉浏览器如何解析网页。
一般来说,只要像下面这样,简单声明doctype为html即可。浏览器就会按照 HTML5 的规则处理网页。文档声明在HTML5文档必不可少,且必须放在文档的第一行。
有时,该标签采用完全大写的形式,以便区别于正常的 HTML 标签。因为本质上不是标签,更像一个处理指令。
标签是网页的顶层容器,也称为根元素(root element),其他元素都是它的子元素。一个网页只能有一个
标签。
该标签的lang属性,表示网页内容默认的语言。
<html lang="en">
标签是一个容器标签,用于放置网页的元信息。它的内容不会出现在网页上,而是为网页渲染做准备。
<html>
<head>
<title>网页标题title>
head>
html>
是
的第一个子元素。如果网页不包含
,浏览器会自动创建一个。
的子元素一般有:
:设置网页的元数据。
:连接外部样式表。
:设置网页标题。
:放置内嵌的样式表。
:引入脚本。
:浏览器不支持脚本时,所要显示的内容。
:设置网页内部相对 URL 的计算基准。
:设定基准的文字字体、字号和颜色
:表明该文档是一个可用于检索的网关脚本,由服务器自动建立
标签用于设置或说明网页的元数据,必须放在
里面。一个
标签就是一项元数据,网页可以有多个
。
的name属性表示元数据的名字,content属性表示元数据的值。
<head>
<meta name="description" content="HTML 语言入门">
<meta name="keywords" content="HTML,教程">
<meta name="author" content="LBJhui">
head>
上面代码包含了三个元数据:description是网页内容的描述,keywords是网页内容的关键字,author是网页作者。
还有一个charset属性,指定网页内容的编码方式,该属性非常重要。如果设置得不正确,浏览器可能无法正确解码,就会出现乱码。
<meta charset="utf-8">
上面代码声明,网页为utf-8编码。虽然可以使用其他的编码方式,但基本上总是应该采用 UTF-8
。
注意,声明的编码方式,应该与网页实际的编码方式一致,即声明了utf-8
,网页就应该使用 UTF-8
编码保存。
标签用于指定网页的标题,会显示在浏览器窗口的标题栏。
<head>
<title>网页标题title>
head>
搜索引擎根据这个标签,显示每个网页的标题。它对于网页在搜索引擎的排序,有很大的影响,应该精心安排,反映网页的主题。
标签的内部,不能再放置其他标签,只能放置无格式的纯文本。
标签是一个容器标签,用于放置网页的主体内容。浏览器显示的页面内容,都是放置在它的内部。它是
的第二个子元素,紧跟在
后面。
<html>
<head>
<title>网页标题title>
head>
<body>
<p>hello worldp>
body>
html>
HTML 语言有自己的空格处理规则。标签内容的头部和尾部的空格,一律忽略不计。
<p> hello world p>
上面代码中,hello前面的空格和world后面的空格,浏览器一律忽略不计。
标签内容里面的多个连续空格(包含制表符\t
),会被浏览器合并成一个。浏览器还会将文本里面的换行符(\n
)和回车符(\r
),替换成空格。
这意味着,HTML 源码里面的换行,不会产生换行效果。
HTML 代码可以包含注释,浏览器会自动忽略注释。注释以结尾,下面就是一个注释的例子。
注释可以是多行的,并且内部的 HTML 都不再生效了。
URL 是“统一资源定位符”(Uniform Resource Locator)的首字母缩写,中文译为“网址”,表示各种资源的互联网地址。下面就是一个典型的 URL。
https://www.example.com/path/index.html
所谓资源,可以简单理解成各种可以通过互联网访问的文件,比如网页、图像、音频、视频、JavaScript 脚本等等。只有知道了它们的 URL,才可能在互联网上获取它们。
只要资源可以互联网访问,它就必然有对应的 URL。一个 URL 对应一个资源,但是同一个资源可能对应多个 URL。
URL 是互联网的基础。互联网之所以“互联”,就是因为网页可以通过“链接”(link),包含其他 URL。用户只要点击,就可以从一个 URL 跳转到另一个 URL,前往不同的网站。
URL 由多个部分组成。为了讲解,下面是一个比较复杂的 URL。
https://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#anchor
我们看看,这个 URL 的各个部分。
协议(scheme)是浏览器请求服务器资源的方法,上例是https:// 的部分,表示使用 HTTPS 协议。
互联网支持多种协议,必须指明网址使用哪一种协议,默认是 HTTP 协议。也就是说,如果省略协议,直接在浏览器地址栏输入github.com/LBJhui ,那么浏览器默认会访问http://github.com/LBJhui 。HTTPS 是 HTTP 的加密版本,出于安全考虑,越来越多的网站使用这个协议。
HTTP 和 HTTPS 的协议名称后面,紧跟着一个冒号和两个斜杠(/)。其他协议不一定如此,邮件地址协议mailto:的协议名后面只有一个冒号,比如mailto:690306059@qq.com 。
主机(host)是资源所在的网站名或服务器的名字,又称为域名。上例的主机是 github.com 。
有些主机没有域名,只有 IP 地址,比如192.168.2.15。这种情况常常出现在局域网。
同一个域名下面可能同时包含多个网站,它们之间通过端口(port)区分。“端口”就是一个整数,可以简单理解成,访问者告诉服务器,想要访问哪一个网站。默认端口是80,如果省略了这个参数,服务器就会返回80端口的网站。
端口紧跟在域名后面,两者之间使用冒号分隔,比如www.example.com:80 。
路径(path)是资源在网站的位置。比如,/path/index.html这个路径,指向网站的/path子目录下面的网页文件index.html。
互联网的早期,路径是真实存在的物理位置。现在由于服务器可以模拟这些位置,所以路径只是虚拟位置。
路径可能只包含目录,不包含文件名,比如/foo/,甚至结尾的斜杠都可以省略。这时,服务器通常会默认跳转到该目录里面的index.html文件(即等同于请求/foo/index.html),但也可能有其他的处理(比如列出目录里面的所有文件),这取决于服务器的设置。一般来说,访问www.example.com 这个网址,很可能返回的是网页文件www.example.com/index.html 。
查询参数(parameter)是提供给服务器的额外信息。参数的位置是在路径后面,两者之间使用?分隔,上例是?key1=value1&key2=value2。
查询参数可以有一组或多组。每组参数都是键值对(key-value pair)的形式,同时具有键名(key)和键值(value),它们之间使用等号(=)连接。比如,key1=value就是一个键值对,key1是键名,value1是键值。
多组参数之间使用&连接,比如key1=value1&key2=value2。
锚点(anchor)是网页内部的定位点,使用#加上锚点名称,放在网址的最后,比如#anchor。浏览器加载页面以后,会自动滚动到锚点所在的位置。
锚点名称通过网页元素的id属性命名,详见《元素的属性》一章。
URL 的各个组成部分,只能使用以下这些字符。
26个英语字母(包括大写和小写)
10个阿拉伯数字
连词号(-)
句点(.)
下划线(_)
此外,还有18个字符属于 URL 的保留字符,只能在给定的位置出现。比如,查询参数的开头是问号(?),也就是说,问号只能出现查询参数的开头,出现在其他位置就是非法的,会导致网址解析错误。网址的其他部分如果要使用这些保留字符,必须使用它们的转义形式。
URL 字符转义的方法是,在这些字符的十六进制 ASCII 码前面加上百分号(%)。下面是这18个字符及其转义形式。
!:%21
#:%23
$:%24
&:%26
':%27
(:%28
):%29
*:%2A
+:%2B
,:%2C
/:%2F
::%3A
;:%3B
=:%3D
?:%3F
@:%40
[:%5B
]:%5D
举例来说,有一个网页的 URL 是foo?bar.html,即文件里面包含一个问号,那么需要写成foo%3Fbar.html。
URL 的合法字符,其实也可以采用这种转义方法,但是不建议使用。比如,字母a的十六进制 ASCII 码是61,转义形式后就是%61。因此,www.apple.com 又可以写成www.%61pple.com ,浏览器一样识别。
值得注意的是,空格的转义形式是%20。对于那些包含空格的文件名,这个转义是必须的。
既不属于合法字符、也不属于保留字符的其他字符(比如汉字),理论上不需要手动转义,可以直接写在 URL 里面,比如www.example.com/中国.html ,浏览器会自动将它们转义,发给服务器。转义方法是使用这些字符的十六进制 UTF-8 编码,每两位算作一组,然后每组头部添加百分号(%)。
举例来说,汉字中的 UTF-8 十六进制编码是e4b8ad,每两个字符一组,URL 转义后就为%e4%b8%ad。也就是说,URL 里面凡是有汉字中的地方,都要写成%e4%b8%ad。因此,访问www.example.com/中国.html 这个网址,需要写成下面的样子。
www.example.com/%e4%b8%ad%e5%9b%bd.html
上面代码中,中的转义形式是%e4%b8%ad,国是%e5%9b%bd。
URL 分成两种:绝对 URL 和相对 URL。
绝对 URL 指的是,只靠 URL 本身就能确定资源的位置。这意味着,URL 必须带有资源的完整信息,包含协议、主机、路径等部分。前面的例子都是绝对 URL。
相对 URL 指的是,URL 不包含资源位置的全部信息,必须结合当前网页的位置,才能定位资源。比如,当前网页的 URL 是https://www.example.com/path/index.html ,该网页上面有一个资源,URL 指向a.html,这个就是相对 URL。因为只知道a.html,并不能定位资源。浏览器假定,a.html与当前网址在同一个子目录下面,从而得到绝对 URL https://www.example.com/path/a.html 。
相对 URL 如果以斜杠(/)开头,就表示网站的根目录。否则,必须以当前目录为起点,推算资源的位置。比如,相对 URL /foo/bar.html表示网站根目录的子目录foo,foo/bar.html表示在当前目录的foo子目录。
URL 还可以使用两个特殊简写,表示特定位置。
. :表示当前目录,比如./a.html(当前目录下的a.html文件)
… :表示上级目录,比如…/a.html(上级目录下的a.html文件)
这两种简写可以多个连用,比如…/…/表示上两级目录。
绝对 URL 也可以使用这两个简写,比如www.example.com/./index.html 等同于www.example.com/index.html ,这时.相当于根目录的当前目录,即根目录本身。
标签指定网页内部的所有相对 URL 的计算基准。整张网页只能有一个
标签,而且只能放在里面。它是单独使用的标签,没有闭合标签,下面是一个例子。
<head>
<base href="https://www.example.com/files/" target="_blank">
head>
标签的href属性给出计算的基准网址,target属性给出如何打开链接的说明(参见《链接》一章)。
已知计算基准是https://www.example.com/files/ ,那么相对 URL foo.html,就可以转成绝对 URL https://www.example.com/files/foo.html 。
注意,
标签必须至少具有href属性或target属性之一。
网页元素的属性(attribute)可以定制元素的行为,不同的属性会导致元素有不同的行为。元素属性的写法是 HTML 标签内部的“键值对”。
<html lang="en">
上面代码中,标签内部的键值对
lang="en"
,就称为html元素的属性。属性名为lang,属性值为en。
属性名与标签名一样,不区分大小写,lang和LANG是同一个属性。
属性名与属性值之间,通过等号=
连接。属性值可以放在单引号或双引号之中,建议统一使用双引号。某些属性值可以不使用引号,但是建议不要这样写。
有些属性是布尔属性,即属性值是一个布尔值,只有“打开”和“关闭”两种情况。这时属性值可以省略,只要添加了属性名,就表示打开该属性。
<input type="text" required>
上面代码中,required就是标签的布尔属性。如果加上这个属性,就表示打开,没有关闭就是关闭。
全局属性(global attributes)是所有元素都可以使用的属性。也就是说,你可以把下面的属性,加在任意一个网页元素上面,不过有些属性对某些元素可能不产生意义。
下面是一些常见的全局属性。
id属性是元素在网页内的唯一标识符。比如,网页可能包含多个标签,id属性可以指定每个
标签的唯一标识符。
<p id="p1">p>
<p id="p2">p>
<p id="p3">p>
上面代码中,三个标签具有不同的id属性,因此可以区分。
id属性的值必须是全局唯一的,同一个页面不能有两个相同的id属性。另外,id属性的值不得包含空格。
id属性的值还可以在最前面加上#,放到 URL 中作为锚点,定位到该元素在网页内部的位置。比如,用户访问网址https://foo.com/index.html#bar 的时候,浏览器会自动将页面滚动到bar的位置,让用户第一眼就看到这部分内容。
class属性用来对网页元素进行分类。如果不同元素的class属性值相同,就表示它们是一类的。
<p class="para">p>
<p>p>
<p class="para">p>
上面代码中,第一个和第三个
是一类,因为它们的class属性相同。
元素可以同时具有多个 class,它们之间使用空格分隔。
<p class="p1 p2 p3">p>
上面的p元素同时具有p1、p2、p3三个 class。
title属性用来为元素添加附加说明。大多数浏览器中,鼠标悬浮在元素上面时,会将title属性值作为浮动提示,显示出来。
<div title="版权说明">
<p>本站内容使用创意共享许可证,可以自由使用。p>
div>
上面代码中,title属性解释了这一块内容的目的。鼠标悬停在上面时,浏览器会显示一个浮动提示。一旦鼠标移开,提示就会消失。
网页通常使用鼠标操作,但是某些情况下,用户可能希望使用键盘,或者只有键盘可以用。因此,浏览器允许使用 Tab 键,遍历网页元素。也就是说,只要不停按下 Tab 键,网页的焦点就会从一个元素转移到另一个元素,选定焦点元素以后,就可以进行下一步操作,比如按下回车键访问某个链接,或者直接在某个输入框输入文字。
这里就有一个问题,按下 Tab 键的时候,浏览器怎么知道跳到哪一个元素。HTML 提供了tabindex属性,解决这个问题。它的名字的含义,就是 Tab 的顺序(index)。
tabindex属性的值是一个整数,表示用户按下 Tab 键的时候,网页焦点转移的顺序。不同的属性值有不同的含义。
<p tabindex="0">这段文字可以获得焦点。p>
上面代码中,标签的tabindex为0,意味着该元素可以获得焦点,并且也可以被 Tab 键遍历,顺序由其在源码里面的位置决定。
一般来说,tabindex属性最好都设成0,按照自然顺序进行遍历,这样比较符合用户的预期,除非网页有特殊布局。如果网页所有元素都没有设置tabindex,那么只有那些默认可以遍历的元素(比如链接、输入框等)才能参与 Tab 键的遍历,顺序由其在源码的位置决定。因此实际上,只有那些无法获得焦点的元素(比如 accesskey属性指定网页元素获得焦点的快捷键,该属性的值必须是单个的可打印字符。只要按下快捷键,该元素就会得到焦点。 上面代码中, accesskey属性的字符键,必须配合功能键,一起按下才会生效。也就是说,快捷键是“功能键 + 字符键”的组合。不同的浏览器与不同的操作系统,功能键都不一样。比如,Chrome 浏览器在 Windows 系统和 Linux 系统的快捷键是Alt + 字符键,在 Mac 系统的快捷键是Ctrl + Alt + 字符键。 注意,accesskey如果跟操作系统或浏览器级别的快捷键有冲突,这时不会生效。 style属性用来指定当前元素的 CSS 样式。具体的设置,请看 CSS 教程。 上面代码指定文字颜色为红色。 hidden是一个布尔属性,表示当前的网页元素不再跟页面相关,因此浏览器不会渲染这个元素,所以就不会在网页中看到它。 上面代码中,这个p元素不会出现在网页上。 注意,CSS 的可见性设置,高于hidden属性。如果 CSS 设为该元素可见,hidden属性将无效。 lang属性指定网页元素使用的语言。 上面代码中,第一个 lang属性的值,必须符合 BCP47 的标准。下面是一些常见的语言代码。 dir属性表示文字的阅读方向,有三个可能的值。 HTML 网页的内容默认是用户不能编辑,contenteditable属性允许用户修改内容。它有两个可能的值。 上面代码中,鼠标单击句子,就可以进入编辑状态,用户可以改变句子的内容。当然,除非提交到服务器,否则刷新页面还是显示原来的内容。 该属性是枚举属性,不是布尔属性,规范的写法是最好带上属性值。 浏览器一般会自带拼写检查功能,编辑内容时,拼错的单词下面会显示红色的波浪线。spellcheck属性就表示,是否打开拼写检查。 它有两个可能的值。 上面代码中,seperate下面会有提示,表示拼错了。 注意,由于该属性只在编辑时生效,所以这个例子必须加上contenteditable属性,表示本段内容可编辑。鼠标单击就可以进入编辑状态,这时才会看到拼写提示。不可编辑的状态下,拼写错误是不提示显示的。对于那些不可编辑的元素,该属性无效。 这个属性看上去像布尔属性,但是其实是枚举属性,所以最好不要省略它的值。如果没有指定这个属性,浏览器将自行决定是否打开拼写检查。 除了上面这些属性,全局属性还包括事件处理属性(event handler),用来响应用户的动作。这些属性的值都是 JavaScript 代码,请参考 JavaScript 教程,这里只列出这些属性的名单。 网页包含了大量的文字,浏览器必须知道这些文字的编码方法,才能把文字还原出来。 一般情况下,服务器向浏览器发送 HTML 网页文件时,会通过 HTTP 头信息,声明网页的编码方式。 上面代码中,HTTP 头信息的Content-Type字段先声明,服务器发送的数据类型是text/html(即 HTML 网页),然后声明网页的文字编码是UTF-8。 网页内部也会再用 网页可以使用不同语言的编码方式,但是最常用的编码是 UTF-8。UTF-8 编码是 Unicode 字符集的一种表达方式。这个字符集的设计目标是包含世界上的所有字符,目前已经收入了十多万个字符。 每个字符有一个 Unicode 号码,称为码点(code point)。如果知道码点,就能查到这是什么字符。举例来说,英文字母a的码点是十进制的97(十六进制的61),汉字“中”的码点是十进制的20013(十六进制的4e2d)。 由于下面的原因,不是每一个 Unicode 字符都能直接在 HTML 语言里面显示。 (1)不是每个 Unicode 字符都可以打印出来,有些没有可打印形式,比如换行符的码点是十进制的10(十六进制的A),就没有对应的字面形式。 (2)小于号(<)和大于号(>)用来定义 HTML 标签,其他需要用到这两个符号的场合,必须防止它们被解释成标签。 (3)由于 Unicode 字符太多,无法找到一种输入法,可以直接输入所有这些字符。换言之,没有一种键盘,有办法输入所有符号。 (4)网页不允许混合使用多种编码,如果使用 UTF-8 编码的同时,又想插入其他编码的字符,就会很困难。 HTML 为了解决上面这些问题,允许使用 Unicode 码点表示字符,浏览器会自动将码点转成对应的字符。 字符的码点表示法是N;(十进制,N代表码点)或者N;(十六进制,N代表码点),比如,字符a可以写成a(十进制)或者a(十六进制),字符中可以写成中(十进制)或者中(十六进制),浏览器会自动转换它们。 上面代码中,字符可以直接表示,也可以使用十进制码点或十六进制码点表示。 注意,HTML 标签本身不能使用码点表示,否则浏览器会认为这是所要显示的文本内容,而不是标签。比如, 数字表示法的不方便之处,在于必须知道每个字符的码点,很难记忆。为了能够快速输入,HTML 为一些特殊字符,规定了容易记忆的名字,允许通过名字来表示它们,这称为实体表示法(entity)。 实体的写法是&name;,其中的name是字符的名子。下面是其中一些特殊字符,及其对应的实体。 注意,上面最后一个特殊字符是空格,它也有对应的实体表示法。 字符的数字表示法和实体表示法,都可以表示正常情况无法输入的字符,逃脱了浏览器的限制,所以英语里面称为“escape”,中文翻译为“字符的转义”。 历史上,网页的主要功能是文本展示。所以,HTML 提供了大量的文本处理标签。 它的最常见用途就是提供 CSS 的钩子,用来指定各种样式。所以在早期,下面层层包裹的 上面代码读起来很费力,因为不带有语义( 带有语义的块级标签(比如 上面代码中,句子里面需要强调的部分,就可以放在 浏览器渲染上面代码时,会分成两行,hello和world各占一行。 上面的代码如果不用 注意,块级元素的间隔,不要使用 上面的代码希望段落之间有两个换行,这时不应该使用 上面代码是一个很长的德语单词,为了防止不正确断行,事先用 上面代码的渲染结果是,两段之间会出现一根水平线。 该标签是历史遗留下来的,建议尽量避免使用。主题之间的分隔可以使用 上面代码中,换行和连续空格都会由于 注意,HTML 标签在 上面代码中, 它与 虽然浏览器通常会以斜体显示 上面代码中, 注意, 上面代码中,“三文鱼”会有一根删除线。 跟 注意,浏览器默认会斜体显示 如果要表示多行代码, 除了标记感兴趣的文本, 注意,不要只为了高亮的效果,而使用这个标签,因为不能保证浏览器的处理方式。如果要保证高亮,还是要使用 CSS 样式。 上面代码中, 上面代码中,选手的机读数据就放在 该标签有几个注意点。 浏览器默认为 这两个标签都有以下属性。 为了脚本操作的方便,可以把术语的定义写入 上面代码中,title属性的一个作用是,鼠标悬浮的时候,术语的解释会以提示的形式显示出来。 某些时候,术语本身是一个缩写,这时 上面代码的渲染结果是,汉字上方有小字体的拼音。 如果想让拼音不是显示在文字上方,而是显示在文字右侧,写法如下。 大部分文字的阅读方向是从左到右,但是有些文字的方向是从右到左,比如阿拉伯语、希伯来语等。 上面代码中, 列表是一系列排列好的项目,主要分成两类:有序列表和无序列表。 有序列表是每个列表项前面有编号,呈现出顺序,就像下面这样。 无序列表则是列表项前面没有编号,只有一个列表符号,默认是一个圆点。 上面代码会在列表项 A、B、C 前面,分别产生1、2、3的编号。 上面代码中,一个有序列表内部嵌套了另一个有序列表,渲染结果如下。 该标签有以下属性。 (1)reversed reversed属性产生倒序的数字列表。 上面代码中,列表项 A、B、C 前面,产生的编号是3、2、1。 (2)start start属性的值是一个整数,表示数字列表的起始编号。 上面代码中,列表项 A、B、C 前面,产生的编号是5、6、7。 (3)type type属性指定数字编号的样式。目前,浏览器支持以下样式。 上面代码中,列表项 A、B、C 前面的编号,分别是英文小写字母a、b、c。 注意,即使编号是字母,start属性也依然使用整数。 上面代码中,type属性指定编号采用小写英文字母,start属性等于3,表示从c开始编号。 上面代码的渲染结果是,列表项 A、B、C 前面,分别产生一个实心小圆点,作为列表符号。 有序列表 上面代码中,value属性指定第二个列表项的编号是4,因此三个列表项的编号,分别为1、4、5。 多个术语( 上面代码中,A和B有共同的解释C,而D有两个解释E和F。 链接(hyperlink)是互联网的核心。它允许用户在页面上,从一个网址跳转到另一个网址,从而把所有资源联系在一起。 URL 是链接指向的地址。链接不仅可以指向另一个网页,也可以指向文本、图像、文件等资源。可以这样说,所有互联网上的资源,都可以通过链接访问。 链接通过 上面代码就定义了一个超级链接。浏览器显示“维基百科”,文字下面默认会有下划线,表示这是一个链接。用户点击后,浏览器跳转到href属性指定的网址。 上面代码中, (1)href href属性给出链接指向的网址。它的值应该是一个 URL 或者锚点。 上文已经给出了完整 URL 的例子,下面是锚点的例子。 上面代码中,href属性的值是#加上锚点名称。点击后,浏览器会自动滚动,停在当前页面里面LBJhui锚点所在的位置。 (2)hreflang hreflang属性给出链接指向的网址所使用的语言,纯粹是提示性的,没有实际功能。 上面代码表明,href属性指向的网址的语言是英语。 该属性的值跟通用属性lang一样,语言代码可以参考《属性》一章的lang属性的介绍。 (3)title title属性给出链接的说明信息。鼠标悬停在链接上方时,浏览器会将这个属性的值,以提示块的形式显示出来。 上面代码中,用户鼠标停留在链接上面,会出现文字提示hello。 (4)target target属性指定如何展示打开的链接。它可以是在指定的窗口打开,也可以在 上面代码中,两个链接都在名叫test的窗口打开。首先点击链接foo,浏览器发现没有叫做test的窗口,就新建一个窗口,起名为test,在该窗口打开foo.com。然后,用户又点击链接bar,由于已经存在test窗口,浏览器就在该窗口打开bar.com,取代里面已经打开的foo.com。 target属性的值也可以是以下四个关键字之一。 上面代码点击后,浏览器会新建一个窗口,在该窗口打开链接,并且新窗口没有名字。 注意,使用target属性的时候,最好跟rel="noreferrer"一起使用,这样可以避免安全风险。 (5)rel rel属性说明链接与当前页面的关系。 上面代码的rel属性,说明链接是当前页面的帮助文档。 下面是一些常见的rel属性的值。 (6)referrerpolicy referrerpolicy属性用于精确设定点击链接时,浏览器发送 HTTP 头信息的Referer字段的行为。 该属性可以取下面八个值:no-referrer、no-referrer-when-downgrade、origin、origin-when-cross-origin、unsafe-url、same-origin、strict-origin、strict-origin-when-cross-origin。 其中,no-referrer表示不发送Referer字段,same-origin表示同源时才发送Referer字段,origin表示只发送源信息(协议+域名+端口)。其他几项的解释,请查阅 HTTP 文档。 (7)ping ping属性指定一个网址,用户点击的时候,会向该网址发出一个 POST 请求,通常用于跟踪用户的行为。 (8)type type属性给出链接 URL 的 MIME 类型,比如到底是网页,还是图像或文件。它也是纯粹提示性的属性,没有实际功能。 上面代码中,type属性提示这是一张图片。 (9)download download属性表明当前链接用于下载,而不是跳转到另一个 URL。 上面代码点击后,会出现下载对话框。 注意,download属性只在链接与网址同源时,才会生效。也就是说,链接应该与网址属于同一个网站。 如果download属性设置了值,那么这个值就是下载的文件名。 上面代码中,下载文件的原始文件名是foo.exe。点击后,下载对话框提示的文件名是bar.exe。 注意,如果链接点击后,服务器的 HTTP 回应的头信息设置了Content-Disposition字段,并且该字段的值与download属性不一致,那么该字段优先,下载时将显示其设置的文件名。 download属性还有一个用途,就是有些地址不是真实网址,而是数据网址,比如data:开头的网址。这时,download属性可以为虚拟网址指定下载的文件名。 上面链接点击后,会打开一个虚拟网页,上面显示Hello World!。 上面链接点击后,下载的hello.txt文件内容就是“Hello, World!”。 链接也可以指向一个邮件地址,使用mailto协议。用户点击后,浏览器会打开本机默认的邮件程序,让用户向指定的地址发送邮件。 上面代码中,链接就指向邮件地址。点击后,浏览器会打开一个邮件地址,让你可以向lbjhui@qq.com.com发送邮件。 除了邮箱,邮件协议还允许指定其他几个邮件要素。 使用方法是将这些邮件要素,以查询字符串的方式,附加在邮箱地址后面。 上面代码中,邮件链接里面不仅包含了邮箱地址,还包含了cc、subject、body等邮件要素。这些要素的值需要经过 URL 转义,比如空格转成%20。 不指定邮箱也是允许的,就像下面这样。这时用户自己在邮件程序里面,填写想要发送的邮箱,通常用于邮件分享网页。 如果是手机浏览的页面,还可以使用tel协议,创建电话链接。用户点击该链接,会唤起电话,可以进行拨号。 上面代码在手机中,点击链接会唤起拨号界面,可以直接拨打指定号码。 上面代码为网页加载样式表theme.css。 除了默认样式表,网页还可以加载替代样式表,即默认不生效、需要用户手动切换的样式表。 上面代码中,default.css是默认样式表,默认就会生效。fancy.css和basic.css是替换样式表(rel=“alternate stylesheet”),默认不生效。title属性在这里是必需的,用来在浏览器菜单里面列出这些样式表的名字,供用户选择,以替代默认样式表。 手机访问时,网站通常需要提供不同分辨率的图标文件。 上面代码指定 iPhone 设备需要的114像素和72像素的图标。 rel属性表示外部资源与当前文档之间的关系,是 下面是一些示例。 某些情况下,你需要浏览器预加载某些资源,也就是先把资源缓存下来,等到使用的时候,就不用再从网上下载了,立即就能使用。预处理指令可以做到这一点。 预加载主要有下面五种类型。 rel="preload"除了优先级较高,还有两个优点:一是允许指定预加载资源的类型,二是允许onload事件的回调函数。下面是rel="preload"配合as属性,告诉浏览器预处理资源的类型,以便正确处理。 上面代码要求浏览器提前下载并缓存style.css和main.js。 as属性指定加载资源的类型,它的值一般有下面几种。 如果不指定as属性,或者它的值是浏览器不认识的,那么浏览器会以较低的优先级下载这个资源。 有时还需要type属性,进一步明确 MIME 类型。 上面代码要求浏览器提前下载视频文件,并且说明这是 MP4 编码。 下面是预下载字体文件的例子。 注意,所有预下载的资源,只是下载到浏览器的缓存,并没有执行。如果希望资源预下载后立刻执行,可以参考下面的写法。 上面代码中,onload指定的回调函数会在脚本下载完成后执行,立即插入页面。 media属性给出外部资源生效的媒介条件。 上面代码中,打印时加载print.css,移动设备访问时(设备宽度小于600像素)加载mobile.css。 下面是使用media属性实现条件加载的例子。 上面代码中,如果屏幕宽度在600像素以下,则只加载第一个资源,否则就加载第二个资源。 上面代码嵌入网页,会立即执行。 上面代码会加载javascript.js脚本文件,并执行。 type属性给出脚本的类型,默认是 JavaScript 代码,所以可省略。完整的写法其实是下面这样。 type属性也可以设成module,表示这是一个 ES6 模块,不是传统脚本。 对于那些不支持 ES6 模块的浏览器,可以设置nomodule属性。支持 ES6 模块的浏览器,会不加载指定的脚本。这个属性通常与type="module"配合使用,作为老式浏览器的回退方案。 上面这段代码,只有浏览器不能执行 JavaScript 代码时才会显示,否则就不会显示。 图片是互联网的重要组成部分,让网页变得丰富多彩。本章介绍如何在网页插入图片。 上面代码在网页插入一张图片LBJhui.jpg。src属性指定图片的网址,上例是相对 URL,表示图片与网页在同一个目录。 上面代码的渲染结果是,文字和图片在同一行显示。 图像默认以原始大小显示。如果图片很大,又与文字处在同一行,那么图片将把当前行的行高撑高,并且图片的底边与文字的底边在同一条水平线上。 上面代码中,图片可以像链接那样点击,点击后会产生跳转。 alt属性用来设定图片的文字说明。图片不显示时(比如下载失败,或用户关闭图片加载),图片的位置上会显示该文本。 上面代码中,alt是图片的说明。图片下载失败时,浏览器会在图片位置,显示文字“示例图片”。 图片默认以原始大小插入网页,width属性和height属性可以指定图片显示时的宽度和高度,单位是像素或百分比。 上面代码中,width属性指定图片显示的宽度为400像素,height属性指定显示高度为300像素。 注意,一旦设置了这两个属性,浏览器会在网页中预先留出这个大小的空间,不管图片有没有加载成功。不过,由于图片的显示大小可以用 CSS 设置,所以不建议使用这两个属性。 一种特殊情况是,width属性和height属性只设置了一个,另一个没有设置。这时,浏览器会根据图片的原始大小,自动设置对应比例的图片宽度或高度。举例来说,图片大小是 800像素 x 800像素,width属性设置成200,那么浏览器会自动将height设成200。 详见下文的《响应式图像》部分。 有时,图片和网页属于不同的网站,网页加载图片就会导致跨域请求,对方服务器可能要求跨域认证。crossorigin属性用来告诉浏览器,是否采用跨域的形式下载图片,默认是不采用。 简单说,只要打开了这个属性,HTTP 请求的头信息里面,就会加入origin字段,给出请求发出的域名,不打开这个属性就不加。 一旦打开该属性,它可以设为两个值。 下面是一个例子。 crossorigin属性如果省略值的部分,则等同于anonymous。 浏览器的默认行为是,只要解析到 loading属性改变了这个行为,可以指定图片的懒加载,即图片默认不加载,只有即将滚动进入视口,变成用户可见时才会加载,这样就节省了带宽。 loading属性可以取以下三个值。 由于行内图片的懒加载,可能会导致页面布局重排,所以使用这个属性的时候,最好指定图片的高和宽。 除了图像, 网页在不同尺寸的设备上,都能产生良好的显示效果,叫做“响应式设计”(responsive web design)。响应式设计的网页图像,就是“响应式图像”(responsive image)。 响应式图像的解决方案有很多,JavaScript 和 CSS 都可以实现。这里只介绍语义性最好的 HTML 方法,浏览器原生支持。 我们知道, 上面代码在桌面端和手机上,插入的都是图像文件foo.jpg。 这种处理方法固然简单,但是有三大弊端。 (1)体积 一般来说,桌面端显示的是大尺寸的图像,文件体积较大。手机的屏幕较小,只需要小尺寸的图像,可以节省带宽,加速网页渲染。 (2)像素密度 桌面显示器一般是单倍像素密度,而手机的显示屏往往是多倍像素密度,即显示时多个像素合成为一个像素,这种屏幕称为 Retina 屏幕。图像文件很可能在桌面端很清晰,放到手机上会有点模糊,因为图像没有那么高的像素密度,浏览器自动把图像的每个像素复制到周围像素,满足像素密度的要求,导致图像的锐利度有所下降。 (3)视觉风格 桌面显示器的面积较大,图像可以容纳更多细节。手机的屏幕较小,许多细节是看不清的,需要突出重点。 为了解决上面这些问题,HTML 语言提供了一套完整的解决方案。首先, srcset属性用来指定多张图像,适应不同像素密度的屏幕。它的值是一个逗号分隔的字符串,每个部分都是一张图像的 URL,后面接一个空格,然后是像素密度的描述符。请看下面的例子 上面代码中,srcset属性给出了三个图像 URL,适应三种不同的像素密度。 图像 URL 后面的像素密度描述符,格式是像素密度倍数 + 字母x。1x表示单倍像素密度,可以省略。浏览器根据当前设备的像素密度,选择需要加载的图像。 如果srcset属性都不满足条件,那么就加载src属性指定的默认图像。 像素密度的适配,只适合显示区域一样大小的图像。如果希望不同尺寸的屏幕,显示不同大小的图像,srcset属性就不够用了,必须搭配sizes属性。 第一步,srcset属性列出所有可用的图像。 上面代码中,srcset属性列出四张可用的图像,每张图像的 URL 后面是一个空格,再加上宽度描述符。 宽度描述符就是图像原始的宽度,加上字符w。上例的四种图片的原始宽度分别为160像素、320像素、640像素和1280像素。 第二步,sizes属性列出不同设备的图像显示宽度。 sizes属性的值是一个逗号分隔的字符串,除了最后一部分,前面每个部分都是一个放在括号里面的媒体查询表达式,后面是一个空格,再加上图像的显示宽度。 上面代码中,sizes属性给出了三种屏幕条件,以及对应的图像显示宽度。宽度不超过440像素的设备,图像显示宽度为100%;宽度441像素到900像素的设备,图像显示宽度为33%;宽度900像素以上的设备,图像显示宽度为254px。 第三步,浏览器根据当前设备的宽度,从sizes属性获得图像的显示宽度,然后从srcset属性找出最接近该宽度的图像,进行加载。 假定当前设备的屏幕宽度是480px,浏览器从sizes属性查询得到,图片的显示宽度是33vw(即33%),等于160px。srcset属性里面,正好有宽度等于160px的图片,于是加载foo-160.jpg。 如果省略sizes属性,那么浏览器将根据实际的图像显示宽度,从srcset属性选择最接近的图片。一旦使用sizes属性,就必须与srcset属性搭配使用,单独使用sizes属性是无效的。 上面代码中, 浏览器按照 上面例子中,设备宽度如果不超过500px,就加载竖屏的图像,否则加载横屏的图像。 下面给出一个例子,同时考虑屏幕尺寸和像素密度的适配。 上面代码中, 除了响应式图像, 上面代码中, 浏览器按照 表格(table)以行(row)和列(column)的形式展示数据。、
2.5、accesskey
<button accesskey="s">提交button>
的快捷键是s,按下快捷键,该元素就得到了焦点。
2.6、style
<p style="color: red;">hellop>
2.7、hidden
<p hidden>本句不会显示在页面上。p>
2.8、lang,dir
<p lang="en">hellop>
<p lang="zh">你好p>
的lang属性,表示使用英语,第二个
的lang属性,表示使用中文。
2.9、contenteditable
<p contenteditable="true">
鼠标点击,本句内容可修改。
p>
2.10、spellcheck
<p contenteditable="true" spellcheck="true">
英语单词 separate 容易写错成 seperate。
p>
3、事件处理属性
onabort, onautocomplete, onautocompleteerror, onblur, oncancel, oncanplay, oncanplaythrough, onchange, onclick, onclose, oncontextmenu, oncuechange, ondblclick, ondrag, ondragend, ondragenter, ondragexit, ondragleave, ondragover, ondragstart, ondrop, ondurationchange, onemptied, onended, onerror, onfocus, oninput, oninvalid, onkeydown, onkeypress, onkeyup, onload, onloadeddata, onloadedmetadata, onloadstart, onmousedown, onmouseenter, onmouseleave, onmousemove, onmouseout, onmouseover, onmouseup, onmousewheel, onpause, onplay, onplaying, onprogress, onratechange, onreset, onresize, onscroll, onseeked, onseeking, onselect, onshow, onsort, onstalled, onsubmit, onsuspend, ontimeupdate, ontoggle, onvolumechange, onwaiting
HTML 字符编码
1、简介
Content-Type: text/html; charset=UTF-8
标签,再次声明网页的编码。
<meta charset="UTF-8">
2、字符的数字表示法
<p>hellop>
<p>hellop>
<p>hellop>
一旦写成
<p>
或者<p>
,浏览器就不再认为这是标签了,而会当作文本内容将其显示为。
3、字符的实体表示法
<:<
>:>
":"
':'
&:&
©:©
#:#
§:§
¥:¥
$:$
£:£
¢:¢
%:%
*:$ast;
@:@
^:^
±:±
空格:
文本标签
1、
<div class="main">
<div class="article">
<div class="title">
<h1>文章标题h1>
div>
div>
div>
<main>
<article>
<header>
<h1>文章标题h1>
header>
article>
main>
、
、
、
等)始终应该优先使用,当且仅当没有其他语义元素合适时,才可以使用
2、
标签是一个块级元素,代表文章的一个段落(paragraph)。不仅是文本,任何想以段落显示的内容,比如图片和表单项,都可以放进
元素。
<p>hello worldp>
3、
是一个通用目的的行内标签(即不会产生换行),不带有任何语义。它通常用作 CSS 样式的钩子,如果需要对某些行内内容指定样式,就可以把它们放置在
。
<p>这是一句<span>重要span>的句子。p>
。
4、
,
让网页产生一个换行效果。该标签是单独使用的,没有闭合标签。hello<br>world
对于诗歌和地址的换行非常有用。<p>
床前明月光,<br>
疑是地上霜。<br>
举头望明月,<br>
低头思故乡。
p>
,会显示成一行。
来产生,而要使用 CSS 指定。<p>第一段p>
<br>
<br>
<p>第二段p>
,而应该使用 CSS。
标签跟
很相似,表示一个可选的断行。如果一行的宽度足够,则不断行;如果宽度不够,需要断行,就在
的位置的断行。它是为了防止浏览器在一个很长的单词中间,不正确地断行或者不断行,所以事先标明可以断行的位置,主要用于欧洲一些单词很长的语言或者 URL 的断行。<p>
Fernstraßen<wbr>bau<wbr>privat<wbr>finanzierungs<wbr>gesetz
p>
告诉浏览器,可以选择在哪里断行。5、
用来在一篇文章中分隔两个不同的主题,浏览器会将其渲染为一根水平线。该标签是单独使用的,没有闭合标签。<p>第一个主题p>
<hr>
<p>第二个主题p>
,如果想要水平线的效果,可以使用 CSS。
6、
是一个块级元素,表示保留原来的格式(preformatted),即浏览器会保留该标签内部原始的换行和空格。浏览器默认以等宽字体显示标签内容。
<pre>hello
worldpre>
标签,而被保留下来,浏览器按照原样输出。
里面还是起作用的。
只保留空格和换行,不会保留 HTML 标签。
<pre><strong>hello worldstrong>pre>
标签的内容会加粗显示。
7、
,
是一个行内元素,表示它包含的内容具有很强的重要性,需要引起注意。浏览器会以粗体显示内容。
<p>开会时间是<strong>下午两点strong>。p>
与
很相似,也表示它包含的内容需要引起注意,浏览器会加粗显示。它是 Boldface 的缩写。
<p>开会时间是<b>下午两点b>。p>
的区别在于,由于历史原因,它没有语义,是一个纯样式的标签,违反了语义与样式分离的原则,因此不建议使用,应该优先使用
标签。
8、
,
是一个行内标签,表示强调(emphasize),浏览器会以斜体显示它包含的内容。
<p>我们<em>已经em>讨论过这件事情了。p>
,但无法保证一定如此,所以最好还是用 CSS 指定一下这个标签的样式。
标签与
相似,也表示与其他地方有所区别,浏览器会以斜体显示。它是 Italic 的缩写。
<p>我心想,这件事是<i>真的i>吗?p>
标签的语义不强,更接近是一个纯样式的标签,建议优先使用
标签代替它。
9、
,
,
标签将内容变为下标,
标签将内容变为上标。它们都是行内元素,主要用于数学公式、分子式等。
<p>水分子是 H<sub>2sub>O。p>
标签表示代码或数学公式的变量。
<p>勾股定理是
<var>avar><sup>2sup> + <var>bvar><sup>2sup> = <var>cvar><sup>2sup>
。p>
10、
,
标签是一个行内元素,表示对内容提供某种注释,提醒用户这里可能有问题,基本上只用来表示拼写错误。浏览器默认以下划线渲染内容。
<p>
一个容易写错的成语是把<em>安分守己em>写成<u>安份守己u>。
p>
提示用户这是一个拼写错误,“安份守己”的下方会有一个下划线。
会产生下划线,由于链接也默认带有下划线,所以必须非常小心使用
标签,避免用户误以为可以点击。万一确有必要使用,最好使用 CSS 改变
的默认样式。
标签是一个行内元素,为内容加上删除线。<p>今天特价商品:<s>三文鱼s>(售完)p>
11、
,
,
是一个块级标签,表示引用他人的话。浏览器会在样式上,与正常文本区别显示。
<blockquote cite="https://quote.example.com">
<p>天才就是 1% 的天赋和99%的汗水。p>
blockquote>
标签有一个
cite
属性,它的值是一个网址,表示引言来源,不会显示在网页上。标签表示引言出处或者作者,浏览器默认使用斜体显示这部分内容。
<blockquote cite="https://quote.example.com">
<p>天才就是 1% 的天赋和99%的汗水。p>
blockquote>
<cite>-- 爱迪生cite>
不一定跟
一起使用。如果文章中提到资料来源,也可以单独使用。
<p>更多资料请看<cite>维基百科cite>。p>
是一个行内标签,也表示引用。它与
的区别,就是它不会产生换行。
<p>
莎士比亚的《哈姆雷特》有一句著名的台词:
<q cite="https://quote.example.com">活着还是死亡,这是一个问题。q>
p>
一样,
也有cite属性,表示引言的来源网址。
的内容,并且会自动添加半角的双引号。所以,引用中文内容时要小心。
12、
标签是一个行内元素,表示标签内容是计算机代码,浏览器默认会以等宽字体显示。
<code>alert()code>的作用是让网页弹出一个提示框。
标签必须放在
内部。
本身仅表示一行代码。
<pre>
<code>
let a = 1;
console.log(a);
code>
pre>
13、
,
标签是一个行内元素,原意是用户从键盘输入的内容,现在扩展到各种输入,包括语音输入。浏览器默认以等宽字体显示标签内容。
<p>Windows 可以按下 <kbd>Ctrlkbd> + <kbd>Shiftkbd> + <kbd>Delkbd> 重启。p>
可以嵌套,方便指定样式。
<p>Windows 可以按下
<kbd> <kbd>Ctrlkbd> + <kbd>Shiftkbd> + <kbd>Delkbd> kbd>
重启。p>
标签是一个行内元素,表示计算机程序输出内容的一个例子。浏览器默认以等宽字体显示。
<p>如果使用没有定义的变量,浏览器会报错:
<samp>Uncaught ReferenceError: foo is not definedsamp>。
p>
14、
是一个行内标签,表示突出显示的内容。Chrome 浏览器默认会以亮黄色背景,显示该标签的内容。
<p>我们讨论以后决定,<mark>运行会在下周三举办mark>。p>
很适合在引用的内容(
或
)中,标记出需要关注的句子。
<blockquote>
床前明月光,疑是地上霜。<mark>举头望明月,低头思故乡。mark>
blockquote>
还可以用于在搜索结果中,标记出匹配的关键词。
15、
是一个行内标签,浏览器会将它包含的内容,以小一号的字号显示,不需要使用 CSS 样式。它通常用于文章附带的版权信息或法律信息。
<p>文章正文p>
<p><small>以上内容使用创意共享许可证。small>p>
16、
,
是一个行内标签,为跟时间相关的内容提供机器可读的格式。
<p>运动会预定<time datetime="2015-06-10">下周三time>举行。p>
表示下周三的具体日期。这方便搜索引擎抓取,或者下一步的其他处理。
的datetime属性,用来指定机器可读的日期,可以有多种格式。
<p>音乐会在<time datetime="20:00">晚上八点time>开始。p>
标签与
类似,也是提供机器可读的内容,但是用于非时间的场合。
<p>本次马拉松比赛第一名是<data value="39">LBJ辉data>p>。
标签的value属性。
17、
标签是一个块级元素,表示某人或某个组织的联系方式。
<p>作者的联系方式:p>
<address>
<p><a href="mailto:foo@example.com">foo@example.coma>p>
<p><a href="tel:+555-34762301">+555-34762301a>p>
address>
(1)如果是文章里提到的地址(比如提到搬家前的地址),而不是联系信息,不要使用标签。
(2)的内容不得有非联系信息,比如发布日期。
(3)不能嵌套,并且内部不能有标题标签(
~
),也不能有
、
、
、
、
、等标签。
(4)通常,会放在
<footer>
<address>
文章的相关问题请联系<a href='mailto:zhangsan@example.com'>LBJ辉
McClurea>。
address>
footer>
18、
标签是一个行内元素,表示标签内容是一个缩写。它的title属性给出缩写的完整形式,或者缩写的描述。鼠标悬停在该元素上方时,title属性值作为提示,会完整显示出来。
<abbr title="HyperText Markup Language">HTMLabbr>
注意,某些浏览器可能对该标签提供圆点下划线。
19、
,
标签是一个行内元素,表示原始文档添加(insert)的内容。
与之类似,表示删除(delete)的内容。它们通常用于展示文档的删改。<del><p>会议定于5月8日举行。p>del>
<ins><p>会议定于5月9日举行。p>ins>
标签的内容加上删除线,为标签的内容加上下划线。
<ins cite="./why.html" datetime="2018-05">
<p>项目比原定时间提前两周结束。p>
ins>
20、
是一个行内元素,表示标签内容是一个术语(definition),本段或本句包含它的定义。
<p>
通过 TCP/IP 协议连接的全球性计算机网络,叫做 <dfn>Internetdfn>。
p>
标签的title属性。
<p>
通过 TCP/IP 协议连接的全球性计算机网络,叫做
<dfn title="全球性计算机网络">Internetdfn>。
p>
和
可以结合使用。
<p>
<dfn><abbr title="acquired immune deficiency syndrome">AIDSabbr><dfn>
的全称是获得性免疫缺陷综合征。
p>
21、
,
用于表示东亚文字的语音,比如汉语拼音。它默认会以小字体,显示在文字的上方。
<ruby>
汉<rp>(rp><rt>hanrt><rp>)rp>
字<rp>(rp><rt>zirt><rp>)rp>
ruby>
是一个行内元素,也是一个容器标签,内部还有许多配套的标签。
:标注语音符号的起始符号(默认为半角括号)和结束符号(默认为半角右括号),默认不显示。
:标注语音符号。
:划分文字单位,与语音一一对应。
:
的容器,主要作用是将语音显示在文字的右侧。<ruby>
<rbc>
<rb>汉rb><rp>(rp><rt>hanrt><rp>)rp>
<rb>字rb><rp>(rp><rt>zirt><rp>)rp>
rbc>
ruby>
22、
,
标签是一个行内元素,表示文字方向与网页主体内容的方向不一致。
<p>床前明月光,<bdo dir="rtl">霜上地是疑bdo>。p>
标签里面的文字,会以相反的方向渲染,结果就是“床前明月光,疑是地上霜”。
的dir属性,指定具体的文字方向。它有两个值,ltr表示从左到右,rtl表示从右到左。
标签用于不确定文字方向的情况。比如,网页有一个部分是用户输入的内容,但是不知道输入内容的文字方向。这种情况就可以使用
标签,告诉浏览器,不确定文字的方向,由浏览器自己决定。
<p><bdi>床前明月光,疑是地上霜。bdi>p>
列表标签
1. 列表项 A
2. 列表项 B
3. 列表项 C
1、
标签是一个有序列表容器(ordered list),会在内部的列表项前面产生数字编号。列表项的顺序有意义时,比如排名,就会采用这个标签。<ol>
<li>列表项 Ali>
<li>列表项 Bli>
<li>列表项 Cli>
ol>
标签内部可以嵌套
标签或
标签,形成多级列表。<ol>
<li>列表项 Ali>
<li>列表项 B
<ol>
<li>列表项 B1li>
<li>列表项 B2li>
<li>列表项 B3li>
ol>
li>
<li>列表项 Cli>
ol>
1. 列表项 A
2. 列表项 B
1. 列表项 B1
2. 列表项 B2
3. 列表项 B3
3. 列表项 C
<ol reversed>
<li>列表项 Ali>
<li>列表项 Bli>
<li>列表项 Cli>
ol>
<ol start="5">
<li>列表项 Ali>
<li>列表项 Bli>
<li>列表项 Cli>
ol>
<ol type="a">
<li>列表项 Ali>
<li>列表项 Bli>
<li>列表项 Cli>
ol>
<ol type="a" start="3">
<li>列表项 Ali>
<li>列表项 Bli>
<li>列表项 Cli>
ol>
2、
标签是一个无序列表容器(unordered list),会在内部的列表项前面产生实心小圆点,作为列表符号。列表项的顺序无意义时,采用这个标签。<ul>
<li>列表项 Ali>
<li>列表项 Bli>
<li>列表项 Cli>
ul>
标签内部可以嵌套
或
,形成多级列表。3、
表示列表项,用在
或
容器之中。
之中,有一个value属性,定义当前列表项的编号,后面列表项会从这个值开始编号。
<ol>
<li>列表项 Ali>
<li value="4">列表项 Bli>
<li>列表项 Cli>
ol>
4、
,,
标签是一个块级元素,表示一组术语的列表(description list)。术语名(description term)由标签定义,术语解释(description detail)由
标签定义。
常用来定义词汇表。<dl>
<dt>CPUdt>
<dd>中央处理器dd>
<dt>Memorydt>
<dd>内存dd>
<dt>Hard Diskdt>
<dd>硬盘dd>
dl>
和
都是块级元素,
默认会在
下方缩进显示。上面代码的默认渲染结果如下。
CPU
中央处理器
Memory
内存
Hard Disk
硬盘
)对应一个解释(
),或者多个解释(
)对应一个术语(
),都是合法的。
<dl>
<dt>Adt>
<dt>Bdt>
<dd>Cdd>
<dt>Ddt>
<dd>Edd>
<dd>Fdd>
dl>
链接标签
1、
标签表示,用户点击后,浏览器会跳转到指定的网址。下面就是一个典型的链接。
<a href="https://www.jianshu.com/u/01d07de71a9a">LBJ辉简书a>
标签内部不仅可以放置文字,也可以放置其他元素,比如段落、图像、多媒体等等。
<a href="https://www.jianshu.com/u/01d07de71a9a">
<img src="LBJhui.jpg">
a>
标签内部就是一个图像。用户点击图像,就会跳转到指定网址。
<a href="#LBJhui">LBJhui锚点a>
<a
href="https://www.jianshu.com/u/01d07de71a9a"
hreflang="en"
>LBJ辉简书a>
<a
href="https://www.jianshu.com/u/01d07de71a9a"
title="hello"
>LBJ辉简书a>
里面打开。
<p><a href="http://foo.com" target="test">fooa>p>
<p><a href="http://bar.com" target="test">bara>p>
里面的链接。如果当前窗口没有上层窗口,这个值等同于_self。
<a
href="https://www.jianshu.com/u/01d07de71a9a"
target="_blank"
>LBJ辉简书a>
<a href="help.html" rel="help">帮助a>
<a
href="LBJhui.jpg"
type="image/jpeg"
>LBJhui图片a>
<a href="LBJhui.txt" download>下载a>
<a
href="foo.exe"
download="bar.exe"
>点击下载a>
<a href="data:,Hello%2C%20World!">点击a>
<a
href="data:,Hello%2C%20World!"
download="hello.txt"
>点击a>
2、邮件链接
<a href="mailto:lbjhui@qq.com">联系我们a>
<a
href="mailto:foo@bar.com?cc=test@test.com&subject=The%20subject&body=The%20body"
>发送邮件a>
<a href="mailto:">告诉朋友a>
3、电话链接
<a href="tel:13312345678">13312345678a>
4、
4.1、基本用法
标签主要用于将当前网页与相关的外部资源联系起来,通常放在
元素里面。最常见的用途就是加载 CSS 样式表。
<link rel="stylesheet" type="text/css" href="theme.css">
<link href="default.css" rel="stylesheet" title="Default Style">
<link href="fancy.css" rel="alternate stylesheet" title="Fancy">
<link href="basic.css" rel="alternate stylesheet" title="Basic">
还可以加载网站的 favicon 图标文件。
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="favicon114.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="favicon72.png">
也用于提供文档的相关链接,比如下面是给出文档的 RSS Feed 地址。
4.2、rel 属性
标签的必需属性。它可以但不限于取以下值。
<link rel="author" href="humans.txt">
<link rel="license" href="copyright.html">
<link rel="alternate" href="https://es.example.com/" hreflang="es">
<link rel="me" href="https://google.com/profiles/someone" type="text/html">
<link rel="me" href="mailto:lbjhui@qq.com">
<link rel="me" href="sms:+15035550125">
<link rel="archives" href="http://example.com/archives/">
<link rel="index" href="http://example.com/article/">
<link rel="first" href="http://example.com/article/">
<link rel="last" href="http://example.com/article/?page=42">
<link rel="prev" href="http://example.com/article/?page=1">
<link rel="next" href="http://example.com/article/?page=3">
4.3、资源的预加载
(1)
告诉浏览器尽快下载并缓存资源(如脚本或样式表),该指令优先级较高,浏览器肯定会执行。当加载页面几秒钟后需要该资源时,它会很有用。下载后,浏览器不会对资源执行任何操作,脚本未执行,样式表未应用。它只是缓存,当其他东西需要它时,它立即可用。
<link rel="preload" href="image.png" as="image">
<link rel="preload" href="style.css" as="style">
<link rel="preload" href="main.js" as="script">
<link rel="preload" href="sintel-short.mp4" as="video" type="video/mp4">
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" as="style" href="async_style.css" onload="this.rel='stylesheet'">
(2)
的使用场合是,如果后续的页面需要某个资源,并且希望预加载该资源,以便加速页面渲染。该指令不是强制性的,优先级较低,浏览器不一定会执行。这意味着,浏览器可以不下载该资源,比如连接速度很慢时。
<link rel="prefetch" href="https://www.jianshu.com/u/01d07de71a9a">
(3)
要求浏览器提前与某个域名建立 TCP 连接。当你知道,很快就会请求该域名时,这会很有帮助。
<link rel="preconnect" href="https://www.jianshu.com/u/01d07de71a9a">
(4)
要求浏览器提前执行某个域名的 DNS 解析。
<link rel="dns-prefetch" href="//example.com/">
(5)
要求浏览器加载某个网页,并且提前渲染它。用户点击指向该网页的链接时,就会立即呈现该页面。如果确定用户下一步会访问该页面,这会很有帮助。
<link rel="prerender" href="https://www.jianshu.com/u/01d07de71a9a">
4.4、media 属性
<link href="print.css" rel="stylesheet" media="print">
<link href="mobile.css" rel="stylesheet" media="screen and (max-width: 600px)">
<link rel="preload" as="image" href="map.png" media="(max-width: 600px)">
<link rel="preload" as="script" href="map.js" media="(min-width: 601px)">
4.5、其他属性
标签的其他属性如下。
5、
用于加载脚本代码,目前主要是加载 JavaScript 代码。
<script>
console.log('hello world');
script>
也可以加载外部脚本,src属性给出外部脚本的地址。
<script src="javascript.js">script>
<script type="text/javascript" src="javascript.js">script>
<script type="module" src="main.js">script>
<script type="module" src="main.js">script>
<script nomodule src="fallback.js">script>
还有下面一些其他属性,大部分跟 JavaScript 语言有关,可以参考相关的 JavaScript 教程。
6、
标签用于浏览器不支持或关闭 JavaScript 时,所要显示的内容。
<noscript>
您的浏览器不能执行 JavaScript 语言,页面无法正常显示。
noscript>
图像标签
1、
标签用于插入图片。它是单独使用的,没有闭合标签。
<img src="LBJhui.jpg">
默认是一个行内元素,与前后的文字处在同一行。
<p>Hello<img src="foo.jpg">Worldp>
<a href="example.html">
<img src="foo.jpg">
a>
(1)alt 属性
<img src="foo.jpg" alt="示例图片">
(2)width 属性,height 属性
<img src="foo.jpg" width="400" height="300">
(3)srcset,sizes
(4)referrerpolicy
导致的图片加载的 HTTP 请求,默认会带有Referer的头信息。referrerpolicy属性对这个行为进行设置。
(5)crossorigin
<img src="foo.jpg" crossorigin="anonymous">
<img src="foo.jpg" crossorigin>
(6)loading
标签,就开始加载图片。对于很长的网页,这样做很浪费带宽,因为用户不一定会往下滚动,一直看到网页结束。用户很可能是点开网页,看了一会就关掉了,那些不在视口的图片加载的流量,就都浪费了。
<img src="image.png" loading="lazy" alt="…" width="200" height="200">
2、
,
标签可以理解是一个图像区块,将图像和相关信息封装在一起。
是它的可选的子元素,表示图像的标题。<figure>
<img src="https://example.com/foo.jpg">
<figcaption>示例图片figcaption>
figure>
还可以封装引言、代码、诗歌等等。它等于是一个将主体内容与附加信息,封装在一起的语义容器。
3、响应式图像
3.1、问题的由来
标签用于插入网页图像,所有情况默认插入的都是同一张图像。
<img src="foo.jpg">
3.2、srcset属性
标签引入了srcset属性。
<img srcset="foo-320w.jpg,
foo-480w.jpg 1.5x,
foo-640w.jpg 2x"
src="foo-640w.jpg">
3.3、sizes属性
<img srcset="foo-160.jpg 160w,
foo-320.jpg 320w,
foo-640.jpg 640w,
foo-1280.jpg 1280w"
src="foo-1280.jpg">
<img srcset="foo-160.jpg 160w,
foo-320.jpg 320w,
foo-640.jpg 640w,
foo-1280.jpg 1280w"
sizes="(max-width: 440px) 100vw,
(max-width: 900px) 33vw,
254px"
src="foo-1280.jpg">
4、
4.1、响应式用法
标签的srcset属性和sizes属性分别解决了像素密度和屏幕大小的适配,但如果要同时适配不同像素密度、不同大小的屏幕,就要用到
标签。
是一个容器标签,内部使用
和
,指定不同情况下加载的图像。
<picture>
<source media="(max-width: 500px)" srcset="cat-vertical.jpg">
<source media="(min-width: 501px)" srcset="cat-horizontal.jpg">
<img src="cat.jpg" alt="cat">
picture>
标签内部有两个
标签和一个
标签。
内部的
标签,主要使用media属性和srcset属性。media属性给出媒体查询表达式,srcset属性就是
标签的srcset属性,给出加载的图像文件。sizes属性其实这里也可以用,但由于有了media属性,就没有必要了。
标签出现的顺序,依次判断当前设备是否满足media属性的媒体查询表达式,如果满足就加载srcset属性指定的图片文件,并且不再执行后面的
标签和
标签。
标签是默认情况下加载的图像,用来满足上面所有
都不匹配的情况,或者不支持
的老式浏览器。
<picture>
<source srcset="homepage-person@desktop.png,
homepage-person@desktop-2x.png 2x"
media="(min-width: 990px)">
<source srcset="homepage-person@tablet.png,
homepage-person@tablet-2x.png 2x"
media="(min-width: 750px)">
<img srcset="homepage-person@mobile.png,
homepage-person@mobile-2x.png 2x"
alt="Shopify Merchant, Corrine Anestopoulos">
picture>
标签的media属性给出屏幕尺寸的适配条件,每个条件都用srcset属性,再给出两种像素密度的图像 URL。
4.2、图像格式的选择
标签还可以用来选择不同格式的图像。比如,如果当前浏览器支持 Webp 格式,就加载这种格式的图像,否则加载 PNG 图像。
<picture>
<source type="image/svg+xml" srcset="logo.xml">
<source type="image/webp" srcset="logo.webp">
<img src="logo.png" alt="ACME Corp">
picture>
标签的type属性给出图像的 MIME 类型,srcset是对应的图像 URL。
标签出现的顺序,依次检查是否支持type属性指定的图像格式,如果支持就加载图像,并且不再检查后面的
标签了。上面例子中,图像加载优先顺序依次为 svg 格式、webp 格式和 png 格式。
表格标签
1、