Atitit.css 规范 bem 项目中 CSS 的组织和管理css
1. 什么是BEM?1html
2. 块的独立性4ide
3. 独立的CSS4模块化
8.1. Modifier 不用bem方式,太繁琐。使用咱们经常写的 .current .active 等表达状态7
9. 是否使用 SASS 或 LESS 这种 CSS 预处理语言来编写???8
BEM表明块(Block),元素(Element)。修饰符(Modifier)。这些术语的含意将在本文进一步阐述。
编程方法论中一个最多见的样例就是面向对象编程(OOP)。这一编程范例出现在不少语言中。在某种程度上,BEM和OOP是类似的。它是一种用代码和一系列模式来描写叙述现实状况的方法。它仅仅考虑程序实体而无所谓使用什么编程语言。
Yandex是一个大公司(在俄罗斯)。它使用BEM方法论来开发它的服务。
BEM 是一种前端项目开发的方法学,由 Yandex 公司提出。
BEM 的名称来源于该方法学的三个组成部分的英文首字母,各自是块(Block)、元素(Element)和修饰符(Modifier)。这三个不一样的组成部分称为 BEM 实体。
做者:: ★(attilax)>>> 外号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙。 EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
一个块是一个独立的实体,就像应用的一块“积木”。一个块既可以是简单的也可以是复合的(包括其它块)。
块
块便是一般所说的 Web 应用开发中的组件或模块。
每个块在逻辑上和功能上都是相互独立的。块中封装了组件相关的 JavaScript、CSS 代码和 HTML 模板。由于块是独立的。可以在应用开发中进行复用,从而减小代码反复并提升开发效率。块可以放置在页面上的不论什么位置,也可以互相嵌套。
同一个块可以在页面上存在多个实例。块的不一样实例具备类似的结构。
一个典型的块的演示样例是菜单。
一个项目中可以有多个不一样的菜单。详细类似的结构和样式。
元素
元素是块中的组成部分。
元素不能离开块来使用。BEM 不推荐在元素中嵌套其它元素。
在菜单块中,每个菜单项是块中的元素。
一个元素是块的一部分,具备某种功能。
元素是依赖上下文的:它们仅仅有处于他们应该属于的块的上下文中时才是有意义的。
好比一个输入域和一个button是Search块的中的元素。
一个Block下的所有Element无论相互层级怎样,都要摊开扁平的属于Block
因此 BEM 最多仅仅有 B+E+M 三级,不可能出现 B+E+E+..+E+M 超长class名,也要求E不能同名
经过把模板转换(使用XSL或是JavaScript)应用到BEM树上生成终于的浏览器标签。
为了不开发一个和现有的块仅仅略微有点不一样的还有一个块,咱们引入修饰符(modifier)的概念。
修饰符做为一个块或是一个元素的一种属性,表明这个块或这个元素在外观或是行为上的改变。
一个修饰符有一个名字和一个值。多个修饰符可以同一时候使用。
随着一个项目的发展,咱们常常会在页面中加入。删除,或者是移动一些块。好比,你可能想要互换Logo和Auth块,或者把Menu放到Search块如下。
为了让这个过程更加简化,块必须是独立的。
一个独立的块可以放置在页面的任何位置 ,包含嵌套在其它块里。
从CSS的角度来看:
BEM是不一样意用标签选择器的,一開始难以接受... .menu li 能搞定的事情需要每个 li 都写.menu-item
· 一个块(或者一个元素)必须有一个惟一的“名字”(一个CSS类)这样才干被CSS规则所做用。
· 必定不能使用ID选择器:仅仅有类选择器才干知足咱们非惟一性的需求
·
· HTML元素不能用做CSS选择器(如.menu td)因为这种选择器并非是全然上下文无关的。
· 避免使用级联(cascading)选择器(译注:如.menu .item)。
如下是一种可能的CSS类命名方案:
一个块的CSS类名就是这个块的名字(block name)。
<ul class="menu">
...</ul>
一个元素的CSS类名是一个块名和一个元素名的组合,它们中间用一些符号隔开。
<ul class="menu">
<li class="menu__item">…</li>
<li class="menu__item">…</li></ul>
在一个元素的CSS类名中包括一个块名是必要的,这样可以让级联最小化。
咱们在长名称中使用连字符分隔单词(好比,block-name)。使用两个下划线来分隔块名和元素名(block-name__element-name)。
· 可以准确地检測到具备一样行为的块,因为它们有一样的CSS类名:使用CSS类选择器,可以拣选出所有一样名字的块。方便给它们定义动态行为
· BEM 实体名称全部是小写字母或数字。
名称中的不一样单词用单个连字符(-)分隔。
· BEM 元素名称和块名称之间经过两个下划线(__)分隔。
· 布尔修饰符和其所修饰的实体名称之间经过两个连字符(--)来分隔。
不使用名值对修饰符。
block + element + modifier,鼓舞一级一级的写的很是详细,很是长。
很是违背习惯 CSS嵌套过多。超过3层就很是难阅读了
OOCSS 表示的是面向对象 CSS(Object Oriented CSS),是一种把面向对象方法学应用到 CSS 代码组织和管理中的实践。面向对象方法学中的很是多理念,如模块化、单一功能原则(Single responsibility principle)和关注点分离(Separation of concerns)等,对于需要组织和管理大量 CSS 代码的应用也是适用的。OOCSS 提出了 CSS 对象的概念,用来表示反复出现的可视化模式。这些模式可以被抽象成独立的 HTML、CSS 和 JavaScript 代码片断,并在整个项目中共享。
OOCSS 有两个重要的原则:
第一个原则是把结构和外观分开。反复出现的可视化模式应该仅仅关注外观。而与 DOM 结构无关。
这就要求 CSS 对象中的每个组成部分都有名称。并在 DOM 结构中经过 CSS 类名与之相应。所以在 OOCSS 中的样式规则都是使用类别选择器。而不依赖特定的 DOM 结构。这样可以提升 CSS 对象的可复用性。
第二个原则是把容器和内容分开。
这就要求在 CSS 样式中不该该出现与 DOM 树中的位置相关的规则。
CSS 样式应该仅仅关注内容,而不是 DOM 元素及其层次关系。
ACSS 表示的是原子化 CSS(Atomic CSS),是 Yahoo 提出来的一种独特的 CSS 代码组织方式。应用在 Yahoo 首页和其它产品中。ACSS 的独特性在于它的理念与通常开发者的理解有很是大的不一样。并挑战了传统意义上编写 CSS 的最佳实践,也就是关注点分离原则。
ACSS 以为关注点分离原则会致使冗余、繁琐和难以维护的 CSS 代码。
ACSS 的原则是把 CSS 样式打散成尽量小的部分。每个 CSS 类仅仅相应一条样式规则。从而达到最大化的可复用性。比方 CSS 类 M(10px)所相应的样式规则是 margin: 10px。在应用 CSS 样式时。仅仅需要在把所需要的原子化 CSS 类名加入到 DOM 元素上就能够。
ACSS 提供了 Atomizer 工具来生成终于的 CSS 样式文件。
ACSS 的优势在于所生成的 CSS 文件仅仅包括必须的内容,而且冗余很是少,可以下降 CSS 文件的尺寸。提升性能。
另外 CSS 类所相应的样式规则是不变的,这使得在不一样的项目和组件之间共享 CSS 变得很是easy。比方在使用传统的方式时。相同是名称为 header 的 CSS 类,其所实际表示的样式规则在不一样的项目中可能全然不一样。而在 ACSS 里面。名称为 M(10px)的 CSS 类所表示的样式规则永远都是 margin: 10px。ACSS 可能的缺点在于它与大多数开发者所理解的最佳实践差别很是大,可能不easy被接受。
上面介绍了 BEM、OOCSS、SMACSS 和 ACSS 等几种不一样的 CSS 命名规则,各有优缺点。
对于开发团队来讲,最重要的是找到最适合的组织和管理的方式。
不需要盲目的遵循所谓的最佳实践,而是要找到最适合的方式。笔者依据我的经验推荐如下的组织和管理方式。
ACSS 的思想尽管有很是多的长处,也在 Yahoo 这种大公司获得了生产实践。但是 ACSS 的作法可能比較难以被大多数开发者所理解。所以除非是团队的决策,不然不推荐使用。比較推荐的作法仍是模块化。更easy让人所理解。
BEM经过Block、Element、Modifier来描写叙述页面(关键就是为了解决多人协做的命名问题).这个走意义bda,可以使用cls+时间法...
结构清晰,严格运行 element 和 modifier 与 block 的从属关系; block 嵌套的层次要尽可能少(他能搞得定。就不要给他再搞个爹)。
不用id方式。使用惟一的class做为block标识。。这样方便复用在一个页面多个相同的block。
。
仅仅命名e的。
。不要和block拼接起来,这样很是长。
。
Css可以使用级联就能够定义。
。
不建议,因为这样ide dw对其的支持有限,致使预览有问题。
BEM的定义_BEM 教程_w3cplus.html
从 BEM 谈大型项目中 CSS 的组织和管理.html
从 BEM 谈大型项目中 CSS 的组织和管理.html
怎样看待 CSS 中 BEM 的命名方式? - 张克军的回答 - 知乎.html