5811前端基础规范-【HTML规范】
HTML约定
1.文档类型
统一使用HTML5的标准文档类型:
<!DOCTYPE html>
;
HTML5文档类型具备前后兼容的特质,并且易记易书写
在文档doctype申明之前,不允许加上任何非空字符;
任何出现在doctype申明之前的字符都将使得你的HTML文档进入非标准模式
不允许添加<meta>
标签强制改变文档模式。
避免出现不可控的问题
2.HEAD
语言
<!-- 中文 -->
<html lang="zh-cn">
<!-- English -->
<html lang="en">
编码
- 以无 BOM 的 utf-8 编码作为文件格式;
- 指定字符编码的 meta 必须是 head 的第一个直接子元素
<meta charset="utf-8">
IE兼容模式
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
SEO优化头部
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Style Guide</title>
<meta name="keywords" content="your keywords">
<meta name="description" content="your description">
<meta name="author" content="author,email address">
</head>
viewport
viewport
: 一般指的是浏览器窗口内容区的大小,不包含工具条、选项卡等内容;width
: 浏览器宽度,输出设备中的页面可见区域宽度;device-width
: 设备分辨率宽度,输出设备的屏幕可见宽度;initial-scale
: 初始缩放比例;maximum-scale
: 最大缩放比例;
为移动端设备优化,设置可见区域的宽度和初始缩放比例。
<meta name="viewport" content="width=device-width, initial-scale=1.0">
IOS图标
IOS独有的标签,可以添加图标到iphone主屏幕快捷方式
- apple-touch-icon 图片自动处理成圆角和高光等效果;
- apple-touch-icon-precomposed 禁止系统自动添加效果,直接显示设计原图;
<!-- iPhone 和 iTouch,默认 57x57 像素,必须有 -->
<link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-57x57-precomposed.png">
<!-- iPad,72x72 像素,可以没有,但推荐有 -->
<link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-72x72-precomposed.png" sizes="72x72">
<!-- Retina iPhone 和 Retina iTouch,114x114 像素,可以没有,但推荐有 -->
<link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-114x114-precomposed.png" sizes="114x114">
<!-- Retina iPad,144x144 像素,可以没有,但推荐有 -->
<link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-144x144-precomposed.png" sizes="144x144">
favicon
在未指定 favicon 时,大多数浏览器会请求 Web Server 根目录下的 favicon.ico 。为了保证 favicon 可访问,避免404,必须遵循以下两种方法之一:
- 在 Web Server 根目录放置 favicon.ico 文件;
- 使用 link 指定 favicon;
<link rel="shortcut icon" href="path/to/favicon.ico">
HEAD 模板
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Style Guide</title>
<meta name="description" content="不超过150个字符">
<meta name="keywords" content="">
<meta name="author" content="name, email@gmail.com">
<!-- 为移动设备添加 viewport -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- iOS 图标 -->
<link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-57x57-precomposed.png">
<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml" />
<link rel="shortcut icon" href="path/to/favicon.ico">
</head>
在调用CSS和JavaScript时,可以将type属性省略不写
<!-- good -->
<link rel="stylesheet" href="base.css" />
<script src="base.js"></script>
<!-- bad -->
<link type="text/css" rel="stylesheet" href="base.css" />
<script type="text/javascript" src="base.js"></script>
因为HTML5在引入CSS时,默认type值为text/css;在引入JavaScript时,默认type值为text/javascript
3.省略属性值
非必须属性值可以省略
<!-- good -->
<input type="text" readonly />
<input type="text" disabled />
<!-- bad -->
<input type="text" readonly="readonly" />
<input type="text" disabled="disabled" />
这里的 readonly 和 disabled 属性的值是非必须的,可以省略不写,我们知道HTML5表单元素新增了很多类似的属性,如: required
4.用双引号包裹属性值
所有的标签属性值必须要用双引号包裹,同时也不允许有的用双引号,有的用单引号的情况
<!-- good -->
<a href="http://www.5811.com.cn" class="home">5811</a>
<!-- bad -->
<a href=http://www.5811.com.cn class=home>5811</a>
5.嵌套
所有元素必须正确嵌套
不允许交叉
<!-- good -->
<span><em>交叉嵌套</em></span>
<!-- bad -->
<span><em>交叉嵌套</span></em>
不允许非法的子元素嵌套
<!-- good -->
<div>
<h3>xx列表</h3>
<ul>
<li>asdasdsdasd</li>
<li>asdasdsdasd</li>
</ul>
</div>
<!-- bad -->
<ul>
<h3>xx列表</h3>
<li>asdasdsdasd</li>
<li>asdasdsdasd</li>
</ul>
不推荐inline元素包含block元素;
<!-- good -->
<div>
<h1>这是一个块级h1元素</h1>
<p>这是一个块级p元素</p>
</div>
<!-- bad -->
<span>
<h1>这是一个块级h1元素</h1>
<p>这是一个块级p元素</p>
</span>
规则可参考:
HTML4/XHTML1.0 Strict: 嵌套规则。
HTML5: 嵌套规则
举个例子,在HTML5中,a元素同时属于 Flow content, Phrasing content, Interactive content, Palpable content 4个分类,那些子元素是 phrasing 元素的元素可以是 a 的父元素,a 允许的子元素是以它的父元素允许的子元素为准,但不能包含 interactive 元素。
6.标签
[建议] HTML
标签的使用应该遵循标签的语义。
- 根据HTML元素的本身用途去使用它们;
- 禁止使用被废弃的用于表现的标签,如 center, font 等;
- 部分在XHTML1中被废弃的标签,在HTML5中被重新赋予了新的语义,在选用时请先弄清其语义,如:b, i, u等。
解释:
下面是常见标签语义
- p - 段落
- h1,h2,h3,h4,h5,h6 - 层级标题
- strong,em - 强调
- ins - 插入
- del - 删除
- abbr - 缩写
- code - 代码标识
- cite - 引述来源作品的标题
- q - 引用
- blockquote - 一段或长篇引用
- ul - 无序列表
- ol - 有序列表
- dl,dt,dd - 定义列表
示例:
将你构建的页面当作一本书,将标签的语义对应的其功能和含义;
- 书的名称:
<h1>
- 书的每个章节标题:
<h2>
- 章节内的文章标题:
<h3>
- 小标题/副标题:
<h4>
<h5>
<h6>
- 章节的段落:
<p>
示例:
<!-- good -->
<p>Esprima serves as an important <strong>building block</strong> for some JavaScript language tools.</p>
<!-- bad -->
<div>Esprima serves as an important <span class="strong">building block</span> for some JavaScript language tools.</div>
<!-- good -->
<h1>标题</h1>
<!-- bad -->
<p>标题</p>
[强制] 对于无需自闭合的标签,不允许自闭合。
解释:
常见无需自闭合标签有input、br、img、hr等。
示例:
<!-- good -->
<input type="text" name="title">
<!-- bad -->
<input type="text" name="title" />
[强制] 对 HTML5
中规定允许省略的闭合标签,不允许省略闭合标签。
解释:
对代码体积要求非常严苛的场景,可以例外。比如:第三方页面使用的投放系统。
示例:
<!-- good -->
<ul>
<li>first</li>
<li>second</li>
</ul>
<!-- bad -->
<ul>
<li>first
<li>second
</ul>
[强制] 标签使用必须符合标签嵌套规则。
解释:
比如 div 不得置于 p 中,tbody 必须置于 table 中。
详细的标签嵌套规则参见HTML DTD中的 Elements
定义部分。
[建议] 在 CSS
可以实现相同需求的情况下不得使用表格进行布局。
解释:
在兼容性允许的情况下应尽量保持语义正确性。对网格对齐和拉伸性有严格要求的场景允许例外,如多列复杂表单。
[建议] 标签的使用应尽量简洁,减少不必要的标签。
示例:
<!-- good -->
<img class="avatar" src="image.png">
<!-- bad -->
<span class="avatar">
<img src="image.png">
</span>
7.多媒体替代方案
- 为img元素加上alt属性;
- 为视频内容提供音轨替代;
- 为音频内容提供字母替代等等。
<!-- good -->
<img src="banner.jpg" alt="520即将到来,爱就大声说出来" />
<!-- bad -->
<img src="banner.jpg" />
alt属性的内容为对该图片的简要描述,这对于盲人用户和图像损毁都非常有意义,即无障碍。对于纯粹的装饰性图片,alt属性值可以留空,如 alt=""
8.有效操作
为表单元素label加上for属性
<!-- good -->
<input type="radio" id="blue" name="color" value="0" /><label for="blue">蓝色</label>
<input type="radio" id="pink" name="color" value="1" /><label for="pink">粉色</label>
<!-- bad -->
<input type="radio" name="color" value="0" /><label>蓝色</label>
<input type="radio" name="color" value="1" /><label>粉色</label>
for属性能让点击label标签的时候,同时focus到对应的 input 和 textarea上,增加响应区域
9.按模块添加注释
在每个模块开始和结束的地方添加注释
<!-- 新闻列表模块 -->
<div class="m-news g-mod"
...
<!-- /新闻列表模块 -->
<!-- 排行榜模块 -->
<div class="m-topic g-mod"
...
<!-- /排行榜模块 -->
注释内容左右两边保留和注释符号有1个空格位,在注释内容内不允许再出现中划线“-”,某些浏览器会报错。
注释风格保持与原生HTML的语法相似:成对出现<!-- comment --><!-- /comment -->
10.格式
- 将每个块元素、列表元素或表格元素都放在新行;
- inline元素视情况换行,以长度不超过编辑器一屏为宜;
- 每个子元素都需要相对其父级缩进
<!-- good -->
<div>
<h1>asdas</h1>
<p>dff<em>asd</em>asda<span>sds</span>dasdasd</p>
</div>
<!-- bad -->
<div><h1>asdas</h1><p>dff<em>asd</em>asda<span>sds</span>dasdasd</p></div>
11.属性
属性顺序
HTML 属性应该按照特定的顺序出现以保证易读性
- id
- class
- name
- data-xxx
- src, for, type, href
- title, alt
- aria-xxx, role
示例:
<a id="..." class="..." data-modal="toggle" href="###"></a>
<input class="form-control" type="text">
<img src="..." alt="...">
[强制] 属性名必须使用小写字母。
示例:
<!-- good -->
<table cellspacing="0">...</table>
<!-- bad -->
<table cellSpacing="0">...</table>
[强制] 属性值必须用双引号包围。
解释:
不允许使用单引号,不允许不使用引号。
示例:
<!-- good -->
<script src="esl.js"></script>
<!-- bad -->
<script src='esl.js'></script>
<script src=esl.js></script>
[建议] 布尔类型的属性,建议不添加属性值。
示例:
<input type="text" disabled>
<input type="checkbox" value="1" checked>
[建议] 自定义属性建议以 xxx-
为前缀,推荐使用 data-
。
解释:
使用前缀有助于区分自定义属性和标准定义的属性。
示例:
<ol data-ui-type="Select"></ol>