专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
码农翻身  ·  中国的大模型怎么突然间就领先了? ·  17 小时前  
程序员的那些事  ·  清华大学:DeepSeek + ... ·  3 天前  
程序员小灰  ·  3个令人惊艳的DeepSeek项目,诞生了! ·  2 天前  
OSC开源社区  ·  2024: 大模型背景下知识图谱的理性回归 ·  4 天前  
程序员的那些事  ·  成人玩偶 + ... ·  5 天前  
51好读  ›  专栏  ›  SegmentFault思否

优雅地写 CSS

SegmentFault思否  · 公众号  · 程序员  · 2018-02-01 08:00

正文

https://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/ https://css-tricks.com/bem-101/ https://www.smashingmagazine.com/2011/12/an-introduction-to-object-oriented-css-oocss/ https://hackhands.com/70-Expert-Ideas-For-Better-CSS-Coding/

重置你的CSS样式

normalize:

  • http://necolas.github.io/normalize.css/

reset:

  • http://html5reset.org/

  • http://www.zhangxinxu.com/wordpress/2010/08/html5-css-reset/

使用CSS常量进行更快速的开发。

  1. /*

  2.   # Dark grey (text): #333333

  3.   # Dark Blue (headings, links) #000066

  4.   # Mid Blue (header) #333399

  5.   # Light blue (top navigation) #CCCCFF

  6.   # Mid grey: #666666

  7. */

工作流程:调试

  1. * { border: 1px solid #f00; }

使用主样式表

  1. /* master.css */

  2. @import url("reset.css");

  3. @import url("global.css");  

  4. @import url("structure.css");

格式

1.类名建议使用破折号代替驼峰法。如果你使用 BEM,也可以使用下划线(参见下面的 OOCSS 和 BEM)。

2.不要使用 ID 选择器。

3.在一个规则声明中应用了多个选择器时,每个选择器独占一行。

4.在规则声明的左大括号 { 前加上一个空格。

5.在属性的冒号 : 后面加上一个空格,前面不加空格。

6.规则声明的右大括号 } 独占一行。

7.规则声明之间用空行分隔开。

  1. .avatar {

  2.  border-radius: 50%;

  3.  border: 2px solid white;

  4. }

  5. .one,

  6. .selector,

  7. .per-line {

  8. // ...

  9. }

注释

1.建议使用行注释 (在 Sass 中是 //) 代替块注释。

2.建议注释独占一行。避免行末注释。

3.给没有自注释的代码写上详细说明,比如:为什么用到了 z-index 兼容性处理

4.使用标志。“将样式表分成特定的部分:全局样式 - (正文,段落,列表等),页眉,页面结构,标题,文本样式,导航,表单,注释,附件。

OOCSS 和 BEM

出于以下原因,我们鼓励使用 OOCSS 和 BEM 的某种组合:

  • 可以帮助我们理清 CSS 和 HTML 之间清晰且严谨的关系。

  • 可以帮助我们创建出可重用、易装配的组件。

  • 可以减少嵌套,降低特定性。

  • 可以帮助我们创建出可扩展的样式表。

OOCSS,也就是 “Object Oriented CSS(面向对象的CSS)”,是一种写 CSS 的方法,其思想就是鼓励你把样式表看作“对象”的集合:创建可重用性、可重复性的代码段让你可以在整个网站中多次使用。

BEM,也就是 “Block-Element-Modifier”,是一种用于 HTML 和 CSS 类名的命名约定。BEM 最初是由 Yandex 提出的,要知道他们拥有巨大的代码库和可伸缩性,BEM 就是为此而生的,并且可以作为一套遵循 OOCSS 的参考指导规范。

尽量不要使用 ID 选择器!!!

在 CSS 中,虽然可以通过 ID 选择元素,但大家通常都会把这种方式列为反面教材。ID 选择器给你的规则声明带来了不必要的高优先级,而且 ID 选择器是不可重用的。

JavaScript 钩子

避免在 CSS 和 JavaScript 中绑定相同的类。否则开发者在重构时通常会出现以下情况:轻则浪费时间在对照查找每个要改变的类,重则因为害怕破坏功能而不敢作出更改。

我们推荐在创建用于特定 JavaScript 的类名时,添加 .js- 前缀:

Sass

属性声明的排序:首先列出除去 @include 和嵌套选择器之外的所有属性声明。紧随后面的是 @include,这样可以使得整个选择器的可读性更高。

嵌套选择器

不要让嵌套选择器的深度超过 3 层!

如果有必要用到嵌套选择器,把它们放到最后,在规则声明和嵌套选择器之间要加上空白,相邻嵌套选择器之间也要加上空白。嵌套选择器中的内容也要遵循上述指引。

  1. .btn {

  2.  background: green;

  3.  font-weight: bold;

  4.  @include transition(background 0.5s ease);

  5.  .icon {

  6.    margin-right: 10px;

  7.  }

  8. }

变量

变量名应使用破折号(例如 $my-variable )代替 camelCased snake_cased 风格。对于仅用在当前文件的变量,可以在变量名之前添加下划线前缀(例如 $_my-variable )。

css分类

按照css的性质和用途,我们可以将css文件分成“公共型样式”、“特殊型样式”、“皮肤型样式”,并以此为顺序引用。那么他们分别是什么呢?

公共型样式

是最为重要的部分,对于比较小的项目,我们只引入一个css,这个css的样式即公共型样式,一般包括:“标签的重置和设置默认值”(以消除不同浏览器之间的差异)、“统一调用背景图和清除浮动或其他需统一处理的长样式(这样就无需对每个进行分别的处理)”、“网站通用布局”、“通用模块和其扩展”、“元件和其扩展”、“功能类样式”、“皮肤类样式”。后面会具体介绍。

特殊型样式

即对某个维护率较高的栏目或者某个与网站整体差异较大的页面独立引入这样一个特殊型样式,方便我们维护。

皮肤型样式

即产品需要换肤功能,那么我们就需要将颜色、背景等抽离出来放在这里,方便管理。

css文件我们分为了公共型样式、特殊型样式、皮肤型样式,那么在css文件的内部我们又是怎么分类的呢?(此部分为重点)

重置和默认的css代码

这是为了消除默认样式和浏览器的差异,并设置部分标签的初始样式, *以减少后面的重复劳动。 * 你可以根据自己的网站需求设置,这一部分代码放在css内部的最上面。

统一处理的css代码

这里可以统一调用背景图和清除浮动(指通用性较高的布局、模块、原件内的清楚)。

布局(grid)

我们将页面分割为几个大块,通常有头部、主体、主栏、侧栏、尾部等。常用!

模块(module)

即语义化的可以重复使用的较大的整体。如导航、登陆、注册、列表、评论、搜索等。常用!

元件(unit)

通常是一个 不可再分 的较为小巧的个体,被重复用于各种模块中,比如按钮、输入框、loading、图表等。常用!

功能(function)

为方便一些常用样式的使用,我们将这些使用率较高的样式剥离出来,按需使用,通常这些选择器具有固定样式表现,比如清除浮动。不常用,不可滥用!

皮肤(skin)

对于换肤型网站需要使用,将皮肤型的样式抽离出来,非换肤型网站不可滥用,不常用。

状态(state)

即一些状态类样式。不常用。

css代码格式

1.选择器、属性和值都是用小写。

这一点非常关键:根据xhtml规范(http://baike.baidu.com/view/15906.htm),所有的标签属性和值都要使用小写形式,而我们知道xhtml更为标准,所以最好遵循之,这样,选择器必须小写就是十分必要的了。既然这样我们就不能使用驼峰式写法来写类名了,如 class="u-leftArrow" 实际上就是不规范的了,最好写成 class="u-left_arrow" ,也可以表达相同的意思。

2.单行写完一个选择器定义。

优点:便于选择器的寻找和阅读,也便于插入新的选择器和编辑,便于模块等的识别。更重要的是可以去除多余空格,使代码紧凑减少换行。试想,如果每一行只有一个属性名和属性值,那么对于一个大项目而言,就很难做到选择器的寻找和阅读了,而使用一行写完一个选择器,那么就有可能缩短为1/6到1/10,这还是非常客观的。

3.最后一个值也要一分号结尾。

实际上,在大括号结束前的值可以省略分号,但是这样做会对修改、添加和维护工作带来不必要的失误和麻烦。比如,在最后添加一个属性,如果之前没有在末尾添加分号,那么你就要在新添加的属性前添加分号,否则就会出错。

4.省略值为0的单位

优点:可以节省不必要的字节同时也为了方便阅读,我们将0px、0em、0%等都缩写为0。

5.使用16进制表示颜色值,其中的字母使用大写形式,并尽量缩写。

除非在你需要透明度而使用rgba,否则都是用#FFFFFF这样的写法,并尽量缩写,如#FFF。使用大写形式,是因为这样更加具有易读性,且有利于压缩,而缩写为了减少不必要的字节。

6.根据属性的重要性顺序书写。

只遵循横向顺序即可,即 先书写定位布局类属性,在书写盒模型等自身属性,最后书写文本类及修饰类属性 。另外,如果属性间存在关联性,则不要隔开写 height line-height 具有关联性,我们尽量不要分开写。

7.私有在前,标准在后。







请到「今天看啥」查看全文