方法论是一个哲学术语,会对一系列具体的方法进行分析研究、系统总结并最终提出较为一般性的原则。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. 结束基础,开始MVC之旅!

    今天终于把前端Extjs和基础折腾完,虽然每一个都只是实现一个小的实例,但是也算是把.NET基础和前端基础顺了一遍.也算是提升.不足就是高级的知识点并没有吃透,比如委托,lamda之类的,还得在后面的 ...

  2. Product Owner交流记录1

    Abstract 最终我们选择了UWP版必应词典功能开发. 项目:“单词挑战”功能 然后我们今天中午我们和Product owner聊了聊. Content Product owner是Travis ...

  3. CSRF(跨站请求伪造)学习总结

    前言 参考大佬的文章,附上地址 https://www.freebuf.com/articles/web/118352.html 什么是CSRF? CSRF,中文名字,跨站请求伪造,听起来是不是和XS ...

  4. 使用 selenium 实现谷歌以图搜图爬虫

    使用selenium实现谷歌以图搜图 实现思路 原理非常简单,就是利用selenium去操作浏览器,获取到想要的链接,然后进行图片的下载,和一般的爬虫无异. 用到的技术:multiprocessing ...

  5. js的中文英文排序

    本例主要实现 中文汉字按拼音排序的方法和英文按照首字母排序的方法. //要排序的数据 let data = [ {chinese: '蔡司', english: 'Chase'}, {chinese: ...

  6. 11. this.setState更新问题

    this.setState是异步的,所以在this.setState之后不能立刻得到最新的state数据关于如何获取最新的数据,有如下三种方法 1.回调函数 this.setState({ xxx:' ...

  7. MVC-过滤器-权限认证

    过滤器主要基于特性,aop来实现对MVC管道中插入其他处理逻辑.比如,访问网站,需要检查是否已经登陆,若没登陆跳入登陆界面. 样例: 方法注册 执行效果 当不符合认证时: 上面是方法注册特性.还有类注 ...

  8. Websec level 30

    前言 昨天在易霖博搞的网络安全与执法竞赛看到的一道web题,实际上就是用两个原题凑起来的.. 不过后面的一关没见过这里简单记录一下 第一关 打开是个登录界面,和BJDCTF的简单注入一模一样,连密码都 ...

  9. 大数据作业之利用MapRedeuce实现简单的数据操作

    Map/Reduce编程作业 现有student.txt和student_score.txt.将两个文件上传到hdfs上.使用Map/Reduce框架完成下面的题目 student.txt 20160 ...

  10. 算法笔记刷题3(codeup 5901)

    今天刷题的速度依旧很慢(小乌龟挥爪.jpg) 我觉得codeup5901中回文串的处理很妙,如果是我自己写的话可能会把数组直接倒过来和原来对比.按照对称规律进行比对的话,工作量可以减少一半. #inc ...