HTML

212 阅读17分钟

1)、语义标签

  • 它们的特点是视觉表现上互相都差不多,主要的区别在于它们表示了不同的语义,比如 section、nav、p 等;
  • 语义类标签则是纯文字的补充,比如标题、自然段、章节、列表,这些内容都是纯文字无法表达的,我们需要依靠语义标签代为表达;
  • 语义标签的有点:
    • 语义类标签对开发者更为友好,使用语义类标签增强了可读性,即便是在没有 CSS 的时候,开发者也能够清晰地看出网页的结构,也更为便于团队的开发和维护;
    • 语义类标签也十分适宜机器阅读。它的文字表现力丰富,更适合搜索引擎检索(SEO),也可以让搜索引擎爬虫更好地获取到更多有效信息,有效提升网页的搜索量,并且语义类还可以支持读屏软件,根据文章可以自动生成目录等等;
  • 错误地使用语义标签,会给机器阅读造成混淆、增加嵌套,给 CSS 编写加重负担。所以,对于语义标签态度应该是:“用对”比“不用”好,“不用”比“用错”好;
  • 与 JavaScript 这样严格的编程语言相比,HTML 中语义标签的使用更接近我们平常说话用的自然语言。我们说话并没有唯一的标准措辞,语义标签的使用也是一样;
  • body 里面有自己的 header 和 footer,然后里面是竖篇的 article,每一个 article 里面都有自己的 header、section、footer。这是一个典型的多文章结构。在这个结构里,我们看到了一些新标签: _ header,如其名,通常出现在前部,表示导航或者介绍性的内容; _ footer,通常出现在尾部,包含一些作者信息、相关链接、版权信息等; _ header 和 footer 一般都是放在 article 或者 body 的直接子元素,但是标准中并没有明确规定,footer 也可以和 aside,nav,section 相关联(header 不存在关联问题)。 _ aside 表示跟文章主体不那么相关的部分,它可能包含导航、广告等工具性质的内容。 _ aside 很容易被理解为侧边栏,实际上二者是包含关系,侧边栏是 aside,aside 不一定是侧边栏。 _ aside 和 header 中都可能出现导航(nav 标签),二者的区别是,header 中的导航多数是到文章自己的目录,而 aside 中的导航多数是到关联页面或者是整站地图; * 最后 footer 中包含 address,这是个非常容易被误用的标签。address 并非像 date 一样,表示一个给机器阅读的地址,而是表示“文章(作者)的联系方式”,address 明确地只关联到 article 和 body。
    标签

2)、元信息类标签

元信息是指描述自身的信息,元信息类标签,就是 HTML 用于描述文档自身的一类标签,它们通常出现在 head 标签中,一般都不会在页面被显示出来(与此相对,其它标签,如语义类标签,描述的是业务)。元信息多数情况下是给浏览器、搜索引擎等机器阅读的,有时候这些信息会在页面之外显示给用户,有时候则不会。

  • head 标签
    • 本身并不携带任何信息,它主要是作为盛放其它语义类标签的容器使用;
    • 规定了自身必须是 html 标签中的第一个标签,它的内容必须包含一个 title,并且最多只能包含一个 base。如果文档作为 iframe,或者有其他方式指定了文档标题时,可以允许不包含 title 标签。
  • title 标签
    • title 标签表示文档的标题;
  • base 标签
    • base 标签实际上是个历史遗留标签。它的作用是给页面上所有的 URL 相对地址提供一个基础;
    • base 标签最多只有一个,它改变全局的链接地址,它是一个非常危险的标签,容易造成跟 JavaScript 的配合问题,所以在实际开发中,我比较建议你使用 JavaScript 来代替 base 标签。
  • meta 标签
    • meta 标签是一组键值对,它是一种通用的元信息表示标签;
    • 在 head 中可以出现任意多个 meta 标签。一般的 meta 标签由 name 和 content 两个属性来定义。name 表示元信息的名,content 则用于表示元信息的值;
    • 具有 charset 属性的 meta,从 HTML5 开始,为了简化写法,meta 标签新增了 charset 属性。添加了 charset 属性的 meta 标签无需再有 name 和 content。charset 型 meta 标签非常关键,它描述了 HTML 文档自身的编码形式。因此,我建议这个标签放在 head 的第一个;
    • 具有 http-equiv 属性的 meta 标签,表示执行一个命令,这样的 meta 标签可以不需要 name 属性了;
         <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      
      • content-language 指定内容的语言;
      • default-style 指定默认样式表;refresh 刷新;
      • set-cookie 模拟 http 头 set-cookie,设置 cookie;
      • x-ua-compatible 模拟 http 头 x-ua-compatible,声明 ua 兼容性;
      • content-security-policy 模拟 http 头 content-security-policy,声明内容安全策略;
    • name 为 viewport 的 meta,实际上,meta 标签可以被自由定义,只要写入和读取的双方约定好 name 和 content 的格式就可以了;
         <meta name="viewport" content="width=500, initial-scale=1">
         //这里只指定了两个属性,宽度和缩放,实际上 viewport 能控制的更多
         // 对于已经做好了移动端适配的网页,应该把用户缩放功能禁止掉,宽度设为设备宽度,一个标准的 meta 如下:
         <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
      
      • width:页面宽度,可以取值具体的数字,也可以是 device-width,表示跟设备宽度相等。
      • height:页面高度,可以取值具体的数字,也可以是 device-height,表示跟设备高度相等。
      • initial-scale:初始缩放比例。
      • minimum-scale:最小缩放比例。
      • maximum-scale:最大缩放比例。
      • user-scalable:是否允许用户缩放。
    • 其它预定义的 meta,在 HTML 标准中,还定义了一批 meta 标签的 name,可以视为一种有约定的 meta,
      • application-name:如果页面是 Web application,用这个标签表示应用名称。
      • author: 页面作者。
      • description:页面描述,这个属性可能被用于搜索引擎或者其它场合。
      • generator: 生成页面所使用的工具,主要用于可视化编辑器,如果是手写 HTML 的网页,不需要加这个 meta。
      • keywords: 页面关键字,对于 SEO 场景非常关键。
      • referrer: 跳转策略,是一种安全考量。
      • theme-color: 页面风格颜色,实际并不会影响页面,但是浏览器可能据此调整页面之外的 UI(如窗口边框或者 tab 的颜色)

3)、链接标签

链接是 HTML 中的一种机制,它是 HTML 文档和其它文档或者资源的连接关系,在 HTML 中,链接有两种类型。一种是超链接型标签,一种是外部资源链接。链接的家族中有 a 标签、area 标签和 link 标签。

  • link: 有些 link 标签也是元信息类标签的一种。我们已经讲过,HTML 标准并没有规定浏览器如何使用元信息,我们还讲到了元信息中有不少是被设计成“无需被浏览器识别,而是专门用于搜索引擎看的”。link 标签也是元信息的一种,在很多时候,它也是不会对浏览器产生任何效果的,这也是很多人会忽略 link 标签学习的原因。link 标签会生成一个链接,它可能生成超链接,也可能生成外部资源链接。一些 link 标签会生成超链接,这些超链接又不会像 a 标签那样显示在网页中。这就是超链接型的 link 标签。这意味着多数浏览器中,这些 link 标签不产生任何作用。但是,这些 link 标签能够被搜索引擎和一些浏览器插件识别,从而产生关键性作用。比如,到页面 RSS 的 link 标签,能够被浏览器的 RSS 订阅插件识别,提示用户当前页面是可以 RSS 订阅的。另外一些 link 标签则会把外部的资源链接到文档中,也就是说,会实际下载这些资源,并且做出一些处理,比如我们常见的用 link 标签引入样式表。除了元信息的用法之外,多数外部资源型的 link 标签还能够被放在 body 中使用,从而起到把外部资源链接进文档的作用。link 标签的链接类型主要通过 rel 属性来区分,在本篇文章中,我们提到 xx 型 link 即表示属性 rel 为 xx 的 link,其代码类似。
    • 超链接类 link 标签超链接型 link 标签是一种被动型链接,在用户不操作的情况下,它们不会被主动下载。link 标签具有特定的 rel 属性,会成为特定类型的 link 标签。产生超链接的 link 标签包括:具有 rel=“canonical” 的 link、具有 rel="alternate"的 link、具有 rel=“prev” rel="next"的 link 等等。
      • canonical 型 link
           // 这个标签提示页面它的主 URL,在网站中常常有多个 URL 指向同一页面的情况,搜索引擎访问这类页面时会去掉重复的页面,这个 link 会提示搜索引擎保留哪一个 URL。
           <link rel="canonical" href="...">
        
      • alternate 型 link
           // 这个标签提示页面它的变形形式,这个所谓的变形可能是当前页面内容的不同格式、不同语言或者为不同的设备设计的版本,这种 link 通常也是提供给搜索引擎来使用的。
           <link rel="alternate" href="...">
           //alternate 型的 link 的一个典型应用场景是,页面提供 rss 订阅时,可以用这样的 link 来引入:
           <link rel="alternate" type="application/rss+xml" title="RSS" href="...">
        
      • prev 型 link 和 next 型 link
        //在互联网应用中,很多网页都属于一个序列,比如分页浏览的场景,或者图片展示的场景,每个网页是序列中的一个项。这种时候,就适合使用 prev 和 next 型的 link 标签,来告诉搜索引擎或者浏览器它的前一项和后一项,这有助于页面的批量展示。因为 next 型 link 告诉浏览器“这是很可能访问的下一个页面”,HTML 标准还建议对 next 型 link 做预处理,在本课后面的内容,我们会讲到预处理类的 link。
        
      • 其它超链接类的 link
        • rel=“author” 链接到本页面的作者,一般是 mailto: 协议
        • rel=“help” 链接到本页面的帮助页
        • rel=“license” 链接到本页面的版权信息页
        • rel=“search” 链接到本页面的搜索页面(一般是站内提供搜索时使用)
          //在互联网应用中,很多网页都属于一个序列,比如分页浏览的场景,或者图片展示的场景,每个网页是序列中的一个项。这种时候,就适合使用 prev 和 next 型的 link 标签,来告诉搜索引擎或者浏览器它的前一项和后一项,这有助于页面的批量展示。因为 next 型 link 告诉浏览器“这是很可能访问的下一个页面”,HTML 标准还建议对 next 型 link 做预处理,在本课后面的内容,我们会讲到预处理类的 link。
          
      • icon 型 link: 这类链接表示页面的 icon。多数浏览器会读取 icon 型 link,并且把页面的 icon 展示出来。
      • 预处理类 link
      • modulepreload 型的 link
      • stylesheet 型 link
      • pingback 型 link
  • a 标签
    • a 标签是“anchor”的缩写,它是锚点的意思,所谓锚点,实际上也是一种比喻的用法,古代船舶用锚来固定自己的位置,避免停泊时被海浪冲走,所以 anchor 标签的意思也是标识文档中的特定位置。a 标签其实同时充当了链接和目标点的角色,当 a 标签有 href 属性时,它是链接,当它有 name 时,它是链接的目标。具有 href 的 a 标签跟一些 link 一样,会产生超链接,也就是在用户不操作的情况下,它们不会被主动下载的被动型链接。重点的内容是,a 标签也可以有 rel 属性,我们来简单了解一下,首先是跟 link 相同的一些 rel,包括下面的几种:
      • alternate
      • author
      • help
      • license
      • next
      • prev
      • search
    • 这些跟 link 语义完全一致,不同的是,a 标签产生的链接是会实际显示在网页中的,而 link 标签仅仅是元信息。
    • 除了这些之外,a 标签独有的 rel 类型:
      • tag 表示本网页所属的标签;
      • bookmark 到上级章节的链接。
      • nofollow 此链接不会被搜索引擎索引;
      • noopener 此链接打开的网页无法使用 opener 来获得当前页面的窗口;
      • noreferrer 此链接打开的网页无法使用 referrer 来获得当前页面的 url;
      • opener 打开的网页可以使用 window.opener 来访问当前页面的 window 对象,这是 a 标签的默认行为。
    • a 标签基本解决了在页面中插入文字型和整张图片超链接的需要,但是如果我们想要在图片的某个区域产生超链接,那么就要用到另一种标签了——
  • area 标签。
    • area 标签 area 标签与 a 标签非常相似,不同的是,它不是文本型的链接,而是区域型的链接。area 标签支持的 rel 与 a 完全一样,这里就不多说了。area 是整个 html 规则中唯一支持非矩形热区的标签,它的 shape 属性支持三种类型。
      • 圆形:circle 或者 circ,coords 支持三个值,分别表示中心点的 x,y 坐标和圆形半径 r。
      • 矩形:rect 或者 rectangle,coords 支持两个值,分别表示两个对角顶点 x1,y1 和 x2,y2。
      • 多边形:poly 或者 polygon,coords 至少包括 6 个表示多边形的各个顶点。
    • 因为 area 设计的时间较早,所以不支持含有各种曲线的路径,但是它也是唯一一个支持了非矩形触发区域的元素,所以,对于一些效果而言,area 是必不可少的。

4)、script

  • script 标签是为数不多的既可以作为替换型标签,又可以不作为替换型标签的元素;
      <script type="text/javascript">console.log("Hello world!");</script>
      <script type="text/javascript" src="my.js"></script>
    
  • 凡是替换型元素,都是使用 src 属性来引用文件的,链接型元素是使用 href 标签的。

5)、img

  • 毫无疑问我们最熟悉的替换型标签就是 img 标签了,几乎每个前端都会日常使用 img 标签;
  • img 标签的作用是引入一张图片。这个标签是没有办法像 script 标签那样作为非替换型标签来使用的,它必须有 src 属性才有意义;
  • img 标签可以使用 width 和 height 指定宽度和高度。也可以只指定其中之一
    <img
      src='data:image/svg+xml;charset=utf8,<svg width="600" height="400" version="1.1"
      xmlns="http://www.w3.org/2000/svg"><ellipse cx="300" cy="150" rx="200" ry="80"
      style="fill:rgb(200,100,50);
      stroke:rgb(0,0,100);stroke-width:2"/></svg>'
      width="100"
    />
    

6)、picture

  • picture 元素可以根据屏幕的条件为其中的 img 元素提供不同的源,它的基本用法如下:
       <picture>
         <source srcset="image-wide.png" media="(min-width: 600px)">
         <img src="image-narrow.png">
       </picture>
    
  • picture 元素的设计跟 audio 和 video 保持了一致(稍后我会为你讲解这两个元素),它跟 img 搭配 srcset 和 sizes 不同,它使用 source 元素来指定图片源,并且支持多个。这里的 media 属性是 media query,跟 CSS 的 @media 规则一致。

7)、video

  • 在 HTML5 早期的设计中,video 标签跟 img 标签类似,也是使用 src 属性来引入源文件的,不过,我想应该是考虑到了各家浏览器支持的视频格式不同,现在的 video 标签跟 picture 元素一样,也是提倡使用 source 的。下面例子是一个古典的 video 用法:

        //这个例子中的代码用 src 来指定视频的源文件。但是因为一些历史原因,浏览器对视频的编码格式兼容问题分成了几个派系,这样,对于一些兼容性要求高的网站,我们使用单一的视频格式是不合适的。现在的 video 标签可以使用 source 标签来指定接入多个视频源。
        <video controls="controls" src="movie.ogg">
        </video>
    
        //现在的 video 标签可以使用 source 标签来指定接入多个视频源。
        <video controls="controls" >
         <source src="movie.webm" type="video/webm" >
         <source src="movie.ogg" type="video/ogg" >
         <source src="movie.mp4" type="video/mp4">
         You browser does not support video.
        </video>
        //从这个例子中,我们可以看到,source 标签除了支持 media 之外,还可以使用 type 来区分源文件的使用场景。video 标签的内容默认会被当做不支持 video 的浏览器显示的内容吗,因此,如果要支持更古老的浏览器,还可以在其中加入 object 或者 embed 标签,这里就不详细展开了。
    
    • video 中还支持一种标签:track。track 是一种播放时序相关的标签,它最常见的用途就是字幕。track 标签中,必须使用 srclang 来指定语言,此外,track 具有 kind 属性,共有五种。
      • subtitles:就是字幕了,不一定是翻译,也可能是补充性说明。
      • captions:报幕内容,可能包含演职员表等元信息,适合听障人士或者没有打开声音的人了解音频内容。
      • descriptions:视频描述信息,适合视障人士或者没有视频播放功能的终端打开视频时了解视频内容。
      • chapters:用于浏览器视频内容。
      • metadata:给代码提供的元信息,对普通用户不可见。
    • 一个完整的 video 标签可能会包含多种 track 和多个 source,这些共同构成了一个视频播放所需的全部信息。

8)、audio

  • audio,跟 picture 和 video 两种标签一样,audio 也可以使用 source 元素来指定源文件。我们看一下例子::
        <audio controls>
           <source src="song.mp3" type="audio/mpeg">
           <source src="song.ogg" type="audio/ogg">
           <p>You browser does not support audio.</p>
        </audio>
    

9)、iframe

  • iframe 标签能够嵌入一个完整的网页。不过,在移动端,iframe 受到了相当多的限制,它无法指定大小,里面的内容会被完全平铺到父级页面上。同时很多网页也会通过 http 协议头禁止自己被放入 iframe 中。iframe 标签也是各种安全问题的重灾区。opener、window.name、甚至 css 的 opacity 都是黑客可以利用的漏洞。
  • 在新标准中,为 iframe 加入了 sandbox 模式和 srcdoc 属性,这样,给 iframe 带来了一定的新场景。我们来看看例子:
       <iframe sandbox srcdoc="<p>Yeah, you can see it <a href="/gallery?mode=cover&amp;amp;page=1">in my gallery</a>."></iframe>
       // 使用 srcdoc 属性创建了一个新的文档,嵌入在 iframe 中展示,并且使用了 sandbox 来隔离。这样,这个 iframe 就不涉及任何跨域问题了。