谈谈BEM规范(含代码)
css规范之BEM规范
前言
引用一句经典名言在编程的世界里其中一件最难的事情就是命名,不管是设计到编程语言还是标记语言都会有命名的需求。今天聊的就是关于css的命名规范的发展过程以及演变。
命名的发展变化过程
- 非组件化项目css命名原则
- 复用性 全局性
- 以jquery为代表的时代,我们项目都是独立的html文件,此时为了让我们的项目更好的维护,在写样式的时候,通常我们会将一些通用的样式单独提取到一个css文件,每个页面使用的时候可以引入使用,比如
reset.css,common.css。 - 每一块功能块的样式都是独立的,之间无法复用,可以复用的样式全部提取到全局样式。
- 组件化项目命名原则
- BEM规范
- 以vue和react为代表的时代,我们项目都是组件化的,组件内的样式都是独立的作用域
scope来限制,组件之间是可以相互引入使用的,一个组件可以拆分成多个小组件,此时样式命名规范就需要使用BEM规范,从而达到组件样式的独立性。
BEM的规范
- BEM规范是css命名规范,主要适用的范围是组件化开发的模式。
- 规范介绍(B__E--M)
- B
代表block,也就是块,每一个块都是一个独立的功能,块之间可以相互嵌套。- 块的命名可以由多个单词组成,每个单词之间以
-链接 - 块的作用只是起到一个隔离的作用,一般不会在块里面实现具体组件的样式,对于块修饰样式比如尺寸,位置可以通过修饰符设置
- 块与修饰符之间通过
--链接
- 块的命名可以由多个单词组成,每个单词之间以
- E
代表element,也就是元素,元素是依赖于块存在,不能独立存在,必须嵌套在块内部。- 元素的命名可以由多个单词组成,每个单词之间以
-链接 - 元素的样式必须依赖块存在,元素是块的具体实现,块与元素之间通过
__链接 - 元素里面可以定义每个元素自身的样式,对于元素修饰样式比如尺寸,状态可以通过修饰符设置
- 元素与修饰符之间通过
--链接
- 元素的命名可以由多个单词组成,每个单词之间以
- M
代表modifier, 也就是修饰符,修饰符一般是对于元素或者块的状态和外观进行修饰。- 修饰符的命名可以由多个单词组成,每个单词之间以
-链接 - 修饰符可以修饰块和元素的状态、行为、尺寸等
- 修饰符的命名可以由多个单词组成,每个单词之间以
- B
- 代码演示
- 评分组件 源码地址
<div class="qf-rate">
<span class="qf-rate__item qf-rate__item--active">
</span>
<span class="qf-rate__item">
</span>
<span class="qf-rate__item">
</span>
<span class="qf-rate__item">
</span>
<span class="qf-rate__item">
</span>
</div>
.qf-rate{
width: 300px;
height: 40px;
display: flex;
justify-content: center;
align-items: center;
}
.qf-rate__item{
width: 48px;
height: 48px;
cursor: pointer;
background: url('./img/star.png');
}
.qf-rate__item--active{
background: url('./img/star_active.png');
}
- BEM不推荐写法
- 采用标签或者id作为选择器,全部采用类名作为选择器
- id因为权重的问题,而且针对于spa的项目会出现id的重复情况
- 标签选择器当我们需要修改组件解构的时候,同时还需要维护组件样式
- 不推荐使用并列选择器,使用修饰符来实现
- 不推荐使用伪类选择器,使用修饰符来实现
- 此处一般通过js控制状态,添加修饰类
- 不推荐使用全局的css样式比如rest.css common.css
- 但是针对于一些格式化的样式还是可以使用,一切目的都是为了方便维护
- 采用标签或者id作为选择器,全部采用类名作为选择器
总结
BEM规范只是前端组件化发展过程中的规范,都是为了组件化服务,并不是唯一的规范,是否采用这个规范目的是为了团队协作和更好的维护迭代,不是为了规范而规范。
谈谈BEM规范(含代码)的更多相关文章
- 也谈谈规范JS代码的几个注意点
也谈谈规范JS代码的几个注意点 写JS代码差不多也有两年了吧,从刚开始的“初生牛犊不怕虎”乱写一通到后来也慢慢知道去规范一下自己写的代码.这种感觉就像是代码是你的作品,你希望它保持一份不仅干净而且也优 ...
- windows环境PhpStorm中简单使用PHP_CodeSniffer规范php代码
为什么使用PHP_CodeSniffer 一个开发团队统一的编码风格,有助于他人对代码的理解和维护,对于大项目来说尤其重要. PHP_CodeSniffer是PEAR中的一个用PHP5写的用来检查嗅探 ...
- 代码规范、代码复审、PSP
作业三: 代码规范.代码复审.PSP 代码规范 代码规范的重要性 一.规范的代码可以促进团队合作 一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码必定会风格迥异.且不说会存 ...
- web前端代码规范 - HTML代码规范
Bootstrap HTML编码规范 本文转载自w3cschool. 由于bootstrap得到了世界的认可,因此,此规范用于规范html代码有一定的说服力. 交流qq群:164858883.欢迎各位 ...
- 谈谈关于PHP的代码安全相关的一些致命知识
谈谈关于PHP的代码安全相关的一些致命知识 目标 本教程讲解如何防御最常见的安全威胁:SQL 注入.操纵 GET 和 POST 变量.缓冲区溢出攻击.跨站点脚本攻击.浏览器内的数据操纵和远程表单提交. ...
- javascript基础修炼(4)——UMD规范的代码推演
javascript基础修炼(4)--UMD规范的代码推演 1. UMD规范 地址:https://github.com/umdjs/umd UMD规范,就是所有规范里长得最丑的那个,没有之一!!!它 ...
- 如何使用 Pylint 来规范 Python 代码风格
如何使用 Pylint 来规范 Python 代码风格 转载自https://www.ibm.com/developerworks/cn/linux/l-cn-pylint/ Pylint 是什么 ...
- Python代码规范之---代码不规范,亲人两行泪
任何语言的程序员,编写出符合规范的代码,是开始程序生涯的第一步! 关于代码规范 Python 官方提供有一系列 PEP(Python Enhancement Proposals) 文档 其中第 8 篇 ...
- 个人博客作业Week2(代码规范,代码复审)
Q:是否需要有代码规范 首先我们来搞清楚什么是“代码规范”,它和“代码风格”又有什么关系.依据个人的审美角度,我可能更喜欢在函数与函数之间空出一行,可能在命名习惯和代码注释上更加的internatio ...
随机推荐
- NOI2021 游记
day -10 开始一天一场NoIP模拟赛,前几场每天挂分很厉害(这么说是因为后面的以前做过) 自省选惨挂以后国赛的知识点就几乎没怎么摸过了,考前发现连manacher都不会写了,反演?又陷入&quo ...
- 未能找到源类型“DbSet<T>”的查询模式的实现。未找到“Select”
使用EF6.0的模型优先模式进行开发,遇到了报错,如下图 后来发现是没引用using System.Linq; 引用后就不报错了
- Linux内核编译配置脚本
环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL Linux内核编译配置脚本 在linux开发过程中熟练使用脚本可以大大简化命令行操作,同时对于需要经常重复操作的指令也是一种备忘 ...
- 经典多级时间轮定时器(C语言版)
经典多级时间轮定时器(C语言版) 文章目录 经典多级时间轮定时器(C语言版) 1. 序言 2. 多级时间轮实现框架 2.1 多级时间轮对象 2.2 时间轮对象 2.3 定时任务对象 2.4 双向链表 ...
- 查看elasticsearch版本的方法
查看elasticsearch版本的方法: 1.elasticsearch已经启动的情况下 使用curl -XGET localhost:9200命令查看: "version" : ...
- 利用k8s yaml配置文件起一个http能够让外部访问
1.首先建一个http的Deployment apiVersion: apps/v1 #版本信息 kind: Deployment #文件类型 metadata: #Deployment资源的元数据信 ...
- PTA 面向对象程序设计 7-1 2017Final 圆周率山
7-1 2017Final 圆周率山 为了参加学校的社团风采展,怡山小学数学组的同学们决定画一座圆周率山,以宣传圆周率. 已知圆周率为:3. 1415926535 8979323846 2643383 ...
- CentOS8部署tftp
tftp:简单文本传输协议,而ftp:文本传输协议.可以把tftp看成是ftp的精简版.tftp用于免登录传输小文件,tftp服务端监听在udp协议的69端口tftp简单的工作原理: tftp服务端与 ...
- 一起学习PHP中GD库的使用(三)
上篇文章我们已经学习了一个 GD 库的应用,那就是非常常用的制作验证码的功能.不过在现实的业务开发中,这种简单的验证码已经使用得不多了,大家会制作出更加复杂的验证码来使用.毕竟现在的各种外挂软件已经能 ...
- 一篇文章搞定Selenium元素定位/封装/数据驱动
小伙伴都知道,自动化最重的,又最"难"(因为实战中会碰到定位的各种坑)那就是定位元素.如果不熟练掌握定位,那只怕你比功能测式的小伙伴下班还会要晚!扎心了吧! Selenium常用定 ...