在项目的开发过程当中, 我们往往因为日益复杂的css代码而感到力不从心. 如何合理的组织css代码成为了我们前端开发过程中必须考虑到的环节.

在读element源代码的时候, 了解到了BEM的命名风格.

使用 BEM 命名规范,理论上讲,每行 css 代码都只有一个选择器。
BEM代表 “块(block),元素(element),修饰符(modifier)”,我们常用这三个实体开发组件。
在选择器中,由以下三种符号来表示扩展的关系:

-   中划线 :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。
-- 双中划线线:用来描述一个块或者块的子元素的一种状态
__ 双下划线:双下划线用来连接块和块的子元素 type-block__element--modifier

块(block)

一个块是设计或布局的一部分,它有具体且唯一地意义 ,要么是语义上的要么是视觉上的。

在大多数情况下,任何独立的页面元素(或复杂或简单)都可以被视作一个块。它的HTML容器会有一个唯一的CSS类名,也就是这个块的名字。

针对块的CSS类名会加一些前缀( ui-),这些前缀在CSS中有类似 命名空间 的作用。

一个块的正式(实际上是半正式的)定义有下面三个基本原则:

CSS中只能使用类名(不能是ID)。
每一个块名应该有一个命名空间(前缀)
每一条CSS规则必须属于一个块。

元素(element)

块中的子元素是块的子元素,并且子元素的子元素在 bem 里也被认为是块的直接子元素。一个块中元素的类名必须用父级块的名称作为前缀。

修饰符(modifier)

一个“修饰符”可以理解为一个块的特定状态,标识着它持有一个特定的属性。

用一个例子来解释最好不过了。一个表示按钮的块默认有三个大小:小,中,大。为了避免创建三个不同的块,最好是在块上加修饰符。这个修饰符应该有个名字(比如:size )和值( small,normal 或者 big )。

element 的源码当中充分实现了这种命名方式, 在使用scss的情况下

/* BEM
-------------------------- */
@mixin b($block) {
$B: $namespace+'-'+$block !global; .#{$B} {
@content;
}
} @mixin e($element) {
$E: $element !global;
$selector: &;
$currentSelector: "";
@each $unit in $element {
$currentSelector: #{$currentSelector + "." + $B + $element-separator + $unit + ","};
} @if hitAllSpecialNestRule($selector) {
@at-root {
#{$selector} {
#{$currentSelector} {
@content;
}
}
}
} @else {
@at-root {
#{$currentSelector} {
@content;
}
}
}
} @mixin m($modifier) {
$selector: &;
$currentSelector: "";
@each $unit in $modifier {
$currentSelector: #{$currentSelector + & + $modifier-separator + $unit + ","};
} @at-root {
#{$currentSelector} {
@content;
}
}
}

最新文章

  1. XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
  2. 在ubuntu上搭建开发环境7---ubuntu安装JDK
  3. fackbook的Fresco的Image Pipeline以及自身的缓存机制
  4. FZU 2072 - Count
  5. php全角字符转换为半角函数 实例代码
  6. libcprops
  7. 父网访问子网(校园网访问校园网IP路由器下的一台电脑)远程路由器下的电脑
  8. NodeJS基础(二)
  9. idea 过段时间java程序包不存在问题 ?
  10. Git拉取项目时报错“remote: HTTP Basic: Access denied”解决方法
  11. ios --xib自定义,解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题
  12. POJ1845
  13. 深入理解Spring的ImportSelector接口
  14. 牛X的规则引擎urule2
  15. sbt打包Scala写的Spark程序,打包正常,提交运行时提示找不到对应的类
  16. C/C++中near和far的区别
  17. ZOJ3202-Second-price Auction(根据输入输出判断是队列还是栈)
  18. 【linux】Shell脚本启动程序
  19. Linux - 时间相关命令 - ntpdate, date, hwclock
  20. 【bzoj2006】超级钢琴

热门文章

  1. python urllib2 实现大文件下载
  2. JMeter-- ThreadGroup原理分析
  3. [转帖] 龙芯 中标麒麟的 源 以及K8S
  4. sysbench压力测试工具简介
  5. 大数据备忘录———将数据从oracle导入impala中
  6. 怎样使用 CSS 清除 input 输入框聚焦选中时的蓝色边框?
  7. vs 2013 设置website项目端口
  8. 【原创】大叔经验分享(62)kudu副本数量
  9. JS基础_属性名和属性值
  10. python爬虫redis-ip代理池搭建几十万的ip数据--可以使用