目录
URL(统一资源定位符)
概述
网址的组成部分
协议
主机
端口
路径
查询参数
锚点
文本标签
示例:
链接标签
示例:
图片标签
示例:
列表标签
示例:
URL(统一资源定位符)
概述
URL 是“统一资源定位符”(Uniform Resource Locator)的首字母缩写,中文译为“网址”,表示各种资源的互联网地址。下面就是一个典型的 URL。
https://www.example.com/path/index.html
所谓资源,可以简单理解成各种可以通过互联网访问的文件,比如网页、图像、音频、视频、JavaScript 脚本等等。只有知道了它们的 URL,才能在互联网上获取它们。
只要资源可以通过互联网访问,它就必然有对应的 URL。一个 URL 对应一个资源,但是同一个资源可能对应多个 URL。
URL 是互联网的基础。互联网之所以“互联”,就是因为网页可以通过“链接”(link),包含其他 URL。用户只要点击,就可以从一个 URL 跳转到另一个 URL,前往不同的网站。
网址的组成部分
URL 由多个部分组成。下面是一个比较复杂的 URL,实际的 URL 通常不会有这么多部分。
https://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#anchor
协议 主机名 端口 路径 查询参数 锚点
我们看看,这个 URL 的各个部分:
协议
协议(scheme)是浏览器请求服务器资源的方法,上例是https://
的部分,表示使用 HTTPS 协议。
互联网支持多种协议,必须指明网址使用哪一种协议,默认是 HTTP 协议。也就是说,如果省略协议,直接在浏览器地址栏输入www.example.com
,那么浏览器默认会访问http://www.example.com
。HTTPS 是 HTTP 的加密版本,出于安全考虑,越来越多的网站使用这个协议。
HTTP 和 HTTPS 的协议名称后面,紧跟着一个冒号和两个斜杠(://
)。其他协议不一定如此,邮件地址协议mailto:
的协议名后面只有一个冒号,比如mailto:foo@example.com
。
主机
主机(host)是资源所在的网站名或服务器的名字,又称为域名。上例的主机是www.example.com
。
有些主机没有域名,只有 IP 地址,比如192.168.2.15
。这种情况常常出现在局域网。
端口
同一个域名下面可能同时包含多个网站,它们之间通过端口(port)区分。“端口”就是一个整数,可以简单理解成,访问者告诉服务器,想要访问哪一个网站。HTTP 协议的默认端口是80,如果省略了这个参数,服务器就会返回80端口的网站。
端口紧跟在域名后面,两者之间使用冒号分隔,比如www.example.com:80
。
常见的端口以及对应的协议:
20 ftp 21 ftp 22 SSH 23 talent 25 smtp 53 DNS 67 68 DHCP 80 http 110 pop3 443 https 389 ladp 3306 mysql 1433 sqlserver 1521 oracle 3389 window远程桌面 6379 redis(nosql数据库)
路径
路径(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
。浏览器加载页面以后,会自动滚动到锚点所在的位置。
文本标签
<div>
<div>
是一个通用标签,表示一个区块(division)。它没有语义,如果网页需要一个块级元素容器,又没有其他合适的标签,就可以使用这个标签。
它的最常见用途就是提供 CSS 的钩子,用来指定各种样式。所以在早期,下面层层包裹的<div>
就很常见。
<div class="main">
<div class="article">
<div class="title">
<h1>文章标题</h1>
</div>
</div>
</div>
上面代码读起来很费力,因为不带有语义。后来,HTML 5 就提出了语义标签,改进了上面的代码。
<main>
<article>
<header>
<h1>文章标题</h1>
</header>
</article>
</main>
<div>
是无语义的块级元素。下面的例子使用<div>
,将图像和文字组合在一起,构成一个警告区块。
<div>
<img src="warning.jpg" alt="警告">
<p>小心</p>
</div>
只要样式上需要多个块级元素组合在一起,就可以使用<div>
。但是,这应该是最后的措施,带有语义的块级标签(比如<article>
、<section>
、<aside>
、<nav>
等)始终应该优先使用,当且仅当没有其他语义元素合适时,才可以使用<div>
。
<p>
<p>
标签是一个块级元素,代表文章的一个段落(paragraph)。不仅是文本,任何想以段落显示的内容,比如图片和表单项,都可以放进<p>
元素。
<p>hello world</p>
上面代码就是一个简单的段落。
<span>
<span>
是一个通用目的的行内标签(即不会产生换行),不带有任何语义。
它通常用作 CSS 样式的钩子,如果需要对某些行内内容指定样式,就可以把它们放置在<span>
。
<p>这是一句<span>重要</span>的句子。</p>
上面代码中,句子里面需要强调的部分,就可以放在<span>
。
<br>
<br>
让网页产生一个换行效果。该标签是单独使用的,没有闭合标签。
hello<br>world
浏览器渲染上面代码时,会分成两行,hello
和world
各占一行。
<br>
对于诗歌和地址的换行非常有用。
<p>
床前明月光,<br>
疑是地上霜。<br>
举头望明月,<br>
低头思故乡。
</p>
上面的代码如果不用<br>
,会显示成一行。
注意,块级元素的间隔,不要使用<br>
来产生,而要使用 CSS 指定。
<p>第一段</p>
<br>
<br>
<p>第二段</p>
上面的代码希望段落之间有两个换行,这时不应该使用<br>
,而应该使用 CSS。
<wbr>
<wbr>
标签跟<br>
很相似,表示一个可选的断行。如果一行的宽度足够,则不断行;如果宽度不够,需要断行,就在<wbr>
的位置的断行。它是为了防止浏览器在一个很长的单词中间,不正确地断行或者不断行,所以事先标明可以断行的位置,主要用于欧洲一些单词很长的语言或者 URL 的断行。
<p>
Fernstraßen<wbr>bau<wbr>privat<wbr>finanzierungs<wbr>gesetz
</p>
上面代码是一个很长的德语单词,为了防止不正确断行,事先用<wbr>
告诉浏览器,可以选择在哪里断行。
<hr>
<hr>
用来在一篇文章中分隔两个不同的主题,浏览器会将其渲染为一根水平线。该标签是单独使用的,没有闭合标签。
<p>第一个主题</p>
<hr>
<p>第二个主题</p>
上面代码的渲染结果是,两段之间会出现一根水平线。
该标签是历史遗留下来的,建议尽量避免使用。主题之间的分隔可以使用<section>
,如果想要水平线的效果,可以使用 CSS。
示例:
<div>
我是div,我独占一行
</div>
<p>我是p标签,我也独占一行</p>
<span>我是span标签,一行可以有多个我 </span><span>我也是span标签</span><br>
<p>注意马上有一个分隔符hr出现</p>
<hr>
链接标签
<a>
链接通过<a>
标签表示,用户点击后,浏览器会跳转到指定的网址。下面就是一个典型的链接。
<a href="https://wikipedia.org/">维基百科</a>
上面代码就定义了一个超级链接。浏览器显示“维基百科”,文字下面默认会有下划线,表示这是一个链接。用户点击后,浏览器跳转到href
属性指定的网址。
<a>
标签内部不仅可以放置文字,也可以放置其他元素,比如段落、图像、多媒体等等。
<a href="https://www.example.com/">
<img src="https://www.example.com/foo.jpg">
</a>
上面代码中,<a>
标签内部就是一个图像。用户点击图像,就会跳转到指定网址。
<a>
标签有如下属性:
(1)href
href
属性给出链接指向的网址。它的值应该是一个 URL 或者锚点。
上文已经给出了完整 URL 的例子,下面是锚点的例子。
<a href="#demo">示例</a>
上面代码中,href
属性的值是#
加上锚点名称。点击后,浏览器会自动滚动,停在当前页面里面demo
锚点所在的位置。
(2)hreflang
hreflang
属性给出链接指向的网址所使用的语言,纯粹是提示性的,没有实际功能。
<a
href="https://www.example.com"
hreflang="en"
>示例网址</a>
上面代码表明,href
属性指向的网址的语言是英语。
该属性的值跟通用属性lang
一样,语言代码可以参考《属性》一章的lang
属性的介绍。
(3)title
title
属性给出链接的说明信息。鼠标悬停在链接上方时,浏览器会将这个属性的值,以提示块的形式显示出来。
<a
href="https://www.example.com/"
title="hello"
>示例</a>。
上面代码中,用户鼠标停留在链接上面,会出现文字提示hello
。
(4)target
target
属性指定如何展示打开的链接。它可以是在指定的窗口打开,也可以在<iframe>
里面打开。
<p><a href="http://foo.com" target="test">foo</a></p>
<p><a href="http://bar.com" target="test">bar</a></p>
上面代码中,两个链接都在名叫test
的窗口打开。首先点击链接foo
,浏览器发现没有叫做test
的窗口,就新建一个窗口,起名为test
,在该窗口打开foo.com
。然后,用户又点击链接bar
,由于已经存在test
窗口,浏览器就在该窗口打开bar.com
,取代里面已经打开的foo.com
。
target
属性的值也可以是以下四个关键字之一。
-
_self
:当前窗口打开,这是默认值。 -
_blank
:新窗口打开。 -
_parent
:上层窗口打开,这通常用于从父窗口打开的子窗口,或者<iframe>
里面的链接。如果当前窗口没有上层窗口,这个值等同于_self
。 -
_top
:顶层窗口打开。如果当前窗口就是顶层窗口,这个值等同于_self
。
<a
href="https://www.example.com"
target="_blank"
>示例链接</a>
上面代码点击后,浏览器会新建一个窗口,在该窗口打开链接,并且新窗口没有名字。
注意,使用target
属性的时候,最好跟rel="noreferrer"
一起使用,这样可以避免安全风险。
(5)rel
rel
属性说明链接与当前页面的关系。
<a href="help.html" rel="help">帮助</a>
上面代码的rel
属性,说明链接是当前页面的帮助文档。
下面是一些常见的rel
属性的值。
-
alternate
:当前文档的另一种形式,比如翻译。 -
author
:作者链接。 -
bookmark
:用作书签的永久地址。 -
external
:当前文档的外部参考文档。 -
help
:帮助链接。 -
license
:许可证链接。 -
next
:系列文档的下一篇。 -
nofollow
:告诉搜索引擎忽略该链接,主要用于用户提交的内容,防止有人企图通过添加链接,提高该链接的搜索排名。 -
noreferrer
:告诉浏览器打开链接时,不要将当前网址作为 HTTP 头信息的Referer
字段发送出去,这样可以隐藏点击的来源。 -
noopener
:告诉浏览器打开链接时,不让链接窗口通过 JavaScript 的window.opener
属性引用原始窗口,这样就提高了安全性。 -
prev
:系列文档的上一篇。 -
search
:文档的搜索链接。 -
tag
:文档的标签链接。
(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 类型,比如到底是网页,还是图像或文件。它也是纯粹提示性的属性,没有实际功能。
<a
href="smile.jpg"
type="image/jpeg"
>示例图片</a>
上面代码中,type
属性提示这是一张图片。
(9)download
download
属性表明当前链接用于下载,而不是跳转到另一个 URL。
<a href="demo.txt" download>下载</a>
上面代码点击后,会出现下载对话框。
注意,download
属性只在链接与网址同源时,才会生效。也就是说,链接应该与网址属于同一个网站。
如果download
属性设置了值,那么这个值就是下载的文件名。
<a
href="foo.exe"
download="bar.exe"
>点击下载</a>
上面代码中,下载文件的原始文件名是foo.exe
。点击后,下载对话框提示的文件名是bar.exe
。
注意,如果链接点击后,服务器的 HTTP 回应的头信息设置了Content-Disposition
字段,并且该字段的值与download
属性不一致,那么该字段优先,下载时将显示其设置的文件名。
download
属性还有一个用途,就是有些地址不是真实网址,而是数据网址,比如data:
开头的网址。这时,download
属性可以为虚拟网址指定下载的文件名。
<a href="data:,Hello%2C%20World!">点击</a>
上面链接点击后,会打开一个虚拟网页,上面显示Hello World!
。
<a
href="data:,Hello%2C%20World!"
download="hello.txt"
>点击</a>
上面链接点击后,下载的hello.txt
文件内容就是“Hello, World!”。
示例:
<a href="http://www.baidu.com"
hreflang="en"
title="这是放在链接上就会有的文字"
target="_blank"
referrerpolicy="no-referer"
type="text/html">
看这里使用a引入了百度的网站,并且设置网址的语言,并且设置了链接在新页面打开,设置了不带referer访问,并且设置打开链接的类型修改为text/html
</a>
点击前:
点击后:
图片标签
<img>
<img>
标签用于插入图片。它是单独使用的,没有闭合标签。
<img src="foo.jpg">
上面代码在网页插入一张图片foo.jpg
。src
属性指定图片的网址,上例是相对 URL,表示图片与网页在同一个目录。
<img>
默认是一个行内元素,与前后的文字处在同一行。
<p>Hello<img src="foo.jpg">World</p>
上面代码的渲染结果是,文字和图片在同一行显示。
图像默认以原始大小显示。如果图片很大,又与文字处在同一行,那么图片将把当前行的行高撑高,并且图片的底边与文字的底边在同一条水平线上。
<img>
可以放在<a>
标签内部,使得图片变成一个可以点击的链接。
<a href="example.html">
<img src="foo.jpg">
</a>
上面代码中,图片可以像链接那样点击,点击后会产生跳转。
(1)alt 属性
alt
属性用来设定图片的文字说明。图片不显示时(比如下载失败,或用户关闭图片加载),图片的位置上会显示该文本。
<img src="foo.jpg" alt="示例图片">
上面代码中,alt
是图片的说明。图片下载失败时,浏览器会在图片位置,显示文字“示例图片”。
(2)width 属性,height 属性
图片默认以原始大小插入网页,width
属性和height
属性可以指定图片显示时的宽度和高度,单位是像素或百分比。
<img src="foo.jpg" width="400" height="300">
上面代码中,width
属性指定图片显示的宽度为400像素,height
属性指定显示高度为300像素。
注意,一旦设置了这两个属性,浏览器会在网页中预先留出这个大小的空间,不管图片有没有加载成功。不过,由于图片的显示大小可以用 CSS 设置,所以不建议使用这两个属性。
一种特殊情况是,width
属性和height
属性只设置了一个,另一个没有设置。这时,浏览器会根据图片的原始大小,自动设置对应比例的图片宽度或高度。举例来说,图片大小是 800像素 x 800像素,width
属性设置成200,那么浏览器会自动将height
设成200。
(3)referrerpolicy
<img>
导致的图片加载的 HTTP 请求,默认会带有Referer
的头信息。
referrerpolicy
属性对这个行为进行设置。
(4)crossorigin
有时,图片和网页属于不同的网站,网页加载图片就会导致跨域请求,对方服务器可能要求跨域认证。
crossorigin
属性用来告诉浏览器,是否采用跨域的形式下载图片,默认是不采用。
简单说,只要打开了这个属性,HTTP 请求的头信息里面,就会加入origin
字段,给出请求发出的域名,不打开这个属性就不加。
一旦打开该属性,它可以设为两个值。
-
anonymous
:跨域请求不带有用户凭证(通常是 Cookie)。 -
use-credentials
:跨域请求带有用户凭证。
下面是一个例子。
<img src="foo.jpg" crossorigin="anonymous"> //设置成为这样后就可以成功的加载不同域名的图片
crossorigin
属性如果省略值的部分,则等同于anonymous
。
<img src="foo.jpg" crossorigin>
(6)loading
浏览器的默认行为是,只要解析到<img>
标签,就开始加载图片。对于很长的网页,这样做很浪费带宽,因为用户不一定会往下滚动,一直看到网页结束。用户很可能是点开网页,看了一会就关掉了,那些不在视口的图片加载的流量,就都浪费了。
loading
属性改变了这个行为,可以指定图片的懒加载,即图片默认不加载,只有即将滚动进入视口,变成用户可见时才会加载,这样就节省了带宽。
loading
属性可以取以下三个值。
auto
:浏览器默认行为,等同于不使用loading
属性。
lazy
:启用懒加载。
eager
:立即加载资源,无论它在页面上的哪个位置。
<img src="image.png" loading="lazy" alt="…" width="200" height="200">
由于行内图片的懒加载,可能会导致页面布局重排,所以使用这个属性的时候,最好指定图片的高和宽。
示例:
1、这是引用一张存在的照片:<br /><img src="../jpg.jpg" width="200" height="200"><br />
2、这是引用不存在的照片:<br /><img src="../123" alt="当图片不存在时我就可以用来提示说明"><br />
3、这时一张长宽都为300的照片:<br /><img src="../jpg.jpg" width="300" height="300">
列表标签
列表是一系列排列好的项目,主要分成两类:有序列表和无序列表。
有序列表是每个列表项前面有编号,呈现出顺序,就像下面这样。
1. 列表项 A 2. 列表项 B 3. 列表项 C
无序列表则是列表项前面没有编号,只有一个列表符号,默认是一个圆点。
· 列表项 A · 列表项 B · 列表项 C
<ol>
<ol>
标签是一个有序列表容器(ordered list),会在内部的列表项前面产生数字编号。列表项的顺序有意义时,比如排名,就会采用这个标签。
<ol>
<li>列表项 A</li>
<li>列表项 B</li>
<li>列表项 C</li>
</ol>
上面代码会在列表项 A、B、C 前面,分别产生1、2、3的编号。
<ol>
标签内部可以嵌套<ol>
标签或<ul>
标签,形成多级列表。
<ol>
<li>列表项 A</li>
<li>列表项 B
<ol>
<li>列表项 B1</li>
<li>列表项 B2</li>
<li>列表项 B3</li>
</ol>
</li>
<li>列表项 C</li>
</ol>
上面代码中,一个有序列表内部嵌套了另一个有序列表,渲染结果如下。
1. 列表项 A 2. 列表项 B 1. 列表项 B1 2. 列表项 B2 3. 列表项 B3 3. 列表项 C
该标签有以下属性。
(1)reversed
reversed
属性产生倒序的数字列表。
<ol reversed>
<li>列表项 A</li>
<li>列表项 B</li>
<li>列表项 C</li>
</ol>
上面代码中,列表项 A、B、C 前面,产生的编号是3、2、1。
(2)start
start
属性的值是一个整数,表示数字列表的起始编号。
<ol start="5">
<li>列表项 A</li>
<li>列表项 B</li>
<li>列表项 C</li>
</ol>
上面代码中,列表项 A、B、C 前面,产生的编号是5、6、7。
(3)type
<ol type="a">
<li>列表项 A</li>
<li>列表项 B</li>
<li>列表项 C</li>
</ol>
type
属性指定数字编号的样式。目前,浏览器支持以下样式。
-
a
:小写字母 -
A
:大写字母 -
i
:小写罗马数字 -
I
:大写罗马数字 -
1
:整数(默认值)
上面代码中,列表项 A、B、C 前面的编号,分别是英文小写字母a、b、c。
注意,即使编号是字母,start
属性也依然使用整数。
<ol type="a" start="3">
<li>列表项 A</li>
<li>列表项 B</li>
<li>列表项 C</li>
</ol>
上面代码中,type
属性指定编号采用小写英文字母,start
属性等于3
,表示从c
开始编号。
<ul>
<ul>
标签是一个无序列表容器(unordered list),会在内部的列表项前面产生实心小圆点,作为列表符号。列表项的顺序无意义时,采用这个标签。
<ul>
<li>列表项 A</li>
<li>列表项 B</li>
<li>列表项 C</li>
</ul>
上面代码的渲染结果是,列表项 A、B、C 前面,分别产生一个实心小圆点,作为列表符号。
<ul>
标签内部可以嵌套<ul>
或<ol>
,形成多级列表。
<li>
<li>
表示列表项,用在<ol>
或<ul>
容器之中。
有序列表<ol>
之中,<li>
有一个value
属性,定义当前列表项的编号,后面列表项会从这个值开始编号。
<ol>
<li>列表项 A</li>
<li value="4">列表项 B</li>
<li>列表项 C</li>
</ol>
上面代码中,value
属性指定第二个列表项的编号是4
,因此三个列表项的编号,分别为1、4、5。
<dl>
,<dt>
,<dd>
<dl>
标签是一个块级元素,表示一组术语的列表(description list)。术语名(description term)由<dt>
标签定义,术语解释(description detail)由<dd>
标签定义。<dl>
常用来定义词汇表。
<dl>
<dt>CPU</dt>
<dd>中央处理器</dd>
<dt>Memory</dt>
<dd>内存</dd>
<dt>Hard Disk</dt>
<dd>硬盘</dd>
</dl>
<dt>
和<dd>
都是块级元素,<dd>
默认会在<dt>
下方缩进显示。上面代码的默认渲染结果如下。
CPU 中央处理器 Memory 内存 Hard Disk 硬盘
多个术语(<dt>
)对应一个解释(<dd>
),或者多个解释(<dd>
)对应一个术语(<dt>
),都是合法的。
<dl>
<dt>A</dt>
<dt>B</dt>
<dd>C</dd>
<dt>D</dt>
<dd>E</dd>
<dd>F</dd>
</dl>
上面代码中,A
和B
有共同的解释C
,而D
有两个解释E
和F
。
示例:
<ol>
<li>有序列表1</li>
<li>有序列表2</li>
<li>有序列表3</li>
</ol>
<ol reversed>
<li>有序列表1</li>
<li>有序列表2</li>
<li>有序列表3</li>
</ol>
<ol start="100">
<li>有序列表1</li>
<li>有序列表2</li>
<li>有序列表3</li>
</ol>
<ol type="A">
<li>有序列表1</li>
<li>有序列表2</li>
<li>有序列表3</li>
</ol>
<ul>
<li>无序列表1</li>
<li>无序列表2</li>
<li>无序列表3</li>
</ul>
<dl>这是dl
<dt>这时dt
<dd>
这是dd
</dd>
</dt>
</dl>
以上只是列举了一些常见的标签
更多的文本标签可以参考:HTML 标签参考手册