CSS规范及命名

728 阅读7分钟

其他规范链接

JavaScript规范及命名

RESTful接口规范

Git使用规范

1. 命名风格

1.1 命名前缀

使用带前缀的命名空间,防止命名冲突。

.adw-help {} /* AdWords */
#maia-note {} /* Maia */

1.2 id 和 class 命名分隔符

选择器中使用连字符,以提高可读性。

/* bad  “demo” 和 “image” 之间没有分隔符 */
.demoimage {}
 
/* bad 使用下划线 */
.error_status {}
 
/* good */
#video-id {}
.ads-sample {}

2. 值与单位

2.1 单位

值为 0 时不用添加单位。

margin: 0;
padding: 0;

值在 -1 和 1 之间时,不需要加 0。

font-size: .8em;

2.2 颜色值

颜色统一用 16 进制表示,重复的字母省略。除了是带有 alpha 的颜色信息可以使用 rgba(),通常情况下都不允许使用 rgba()。使用 rgba() 时每个逗号后必须保留一个空格。

/* bad */
color: #eebbcc;
 
/* good */
color: #ebc;
 
/* good */
box-shadow: 0 0 2px rgba(0, 128, 0, .3);

颜色值不能使用命名颜色,颜色值中的英文字符应统一采用小写。

/* bad */
.success {
  color: lightgreen;
}
 
/* good */
.success {
  color: #90ee90;
}
 
/* bad */
.success {
  color: #90ee90;
  background-color: #ACA
}
 
/* good */
.success {
  color: #90ee90;
  background-color: #aca
}

3. 选择器及属性

3.1 选择器

除非需要,否则不要在 id 或 class 前加元素名进行限定。

/* bad */
ul#example {}
div.error {}

/* good */
#example {}
.error {}

3.2 属性简写

尽量使用 CSS 中可以简写的属性 (如 font),可以提高编码效率以及代码可读性。

/* bad */
border-top-style: none;
font-family: palatino, georgia, serif;
font-size: 100%;
line-height: 1.6;
padding-bottom: 2em;
padding-left: 1em;
padding-right: 1em;
padding-top: 0;

/* good */
border-top: 0;
font: 100%/1.6 palatino, georgia, serif;
padding: 0 1em 2em;

4. 书写顺序

按照以下顺序书写属性(带有浏览器前缀的属性与其相应的属性写一起),以减少不必要的页面重绘。

div {
  /* 定位属性 */
  display;
  visibility;
  float;
  clear;
  
  position;
  top;
  right;
  botttom;
  left;
  z-index;
  overflow;

  /* 自身属性 */
  width;
  min-width;
  max-width;
  height;
  min-height;
  max-height;

  margin;
  margin-top;
  margin-right;
  margin-bottom;
  margin-left;

  padding;
  padding-top;
  padding-right;
  padding-bottom;
  padding-left;
  
  border-width;
  border-top-width;
  border-right-width;
  border-bottom-width;
  border-left-width;

  border-style;
  border-top-style;
  border-right-style;
  border-bottom-style;
  border-left-style;

  border-color;
  border-top-color;
  border-right-color;
  border-bottom-color;
  border-left-color;

  outline;

  list-style;

  table-layout;
  caption-side;
  border-collapse;
  border-spacing;
  empty-cells;
  
  /* 文字样式, 文本属性 */
  font;
  font-family;
  font-size;
  line-height;
  font-weight;
  text-align;
  text-indent;
  text-transform;
  text-decoration;
  letter-spacing;
  word-spacing;
  white-space;
  vertical-align;
  color;

  background;
  background-color;
  background-image;
  background-repeat;
  background-position;

  /* 其他属性 */
  opacity;

  cursor;

  content;
  quotes;
}

5. 通用

5.1 选择器的嵌套层级

选择器的嵌套层级应不大于 3 级,位置靠后的限定条件应尽可能精确。

/* bad */
.page .header .login #username input {}
.comment div * {}

/* good */
#username input {}
.comment .avatar {}

5.2 引号

属性选择器和属性值用单引号,URI 的值不需要引号。

/* bad */
@import url("//www.google.com/css/maia.css");

html {
  font-family: "open sans", arial, sans-serif;
}

/* good */
@import url(//www.google.com/css/maia.css);

html {
  font-family: 'open sans', arial, sans-serif;
}

5.3 样式块风格

在选择器和 {} 之间用空格隔开。

/* bad 没有空格 */
#video{
  margin-top: 1em;
}

/* bad 没有必要的换行 */
#video
{
  margin-top: 1em;
}

/* good */
#video {
  margin-top: 1em;
}

5.4 属性名书写风格

属性名和值之间都应有一个空格。

/* bad */
h3 {
  font-weight:bold;
}

/* good */
h3 {
  font-weight: bold;
}

5.5 选择器分隔

每个选择器都另起一行。

/* bad */
a:focus, a:active {
  position: relative; top: 1px;
}

/* good */
h1,
h2,
h3 {
  font-weight: normal;
  line-height: 1.2;
}

选择器之间都用空行隔开。

html {
  background: #fff;
}

body {
  margin: auto;
  width: 50%;
}

5.6 分段注释

用注释把 CSS 分成各个部分。

/* Header */

#adw-header {}

/* Footer */

#adw-footer {}

/* Gallery */

.adw-gallery {}

5.7 2D 位置

2D 位置初始值为 0% 0%,但在只有一个方向的值时,另一个方向的值会被解析为 center。为避免理解上的困扰,应同时给出两个方向的值。

/* bad */
body {
  background-position: top; /* 水平50% 垂直0% */
}

/* good */
body {
  background-position: center top; /* 水平50% 垂直0% */
}

5.8 !important

尽量不使用 !important 声明。当需要强制指定样式且不允许任何场景覆盖时,才可通过标签内联和 !important 定义样式。

必须注意的是,仅在设计上 确实不允许任何其它场景覆盖样式 时,才使用内联的 !important 样式。

5.9 z-index

z-index 进行分层,对文档流外绝对定位元素的视觉层级关系进行管理。

同层的多个元素,如多个由用户输入触发的 Dialog,在该层级内使用相同的 z-index 或递增 z-index

每层使用100个 z-index 来容纳足够的元素,如果每层元素较多,可以调整这个数值。

在可控环境下,期望显示在最上层的元素,z-index 指定为 999999

6. 字体

6.1 字体顺序

font-family 按「西文字体在前、中文字体在后」、「效果佳 (质量高/更能满足需求) 的字体在前、效果一般的字体在后」的顺序编写,最后必须指定一个通用字体族( serif / sans-serif )。

h1 {
  font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "WenQuanYi Micro Hei", "Microsoft YaHei", sans-serif;
}

6.2 字体大小写

在同一个项目中的 font-family,应都采用大写。

/* bad */
body {
  font-family: arial, sans-serif;
}

h1 {
  font-family: Arial, "Microsoft YaHei", sans-serif;
}

/* good */
body {
  font-family: Arial, sans-serif;
}

h1 {
  font-family: Arial, "Microsoft YaHei", sans-serif;
}

6.3 font-weight

font-weight 属性必须使用数值方式描述。400 等同于 normal,700 等同于 bold。

/* bad */
h1 {
  font-weight: bold;
}

/* good */
h1 {
  font-weight: 700;
}

7. 变换与动画

7.1 指定 transition-property

使用 transition 时应指定 transition-property。

/* bad */
.box {
  transition: all 1s;
}

/* good */
.box {
  transition: color 1s, border-color 1s;
}

7.2 尽可能在浏览器能高效实现的属性上添加过渡和动画

在可能的情况下应选择这样四种变换:

  • transform: translate(npx, npx);
  • transform: scale(n);
  • transform: rotate(ndeg);
  • opacity: 0.1;

典型的,可以使用 translate 来代替 left 作为动画属性。

/* bad */
.box {
  left: 0;
  transition: left 1s;
}
.box:hover {
  left: 20px; /* move right for 20px */
}

/* good */
.box {
  transition: transform 1s;
}
.box:hover {
  transform: translate(20px); /* move right for 20px */
}

8. 响应式

8.1 效果更佳的样式

尽可能给出在高分辨率设备 (Retina) 下效果更佳的样式。

8.2 Media Query

Media Query 不得单独编排,必须与相关的规则一起定义。

/* bad */
/* header styles */
/* main styles */
/* footer styles */

@media (...) {
    /* header styles */
    /* main styles */
    /* footer styles */
}

/* good */
/* header styles */
@media (...) {
    /* header styles */
}

/* main styles */
@media (...) {
    /* main styles */
}

/* footer styles */
@media (...) {
    /* footer styles */
}

9. 兼容性

9.1 属性前缀

带私有前缀的属性由长到短排列,按冒号位置对齐,标准属性放在最后。

.box {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

10. 文件命名

  • 全局样式表:global.css

  • 重置默认样式:reset.css

  • 布局样式:layout.css

  • 文字样式:font.css

11. id 及 class 命名

统一采用 kebab-case 命名。

  • 无嵌套结构时

第一个字符表示一个块,第二个字符表示块级下面的元素。

示例:

<div class="article">
  <button class="article-btn"></button>
</div>
 
<div class="head">
  <h1 class="head-title">title</h1>
</div>
  • 有嵌套结构时

直接根据层级关系命名,无需用 - 连接。

示例:

<div class="article">
  <button class="btn"></button>
</div>
 
<div class="head">
  <h1 class="title">title</h1>
</div>

12. 常用命名

使用有含义的 id 和 class 名称。id 和 class 应该尽量简短,但同时要容易理解。

12.1 页面结构

功能id / class
包裹容器container / box
页头header
页面主体main
页尾footer
导航nav
侧边栏sidebar

12.2 状态

功能id / class
成功success
危险danger
警告warning
错误error
亮色light
暗色dark
禁用disabled
激活active
选中(单选框 / 复选框)checked
默认选中项(下拉选择框)selected
加载loading

12.3 尺寸

功能id / class
big
middle
small
更大bigger
更小smaller

12.4 位置

功能id / class
第一个first
第二个second
第三个third
最后一个last
上一个prev
下一个next
left
right
center

12.5 组件

功能id / class
卡片card
列表list
图片img
轮播图banner
轮滑slide
使用swiper时swiper
菜单栏menu
分页pagination
标题title
内容content
日期date
时间time
头像avatar
标志logo
下划线 / 修饰线line
登录条login-bar
搜索框search
功能区box
表单form
表格table
弹窗dialog
抽屉式弹窗drawer