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