参考教程:

主要参考的是网道的教程,个人认为它比较新,仅记录个人理解的重点和不熟悉的地方

网页的基本概念

HTML的标签和属性都是 不分大小写 的,onclickonClick是同一个属性。

标签与元素

浏览器渲染网页时,会把 HTML 源码解析成一个标签树,每个标签都是树的一个节点(node)。这种节点就称为 网页元素(element)。

“标签”和“元素”基本上是同义词,只是使用的场合不一样:

  • 标签 是从 源码 角度来看
  • 元素 是从 编程 角度来看

比如<p>标签对应网页的p元素。嵌套的标签就构成了网页元素的层级关系(父元素/子元素)。

块级元素,行内元素

块级元素(block)

默认占据一个独立的区域,在网页上会自动另起一行,占据 100% 的宽度。

例如: p

行内元素(inline)

行内元素默认与其他元素在同一行,不产生换行。

例如: spansup(上标)、sub(下标)、bi

行内元素还有哪些呢?

网页的基本标签

符合 HTML 语法标准的网页,应该满足下面的基本结构。

1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
</html>

不管多么复杂的网页,都是从上面这个基本结构衍生出来的。

  • <!doctype>

  • <html>:网页的顶层 容器 ,即标签树结构的顶层节点,也称为根元素(root element),其他元素都是它的子元素。

    • 该标签的lang属性,表示网页内容默认的语言。

      1
      <html lang="zh-CN">
  • <head>容器 标签,用于放置网页的元信息。

    • <meta>:设置网页的元数据(编码/元数据/http回应字段)。
    • <link>:连接外部样式表。
    • <title>:设置网页标题。会显示在浏览器窗口的标题栏。搜索引擎会根据这个来显示。
    • <style>:放置内嵌的样式表。
    • <script>:引入脚本。
    • <noscript>:浏览器不支持脚本时,所要显示的内容。
    • <base>:设置网页内部相对 URL 的计算基准。
  • <body>容器 标签

<!doctype>

网页的第一个标签通常是<!doctype>,表示文档类型,告诉浏览器如何解析网页。

一般来说,只要像下面这样,简单声明doctypehtml即可。浏览器就会按照 HTML 5 的规则处理网页。

有时,该标签采用完全大写的形式,以便区别于正常的 HTML 标签。因为<!doctype>本质上不是标签,更像一个处理指令。

1
<!DOCTYPE html>

<meta>

一个<meta>标签就是一项元数据,网页可以有多个<meta><meta>标签约定放在<head>内容的最前面。

不管什么样的网页,一般都可以放置以下两个<meta>标签。

1
2
3
4
5
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Page Title</title>
</head>

上面例子中,第一个<meta>标签表示网页采用 UTF-8 格式编码,第二个<meta>标签表示网页在手机端可以自动缩放。

<meta>标签有五个属性,下面依次介绍。

(1)charset 属性

<meta>标签的charset属性,用来指定网页的 编码方式 。该属性非常重要,如果设置得不正确,浏览器可能无法正确解码,就会显示乱码。

1
<meta charset="utf-8">

上面代码声明,网页为 UTF-8 编码。这里声明的编码方式,应该与网页实际的编码方式一致,

(2)name 属性,content 属性

<meta>标签的name属性表示元数据的名字,content属性表示元数据的值。它们合在一起使用,就可以 为网页指定一项元数据

1
2
3
4
5
<head>
<meta name="description" content="HTML 语言入门">
<meta name="keywords" content="HTML,教程">
<meta name="author" content="张三">
</head>

上面代码包含了三个元数据:description是网页内容的描述,keywords是网页内容的关键字,author是网页作者。

其他元数据例子⭐

1
2
3
4
5
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="application-name" content="Application Name">
<meta name="generator" content="program">
<meta name="subject" content="your document's subject">
<meta name="referrer" content="no-referrer">

(3)http-equiv 属性,content 属性

<meta>标签的http-equiv属性用来覆盖 HTTP 回应的头信息字段,content属性是对应的字段内容。这两个属性与 HTTP 协议相关,属于高级用法,这里就不详细介绍了。

1
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">

上面代码可以覆盖 HTTP 回应的Content-Security-Policy字段。

下面是另一些例子。

1
2
3
<meta http-equiv="Content-Type" content="Type=text/html; charset=utf-8">
<meta http-equiv="refresh" content="30">
<meta http-equiv="refresh" content="30;URL='http://website.com'">

<base>

<base>标签指定网页内部的所有相对 URL 的计算基准。

整张网页 只能有一个 <base>标签,而且只能放在<head>里面。它是单独使用的标签, 没有闭合标签 ,下面是一个例子。

1
2
3
<head>
<base href="https://www.example.com/files/" target="_blank">
</head>

<base>标签的href属性给出计算的基准网址,target属性给出如何打开链接的说明(参见《链接》一章)。已知计算基准是https://www.example.com/files/,那么相对 URL foo.html,就可以转成绝对 URL https://www.example.com/files/foo.html

注意,<base>标签必须至少具有href属性或target属性之一。

1
2
<base href="http://foo.com/app/">
<base target="_blank">

一旦设置了<base>,就对整个网页都有效。

尤其需要注意 锚点 ,这时锚点也是针对<base>计算的,而不是针对当前网页的 URL。

更多有关URL的介绍见:

URL 简介 - HTML 教程 - 网道 (wangdoc.com)

更多有关编码的内容见:

HTML 字符编码 - HTML 教程 - 网道 (wangdoc.com)

HTML 标签本身不能使用码点表示,否则浏览器会认为这是所要显示的文本内容,而不是标签。比如,<p>一旦写成<p>或者<p>,浏览器就不再认为这是标签了,而会当作文本内容将其显示为<p>

元素的全局属性

  1. id :唯一标识符,不能包含空格。在id前加“#”可以用做锚点。

  2. class :元素可以同时具有多个 class,它们之间使用空格分隔。

  3. titletitle属性用来为元素添加附加说明。大多数浏览器中,鼠标悬浮在元素上面时,会将title属性值作为浮动提示,显示出来。

  4. tabindextabindex属性的值是一个整数,表示用户按下 Tab 键的时候,网页焦点转移的顺序。不同的属性值有不同的含义。

    • 负整数:该元素可以获得焦点(比如使用 JavaScript 的focus()方法),但不参与 Tab 键对网页元素的遍历。这个值通常是-1

    • 0:该元素参与 Tab 键的遍历,顺序由浏览器指定,通常是按照其在网页里面出现的位置。

    • 正整数:网页元素按照从小到大的顺序(1、2、3、……),参与 Tab 键的遍历。如果多个元素的tabindex属性相同,则按照在网页源码里面出现的顺序遍历。

    如果网页所有元素都没有设置tabindex,那么只有那些 默认可以遍历的元素(比如链接、输入框等) 才能参与 Tab 键的遍历,顺序由其在源码的位置决定。

  5. accesskey :指定网页元素获得焦点的快捷键,该属性的值必须是单个的可打印字符。 必须配合功能键,一起按下才会生效。 Chrome 浏览器在 Windows 系统和 Linux 系统的快捷键是Alt + 字符键,在 Mac 系统的快捷键是Ctrl + Alt + 字符键

  6. style :指定当前元素的 CSS 样式

  7. hidden : 注意,CSS 的可见性设置,高于hidden属性。如果 CSS 设为该元素可见,hidden属性将无效。

  8. langlang属性指定网页元素使用的语言。必须符合 BCP47 的标准。

  9. dir :表示文字的阅读方向,有三个可能的值。ltr/rtr/auto

  10. contenteditable : 允许用户修改内容。两个值:true/false。鼠标单击句子,就可以进入编辑状态,用户可以改变句子的内容。当然,除非提交到服务器,否则刷新页面还是显示原来的内容。

    鼠标单击句子,就可以进入编辑状态,用户可以改变句子的内容。当然,除非提交到服务器,否则刷新页面还是显示原来的内容。

    该属性是枚举属性,不是布尔属性,规范的写法是最好带上属性值。 (下面的spellcheck也是这样)

  11. spellcheck :是否打开拼写检查功能。只在编辑时生效,即contenteditable="true"

  12. data-data-属性用于放置自定义数据。如果没有其他属性或元素合适放置数据,就可以放在data-属性。

    data-属性只能通过 CSS 或 JavaScript 利用,下面是 CSS 的例子。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /* HTML 代码如下
    <div data-role="mobile">
    Mobile only content
    </div>
    */
    div[data-role="mobile"] {
    display:none;
    }

    /* HTML 代码如下
    <div class="test" data-content="This is the div content">test</div>
    */
    .test {
    display: inline-block;
    }
    .test:after {
    content: attr(data-content);
    }
  13. 事件处理属性 : event handler,响应用户的动作。这些属性的值都是 JavaScript 代码:

    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语义结构

  • 结构化标记 :可用来描述标题和段落的元素
  • 语义化标记 :表达特定含义的标记。例如在一个句子中的什么位置加入强调内容,也可能标明是一个引用(以及引用的作者),或者标明是一个缩写词的全称等等。

TODO: 补充HTML语义化的好处

语义良好的网页,

  1. 天然具有良好的结构,
  2. 对于开发者易读易写,容易维护,
  3. 也能帮助计算机更好地处理网页内容。

常用标签:

  • header不是head!! 可以放网站导航、搜索栏、文章标题、作者信息等。(不可以嵌套header/footer

  • footer:比如版权信息等(不可以嵌套header/footer

  • main:主题内容。一个页面只能有一个。顶层标签。

  • article:一段完整的内容,比如一篇文章。

  • aside:与网页或文章主要内容间接相关的部分。(侧边栏、补充信息、评论、注释)不一定非要在侧边。

  • section:一个含有主题的独立部分,通常用在文档里面表示一个章节。总是多个一起使用,一个页面不能只有一个<section>。比如<article>包含了两个<section>,代表两章。适合幻灯片展示的页面

  • nav:放置页面或文档的导航信息。一个页面可以有多个<nav>,比如一个用于站点导航,另一个用于文章导航。里面通常是列表

  • h1 ~ h6:标题

  • hgroup:如果主标题包含多级标题(比如带有副标题),那么可以使用<hgroup>标签,将多级标题放在其中。

    1
    2
    3
    4
    5
    <hgroup>
    <h1>Heading 1</h1>
    <h2>Subheading 1</h2>
    <h2>Subheading 2</h2>
    </hgroup>

    注意,<hgroup>只能包含<h1>~<h6>,不能包含其他标签。

基本标签

文本标签

注:加粗的表示是语义标签

  1. <div> :表示一个区块。提供 CSS 的钩子,用来指定各种样式。

  2. <p>:文章的一个段落(paragraph)。

  3. <span>:通用目的的行内标签(即不会产生换行)。通常用作 CSS 样式的钩子,如果需要对某些行内内容指定样式

  4. <br><wbr>:换行/可选断行。没有闭合标签。<wbr>标签跟<br>很相似,表示一个可选的断行。如果一行的宽度足够,则不断行;如果宽度不够,需要断行,就在<wbr>的位置的断行。

    注意,块级元素的间隔,不要使用<br>来产生,而要使用 CSS 指定。

  5. <hr>:水平分割线。没有闭合标签。

    该标签是历史遗留下来的,建议尽量避免使用。主题之间的分隔可以使用<section>,如果想要水平线的效果,可以使用 CSS。

  6. <pre>块级元素 ,表示保留原来的格式(preformatted),即浏览器会保留该标签内部原始的换行和空格。

  7. <strong><b>行内元素 。加粗,优先使用含有语义的<strong>标签。

  8. <em><i>行内元素 。强调,一般情况下,会以斜体表示。优先使用含有语义的<em>标签。

  9. <sub><sup><var>:行内元素,下标/上标/代码或数学公式的变量

  10. <u><s> :行内元素。提示存在的问题(浏览器默认用下划线渲染)/删除线。

  11. <blockquote><cite><q>

    • .<blockquote> 是一个 块级标签 ,表示引用他人的话。浏览器会在样式上,与正常文本区别显示。<blockquote>标签有一个cite属性,它的值是一个网址,表示引言来源,不会显示在网页上。

    • .<cite> 标签表示引言出处或者作者,浏览器默认使用斜体显示这部分内容。不一定跟<blockquote>一起用。

    • .<q> 是一个 行内标签 (不换行),也表示引用。也有cite属性。浏览器默认并且会自动添加半角的双引号。

    示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <section>
    <blockquote cite="https://quote.example.com">
    <p>天才就是 1% 的天赋和99%的汗水。</p>
    </blockquote>
    <cite>-- 爱迪生</cite>
    <p>
    莎士比亚的《哈姆雷特》有一句著名的台词:
    <q cite="https://quote.example.com">活着还是死亡,这是一个问题。</q>
    </p>
    </section>

    image-20220320170735016

  12. <code>行内元素 ,表示标签内容是计算机代码,浏览器默认会以等宽字体显示。如果要表示多行代码,<code>标签必须放在<pre>内部。

  13. <kbd><samp>

    • .<kbd>行内元素 ,用户从键盘输入的内容,现在扩展到各种输入,包括语音输入。<kbd>可以嵌套,方便指定样式。译]您知道 HTML 的键盘标签吗? - 知乎 (zhihu.com)
    • .<samp>行内元素 ,表示计算机程序输出内容的一个例子。浏览器默认以等宽字体显示。
  14. <mark>行内标签 ,表示突出显示的内容。Chrome 浏览器默认会以亮黄色背景,显示该标签的内容( 不要只为了高亮的效果,而使用这个标签,因为不能保证浏览器的处理方式。如果要保证高亮,还是要使用 CSS 样式。 )。还可以用于在搜索结果中,标记出匹配的关键词。

  15. <small> :呈现小号字体效果,指定细则,输入免责声明、注解、署名、版权。 行内标签

  16. <time><data>行内标签 。提供机器可读的格式。(前者与事件有关)

    属性

    <time>datetime属性,用来指定机器可读的日期,可以有多种格式。

    • 有效年份:2011
    • 有效月份:2011-11
    • 有效日期:2011-11-18
    • 无年份的日期:11-18
    • 年度的第几周:2011-W47
    • 有效时间:14:5414:54:3914:54:39.929
    • 日期和时间:2011-11-18T14:54:39.929
    示例
    1
    2
    <p>音乐会在<time datetime="20:00">晚上八点</time>开始。</p>
    <p>本次马拉松比赛第一名是<data value="39">张三</data></p>
  17. <address>块级元素 ,表示某人或某个组织的联系方式。

    注意点

    (1)如果是文章里提到的地址(比如提到搬家前的地址),而不是联系信息,不要使用<address>标签。

    (2)<address>的内容不得有非联系信息,比如发布日期。

    (3)<address>不能嵌套,并且内部不能有标题标签(<h1>~<h6>),也不能有<article><aside><section><nav><header><footer>等标签。

    (4)通常,<address>会放在<footer>里面,下面是一个例子。

    1
    2
    3
    4
    5
    6
    7
    8
    <html>
    <footer>
    <address>
    文章的相关问题请联系<a href="mailto:zhangsan@example.com">张三
    McClure</a>
    </address>
    </footer>
    </html>
  18. <abbr>行内元素 ,表示标签内容是一个 缩写 。它的title属性给出缩写的完整形式,或者缩写的描述。鼠标悬停在该元素上方时,title属性值作为提示,会完整显示出来。

  19. <ins><del>行内元素 。原始文档添加(insert)/删除(delete)的内容。

    浏览器默认为<del>标签的内容加上删除线,为<ins>标签的内容加上下划线。

    这两个标签都有以下属性。

    • cite:该属性的值是一个 URL,表示该网址可以解释本次删改。
    • datetime:表示删改发生的时间。
  20. <dfn>行内元素 ,表示标签内容是一个术语(definition),本段或本句包含它的定义。

    用法示例
    1
    2
    3
    4
    5
    6
    7
    8
    <p>
    通过 TCP/IP 协议连接的全球性计算机网络,叫做
    <dfn title="全球性计算机网络">Internet</dfn>
    </p>
    <p>
    <dfn><abbr title="acquired immune deficiency syndrome">AIDS</abbr></dfn>
    的全称是获得性免疫缺陷综合征。
    </p>
  21. <ruby> :表示文字的语音注释,主要用于东亚文字,比如汉语拼音和日语的片假名。 是行内元素,同时也是容器

    简单示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    示例:<ruby>
    <rt>han</rt>
    <rt>zi</rt>
    <rt>べん</rt><rp>
    <rt>きょう</rt><rp>
    </ruby>
    <!-- 下面是兼容的写法 -->
    示例:<ruby>
    <rp>(</rp><rt>han</rt><rp>)</rp>
    <rp>(</rp><rt>zi</rt><rp>)</rp>
    <rp>(</rp><rt>べん</rt><rp>)</rp>
    <rp>(</rp><rt>きょう</rt><rp>)</rp> 
    </ruby>

    image-20220320174030111

    具体用法

    <ruby>的内部还有许多配套的标签。

    (1)<rp>

    <rp>标签的用处,是为不支持语音注释的浏览器,提供一个兼容方案。对于那些支持语音注释的浏览器,该标签的内容不显示。

    <rp>标签一般用于放置圆括号,如果遇到不支持的浏览器,就会将语音注释显示在括号里面。

    1
    2
    3
    4
    <ruby>
    汉<rp>(</rp><rt>han</rt><rp>)</rp>
    字<rp>(</rp><rt>zi</rt><rp>)</rp>
    </ruby>

    上面代码在不支持语音注释的浏览器中,渲染结果为汉(han)字(zi)。遇到支持语音注释的浏览器,就不会显示圆括号。

    (2)<rt>

    <rt>标签用于放置语音注释。

    (3)<rb>

    <rb>标签用于划分文字单位,与语音注释一一对应。

    1
    2
    3
    4
    5
    6
    7
    <ruby>
    <rb>汉</rb><rb>字</rb>
    <rp>(</rp>
    <rt>han</rt>
    <rt>zi</rt>
    <rp>)</rp>
    </ruby>

    上面例子中,汉字这两个字是写在一起的,<rb>标签用于每个字划分出来,跟<rt>标签一一对应。

    (4)<rbc><rtc>

    <rbc>标签表示一组文字,通常包含多个<rb>元素。<rtc>标签表示一组语音注释,跟<rbc>对应。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <ruby style="ruby-position: under;">
    <rbc>
    <rb>汉</rb><rp>(</rp><rt>han</rt><rp>)</rp>
    <rb>字</rb><rp>(</rp><rt>zi</rt><rp>)</rp>
    </rbc>
    <rtc style="ruby-position: over;">
    <rp>(</rp><rt>Chinese</rt><rp>)</rp>
    </rtc>
    </ruby>

    上面例子中,汉字这两个字有两组语音注释,分别是汉语拼音与英语。一组语音注释放在<rbc>标签中,另一组语音注释放在<rtc>,用来对应<rbc>。同时,分别使用style属性,指定汉语拼音显示在文字下方,英语显示在文字上方。

    注意,Chrome 浏览器目前不支持这两个标签。

  22. <bdo><bdi>

    • <bdo>标签里面的文字,会以相反的方向渲染。dir属性,指定具体的文字方向。它有两个值,ltr表示从左到右,rtl表示从右到左。
    • <bdi>标签用于不确定文字方向的情况。由浏览器自己决定。

列表标签

  1. <ol>:有序列表 容器

    属性

    (1)reversed

    reversed属性产生倒序的数字列表。

    1
    2
    3
    4
    5
    <ol reversed>
    <li>列表项 A</li>
    <li>列表项 B</li>
    <li>列表项 C</li>
    </ol>

    上面代码中,列表项 A、B、C 前面,产生的编号是3、2、1。

    (2)start

    start属性的值是一个整数,表示数字列表的起始编号。

    1
    2
    3
    4
    5
    <ol start="5">
    <li>列表项 A</li>
    <li>列表项 B</li>
    <li>列表项 C</li>
    </ol>

    上面代码中,列表项 A、B、C 前面,产生的编号是5、6、7。

    (3)type

    type属性指定数字编号的样式。目前,浏览器支持以下样式。

    • a:小写字母
    • A:大写字母
    • i:小写罗马数字
    • I:大写罗马数字
    • 1:整数(默认值)
    1
    2
    3
    4
    5
    <ol type="a">
    <li>列表项 A</li>
    <li>列表项 B</li>
    <li>列表项 C</li>
    </ol>

    上面代码中,列表项 A、B、C 前面的编号,分别是英文小写字母a、b、c。

    注意,即使编号是字母,start属性也依然使用整数。

    1
    2
    3
    4
    5
    <ol type="a" start="3">
    <li>列表项 A</li>
    <li>列表项 B</li>
    <li>列表项 C</li>
    </ol>

    上面代码中,type属性指定编号采用小写英文字母,start属性等于3,表示从c开始编号。

  2. <ul>:无序列表 容器

  3. <li>:列表项。有序列表<ol>之中,<li>有一个value属性,定义当前列表项的编号,后面列表项会从这个值开始编号。

  4. <dl><dt><dd><dl>标签是一个 块级元素 ,表示一组 术语 的列表(description list),常用来定义 词汇表 。术语名(description term)由<dt>标签定义,术语解释(description detail)由<dd>标签定义。

    示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <dl>
    <dt>CPU</dt>
    <dd>中央处理器</dd>

    <dt>Memory</dt>
    <dd>内存</dd>

    <dt>HD</dt>
    <dt>Hard Disk</dt>
    <dd>硬盘</dd>
    </dl>
    CPU
    中央处理器
    Memory
    内存
    HD
    Hard Disk
    硬盘

    多个术语(<dt>)对应一个解释(<dd>),或者多个解释(<dd>)对应一个术语(<dt>),都是合法的。

图像标签

<img>标签和属性

行内元素,无闭合标签。

1
<img src="foo.jpg">

必须属性为src

其他属性:

  • alt 属性

  • width 属性,height 属性 (更推荐用css样式)

  • srcset,sizes 见响应式

  • referrerpolicy

    <img>导致的图片加载的 HTTP 请求,默认会带有Referer的头信息。referrerpolicy属性对这个行为进行设置。

  • crossorigin :跨域请求

    crossorigin属性用来告诉浏览器,是否采用跨域的形式下载图片,默认是不采用。

    简单说,只要打开了这个属性,HTTP 请求的头信息里面,就会加入origin字段,给出请求发出的域名,不打开这个属性就不加。

    一旦打开该属性,它可以设为两个值。

    • anonymous:跨域请求不带有用户凭证(通常是 Cookie),打开属性后的默认值。
    • use-credentials:跨域请求带有用户凭证。

    详解:img元素中的crossorigin属性 - 简书 (jianshu.com)

  • loading

    loading属性改变了这个行为,可以指定图片的懒加载,即图片默认不加载,只有即将滚动进入视口,变成用户可见时才会加载,这样就节省了带宽。

    loading属性可以取以下三个值。

    • auto:浏览器默认行为,等同于不使用loading属性。
    • lazy:启用懒加载。
    • eager:立即加载资源,无论它在页面上的哪个位置。
    1
    <img src="image.png" loading="lazy" alt="…" width="200" height="200">

    由于行内图片的懒加载,可能会导致页面布局重排,所以使用这个属性的时候,最好指定图片的高和宽。

<figure>容器和图形说明figcaption

<figure>标签是一个 语义容器 ,可以理解为一个图像区块,将图像和相关信息封装在一起(还可以封装引言、代码、诗歌等等。)

<figcaption>是它的可选子元素,表示图像的文本描述,通常用于放置标题,可以出现多个。

HTML响应式图像

img标签的srcset属性和sizes属性

srcset属性用来指定多张图像,适应 不同像素密度 的屏幕。

sizes属性列出不同设备的图像显示 宽度/大小

1
2
3
4
5
6
7
8
<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">

浏览器根据当前设备的宽度,从sizes属性获得图像的显示宽度,然后从srcset属性找出最接近该宽度的图像,进行加载。

假定当前设备的屏幕宽度是480px,浏览器从sizes属性查询得到,图片的显示宽度是33vw(即33%),等于160pxsrcset属性里面,正好有宽度等于160px的图片,于是加载foo-160.jpg

如果省略sizes属性,那么浏览器将根据实际的图像显示宽度,从srcset属性选择最接近的图片。一旦使用sizes属性,就必须与srcset属性搭配使用,单独使用sizes属性是无效的。

<picture>容器标签

容器标签,内部使用<source><img>,指定不同情况下加载的图像。

1
2
3
4
5
6
7
8
9
10
11
<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>

浏览器按照<source>标签出现的顺序,依次判断当前设备是否满足media属性的媒体查询表达式,如果满足就加载srcset属性指定的图片文件,并且不再执行后面的<source>标签和<img>标签。

除了响应式图像,<picture>标签还可以用来选择不同格式的图像。<source>标签的type属性给出图像的 MIME 类型,srcset是对应的图像 URL。

1
2
3
4
5
<picture>
<source type="image/svg+xml" srcset="logo.xml">
<source type="image/webp" srcset="logo.webp">
<img src="logo.png" alt="ACME Corp">
</picture>

链接标签

<a>/<link>/<script>/<noscript>

<a>

属性:

  • href

    • 特殊值:邮件链接: mailto:xxx@xxx(可不指定邮箱)
    • 特殊值:电话链接:tel:xxxxxxxxxxx
  • hreflang :提示语言

  • title :鼠标悬停提示说明信息。

  • target :如何展示打开的链接。

    • _self:当前窗口打开,这是默认值。
    • _blank:新窗口打开。
    • _parent:上层窗口打开,这通常用于从父窗口打开的子窗口,或者<iframe>里面的链接。如果当前窗口没有上层窗口,这个值等同于_self
    • _top:顶层窗口打开。如果当前窗口就是顶层窗口,这个值等同于_self
    • 自定义名称:比如两个链接都在名叫test的窗口打开。
  • rel :说明链接与当前页面的关系。

    常见属性值
    • alternate:当前文档的另一种形式,比如翻译。
    • author:作者链接。
    • bookmark:用作书签的永久地址。
    • external:当前文档的外部参考文档。
    • help:帮助链接。
    • license:许可证链接。
    • next:系列文档的下一篇。
    • nofollow:告诉搜索引擎忽略该链接,主要用于用户提交的内容,防止有人企图通过添加链接,提高该链接的搜索排名。
    • noreferrer:告诉浏览器打开链接时,不要将当前网址作为 HTTP 头信息的Referer字段发送出去,这样可以隐藏点击的来源。
    • noopener:告诉浏览器打开链接时,不让链接窗口通过 JavaScript 的window.opener属性引用原始窗口,这样就提高了安全性。
    • prev:系列文档的上一篇。
    • search:文档的搜索链接。
    • tag:文档的标签链接。
  • referrerpolicy :用于精确设定点击链接时,浏览器发送 HTTP 头信息的Referer字段的行为。

    属性值

    该属性可以取下面八个值:no-referrerno-referrer-when-downgradeoriginorigin-when-cross-originunsafe-urlsame-originstrict-originstrict-origin-when-cross-origin

    其中,no-referrer表示不发送Referer字段,same-origin表示同源时才发送Referer字段,origin表示只发送源信息(协议+域名+端口)。其他几项的解释,请查阅 HTTP 文档。

  • ping :指定一个网址,用户点击的时候,会向该网址发出一个 POST 请求,通常用于跟踪用户的行为。

  • type :提示给出链接 URL 的 MIME 类型

  • download :表明当前链接用于下载,而不是跳转到另一个 URL。只在链接与网址同源时,才会生效。

    说明

    注意,如果链接点击后,服务器的 HTTP 回应的头信息设置了Content-Disposition字段,并且该字段的值与download属性不一致,那么该字段优先,下载时将显示其设置的文件名。

    download属性还有一个用途,就是有些地址不是真实网址,而是数据网址,比如data:开头的网址。这时,download属性可以为虚拟网址指定下载的文件名。

    1
    <a href="data:,Hello%2C%20World!">点击</a>

    上面链接点击后,会打开一个虚拟网页,上面显示Hello World!

    1
    2
    3
    4
    <a
    href="data:,Hello%2C%20World!"
    download="hello.txt"
    >点击</a>

    上面链接点击后,下载的hello.txt文件内容就是“Hello, World!”。

主要用于加载与网页相关的外部资源文件,通常放在<head>里。

如css样式、图标文件、相关文档链接等。

举例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 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">

<!-- 图标引入 -->
<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">

<!-- 文档的相关链接引入 -->
<link rel="alternate" type="application/atom+xml" href="/blog/news/atom">
  1. rel属性:表示外部资源与当前文档之间的关系,是<link>标签的必需属性。

    rel属性值
    • alternate:文档的另一种表现形式的链接,比如打印版。
    • author:文档作者的链接。
    • dns-prefetch:要求浏览器提前执行指定网址的 DNS 查询。
    • help:帮助文档的链接。
    • icon:加载文档的图标文件。
    • license:许可证链接。
    • next:系列文档下一篇的链接。
    • pingback:接收当前文档 pingback 请求的网址。
    • preconnect:要求浏览器提前与给定服务器,建立 HTTP 连接。
    • prefetch:要求浏览器提前下载并缓存指定资源,供下一个页面使用。它的优先级较低,浏览器可以不下载。
    • preload:要求浏览器提前下载并缓存指定资源,当前页面稍后就会用到。它的优先级较高,浏览器必须立即下载。
    • prerender:要求浏览器提前渲染指定链接。这样的话,用户稍后打开该链接,就会立刻显示,感觉非常快。
    • prev:表示当前文档是系列文档的一篇,这里给出上一篇文档的链接。
    • search:提供当前网页的搜索链接。
    • stylesheet:加载一张样式表。
    更多示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <!-- 作者信息 -->
    <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:name@example.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">
  2. relastype与资源预加载

    as属性,告诉浏览器预处理资源的类型

    • “script”
    • “style”
    • “image”
    • “media”
    • “document”

    type属性,进一步明确 MIME 类型。

    5种预加载

    1. <link rel="preload">

      尽快下载并缓存资源(如脚本或样式表),该指令优先级较高,浏览器肯定会执行。

    2. <link rel="prefetch">

      后续的页面需要某个资源,并且希望预加载该资源,以便加速页面渲染。该指令不是强制性的,优先级较低

    3. <link rel="preconnect">

      提前与某个域名建立 TCP 连接。

    4. <link rel="dns-prefetch">

      浏览器提前执行某个域名的 DNS 解析

    5. <link rel="prerender">

      浏览器加载某个网页,并且提前渲染它。

  3. media属性

    给出外部资源生效的媒介条件。

    例如:

    • media="print"
    • media="screen and (max-width: 600px)"
  4. 其他属性

    • crossorigin:加载外部资源的跨域设置。
    • href:外部资源的网址。
    • referrerpolicy:加载时Referer头信息字段的处理方法。
    • asrel="preload"rel="prefetch"时,设置外部资源的类型。
    • type:外部资源的 MIME 类型,目前仅用于rel="preload"rel="prefetch"的情况。
    • title:加载样式表时,用来标识样式表的名称。
    • sizes:用来声明图标文件的尺寸,比如加载苹果手机的图标文件。

<scipt>

加载脚本代码,目前主要是加载 JavaScript 代码。

也可以加载外部脚本,src属性给出外部脚本的地址。

type属性也可以设成module,表示这是一个 ES6 模块,不是传统脚本。

1
<script type="module" src="main.js"></script>

对于那些不支持 ES6 模块的浏览器,可以设置nomodule属性。支持 ES6 模块的浏览器,会不加载指定的脚本。这个属性通常与type="module"配合使用,作为老式浏览器的回退方案。

1
2
<script type="module" src="main.js"></script>
<script nomodule src="fallback.js"></script>
其他属性
  • async:该属性指定 JavaScript 代码为异步执行,不是造成阻塞效果,JavaScript 代码默认是同步执行。
  • defer:该属性指定 JavaScript 代码不是立即执行,而是页面解析完成后执行。
  • crossorigin:如果采用这个属性,就会采用跨域的方式加载外部脚本,即 HTTP 请求的头信息会加上origin字段。
  • integrity:给出外部脚本的哈希值,防止脚本被篡改。只有哈希值相符的外部脚本,才会执行。
  • nonce:一个密码随机数,由服务器在 HTTP 头信息里面给出,每次加载脚本都不一样。它相当于给出了内嵌脚本的白名单,只有在白名单内的脚本才能执行。
  • referrerpolicy:HTTP 请求的Referer字段的处理方法。

<noscript>

用于浏览器不支持或关闭 JavaScript 时,所要显示的内容。

多媒体标签

<video>

1
2
3
<video src="example.mp4" controls>
<p>你的浏览器不支持 HTML5 视频,请下载<a href="example.mp4">视频文件</a></p>
</video>
属性
  • src:视频文件的网址。
  • controls:播放器是否显示控制栏。该属性是布尔属性,不用赋值,只要写上属性名,就表示打开。如果不想使用浏览器默认的播放器,而想使用自定义播放器,就不要使用该属性。
  • width:视频播放器的宽度,单位像素。
  • height:视频播放器的高度,单位像素。
  • autoplay:视频是否自动播放,该属性为布尔属性。
  • loop:视频是否循环播放,该属性为布尔属性。
  • muted:是否默认静音,该属性为布尔属性。
  • poster:视频播放器的封面图片的 URL。
  • preload:视频播放之前,是否缓冲视频文件。这个属性仅适合没有设置autoplay的情况。它有三个值,分别是none(不缓冲)、metadata(仅仅缓冲视频文件的元数据)、auto(可以缓冲整个文件)。
  • playsinline:iPhone 的 Safari 浏览器播放视频时,会自动全屏,该属性可以禁止这种行为。该属性为布尔属性。
  • crossorigin:是否采用跨域的方式加载视频。它可以取两个值,分别是anonymous(跨域请求时,不发送用户凭证,主要是 Cookie),use-credentials(跨域时发送用户凭证)。
  • currentTime:指定当前播放位置(双精度浮点数,单位为秒)。如果尚未开始播放,则会从这个属性指定的位置开始播放。
  • duration:该属性只读,指示时间轴上的持续播放时间(总长度),值为双精度浮点数(单位为秒)。如果是流媒体,没有已知的结束时间,属性值为+Infinity

<audio>

用于放置音频。

1
2
3
4
5
<audio controls>
<source src="foo.mp3" type="audio/mp3">
<source src="foo.ogg" type="audio/ogg">
<p>你的浏览器不支持 HTML5 音频,请直接下载<a href="foo.mp3">音频文件</a></p>
</audio>

上次出现source是在<picture>标签那里

属性
  • autoplay:是否自动播放,布尔属性。
  • controls:是否显示播放工具栏,布尔属性。如果不设置,浏览器不显示播放界面,通常用于背景音乐。
  • crossorigin:是否使用跨域方式请求。
  • loop:是否循环播放,布尔属性。
  • muted:是否静音,布尔属性。
  • preload:音频文件的缓冲设置。
  • src:音频文件网址。

<track>

用于指定视频的字幕,格式是 WebVTT (.vtt文件),放置在<video>标签内部。它是一个单独使用的标签,没有结束标签。

1
2
3
4
<video controls src="sample.mp4">
<track label="英文" kind="subtitles" src="subtitles_en.vtt" srclang="en">
<track label="中文" kind="subtitles" src="subtitles_cn.vtt" srclang="cn" default>
</video>
属性
  • label:播放器显示的字幕名称,供用户选择。
  • kind:字幕的类型,默认是subtitles,表示将原始声音成翻译外国文字,比如英文视频提供中文字幕。另一个常见的值是captions,表示原始声音的文字描述,通常是视频原始使用的语言,比如英文视频提供英文字幕。
  • src:vtt 字幕文件的网址。
  • srclang:字幕的语言,必须是有效的语言代码。
  • default:是否默认打开,布尔属性。

<source>

<source>标签用于<picture><video><audio>的内部,用于指定一项外部资源。单标签是单独使用的,没有结束标签。

属性
  • type:指定外部资源的 MIME 类型。
  • src:指定源文件,用于<video><audio>
  • srcset:指定不同条件下加载的图像文件,用于<picture>
  • media:指定媒体查询表达式,用于<picture>
  • sizes:指定不同设备的显示大小,用于<picture>,必须跟srcset搭配使用。

<embed>

用于嵌入外部内容,这个外部内容通常由浏览器插件负责控制。

由于 浏览器的默认插件都不一致 ,很可能不是所有浏览器的用户都能访问这部分内容, 建议谨慎使用

属性
  • height:显示高度,单位为像素,不允许百分比。
  • width:显示宽度,单位为像素,不允许百分比。
  • src:嵌入的资源的 URL。
  • type:嵌入资源的 MIME 类型。

<object><param>

可以视为<embed>的替代品,有标准化行为,只限于插入少数几种通用资源,没有历史遗留问题,因此更推荐使用。

<object>标签是一个容器元素,内部可以使用<param>标签,给出插件所需要的运行参数。

1
2
3
<object data="movie.swf" type="application/x-shockwave-flash">
<param name="foo" value="bar">
</object>
属性
  • data:嵌入的资源的 URL。
  • form:当前网页中相关联表单的id属性(如果有的话)。
  • height:资源的显示高度,单位为像素,不能使用百分比。
  • width:资源的显示宽度,单位为像素,不能使用百分比。
  • type:资源的 MIME 类型。
  • typemustmatch:布尔属性,表示data属性与type属性是否必须匹配。

iframe

1
2
3
4
5
<iframe src="https://www.example.com"
width="100%" height="500" frameborder="0"
allowfullscreen sandbox>
<p><a href="https://www.example.com">点击打开嵌入页面</a></p>
</iframe>
属性
  • allowfullscreen:允许嵌入的网页全屏显示,需要全屏 API 的支持,请参考相关的 JavaScript 教程。
  • frameborder:是否绘制边框,0为不绘制,1为绘制(默认值)。建议尽量少用这个属性,而是在 CSS 里面设置样式。
  • src:嵌入的网页的 URL。
  • width:显示区域的宽度。
  • height:显示区域的高度。
  • sandbox:设置嵌入的网页的权限,详见下文。
  • importance:浏览器下载嵌入的网页的优先级,可以设置三个值。high表示高优先级,low表示低优先级,auto表示由浏览器自行决定。
  • name:内嵌窗口的名称,可以用于<a><form><base>target属性。
  • referrerpolicy:请求嵌入网页时,HTTP 请求的Referer字段的设置。参见<a>标签的介绍。

sandbox 属性

允许设置嵌入的网页的权限,等同于提供了一个隔离层,即“沙箱”。可以当作布尔属性使用,表示打开所有限制。

属性值
  • allow-forms:允许提交表单。
  • allow-modals:允许提示框,即允许执行window.alert()等会产生弹出提示框的 JavaScript 方法。
  • allow-popups:允许嵌入的网页使用window.open()方法弹出窗口。
  • allow-popups-to-escape-sandbox:允许弹出窗口不受沙箱的限制。
  • allow-orientation-lock:允许嵌入的网页用脚本锁定屏幕的方向,即横屏或竖屏。
  • allow-pointer-lock:允许嵌入的网页使用 Pointer Lock API,锁定鼠标的移动。
  • allow-presentation:允许嵌入的网页使用 Presentation API。
  • allow-same-origin:不打开该项限制,将使得所有加载的网页都视为跨域。
  • allow-scripts:允许嵌入的网页运行脚本(但不创建弹出窗口)。
  • allow-storage-access-by-user-activationsandbox属性同时设置了这个值和allow-same-origin的情况下,允许<iframe>嵌入的第三方网页通过用户发起document.requestStorageAccess()请求,经由 Storage Access API 访问父窗口的 Cookie。
  • allow-top-navigation:允许嵌入的网页对顶级窗口进行导航。
  • allow-top-navigation-by-user-activation:允许嵌入的网页对顶级窗口进行导航,但必须由用户激活。
  • allow-downloads-without-user-activation:允许在没有用户激活的情况下,嵌入的网页启动下载。

不要同时设置allow-scriptsallow-same-origin属性,这将使得嵌入的网页可以改变或删除sandbox属性。

loading 属性

<iframe>滚动进入视口以后再加载,这样会比较节省带宽。

loading属性可以触发<iframe>网页的懒加载。该属性可以取以下三个值。

  • auto:浏览器的默认行为,与不使用loading属性效果相同。
  • lazy:<iframe>的懒加载,即将滚动进入视口时开始加载。
  • eager:立即加载资源,无论在页面上的位置如何。

如果<iframe>是隐藏的,则loading属性无效,将会立即加载。只要满足以下任一个条件,Chrome 浏览器就会认为<iframe>是隐藏的。

  • <iframe>的宽度和高度为4像素或更小。
  • 样式设为display: nonevisibility: hidden
  • 使用定位坐标为负X或负Y,将<iframe>放置在屏幕外。

表格标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<table>
<!-- caption总是第一个子元素 -->
<caption>示例表格</caption>
<!-- 可选一级子元素,表头、表体、表尾 -->
<thead>... ...</thead>
<tbody>... ...</tbody>
<tfoot>... ...</tfoot>
<!-- 一级子元素colgroup -->
<colgroup>
<col class="c1">
<col class="c2">
</colgroup>
<!-- 表格的一行(table row) -->
<tr>
<!-- 标题单元格 -->
<th>学号</th><th>姓名</th>
</tr>
<tr>
<!-- 标题单元格 -->
<td>001</td><td>张三</td>
</tr>
</table>
  • 大型表格内部可以使用多个<tbody>,表示连续的多个部分。
  • <col>不仅是一个单独使用的标签,没有结束标志,而且还是一个 空元素 ,没有子元素。它的主要作用,除了申明表格结构,还可以为表格附加样式。
  • <col>有一个span属性,值为正整数,默认为1。如果大于1,就表示该列的宽度包含连续的多列。
  • 如果表格有<thead><tbody><tfoot>,那么<tr>就放在这些容器元素之中,否则直接放在<table>的下一级。
  • 通过colspan属性和rowspan属性设置 单元格 跨越的栏/行数
  • 可以使用headers属性表示哪个单元格对应哪个表头。对于跨行的情况,可以是一个空格分隔的字符串,对应多个id属性的值。
  • scope属性只有<th>标签支持,一般不在<td>标签使用,表示该<th>单元格到底是栏的标题,还是列的标题。
    • 可取属性值:row/col/rowgroup/colgroup/auto

表单标签

容器元素<form>

属性:

  • name:表单的名称,应该在网页中是 唯一且必须 的。注意,如果一个控件没有设置name属性,那么这个控件的值就不会作为键值对,向服务器发送。
  • action:服务器接收数据的 URL。
  • method:提交数据的 HTTP 方法,可能的值有post(表单数据作为 HTTP 数据体发送),get(表单数据作为 URL 的查询字符串发送),dialog(表单位于<dialog>内部使用)。
其他属性
  • accept-charset:服务器接受的字符编码列表,使用空格分隔,默认与网页编码相同。
  • autocomplete:如果用户没有填写某个控件,浏览器是否可以自动填写该值。它的可能取值分别为off(不自动填写)和on(自动填写)。
  • enctype:当method属性等于post时,该属性指定提交给服务器的 MIME 类型。可能的值为application/x-www-form-urlencoded(默认值),multipart/form-data(文件上传的情况),text/plain。详见表单标签 - HTML 教程 - 网道 (wangdoc.com)
  • novalidate:布尔属性,表单提交时是否取消验证。
  • target:在哪个窗口展示服务器返回的数据,可能的值有_self(当前窗口),_blank(新建窗口),_parent(父窗口),_top(顶层窗口),<iframe>标签的name属性(即表单返回结果展示在<iframe>窗口)。

<fieldset><legend>

<fieldset>是一个容器元素,表示控件的集合,用于将一组相关控件组合成一组。

有以下属性。

  • disabled:布尔属性,一旦设置会使得<fieldset>内部包含的控件都不可用,都变成灰色状态。
  • form:指定控件组所属的<form>,它的值等于<form>id属性。
  • name:该控件组的名称。

<legend>标签用来设置<fieldset>控件组的标题,通常是<fieldset>内部的第一个元素,会嵌入显示在控件组的上边框里面。

1
2
3
4
5
6
7
<form>
<fieldset>
<legend>学生情况登记</legend>
<p>年龄:<input type="text" name="age"></p>
<p>性别:<input type="text" name="gender"></p>
</fieldset>
</form>

image-20220320234141574

<label>

行内元素

点击<label>,就相当于控件本身的click事件。

<label>for属性关联相对应的控件,它的值是对应控件的id属性。所以,控件最好设置id属性。

控件也可以放在<label>之中,这时不需要for属性和id属性。

<label>的属性如下。

  • for:关联控件的id属性。
  • form:关联表单的id属性。设置了该属性后,<label>可以放置在页面的任何位置,否则只能放在<form>内部。

<input>

不用闭合

共同属性
  • autofocus:布尔属性,是否在页面加载时自动获得焦点。
  • disabled:布尔属性,是否禁用该控件。一旦设置,该控件将变灰,用户可以看到,但是无法操作。
  • form:关联表单的id属性。设置了该属性后,控件可以放置在页面的任何位置,否则只能放在<form>内部。
  • list:关联的<datalist>id属性,设置该控件相关的数据列表,详见后文。
  • name:控件的名称,主要用于向服务器提交数据时,控件键值对的键名。注意,只有设置了name属性的控件,才会向服务器提交,不设置就不会提交。
  • readonly:布尔属性,是否为只读。
  • required:布尔属性,是否为必填。
  • type:控件类型,详见下文。
  • value:控件的值。

type属性决定了<input>的形式:

详细的属性解说见表单标签 - HTML 教程 - 网道 (wangdoc.com)

1. text
3. button

建议尽量不使用这个类型,而使用<button>标签代替

4. submit

可用配套属性来覆盖<form>标签的相应设置。

5. image

将图像作为submit按钮

6. reset

用处不大,用户点错了还会使得所有已经输入的值都被重置,建议不要使用。

7. checkbox

多个相关的复选框,可以放在<fieldset>里面。name要一致。

8. radio

多个单选框的name属性的值,应该都是一致的。

9. email

该类型还可以搭配<datalist>标签,提供输入的备选项。

1
2
3
4
5
6
7
8
9
<input type="email" size="40" list="defaultEmails">

<datalist id="defaultEmails">
<option value="jbond007@mi6.defence.gov.uk">
<option value="jbourne@unknown.net">
<option value="nfury@shield.org">
<option value="tony@starkindustries.com">
<option value="hulk@grrrrrrrr.arg">
</datalist>
10. password

浏览器会自动将换行符(U+000A)和回车符(U+000D)过滤掉。

11. file
12. hidden

TODO: 详细过程?

type="hidden"是一个不显示在页面的控件,用户无法输入它的值,主要用来向服务器传递一些隐藏信息。比如,CSRF 攻击会伪造表单数据,那么使用这个控件,可以为每个表单生成一个独一无二的隐藏编号,防止伪造表单提交。

1
<input id="prodId" name="prodId" type="hidden" value="xm234jq">

上面这个控件,页面上是看不见的。用户提交表单的时候,浏览器会将prodId=xm234jq发给服务器。

CSRF(Cross-Site Request Forgery)的全称是“跨站请求伪造”,也被称为“One Click Attack”或者“Session Riding”,通常缩写为CSRF或者XSRF。

CSRF 攻击详解 - 程序员自由之路 - 博客园 (cnblogs.com)

13. number

数字输入框,只能输入数字。浏览器通常会在输入框的最右侧,显示一个可以点击的上下箭头,点击向上箭头,数字会递增,点击向下箭头,数字会递减。

14. range

type="range"是一个滑块,用户拖动滑块,选择给定范围之中的一个数值。因为拖动产生的值是不精确的,如果需要精确数值,不建议使用这个控件。常见的例子是调节音量。

该类型的配套属性如下,用法与type="number"一致。

  • max:允许的最大值,默认为100。
  • min:允许的最小值,默认为0。
  • step:步长值,默认为1。

该类型与<datalist>标签配合使用,可以在滑动区域产生刻度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<input type="range" list="tickmarks">

<datalist id="tickmarks">
<option value="0" label="0%">
<option value="10">
<option value="20">
<option value="30">
<option value="40">
<option value="50" label="50%">
<option value="60">
<option value="70">
<option value="80">
<option value="90">
<option value="100" label="100%">
</datalist>

上面代码会在0~100之间产生11个刻度。其中,0%50%100%三个位置会有文字提示,不过浏览器很可能不支持。

注意,浏览器生成的都是水平滑块。如果想要生成垂直滑块,可以使用 CSS 改变滑块区域的方向。

15. url

<datalist>标签搭配使用,可以形成下拉列表供用户选择。

16. tel

大多数时候需要自定义验证。

17. color

选择颜色的控件,它的值一律都是#rrggbb格式。

18. date/time/month/week/datetime-local

日期/时间/月份/周/日期时间输入框

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<p>
date: <input type="date" id="start" name="start"
value="2018-07-22"
min="2018-01-01" max="2018-12-31">
</p>
<p>
time: <input type="time" id="appt" name="appt"
min="9:00" max="18:00" required>
</p>
<p>
month: <input type="month" id="start" name="start"
min="2018-03" value="2018-05">
</p>
<p>
week: <input type="week" name="week" id="camp-week"
min="2018-W18" max="2018-W26" required>
</p>
<p>
datetime-local: <input type="datetime-local" id="meeting-time"
name="meeting-time" value="2018-06-12T19:30"
min="2018-06-07T00:00" max="2018-06-14T00:00">
</p>
</html>

image-20220321172126115

<button>

是一个容器标签(?)通常需要用type属性或脚本指定按钮的功能。

<button>内部不仅放置文字,还可以放置图像,这可以形成图像按钮。

属性
  • autofocus:布尔属性,表示网页加载时,焦点就在这个按钮。网页里面只能有一个元素,具有这个属性。
  • disabled:布尔属性,表示按钮不可用,会导致按钮变灰,不可点击。
  • name:按钮的名称(与value属性配合使用),将以name=value的形式,随表单一起提交到服务器。
  • value:按钮的值(与name属性配合使用),将以name=value的形式,随表单一起提交到服务器。
  • type:按钮的类型,可能的值有三种:submit(点击后将数据提交给服务器),reset(将所有控件的值重置为初始值),button(没有默认行为,由脚本指定按钮的行为)。
  • form:指定按钮关联的<form>表单,值为<form>id属性。如果省略该属性,默认关联按钮所在父表单。

下面是覆盖form的属性:

  • formaction:数据提交到服务器的目标 URL,会覆盖<form>元素的action属性。
  • formenctype:数据提交到服务器的编码方式,会覆盖<form>元素的enctype属性。可能的值有三种:application/x-www-form-urlencoded(默认值),multipart/form-data(只用于文件上传),text/plain
  • formmethod:数据提交到服务器使用的 HTTP 方法,会覆盖<form>元素的method属性,可能的值为postget
  • formnovalidate:布尔属性,数据提交到服务器时关闭本地验证,会覆盖<form>元素的novalidate属性。
  • formtarget:数据提交到服务器后,展示服务器返回数据的窗口,会覆盖<form>元素的target属性。可能的值有_self(当前窗口),_blank(新的空窗口)、_parent(父窗口)、_top(顶层窗口)。

<option><optgroup>

<option>标签用在<select><optgroup><datalist>里面,表示一个菜单项,参见<select>的示例。

属性
  • disabled:布尔属性,是否禁用该项。
  • label:该项的说明。如果省略,则等于该项的文本内容。
  • selected:布尔属性,是否为默认值。显然,一组菜单中,只能有一个菜单项设置该属性。
  • value:该项提交到服务器的值。如果省略,则等于该项的文本内容。

<optgroup>表示菜单项的分组,通常用在<select>内部。

  • disabled:布尔设置,是否禁用该组。一旦设置,该组所有的菜单项都不可选。
  • label:菜单项分组的标题。

<select>

用于生成一个下拉菜单。

属性
  • autofocus:布尔属性,页面加载时是否自动获得焦点。
  • disabled:布尔属性,是否禁用当前控件。
  • form:关联表单的id属性。
  • multiple:布尔属性,是否可以选择多个菜单项。默认情况下,只能选择一项。一旦设置,多数浏览器会显示一个滚动列表框。用户可能需要按住Shift或其他功能键,选中多项。
  • name:控件名。
  • required:布尔属性,是否为必填控件。
  • size:设置了multiple属性时,页面显示时一次可见的行数,其他行需要滚动查看。

<datalist>

为指定控件提供一组相关数据,通常用于生成输入提示。它的内部使用<option>,生成每个菜单项。

注意,<option>在这里可以不需要闭合标签。

<textarea>

属性
  • autofocus:布尔属性,是否自动获得焦点。
  • cols:文本框的宽度,单位为字符,默认值为20。
  • disabled:布尔属性,是否禁用该控件。
  • form:关联表单的id属性。
  • maxlength:允许输入的最大字符数。如果未指定此值,用户可以输入无限数量的字符。
  • minlength:允许输入的最小字符数。
  • name:控件的名称。
  • placeholder:输入为空时显示的提示文本。
  • readonly:布尔属性,控件是否为只读。
  • required:布尔属性,控件是否为必填。
  • rows:文本框的高度,单位为行。
  • spellcheck:是否打开浏览器的拼写检查。可能的值有true(打开),default(由父元素或网页设置决定),false(关闭)。
  • wrap:输入的文本是否自动换行。可能的值有hard(浏览器自动插入换行符CR + LF,使得每行不超过控件的宽度),soft(输入内容超过宽度时自动换行,但不会加入新的换行符,并且浏览器保证所有换行符都是CR + LR,这是默认值),off(关闭自动换行,单行长度超过宽度时,会出现水平滚动条)。

<output>

行内元素,用于显示用户操作的结果。一般是计算结果(?

0 100 + =

<progress>

任务完成进度

70%

<meter>

行内元素,表示指示器,用来显示已知范围内的一个值,很适合用于任务的当前进度、磁盘已用空间、充电量等带有比例性质的场合。浏览器通常会将其显示为一个不会滚动的指示条。

示例:

烤箱的当前温度是350度

属性
  • 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属性,则表示“高端”是最佳范围;如果在lowhigh之间,则表示“中间地带”是最佳范围。如果省略,则等于minmax的中间值。
  • form:关联表单的id属性。

其他标签

<dialog>

或许这就是模态框。。

<dialog>元素里面,可以放入其他 HTML 元素。

1
2
3
4
5
6
<dialog open>
<form method="dialog">
<input type="text">
<button type="submit" value="foo">提交</button>
</form>
</dialog>

上面的对话框里面,有一个输入框和提交按钮。

注意,上例中<form>method属性设为dialog,这时点击提交按钮,对话框就会消失。但是,表单不会提交到服务器,浏览器会将表单元素的returnValue属性设为 Submit 按钮的value属性(上例是foo)。

JS API

提供Dialog.showModal()Dialog.close()两个方法,用于打开/关闭对话框。

事件

有两个事件,可以监听。

  • close:对话框关闭时触发
  • cancel:用户按下esc键关闭对话框时触发

如果希望用户点击透明层,就关闭对话框,可以用下面的代码。

1
2
3
4
5
modal.addEventListener('click', (event) => {
if (event.target === modal) {
modal.close('cancelled');
}
});

<details><summary>

这是summary 这是details

CSS 设置summary::-webkit-details-marker,可以改变标题前面的三角箭头。

JS API

Details元素的open属性返回<details>当前是打开还是关闭。

Details元素有一个toggle事件,打开或关闭折叠时,都会触发这个事件。

详细见其他标签 - HTML 教程 - 网道 (wangdoc.com)

HTML的演变过程与对应的文档类型定义(DTD)

  • HTML4

    1
    2
    <!DOCTYPE htm1 PUBLIC
    "-//w3C//DTD HTML 4.01 Transitiona1 //EN" "http://www.w3.org/TR/htm14/1oose.dtd">
  • XHTML 1.0

    1
    2
    3
    4
    5
    6
    <!DOCTYPE htm1 PUBLIC
    "-//W3C//DTD XHTML 1.0 Transitiona1 //EN" "http://www.w3.org/TR/xhtm11/DTD/
    xhtm11-transitiona1.dtd">

    <!DOCTYPE htm1 PUBLIC
    "-//W3C//DTD XHTML 1.0 Strict/ /EN" "http://www.w3.org/TR/xhtm11/DTD/xhtm11-strict.dtd">
    • 是依据XML标准重新制定的,有着严格的规则(也有过渡板的XHTML,其中仍可以使用一些表示性元素)

    • XML:可扩展标记性语言,定义数据传输的格式,标签需要自定义

      1
      <?xml version-"1.0”?>
  • HTML5

    1
    <! DOCTYPE htm1>

搜索引擎优化SEO

搜索引擎优化(或者叫SEO)是一种利用 搜索引擎的搜索规则提高网站在有关搜索引擎内的排名 的方式

SEO的核心是,找到人们在搜索你的网站时可能会输入到搜索引擎的 关键词 ,然后在你的网站中将这些关键词应用到合适的位置,以此来增加你的网站在搜索引擎结果中显示的机会。

站内优化

关注站内网页文本

  • 关键词插入:
  1. 页面标题 <head>-<title>
  2. URL/网址 :文件名属于URL的一部分,如果允许的话在文件名中加入关键词
  3. 标题 <h1>~<hn>
  4. 正文 不要出现段与段之间生硬的植入关键词,要保持关键词布局的合理性
  5. 链接文本
  6. 图像的alt特性
  7. 页面描述 <head>-<meta> description描述标签/keywords关键词标签

永远不要试图欺骗搜索引擎!例如,不要添加颜色与背景色相同的文本,因为搜索引擎可以检测到这一点。

  • 内容的更新

站外优化

获得来自其他内容相关的网站的链接(其他网站引用了你的网站的链接),可以做友链交换

可以通过Google Analytics等工具分析来访者

通过发布外链等方式吸引来访者

通过服务器优化提高访问速度等等方式留住来访者

其他可参考: Google SEO教程,谷歌搜索引擎优化新手入门指南 - 奶爸建站笔记 (naibabiji.com)