You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
8.2 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# HTML元信息类标签你知道head里一共能写哪几种标签吗
你好我是winter。
我们在前面的HTML部分的课程中已经学习了语义标签。这些标签涵盖了我们日常开发用到的多数标签也是我们编写代码时最常用的一批标签。
但是我们今天要讲的标签,重要性丝毫不弱于语义类标签,这就是页面元信息类标签。
我们可以先来了解一下什么是元信息类标签。所谓元信息是指描述自身的信息元信息类标签就是HTML用于描述文档自身的一类标签它们通常出现在head标签中一般都不会在页面被显示出来与此相对其它标签如语义类标签描述的是业务
元信息多数情况下是给浏览器、搜索引擎等机器阅读的,有时候这些信息会在页面之外显示给用户,有时候则不会。
元信息类标签数量不多,我在这里就逐一为你介绍一下。
## head标签
首先我们先来了解一下head标签head标签本身并不携带任何信息它主要是作为盛放其它语义类标签的容器使用。
head标签规定了自身必须是html标签中的第一个标签它的内容必须包含一个title并且最多只能包含一个base。如果文档作为iframe或者有其他方式指定了文档标题时可以允许不包含title标签。
## title标签
title标签表示文档的标题从字面上就非常容易理解。这里我就讲讲需要注意的地方。
你还记得吗我们的语义类标签中也有一组表示标题的标签h1-h6。
heading 和 title 两个英文单词意义区分十分微妙,在中文中更是找不到对应的词汇来区分。但是实际使用中,两者确实有一定区别。
在HTML标准中特意讨论了这个问题。我们思考一下假设有一个介绍蜜蜂跳舞求偶仪式的科普页面我们试着把以下两个文字分别对应到title和h1。
* 蜜蜂求偶仪式舞蹈
* 舞蹈
在听/看正确答案前,你不妨先想想,自己的答案是什么呢?为什么?
好了思考之后我们来看看正确答案。正确答案是“蜜蜂求偶仪式舞蹈”放入title“舞蹈”放入h1。
我来讲一讲为什么要这样放呢这主要是考虑到title作为元信息可能会被用在浏览器收藏夹、微信推送卡片、微博等各种场景这时侯往往是上下文缺失的所以title应该是完整地概括整个网页内容的。
而h1则仅仅用于页面展示它可以默认具有上下文并且有链接辅助所以可以简写即便无法概括全文也不会有很大的影响。
## base标签
base标签实际上是个历史遗留标签。它的作用是给页面上所有的URL相对地址提供一个基础。
base标签最多只有一个它改变全局的链接地址它是一个非常危险的标签容易造成跟JavaScript的配合问题所以在实际开发中我比较建议你使用JavaScript来代替base标签。
## meta标签
meta标签是一组键值对它是一种通用的元信息表示标签。
在head中可以出现任意多个meta标签。一般的meta标签由name和content两个属性来定义。name表示元信息的名content则用于表示元信息的值。
它基本用法是下面这样的,你也可以自己动手尝试一下:
```
<meta name=application-name content="lsForums">
```
这个标签表示页面所在的web-application名为IsForums。
这里的name是一种比较自由的约定HTTP标准规定了一些name作为大家使用的共识也鼓励大家发明自己的name来使用。
除了基本用法meta标签还有一些变体主要用于简化书写方式或者声明自动化行为。下面我就挑几种重点的内容来分别讲解一下。
### 具有charset属性的meta
从HTML5开始为了简化写法meta标签新增了charset属性。添加了charset属性的meta标签无需再有name和content。
```
<meta charset="UTF-8" >
```
charset型meta标签非常关键它描述了HTML文档自身的编码形式。因此我建议这个标签放在head的第一个。
```
<html>
<head>
<meta charset="UTF-8">
……
```
这样浏览器读到这个标签之前处理的所有字符都是ASCII字符众所周知ASCII字符是UTF-8和绝大多数字符编码的子集所以在读到meta之前浏览器把文档理解多数编码格式都不会出错这样可以最大限度地保证不出现乱码。
一般情况下HTTP服务端会通过http头来指定正确的编码方式但是有些特殊的情况如使用file协议打开一个HTML文件则没有http头这种时候charset meta就非常重要了。
## 具有http-equiv属性的meta
具有http-equiv属性的meta标签表示执行一个命令这样的meta标签可以不需要name属性了。
例如下面一段代码相当于添加了content-type这个http头并且指定了http编码方式。
```
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
```
除了content-type还有以下几种命令
* 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类型它没有在HTML标准中定义却是移动端开发的事实标准它就是name为viewport的meta。
这类meta的name属性为viewport它的content是一个复杂结构是用逗号分隔的键值对键值对的格式是key=value。
例如:
```
<meta name="viewport" content="width=500, initial-scale=1">
```
这里只指定了两个属性宽度和缩放实际上viewport能控制的更多它能表示的全部属性如下
* width页面宽度可以取值具体的数字也可以是device-width表示跟设备宽度相等。
* height页面高度可以取值具体的数字也可以是device-height表示跟设备高度相等。
* initial-scale初始缩放比例。
* minimum-scale最小缩放比例。
* maximum-scale最大缩放比例。
* user-scalable是否允许用户缩放。
对于已经做好了移动端适配的网页应该把用户缩放功能禁止掉宽度设为设备宽度一个标准的meta如下
```
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
```
## 其它预定义的meta
在HTML标准中还定义了一批meta标签的name可以视为一种有约定的meta我在这里列出来你可以简单了解一下。
application-name如果页面是Web application用这个标签表示应用名称。
* author: 页面作者。
* description页面描述这个属性可能被用于搜索引擎或者其它场合。
* generator: 生成页面所使用的工具主要用于可视化编辑器如果是手写HTML的网页不需要加这个meta。
* keywords: 页面关键字对于SEO场景非常关键。
* referrer: 跳转策略,是一种安全考量。
* theme-color: 页面风格颜色实际并不会影响页面但是浏览器可能据此调整页面之外的UI如窗口边框或者tab的颜色
## 结语
在本课,我们又学习了一批标签,它们是文档用于描述自身的元信息类标签。一些元信息标签可以产生实际的行为,掌握它们对于我们编写代码是必须的。
另一些元信息仅仅是对页面的描述,掌握它们可以使我们编写的页面跟各种浏览器、搜索引擎等结合地更好。
主要包括下面这些内容。
* head元信息的容器。
* title文档标题。
* base页面的基准URL。
* meta: 元信息通用标签。
我们还展开介绍了几种重要的meta标签charset表示页面编码http-equiv表示命令还介绍了一些有约定的meta名称。
最后给你留一个问题你还见过哪些meta标签的用法欢迎留言告诉我。