BEM
BEM是一种命名方法,能够帮助你在前端开发中实现可复用的组件和代码共享。
BEM的意思是块(block)、元素(element)、修饰符(modifier)。
BEM 通过唯一的 block 来保证命名的唯一性。
- block 代表了更高级别的抽象或组件。
- block__element 代表.block的后代,用于形成一个完整的.block的整体。
- block—modifier代表.block的不同状态或不同版本,用于修饰。
air-table{} /* 块 */air-table__footer{} /* 元素 */air-table--full{} /* 修饰符 */
案例:
<form class="site-search site-search--full"><input type="text" class="site-search__field"><input type="Submit" value ="Search" class="site-search__button"></form>
BEM 将 css 的关注点规范为 block、element、modifier,忽略结构、忽略层级(禁用子选择器),进而换取作用域的稳定。
BEM & SCSS
在 sass 中通过使用 mixins 来添加前缀等方式来避免在 sass 中出现臭长的代码。
原文地址:https://zhuanlan.zhihu.com/p/28650879 这篇文章介绍minix 思路和一些坑点。
最简单的封装如下:
// 这步比较简单就直接贴代码了$element-separator: '__';$modifier-separator: '--';@mixin b($block) {.#{$block} {@content;}}@mixin e($element) {$selector: &; // & 里面保存着上下文,在这个 mixin 中其实期待的的就是 block@at-root { // @at-root 指规则跳出嵌套,写在最外层.#{$selector+ $element-separator + $element} {@content;}}}@mixin m($modifier) {$selector: &;@at-root {.#{$selector + $modifier-separator + $modifier} {@content;}}}
基于此再写 sass 代码如下:
@include b(human) {@include e(finger) {@include m(little) {}}}
这只是一个简单的案例,并不完善,还有很多实际中应用的坑。更详细的用法可以参考 element-ui 的源码中的应用:https://github.com/ElemeFE/element/blob/dev/packages/theme-chalk/src/mixins/mixins.scss
