一、什么是 CSS methodologies


CSS methodologies,可以理解成 设计模式,也可以理解成 css 规范,市面使用情况如下图:

上图来源:https://2019.stateofcss.com/technologies/

你可能在日常开发中并不会专门花时间去注意和了解 CSS methodologies,但随着你经验的积累,你可能会自己思考,或者阅读别人的代码、参考网上成熟的框架,这里面都或多或少的蕴含了一些 css methodologies 的闪光点。而下面要介绍的几种主流的 css methodologies,则可以帮你做到很好的总结和梳理。

二、常见的 CSS methodologies


1、OOCSS

面向对象的 CSS(Object-Oriented CSS,简称 OOCSS ),由 Nicole Sullivan 于 2008 年提出,这基于她在雅虎的工作。

(1)规则

1、不要使用 ID 用 Class

直接使用class来设定样式,这样写不只是可以增加语义,同時也降低css对html的依赖。

2、结构和样式分离

虽然早期 html 和 css 实现了结构和样式的分离,但 css 内部同样存在两种类型的样式:

  • 结构样式(例如长宽、距离)

  • 皮肤样式(例如颜色、阴影)

所以 OOCSS 建议把这两种样式拆开。

比如有三种按钮,白色的/绿色的/红色的,可分别定义为:

class="btn btn-default"

class="btn btn-green"

class="btn btn-red"

如果你真的有很多个具有紫色按钮,则可以创建一个单独的紫色按钮类。这样可以大大减少CSS代码的数量。

3、容器和内容分离

内容绝不应该限制于特定的容器,为了重用,得分离开。

# 错误写法
.header .action {
}
.header .action .login {
}
.header .action .register {
} # 正确写法
.header{
}
.action{
}
.login {
}
.register {
}

继承选择符是有用的,它可以减少因相同命名引发的样式冲突(常发生于多人协作开发)。但是,我们不应过度使用。

(2)利弊

好处:

  • 模块化,可重用

  • 减少代码重复

  • 提高可拓展性、可维护性、可读性

缺点:

  • 虽减少了深层的嵌套选择器,但是多了更多的类

  • 如果代码中没有大量重复的视觉模式,比如一些小项目,则应用OOCSS可能不切实际

(3)实例

Bootstrap 就是用的 OOCSS。

例如:

html

    <div class='header'>
<ul class='menu'>
<li class='menu-item active'>1</li>
<li class='menu-item'>2</li>
<li class='menu-item'>3</li>
</ul>
<div class="action">
<button class="btn btn-login">login</button>
<button class="btn btn-register">register</button>
</div>
</div>

css:

.header {
}
.menu {
}
.menu-item {
}
.item.active {
}
.action {
}
.btn {
}
.btn-login {
}
.btn-register{
}

2、BEM

BEM - Block Element Modfier(块元素编辑器)。诞生于2009年。

(1)内容

BEM 包括三个:

  • Block - 块,如 header

  • Element - 子元素,如 块menu 下的 item

  • Modfier - 状态,如.current、.active

(2)规则

1、命名规范

  • -中划线 :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。

  • __ 双下划线:用来连接块和块的子元素。

  • -- 双中划线:用来描述一个块或者块的子元素的一种状态。

    在某些公司(如腾讯)的规范里,双中划线被单下划线(_)替代。

例如:.block-name__element--modifier

demo - html:

    <div class='header'>
<ul class='header__menu'>
<li class='header__menu-item--active'>1</li>
<li class='header__menu-item'>2</li>
<li class='header__menu-item'>3</li>
</ul>
<div class="header__action">
<button class="header__btn--login">login</button>
<button class="header__btn--register">register</button>
</div>
</div>

demo - less:

.header {
&__menu {}
&__menu-item {}
&__action {}
&__btn {
&--login {}
&--register {}
}
}

2、避免嵌套

BEM 最多只有 B+E+M 三级。

所以请避免 .block__el1__el2 的格式,直接改为 .block_el2

这里的 block 就很像命名空间了。

(3)利弊

好处:

  • 层级关系一目了然,具有可读性

  • 不需要依靠层级选择器来限定约束作用域,可避免跨组件的样式污染。

缺点:

  • 命名方式长而难看,书写不便(可以通过 less/sass 来简化书写)

  • 在较小的组件中,BEM 格式可能显得鸡肋。但对于公共的、全局性的模块样式定义,还是推荐使用 BEM 格式。(尤其对外发布的公共组件)

其他:

BEM 命名会使得 Class 类名变长,但经过 gzip 压缩后这个带宽开销可以忽略不计。

BEM是不允许用标签选择器的,哪怕最简单的 li 也得写成 .menu-item。

(4)实践

饿了么的框架elementUI就是BEM的一种,或者你也可以研究网站company.yandex.ru/

3、SMACSS

SMACSS(Scalable & Modular Architecture CSS ,即 CSS 的可扩展性和模块化架构)。Jonathan Snook 于 2011 年提出,当时他在雅虎工作,为 Yahoo Mail 编写 CSS。

(1)规则

1、Categorizing CSS Rules(CSS 分类规则)

它将 CSS 分为5个不同的类别:

  • Base 基本规范

    例如 CSS Reset 和 CSS Normalize。

  • Layout 布局规范

    例如左右分栏、栅格系统。

  • Module 模块

    例如一个产品列表,一个导航条。可重用。

  • State 状态规范

    例如选中状态。

  • Theme 样式规范

2、Naming Rules(命名规则)

为类名添加前缀

  • Base 不需要前缀。而且是用标签而不是 class 和 ID。
  • l- 用作 Layout 的前缀:l-inline
  • m- 用作 Module 的前缀:m-callout但也可以不用前缀。
  • is- 用作 State 的前缀:is-collapsed
  • Theme 一般会新建个 theme.css,用之前存在的类名。如果想用单独的类名,可用 theme- 前缀。

例子:

<div class="l-box m-profile m-profile--is-pro-user">
<img class="m-avatar m-profile__image" />
<p class="m-profile__bio">...</p>
</div>
(2)实例

在线 demo:https://codepen.io/savemuse/pen/gWVpvd

4、 Atomic CSS

Atomic CSS 也是雅虎提出的,可以从字面意思理解成原子 CSS

(1)示例
<div className="P(10px) M(20%) Pos(f) Start(50%) Bgc(#fff)" />

会有专门的 Atomic css 工具,帮助将上面 html 中的 class name 解析成正常的 css。(略)

(2)利弊

好处:将 CSS style 最小元件化,重用性最大化

坏处:这根本就是在写 inline-style,只是我们用 class name 的方式來表示而已。

(3)总结

这种做法真的很激进。我暂时无法接受。

三、总结


抛开激进的Atomic,我对剩下的 OOCSS / BEM / SMACSS 有如下建议:

  • 他们各自的思想有互补也有冲突,在实际开发中可以有取舍的使用

  • 他们都可以结合 CSS 预处理器(如 less/sass )获得更好的效率

  • 把上文分别介绍他们的好处列举在一起对比汇总,发现他们解决的核心问题就是:模块化

运用 CSS methodologies 去实现模块化的更多相关文章

  1. 运用 CSS in JS 实现模块化

    一.什么是 CSS in JS 上图来源:https://2019.stateofcss.com/technologies/ CSS in JS 是2014年推出的一种设计模式,它的核心思想是把 CS ...

  2. [css]样式合并与模块化

    原文链接:http://www.zhangxinxu.com/wordpress/2010/07/css%E7%9A%84%E6%A0%B7%E5%BC%8F%E5%90%88%E5%B9%B6%E4 ...

  3. 使用一个CSS Class去给标签定义Style

    使用一个CSS Class去给标签定义Style 类是可重用的样式,可以添加到HTML元素. 下面是一个CSS类声明的例子: <style>   .blue-text {     colo ...

  4. css预处理语言的模块化实践

    编写css是前端工作中,一项普通而又频繁的劳动,由于css并不是一门语言,所以在程序设计上显得有些简陋.对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目 ...

  5. [前端]css前端样式的模块化

    css样式文件结构( 模块划分的单入口 ) common|_ _ _ _ _ _reset.css|_ _ _ _ _ _common.css 公用样式 libs|_ _ _ _ _ _bootstr ...

  6. 从css谈模块化

    模块化是现今我们随处都可以听到的一个名词,什么是模块化?为什么我们需要模块化?这是本系列文章我们要弄明白的一个问题.我们也借这部分内容,顺带回顾一下前端的发展历程. 说实话,模块化这个主题有点大,我一 ...

  7. CSS的样式合并与模块化

    by zhangxinxu from http://www.zhangxinxu.com 原文地址:http://www.zhangxinxu.com/wordpress/?p=931 一.引言 本文 ...

  8. css模块化及CSS Modules使用详解

    什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方 ...

  9. 从0构建webpack开发环境(二) 添加css,img的模块化支持

    在一个简单的webpack.config.js中,构建了一个基础的webpack.config.js文件,但是只支持js模块的打包. 本篇中添加对css和img的模块化支持 首先需要安装三个个load ...

随机推荐

  1. 建立apk定时自动打包系统第二篇——自动上传文件

    在<建立apk定时自动打包系统第一篇——Ant多渠道打包并指定打包目录和打包日期>这篇文章中介绍多渠道打包的流程.很多时候我们需要将打包好的apk上传到ftp中,这时候我可以修改custo ...

  2. mybatis逆向工程maven版本idea工具

    基于springboot2版本 pom基本依赖 <parent> <groupId>org.springframework.boot</groupId> <a ...

  3. vue入门:用户管理demo1

    该demo由前端请求后台服务器获取数据进行渲染 使用到的技术点 1.使用到的vue指令:{{}} v-if v-for v-model 2.使用到的事件:@click 点击事件, @keyup.ent ...

  4. CSS布局:元素垂直居中

    CSS布局之元素垂直居中 本文将依次介绍在不同条件下实现垂直居中的多种方法及简单原理 Tip:下文中说的适用场景只是举了几个简单的例子方便读者理解.实际应用场景太复杂,生搬硬套容易出错.最重要的是掌握 ...

  5. spring全家桶的pom的基本配置

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  6. Python学习 之 Python入门

    第二章 Python入门 2.1 环境安装 2.1.1 下载解释器: py2.7.16 (2020年官方不再维护) py3.6.8 (推荐安装) 1.下载解释器一定去官网下载,https://www. ...

  7. 一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!

    不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...

  8. 设计模式(C#)——12责任链模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 前言        在开发游戏过程中,当玩家合成一种道具的时候,对于不痛的道具,需要的碎片个数,类型是不同的.用传统的写法,就是 ...

  9. 手机端apk文件安装

    1.电脑端下载豌豆荚 2.手机连接电脑,打开手机USB调试模式(设置->开发人员选项,打开开发人员选项和USB调试) 3.在电脑中双击下载好的apk文件,即可打开豌豆角,然后便可安装到手机.

  10. HDU 4289 Control 最小割

    Control 题意:有一个犯罪集团要贩卖大规模杀伤武器,从s城运输到t城,现在你是一个特殊部门的长官,可以在城市中布置眼线,但是布施眼线需要花钱,现在问至少要花费多少能使得你及时阻止他们的运输. 题 ...