CSS实践指南
CSS Style Guide for Team Work
@New Future内容提要
- 样式实现基本原则
- BEM 规范
- SUIT 规范
- SCSS + Emmet
- 一个栗子
样式实现原则
- DRY:Don’t Repeat Yourself
- 不影响周围布局
- 嵌套层次不易过多
DRY
- 合并相同和相近
selector{ border-top:1px solid #eee; border-left:1px solid #eee; border-bottom:1px solid #eee; }selector{ border:1px solid #eee; border-right:none; } - 重复内容使用函数和变量(预处理语言)
不影响周围布局
尽量避免在基础模块中使用这些属性
- float: left/right ; (脱离文档流)
- position: absolute / fixed ;(脱离文档流)
- 最外层使用
margin(margin穿透等不稳定)
嵌套层数
一层到三层为佳
- 单层要注意冲突
- 多层嵌套太深,增加解析成本
开发规范
- 方便阅读和维护
- 避免冲突和污染
适合对象: 大型项目 团队开发
BEM 规范
使用最多的CSS规范
解决核心的问题逻辑: 命名问题
顺带确定逻辑划分
划分和命名原则
单词用小写短横线-连接
- B: Blcok 块, 所有名称从block开始
- E: Element 元素, 默认用
__连接 - M: Modifier 修改(样式标志或状态),默认用
--连接
.block__element--modifier
.block__element
.block--modifier

一个BEM的栗子
<form class="form form--theme-xmas form--simple">
<input class="form__input" type="text" />
<input class="form__submit form__submit--disabled" type="submit" />
</form>
.form { } /*block*/
.form--theme-xmas { } /*modifier style*/
.form--simple { } /*modifier flag*/
.form__input { } /*element*/
.form__submit { } /*element*/
.form__submit--disabled { } /*element status*/
SUIT 规范
针对BEM的改进方案
特点是组件化,名字更短更易读
SUIT 命名原则
- 驼峰命名
- 组件为基本单元(相当于BEM的block)
- 后代名(相当于BEM的Element)使用
-连接 - modifier 表示主题样式
- 独立出
is-state表示状态
.ComponentName
.ComponentName-descendentName
.ComponentName--modifierName
.ComponentName .is-stateOfComponent
modifier 和 state
/* Core button */
.Button { /* … */ }
/* Default button style */
.Button--default { /* … */ }
.Tweet { /* … */ }
.Tweet.is-expanded { /* … */ }
蒸栗子(筛选自twitter)
<div class="RichEditor RichEditor--emojiPicker ">
<div class="RichEditor-bottomItems">
<div class="EmojiPicker dropdown is-loading">
<button class="EmojiPicker-trigger u-textUserColorHover">
<span class="Icon Icon--smiley"></span>
</button>
<div class="EmojiPicker-dropdownMenu">
<div class="EmojiPicker-content Caret Caret--stroked"></div>
</div>
</div>
</div>
</div>
SCSS + Emmet
重复的内容使用工具
SCSS &
.nav {
&__list {
font-size: 1em;
&__item { border: 1em; }
}
&__link {
&--active { color: green; }
}
}
.nav__list {
font-size: 1em;
}
.nav__list__item {
border: 1em;
}
.nav__link--active {
color: green;
}
Emmet

分析一个CSS栗子
如何实现 这个导航箭头

(同样的效果可以有多种实现方案)
实现方案
- 嵌套 img 标签
- css 背景图片
- css 字体图标
- css 动画
图片方案
<img class="arrow" src="arrow.jpg"></img>
.arrow{
background:url(arrow.jpg);;
background-repeat:no-repeat;
}
CSS 伪元素方案
.arrow::after{
font-family: "myicon-font";
content: "\0030";
}
.arrow::after {
content: " ";
border-width: 3px 3px 0 0;
border-color: #888888;
border-style: solid;
transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);
}
References
- BEM: http://getbem.com/naming/
- SUIT CSS: https://suitcss.github.io/
THE END
THANKS
CSS实践指南
CODE: https://github.com/NewFuture/slides
LINK: https://slides.newfuture.cc/css-style-guide/