使用BEM命名规范来组织CSS代码
BEM 是 Block(块) Element(元素) Modifier(修饰器)的简称
使用BEM规范来命名CSS,组织HTML中选择器的结构,利于CSS代码的维护,使得代码结构更清晰(弊端主要是名字会稍长)
如何使用BEM
- 一个独立的(语义上或视觉上),可以复用而不依赖其它组件的部分,可作为一个块(Block)
- 属于块的某部分,可作为一个元素(Element)
- 用于修饰块或元素,体现出外形行为状态等特征的,可作为一个修饰器(Modifier)
在本规范中,以双下划线 __ 来作为块和元素的间隔,以单下划线 _ 来作为块和修饰器 或 元素和修饰器 的间隔,以中划线 - 来作为 块|元素|修饰器 名称中多个单词的间隔
保证各个部分只有一级 B__E_M ,修饰器需要和对应的块或元素一起使用,避免单独使用
<!-- 某个块 -->
<form class="search-form">
<!-- 某个元素 -->
<div class="search-form__content-left">
<!-- 错误:不能出现多个元素 -->
<h2 class="search-form__content-left__h2">标题</h2>
<!-- 某个元素,虽然是子集,保证了只有一级元素 -->
<input class="search-form__input">
<!-- 某个元素,加上了hover修饰器 -->
<button class="search-form__button search-form__button_hover">搜索</button>
<button class="search-form__button-set search-form__button-set_hover">搜索1</button>
<!-- 错误:不能单独使用lg修饰器 -->
<button class="search-form__button_lg">搜索</button> <!-- 块中可嵌套着另一个块 -->
<p class="my-img">
<img class="my-img__logo" src="abc.png" alt="image" title="image">
</p> </div>
</form> <div class="search-result"></div>
在样式文件中,仅以类名作为选择器,不使用ID或标签名来约束选择器,且CSS(或者SCSS编译后的CSS)中的选择器嵌套不超过2层,增加效率和复用性,减少选择器之间的耦合度
比较常见的嵌套情景:需要通过块状态对内部元素进行调整时
.search-form {
position: relative;
} .search-form__input {
font-size: 12px;
} .search-form__button_hover {} /* 避免:避免使用不必要的嵌套(此处只是简单的嵌套,没有必要) */
.search-form__content-left .search-form__input {} /* 稍好的嵌套(此处是在块的theme1修饰器下的子元素,某些时候有必要) */
.search-form_theme1 .search-form__input {} /* 错误:使用了标签 */
button.search-form__button {}
.search-form button {}
而在SASS文件中,也需要注意嵌套层次的意义,尽量按照 BEM三层来
/* 避免这样做 .search 不是一个独立的块 */
.search {
/* 应该把这个块提取出来 */
&-form {
&__button {
&_hover {} /* 应该把这个元素提取出来 */
&-set {
&_hover {}
}
}
} &-result { }
} /* 建议这样,按照各级区分出来 */
.search-form {
&__button {
&_hover {}
} &_button-set {
&_hover {}
}
} .search-result { } /* 对于嵌套在块中的块,如果非常有必要,可以嵌套写样式 */
.search-form {
.my-img {
&__logo {}
}
}
/* 但一般来说,不建议,因为这破坏了块的独立性。可转换成设置对应的 元素来表现,如 */
.search-form {}
.my-img {
&__search-form-logo {}
}
BEM 规范虽然结构比较清晰,但有时候会产生代码冗余。
为避免写太多重复性的代码,我们要学会善于利用预编译语言的(适当地使用 @include @extend 等)
使用BEM命名规范来组织CSS代码的更多相关文章
- CSS BEM 命名规范简介
[前言] BEM 是一个简单又非常有用的命名约定.让你的前端代码更容易阅读和理解,更容易协作,更容易控制,更加健壮和明确,而且更加严密.这篇文章主要介绍了CSS BEM 命名规范简介(推荐)的相关资料 ...
- CSS — BEM 命名规范
推荐阅读: https://juejin.im/post/5b925e616fb9a05cdd2ce70d 1 什么是 BEM 命名规范 Bem 是块(block).元素(element).修饰符(m ...
- 一篇关于BEM命名规范
一直以来自己对命名都是比较混乱的,并没有一个比较好的格式来命名,最近自己碰巧学习到了BEM命名规范,我想谈谈自己的理解以供自己来学习,同时也可以和各位大佬一起学习. BEM是一个很有用的方法可以创建复 ...
- CSS书写规范、命名规范、网易CSS框架NEC
网易CSS框架NEC:http://nec.netease.com/ NEC框架的CSS规范: CSS规范 - 分类方法 CSS规范 - 命名规则 CSS规范 - 代码格式 CSS规范 - 优化方案 ...
- css 命名规范 BEM
在项目的开发过程当中, 我们往往因为日益复杂的css代码而感到力不从心. 如何合理的组织css代码成为了我们前端开发过程中必须考虑到的环节. 在读element源代码的时候, 了解到了BEM的命名风格 ...
- 前端css命名规范----BEM
一.什么是BEM BEM就是块(block).元素(element).修饰符(modifier),是由Yandex团队提出的一种前端命名方法论.这种巧妙的命名方法可以使css类对其他开发者来说更加透明 ...
- css命名规范: BEM 的命名法
整理自:前端早读课[第1183期]这些 CSS 命名规范,将省下你大把调试时间 试图解决 3 类问题: 仅从名字就能知道一个 CSS 选择器具体做什么 从名字能大致清楚一个选择器可以在哪里使用 从 C ...
- CSS 命名规范将省下调试时间
我听说很多开发者厌恶 CSS.而在我的经验中,这往往是由于他们并没有花时间来学习 CSS. CSS 算不上是最优美的『语言』,但迄今二十多年来,它都是美化 web 举足轻重的工具.从这点来说,也还算不 ...
- 我认为最节省时间的CSS命名规范
CSS命名规范一 js中对变量的命名最好使用camel case驼峰式命名法,但CSS中更适用于red-box命名规范. CSS命名规范二 BEM命名规范 B=>block E=>elem ...
随机推荐
- Linux Shell 文件描述符 及 stdin stdout stderr 重定向
Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...
- Java中的最值
Double.MAX_VALUE 等于 (2-2^(-52)) * 2^1023 约等于2^1024Double.MIN_VALUE 最小正非零值 2^(-1074)Long.MAX ...
- windows程序设计获取文本框(窗口、对话框)文本
就是这样一个简单的界面,窗口上重绘的对话框(这种写法参考我之前博文): 需要做到的就是点击确定,获取文本框中内容. // 处理对话框消息 INT_PTR CALLBACK NewDlgProc(HWN ...
- dump、libeay32.dll、gsoap、webserver多线程调用gsoap产生崩溃
问题:调用webserver接口出现dump文件,dump文件指向libeay32.dll有问题,产生崩溃的原因是gsoap多线程问题,多线程调用时需要程序启动的地方调用如下函数进行多线程初始化: i ...
- spring之AspectJ基于xml AOP编程
一.引言: AspectJ框架不仅实现了面向切面编程,而且还支持注解,spring将它引入自己的规范之中. 二.需要了解: AspectJ是基于java语言的AOP框架 spring2.0之后支持As ...
- spring-boot 使用 main函数 无法启动的问题完美 解决方案。
首先 是启动之后 ,直接回exit code 0,网址 里面输入localhost:8080显示站点未启动.网上查 了多种 方式 ,日志 也 打了,都没发现问题,最后到这篇文章里 找到了答案.但是这 ...
- Python之Django rest_Framework(3)
补充: 为什么要前后端分离: a.因为前端它有自己框架,这样它的效率就非常高 b.不做前后端分离,公司如果既有客户端,又有app这种情况下你就的写两遍 django rest ...
- JMS基础篇(二)
简介 异构集成是消息发挥作用的一个领域,大型公司内部可能会遇到很多的平台,Java,.net或者公司自己的平台等. 传送消息还应该支持异步机制,以提高系统整体的性能.异步传输一条消息意味着,发送者不必 ...
- 洛谷 [P1280] 尼克的任务
DP 题目问的是最大空暇时间,那么就定义dp[i]为第i分钟的最大空暇时间,显然满足最优子结构,我们发现dp[i]仅与其后的值有关,那么从后往前推,如果第i分钟没有任务,dp[i]=dp[i+1],如 ...
- BZOJ 1355: [Baltic2009]Radio Transmission [KMP 循环节]
1355: [Baltic2009]Radio Transmission Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 792 Solved: 535 ...