方法论是一个哲学术语,会对一系列具体的方法进行分析研究、系统总结并最终提出较为一般性的原则。CSS方法论是一种面向CSS、由个人和组织设计、已被诸多项目检验且公认有效的最佳实践。这些方法论都会涉及结构化的命名约定,并且在组织CSS时可提供相应的指南,从而提升代码的性能、可读性以及可维护性。本章会讲解三种CSS方法论:OOCSS、BEM和SMACSS。

一、OOCSS

  OOCSS(Object-Oriented CSS)是指面向对象的CSS,由Nicole Sullivan在2009年提出,借鉴了面向对象编程的抽象思维。其核心概念是采用模块化的实现方式,将CSS分解成可复用和继承的对象,也就是将关注点从页面转移到页面内的组件。OOCSS包含两条核心原则,如下所列,每条原则下都给出了相应的示例。

  (1)结构与皮肤分离,即不要将位置、尺寸等结构属性和字体、颜色等皮肤属性写在一个选择器中。

<style>
.col {
float: left;
width: 200px;
}
.line {
background: #F60;
}
</style>
<div class="line col"></div>

  (2)内容与容器分离,即让对象的行为可预测,避免对位置的依赖,子元素即使离开了容器也应该能正确显示。

<style>
.line {
background: #F60;
}
.unit {
width: 50%;
}
</style>
<div class="line">
<div class="unit"></div>
</div>

1)命名约定

  在OOCSS中,类名既要能传递对象的用途,也要有通用性,例如mod、complex、pop等。如果将CSS类命名的太语义化,例如navigation-bar,那么就会将其限制在导航栏,无法应用到网页的其它位置。

2)缺点

  OOCSS的缺点也很明显,如下所列。

  (1)虽然样式的粒度变小了,但同时会产生许多充满类的HTML元素。

  (2)在避免特殊性冲突时,OOCSS选择的方案是放弃层叠,这样就无法最大程度地利用关系选择器的优势。

  (3)为了让类能更通用,在命名时就得弱化语义。

二、BEM

  BEM(Block Element Modifier)是指块级元素修饰符,也是在2009年提出,起源于Yandex(俄语版的Google)。BEM分为三部分:

  (1)块(Block)是一个独立实体,最高级抽象,相当于OOCSS中的对象,例如菜单、文本框等。

  (2)元素(Element)是块的组成部分,被包含在块中,无法自成一体,例如菜单项、标题等。

  (3)修饰符(Modifier)是块或元素的状态,可更改它们的外观或行为,例如高亮、选中等。

1)命名约定

  BEM中的块、元素和修饰符需要全部小写,名称中的单词用连字符(-)分隔,元素由双下划线(__)分隔,修饰符由双连字符(--)分隔。注意,块和元素都既不能是HTML元素名或ID,也不依赖其它块或元素。

  在下面的示例中,.form是块,.form__input和.form__submit是其元素,.form--theme-xmas是其修饰符,而.form__submit--disabled是.form__submit的修饰符。

<style>
.form {}
.form--theme-xmas {}
.form__input {}
.form__submit {}
.form__submit--disabled {}
</style>
<form class="form form--theme-xmas">
<input class="form__input" type="text" />
<input class="form__submit form__submit--disabled" type="submit" />
</form>

  BEM的核心思想就是用这种命名约定来清晰的表达出类的含义以及与其它类之间的关系。

2)缺点

  BEM的缺点如下所列。

  (1)BEM与OOCSS一样,也抛弃了层叠,因此也不能完全挖掘出关系选择器的潜力。

  (2)CSS类名可能会比较长而且复杂。

  (3)需要完善规则说明文档,否则HTML结构将难以阅读。

三、SMACSS

  SMACSS(Scalable and Modular Architecture for CSS)是指可伸缩及模块化的CSS架构,由Jonathan Snook在2011年雅虎工作时提出。他在OOCSS和BEM的基础上添加了五种类别的组件的处理规则,具体如下所列。

  (1)基础(Base)是为HTML元素定义默认样式,可以包含属性、伪类等选择器。

  (2)布局(Layout)会将页面分为几部分,可作为高级容器包含一个或多个模块,例如左右分栏、栅格系统等。

  (3)模块(Module)又名对象或块,是可重用的模块化部分,例如导航栏、产品列表等。

  (4)状态(State)描述的是任一模块或布局在特定状态下的外观,例如隐藏、激活等。

  (5)主题(Theme)也就是换肤,描述了页面的外观,它可修改前面四个类别的样式,例如链接颜色、布局方式等。

1)命名约定

  推荐使用前缀来区分布局、模块、状态和主题,如下所列。

  (1)“l-”或“layout-”用作布局的前缀,例如.l-inline、.layout-grid等。

  (2)“m-”或模块自身的命名用作其前缀,例如.m-profile、.field等。

  (3)“is-”用作状态的前缀,例如.is-collapsed、.is-active等。

  (4)“theme-”用作主题的前缀,例如.theme-a-background、.theme-l-grid等。

  注意,由于基础规则是直接作用于元素的,因此不需要前缀。

2)共享

  在实际工作中,不需要局限于某一个CSS方法论,很多时候可以结合使用,共享模块化CSS的规则。例如遵循OOCSS的第一条分离原则,BEM的命名约定,以及SMACSS的分类前缀,具体如下所列。

  (1)基础仍旧沿用SMACSS的规则,布局和模块使用SMACSS的前缀。

  (2)子元素用双下划线(__)分隔,其状态前缀沿用“is-”。

  (3)修饰符也以“is-”为前缀,与模块组合时用双连字符(--)分隔。

  (4)适当层叠,最好保持在一层。

  在下面的示例中,.m-notice__img和.m-notice__content是模块的子元素,.is-important是子元素h6的状态,.m-notice--is-active是模块的修饰符。

<style>
.l-notice {}
.m-notice {}
.m-notice--is-active {}
.m-notice__img {}
.m-notice__content h6 {}
.is-important {}
</style>
<div class="m-notice l-notice">
<img class="m-notice__img" />
<div class="m-notice__content">
<h6>......</h6>
<h6 class="is-important">......</h6>
</div>
</div>

CSS躬行记(10)——CSS方法论的更多相关文章

  1. CSS躬行记(9)——网格布局

    网格布局(Grid Layout)也叫栅格布局,与表格布局类似,也依赖行和列.但与之不同的是,网格布局能直接控制HTML文档中元素的顺序.位置和大小等,而不用再借助辅助元素. 一.术语 下图展示了CS ...

  2. CSS躬行记(1)——CSS基础拾遗

    一.box-decoration-break CSS3新增的box-decoration-break属性可指定行内非替换元素在跨行.跨列或跨页时的样式渲染,它包含两个值: (1)slice:默认值,盒 ...

  3. CSS躬行记(3)——CSS属性拾遗

    一.粘滞定位 粘滞定位(sticky)与相对定位类似,既不会脱离正常流,也不会改变元素盒类型,并且会保留原先所占的空间.它会相对于包含块偏移,它的包含块分为两种,第一种和绝对定位一样:第二种是最近的滚 ...

  4. CSS躬行记(4)——浮动形状

    CSS规范新增了一个模块:CSS Shapes,shape-outside属性属于该模块,它能影响浮动元素周边内容流的形状(即浮动形状),可接收三类值:形状盒子.函数和图像. 一.形状盒子 形状盒子( ...

  5. CSS躬行记(6)——滤镜

    滤镜(filter)可改造元素的视觉呈现,CSS内置的滤镜有10种,通过SVG文件还能自定义滤镜. 一.调色滤镜 调色滤镜可控制元素的模糊.颜色.亮度等变化,并且多个滤镜可组合在一起使用.这些滤镜大部 ...

  6. CSS躬行记(7)——合成

    在图形编辑软件中,可以按特定地方式处理不同图层的合成,最新的CSS规范也引入了该功能,并提供了mix-blend-mode和background-blend-mode两个属性.混合模式(blendin ...

  7. CSS躬行记(8)——裁剪和遮罩

    一. 裁剪 裁剪(clipping)能让元素显示指定形状的区域,在布局时可起点缀的作用,丰富了视觉呈现.注意,裁剪本质上只是让元素的部分区域透明,由此可知,裁剪完后元素所占的空间仍旧会保留.裁剪最早是 ...

  8. CSS躬行记(2)——伪类和伪元素

    一.伪类选择器 伪选择器弥补了常规选择器的不足,能够实现一些特殊情况下的样式,例如在鼠标悬停时或只给字符串中的第一个字符指定样式.与类选择器类似,可以从HTML元素的class属性中查看到,但伪选择器 ...

  9. CSS躬行记(11)——管理后台响应式改造

    为了提升业务人员操作管理后台的体验,花了点时间进行响应式的改造,紧急情况时,掏出手机就能工作. 利用CSS3的媒体查询,就能根据不同屏幕的尺寸采用不同的样式来渲染,目前使用的移动端屏幕阈值为750px ...

随机推荐

  1. 谁说 Vim 不好用?送你一个五彩斑斓的编辑器!

    相信大家在使用各种各样强大的 IDE 写代码时都会注意到,代码中各种类型的关键字会用独特的颜色标记出来,然后形成一套语法高亮规则.这样不仅美观,而且方便代码的阅读. 而在上古神器 Vim 中,我们通常 ...

  2. jdbctemplate打印sql

    在logback.xml里加入如下配置即可: <include resource="org/springframework/boot/logging/logback/base.xml& ...

  3. asp.net core webapi Session 跨域

    在ajax 请求是也要加相应的东西 $.ajax({ url:url, //加上这句话 xhrFields: { withCredentials: true } success:function(re ...

  4. 好用的mitmproxy代理抓包

    安装证书 浏览器输入 `mitm.it` 下载证书有时候打不开,可能是起的服务卡死了,回车下命令行,再再网页刷新下载证书就可以了. mitmweb Chrome浏览器代理设置 打开的话,记得保存点一下 ...

  5. linux下五种查找命令

      我们经常需要在系统中查找一个文件或者命令,那么在Linux系统中如何快速定位和精确查找它呢?下面总结了五个基础命令·分别是which.whereis.type.locate.find. 一 whi ...

  6. 设计模式 - 命令模式详解及其在JdbcTemplate中的应用

    基本介绍 在软件设计中,我们经常需要向某些对象发送一些请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需要在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得 ...

  7. Go语言 2019 调查报告发布

    Go 官方博客昨日公布了[ 2019 年 Go 语言调查报告].本次调查收到的回复达到 10,975 份,约为去年的两倍. 这些受访者的反馈意见将被选取用于改进 Go 语言的发展. 以下是 2019 ...

  8. 将jar包发布到maven中央仓库

    将jar包发布到maven中央仓库 最近做了一个swagger-ui的开源项目,因为是采用vue进行解析swagger-json,需要前端支持,为了后端也能方便的使用此功能,所以将vue项目编译后的结 ...

  9. windows下部署.netcore+docker系列二 (unbuntu 18.4 下 安装 docker)亲测!!!

    1.卸载sudo apt-get remove docker docker-engine docker.io containerd runc2.更新sudo apt-get update3.安装依赖包 ...

  10. 使用sqlmap结合dnslog快速注入

    0x01 起因 实际项目中遇到一个oracle延时注入,需要获取数据,几十个库几百张表,等找到关键数据不知道要到哪天. 测试支持带外请求 于是想用使用sqlmap利用DNS进行OOB注入 0x02 阿 ...