前言

BEM 是一种 CSS class 命名规范. 目的是防止大家名字取太短, 不小撞名字后果很麻烦.

参考:

Youtube – You Probably Need BEM CSS in Your Life (Tutorial)

Battling BEM CSS: 10 Common Problems And How To Avoid Them

结构

<section class="service-section">
<h1 class="service-section__title">Service 1</h1>
<p class="service-section__description">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Recusandae,
omnis.
</p>
<button class="service-section__action service-section__action--focused">
click
</button>
</section>

Block

block 就是一个 namespace 概念, 算是全局命名了, 要确保与页面里其它 block 不能撞,

Element

element 就是元素的语义命名, 比如 title, description, call to action 对比 h1, p, button

有些人不喜欢拿 semantic HTML 来做 selector 所以就有了更语义化的 element.

要确保在整个 block 里面, element 名字不能撞哦.

Modifier

modifier 通常用来表达状态 state, 比如 focused, hovered, 变种 element 的意思.

Sass 结构

.service-section {
&__title {
color: red;
}
&__description {
font-size: 1.5rem;
}
&__action {
text-transform: uppercase;
letter-spacing: 1px;
padding: 0.5rem 1rem; &--focused {
background-color: rgba($color: blue, $alpha: 0.3);
}
}
}

利用嵌套和 & 语法, 虽然 class name 很长, 但 Sass 并没有重复的代码, 看上去还可以.

出来的效果

.service-section__title {
color: red;
}
.service-section__description {
font-size: 1.5rem;
}
.service-section__action {
text-transform: uppercase;
letter-spacing: 1px;
padding: 0.5rem 1rem;
}
.service-section__action--focused {
background-color: rgba(0, 0, 255, 0.3);
}

注意, 它并不是 child selector, .service-section .service-section__title 哦, 而是 flat 的.

我个人是觉得是 ok 的, 毕竟都命名规范了嘛, flat 也不会撞. 但如果想让它变成 .service-section .service-section__title 也是很容易的

#{&}__title {
color: red;
}

加上 Sass 特定语法 #{} 就可以了. 效果:

.service-section .service-section__title {
color: red;
}

常见问题 FAQ:

问: 如果有很多层, 是不是要写成 block__element1_element2_modifier 还是 block1_block2_element_modifier?

答: no, BEM 的结构永远都是 block-name__element-name--modifier, block name, element name 可以用 kebab-case 写长长, 防止撞名字.

问: 不喜欢 class 名字长长, HTML 很丑, 用嵌套 + child selector 的方式可以吗?

答: 是可以的, 关键就是哪个 namespace 的概念要有, 所以 selector 都要有一个 root > child. root 就是 unique 的. 这样就可以保证不会撞了.

我不喜欢 html 写长长的 class. 所以我都是用 child selector 的 (但这样其实风水并没有比较好, 要 100% 顺风水的话还是用 BEM 吧)

替代方案

BEM 的目的是防止 class name 撞名字. 它的解决方式是通过 namespace

我们需要自己管理好 namespace, block 一定要是 unique. 而 block 里面的 element 命名是 block__element 所以防止了和 block 撞名.

有几个方式可以替代这个方案.

1. 用 Tailwind CSS, 因为它的 class 是功能的名字而不是 element 的名字, 自然就不会撞名字了

2. 用 Isolation 方案, 比如 Asp.net Core – CSS Isolation, Angular Component styles

它们的做法就是 compile CSS 和 HTML, 然后加上一些名字. 做法和 BEM 差不多, 只不过是自动的, 不需要人维护.

CSS – BEM (Block__Element--Modifier)的更多相关文章

  1. CSS BEM 命名规范简介

    [前言] BEM 是一个简单又非常有用的命名约定.让你的前端代码更容易阅读和理解,更容易协作,更容易控制,更加健壮和明确,而且更加严密.这篇文章主要介绍了CSS BEM 命名规范简介(推荐)的相关资料 ...

  2. CSS BEM

    CSS BEM Block, Element, Modifier https://en.bem.info/methodology/quick-start/ BEM /* Block component ...

  3. CSS — BEM 命名规范

    推荐阅读: https://juejin.im/post/5b925e616fb9a05cdd2ce70d 1 什么是 BEM 命名规范 Bem 是块(block).元素(element).修饰符(m ...

  4. CSS BEM 命名方式

    简介 简易 css 命名方式,减小命名冲突,使得 css 更有组织感和识别感.但如今写 react 项目大多可以忽略对 css 的命名约束了. 官网介绍:http://getbem.com/intro ...

  5. 面试官:说说你对css效率的理解

    大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 大家的支持是我创作的动力. 选择器的优先级 众所周知,选择器是有权重 ...

  6. 前端规范(ES6BEMOOCSSSMACSS)

    前端规范 在实际开发中,由于团队成员编码习惯不一,技术层次不同,开发前定制并遵循一种代码规范能提高代码质量,增加开发效率. Javascript Javascript规范直接参考airbnb: ES6 ...

  7. Matplotlib数据可视化(3):文本与轴

      在一幅图表中,文本.坐标轴和图像的是信息传递的核心,对着三者的设置是作图这最为关心的内容,在上一篇博客中虽然列举了一些设置方法,但没有进行深入介绍,本文以围绕如何对文本和坐标轴进行设置展开(对图像 ...

  8. CSS命名规范——BEM思想(非常赞的规范)

    人们问我最多的问题之一是在CSS类名中“--”和“__”是什么意思?它们的出现是源于BEM和Nicolas Gallagher... BEM的意思就是块(block).元素(element).修饰符( ...

  9. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

    好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...

  10. CSS命名方式=》BEM

    时间:2016-11-04 20:04:53 原文地址:https://github.com/zhongxia245/blog/issues/48 一.背景 挺早就听说过BEM了,也大概的知道怎么用, ...

随机推荐

  1. 基于Java+SpringBoot+Vue宠物咖啡馆平台设计和实现

    \n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成 ...

  2. oeasy教您玩转vim - 36 - # 插入字符

    ​ 插入字符 回忆上节课内容 正则表达式 行头行尾 ^ 意味着行开头 $ 意味着行结尾 任意字符 . 代表任意字符 [a-z] 代表任意小写字母 字符数量 * 代表 0 到任意多个前字符 + 代表 1 ...

  3. WPF控件库

    Welcome to CookPopularControl 介绍 CookPopularControl是支持.NetFramework4.6.1与.Net5.0的WPF控件库,其中参考了一些资料,目前 ...

  4. 解决Prism中对话框服务中对话框开启时回调函数不会触发的问题

    解决办法 新建一个类DialogServiceExtend,然后在再注册 public class DialogServiceExtend : DialogService { public Dialo ...

  5. 新年切红包-scratch小游戏

    程序说明: <新年切红包>是一款Scratch制作的小游戏,灵感来源于流行的切水果游戏.在这个游戏中,玩家需要用鼠标切割屏幕上不断飞出的红包,切割到红包将获得金币奖励,而切割到爆竹则会导致 ...

  6. 《最新出炉》系列入门篇-Python+Playwright自动化测试-56- 多文件上传 - 下篇

    1.简介 前边的两篇文章中,宏哥分别对input控件上传文件和非input控件上传文件进行了从理论到实践地讲解和介绍,但是后来又有人提出疑问,前边讲解和介绍的都是上传一个文件,如果上传多个文件,Pla ...

  7. 【Excel】VBA编程 01 入门

    视频地址: https://www.bilibili.com/video/BV1Q5411p71p 在Excel种需要打开[开发工具]和[启用所有宏]两点 打开开发工具选项 宏启用 菜单栏才会有开发工 ...

  8. 【Nexus】Linux上的Maven私服搭建

    [1.安装Nexus] 需要Linux安装JDK运行,Nexus2版本JDK7,3版本JDK8 首先需要Nexus服务器文件 nexus-2.12.0-01-bundle.tar.gz 解压 tar ...

  9. Jax框架 —— 如何在没有GPU和TPU的设备上debug代码 —— 在CPU上使用GPU仿真设置 —— Jax框架在多卡设备上的自动并行特性的仿真体验

    Jax计算框架是Google用来取代Tensorflow的新一代计算框架,这个框架使用类似pytorch的技术,但是在pytorch技术之上加入了更加强大的技术,但是这也导致该框架使用起来要比pyto ...

  10. 使用X11进行屏幕转播是否有价值? 最好用的远控软件是什么?

    由于有多个主机在使用,而且物理位置不在一起,所以以前往往要使用VNC软件来进行远程连接,但是其延迟比较高,使用感受不是很好,而且由于我所使用的多个主机均是Ubuntu系统,于是想到了是否可以使用X11 ...