前言
最近看了一些同事留下的代码,有种天马行空,随心所欲的感觉。大多数旧的代码冗余复杂,想进行优化却不敢删除他们的代码,开发新功能只能在这基础上进行增加,导致代码进一步臃肿,感触良多。写一篇规范分享一下,由于JavaScript规范太多后续在写一篇博客补充。
html格式规范
语义化标签
我们应该根据元素本身的用途去使用他们,而不是为了简便使用一堆<div>
、<span>
等标签。主要原因如下:
1. 代码结构清晰,别人阅读和修改方便。
2. seo优化:搜索引擎判断和收录页面内容的主要指标之一就是标签,例如看到<h1>标签搜索引擎就知道页面表达的主题是<h1>标签内部的信息,如果整个页面都是<div>和<span>标签搜索引擎就无法抓住重点
不推荐案例:
<p>标题</p>
<div>
<p>列表元素1</p>
<p>列表元素2</p>
<p>列表元素3</p>
</div>
推荐案例:
// 标题使用<h1>标签,列表使用<ul>或者<ol>标签
<h2>标题</h2>
<ul>
<li>列表元素1</li>
<li>列表元素2</li>
<li>列表元素3</li>
</ul>
统一使用html5文档类型
统一使用html5
文档类型,格式如下所示。主要作用是告诉浏览器用最新<html>
规范来解析<html>语法,避免出现怪异现象。所有标签不要大写,即便是 doctype 标签。
<!doctype html>
html指定基本属性
为了让浏览器保持更好的兼容性,要求添加如下基本属性。
基本属性:
1、为文档指定lang属性,有助于语音合成工具确定其所应该采用的发音,有助于翻译工具确定其翻译时所应遵守的规则等等。
2、charset属性告诉流浪器用什么编码格式显示网页,不指定该属性在Safari等部分浏览器会出现中文乱码现象
3、X-UA-Compatible指定IE=edge主要是告诉IE浏览器默认用什么引擎打开网页,这个还可以指定IE=7等其它版本。
使用案例:
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
</html>
为多媒体元素加上回退方案
我们需要为多媒体元素加上附加信息。主要原因包括:
- 由于网络的原因,可能图片等多媒体没有下载下来
- 如果考虑屏幕阅读器的话,多媒体需要使用附加的信息才能被阅读器识别
不推荐方案:
<img src="logo.jpg" />
推荐方案:
<img src="logo.jpg" alt="规定图像的替代文本" />
标签属性的处理方案
1、属性顺序
HTML属性应当按照以下给出的顺序依次排列,确保代码的易读性。class
id
, name
data-*
src
, for
, type
, href
, value
title
, alt
role
, aria-*
推荐案例:
<a class="..." id="..." data-toggle="modal" href="#">
Example link
</a>
<input class="form-control" type="text">
<img src="..." alt="...">
class
用于标识高度可复用组件,因此应该排在首位。id
用于标识具体组件,应当谨慎使用(例如,页面内的书签),因此排在第二位。
2、约定布尔属性值
部分html布尔属性诸如disabled
、checked
、readonly
、required
等等值可以省略,可以为布尔类型,可以等于属性名称。,这里统一约定使用省略属性值的格式。
推荐案例:
<input type="text" disabled />
3、用双引号包裹属性值
属性值可以用单引号包裹,也可以用双引号,约定统一使用双引号包裹
推荐案例:
<p class="error">aaaaaa</p>
标签嵌套闭合
所有标签必须正确嵌套和闭合,可以使用W3C验证器检测代码。
不推荐的案例:
<div>
<p>
标签嵌套错误
</div>
</p>
// --------------------------------
<div>
<p>
标签没有闭合
</div>
推荐的案例:
<div>
<p>
标签使用正确
</p>
</div>
按照功能模块添加注释
合理的添加注释阅读和编码会更容易。添加注释的地方建议按照功能或者模块来添加,添加注释的格式建议如下:
1、注释成对出现,注释的格式和html元素相同用,即尾部的注释添加/结束。
<!-- 公告列表模块 -->
<div class="m-post"
...
<!-- /公告列表模块 -->
2、注释成对出现,注释中标注开始和结束。
<!-- 公告列表模块 start -->
<div class="m-post"
...
<!-- /公告列表模块 end -->
内容和样式分离
html只关注内容,不关注页面的样式。我们选用html标签考虑的是这部分内容用什么标签表达更合适,而不是有哪个标签的样式可以让我们少些css代码。常见的错误如下:
- 错误的使用style属性添加样式
- 错误的使用表象元素b标签、i标签等添加样式
- table错误的使用cellpadding、border等属性设置样式
- 错误的使用<br/>换行
css规范
文件引用
1、不使用@import
css样式文件有两种引入方式,一种是link
元素,另一种是@import
。建议只在打包工具中使用@import引入mixin等公共样式文件,html中使用<link>替代@import。
2、去掉引用资源中的引号
引用资源可以使用引号,也可以不使用引号,统一约定不使用引号。
不推荐案例:
div {
background-image: url("./poster.png");
}
推荐案例:
div {
background-image: url(./poster.png);
}
3、在head元素中引用css文件
避免在页面style
标签内引用样式或者直接在元素上内联样式,应该将样式抽离出来放在单独的css
文件里。原因是因为内容和样式分离,易于维护和管理,并且css
文件可以被缓存,重用等
*符号处理
css
代码避免使用*,原因是因为它标识浏览器所支持的全部html
属性。拿css代码重置作为说明。
不推荐案例:
*{margin:0;padding:0;}
推荐案例:
body,dl,dd,h1,h2,h3,h4,h5,h6,p,form,ol,ul{margin:0;padding:0;}
说明:推荐案例代码稍微多,但是性能比上面的方式好,在渲染的时候,只匹配body
,dl
,dd
,h1
,h2
,h3
,h4
,h5
,h6
,p
,form
,ol
,ul
这里面的元素,这些元素带有margin
和padding
,需要重置。而其它span
等元素则无需进行内外边距处理。
避免无意义的选择器
不推荐案例:
.header #logo img{
width:200px;
...
}
推荐案例:
#logo img{
width:200px;
...
}
说明:我们的代码中应注意避免使用一些无实际意义的css
代码,例如上述案例中#logo
优先级已经很高了,前面加上.header
选择器很多余。而且建议元素的嵌套最好不要超过3层,过度的嵌套会使得代码臃肿,而且也会降低浏览器的解析效率。
公共代码抽离
不推荐案例:
.btn-default {
cursor: pointer;
background-image: none;
border: 1px solid transparent;
padding: 6px 12px;
font-size: 14px;
color: #333;
background-color: #fff;
border-color: #ccc;
}
.btn-primary {
cursor: pointer;
background-image: none;
border: 1px solid transparent;
padding: 6px 12px;
font-size: 14px;
color: #fff;
background-color: #286090;
border-color: #204d74;
}
推荐案例:
.btn {
cursor: pointer;
background-image: none;
border: 1px solid transparent;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857143;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.btn-default {
color: #333;
background-color: #fff;
border-color: #ccc;
}
.btn-primary {
color: #fff;
background-color: #286090;
border-color: #204d74;
}
说明:公共的样式尽量抽离出来,可以是模块内共享,也可以是全局共享。上述案例是bootstrap
框架源码按钮样式的一部分。.btn-default
样式和.btn-primary
样式区别仅仅在与不同状态下的颜色区别,其它代码相同。在举个全局共享的案例:
//单行文本超出显示省略号
.text-ellipsis{
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
css命名规范
有句俗语叫做见名知意,css
命名应根据大多数人的习惯,以及功能模块来命名。
1、命名格式
不推荐案例:
// css名字用驼峰式命名
.textEllipsis{
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
推荐案例:
// css名字用-分割
.text-ellipsis{
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
2、常见的命名建议
头:header
尾:footer
导航:nav
导航条:navbar
子导航:subnav
内容外围容器:wrapper/container
侧栏:sidebar
登录条:loginbar
标志:logo
广告:banner
页面主体:main
热点:hot
新闻:news
下载:download
菜单:menu
子菜单:submenu
搜索:search
版权:copyright
内容:content
标签:tags
文章列表:list
提示信息:tips
标题:title
指南:guide
服务:service
注册:regsiter
状态:status
摘要: summary
属性书写顺序
建议书写css按照一定的顺序,不一定按照下面推荐的来进行,而是根据个人自己的习惯,不能杂乱无章。
- 位置属性(position, top, right, z-index, display, float)
- 盒子模型属性(width, height, padding, margin, border)
- 文字相关(font, line-height, letter-spacing, color, text-align)
- 背景相关(background)
- 其它属性(opacity)
- 最后是动画属性(animation, transition等)
0与单位
如果属性值为0,则不需要为0加单位。
不推荐的案例:
.header {
margin: 0px;
padding: 0px;
}
推荐的案例:
.header {
margin: 0;
padding: 0;
}
浏览器前缀处理
为了提高兼容性,需要添加浏览器前缀,并且把非前缀版本放在最后。另一个解决方案是在开发过程中使用Autoprefixer等第三方库自动添加前缀。
推荐案例:
header {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
书写格式
所有css规则需要换行,多组选择器之间需要换行,建议大家使用格式化工具或者插件。
不推荐案例:
.dropdown-menu > .active > a,.dropdown-menu > .active > a:hover,.dropdown-menu > .active > a:focus {
color: #fff;
text-decoration: none;
background-color: #337ab7;
outline: 0;
}
推荐案例:
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
color: #fff;
text-decoration: none;
background-color: #337ab7;
outline: 0;
}
其它注意事项
- 尽量少使用
id
命名,避免出现不可控问题 - 每条规则结束后都必须加上分号
- 当使用《css揭秘》等书籍或博客提供的
hack
技巧时候,一定要添加注释,解释清楚 - 当我们自定义的组件与框架组件重名时候,我们应该加上自己工作组或项目的特定前缀进行区分。例如案例:
//bootstrap框架样式命名为table
<table class="table">
...
</table>
//自定义框架样式可以命名为dms-table,其中dms是项目组简写
<table class="dms-table">
...
</table>
总结
制定规范可以让我们的减少无畏的思考,可以写出高质量的代码,可以减少后期维护的成本,希望大家引起重视。
更多可以参考:bootstrap开发规范
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。