XingYun blog
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具

XingYun

冲!
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具
  • leaflet改变坐标原点
  • 补间动画gsap与tween
  • 文字转语音mp3文件
  • JavaScript引入
  • JavaScript高级程序设计阅读笔记
  • Javascript函数参数按值传递传递
  • JS防抖和节流
  • 手写JS常用方法
  • 手写Promise
  • JS Event Loop
  • 重排和重绘
  • em、px、rem、vh、vw 区别
  • css也需要性能优化
  • 图解 js 原型链
  • js函数参数按值传递
  • BOM浏览器对象模型
  • DOM
  • 事件
  • js对象数组sort按需排序
  • 文件上传功能技术选型和前后端实现
  • 前端图片处理
  • 让你的JavaScript代码简单又高效
  • BEM:class命名规范
    • 1. 什么是 BEM
      • 1.1 概念
    • 2. Block
    • 3. Element
    • 4. Modifier
    • 5. 一个官方 demo
    • 6. 使用 BEM 的误区
    • 7. 我的习惯
  • 前端规范-CSS属性那么多(杂),怎么排序
  • TypeScript Tips
  • jsx
  • canvas基础
  • 前端日志
  • 浏览器存储
  • CSS世界阅读笔记
  • CSS揭秘阅读笔记
  • js变量命名常用规范词
  • 你不知道的JavaScript阅读笔记
  • js对象的底层数据结构
  • js判断数据类型
  • JS浮点数精度问题和解决办法
  • js作用域
  • js堆栈溢出和内存泄漏
  • 浏览器是如何渲染页面的
  • 疑难杂症和踩坑问题合集
  • 免费在线API收集
  • 原生JS实现Ajax请求
  • cookie、session、localStorage、sessionStorage的区别
  • Sass与Less
  • arrayBuffer、blob、file对象
  • TypeScript基础
  • 前端
XingYun
2022-01-13
目录

BEM:class命名规范

如果编写项目的 CSS 代码只有一个人,或者项目的 CSS 代码量很小,可以用你喜欢,习惯的方式去组织你的 CSS 代码。
但是项目更大,更复杂,有多人编写项目的 CSS 代码(每个人有自己的风格),代码量大的时候,就需要一种统一规范去组织 CSS 代码,这时候 BEM 就派上用场了。

# 1. 什么是 BEM

# 1.1 概念

BEM(Block Element Modifier) 是一种命名 CSS class 的模式,使用这种模式可以让 CSS 代码更加利于维护。
标准的 BEM 写法是 .block-name__element-name--modifier-name。

# 2. Block

Block

页面上逻辑和功能独立的,可复用的组件,可以嵌套并相互交互,但在语义上它们保持平等,可以存在页面上不同的位置或不同项目中,保持样式不变。

可以使用字母,数字,连字符进行命名,任何 html 元素都可以成为一个 block,不依赖于页面上的其他 block 或者 element。

<header class="header"></header>

<style>
  .header {
    color: #333;
    background: #f5f5f5;
  }
</style>
1
2
3
4
5
6
7
8

# 3. Element

组成块的一部分,内部的任何元素都与块有关联,不能在块的外部使用。

<article class="article">
  <h2 class="article__title"></h2>
  <p class="article__content"></p>
</article>

<style>
  .article {
    padding: 12px;
  }

  .article__title {
    font-size: 1rem;
  }

  .article__content {
    font-size: 0.9rem;
  }
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 4. Modifier

用来表示块或者元素的状态,外观或者行为,不必须,可以选择使用。

<button class="btn btn--disabled"></button>

<style>
  .btn {
    color: #333;
    background-color: #fff;
  }

  .btn--disabled {
    color: #fff;
    background-color: #6c757d;
  }
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13

# 5. 一个官方 demo

<header class="header">
  <div class="header__wrapper">
    <div class="logo">
      <img src="http://via.placeholder.com/32x32" class="logo__img" />
    </div>
    <nav class="nav">
      <ul class="menu">
        <li class="menu__item">
          <a href="#" class="menu__link menu__link--active">Home</a>
        </li>
        <li class="menu__item"><a href="#" class="menu__link">Works</a></li>
        <li class="menu__item"><a href="#" class="menu__link">About</a></li>
        <li class="menu__item"><a href="#" class="menu__link">Contact</a></li>
      </ul>
    </nav>
  </div>
</header>
<main class="main">
  <div class="main__wrapper">
    <section class="content">
      <div class="item">
        <img class="item__img" src="http://via.placeholder.com/64x64" />
        <div class="item__content">
          <h6 class="item__title">Here is a title</h6>
          <p class="item__desc">
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Rem quasi,
            repudiandae earum autem eligendi vel quidem.
          </p>
        </div>
      </div>
      <div class="item">
        <img class="item__img" src="http://via.placeholder.com/64x64" />
        <div class="item__content">
          <h6 class="item__title">Here is a title</h6>
          <p class="item__desc">
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Rem quasi,
            repudiandae earum autem eligendi vel quidem.
          </p>
        </div>
      </div>
    </section>
    <aside class="aside">
      <div class="aside__item">
        <i class="aside__icon fas fa-heart"></i>
        <span class="aside__text">favorite</span>
      </div>
      <div class="aside__item">
        <i class="aside__icon fas fa-question-circle"></i>
        <span class="aside__text">question</span>
      </div>
      <div class="aside__item">
        <i class="aside__icon fas fa-user"></i>
        <span class="aside__text">user</span>
      </div>
    </aside>
  </div>
</main>
<footer class="footer">
  <p class="footer__desc">Copyright © 2018-2024;&nbsp;All Rights Reserved.</p>
</footer>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

# 6. 使用 BEM 的误区

Block 误区:

这个 block 并非 inline-block 里的 block,而是将所有东西都划分为一个独立的模块,一个 header 是 block,header 里嵌套的搜索框是 block,甚至一个 icon 一个 logo 也是 block
block 可以相互嵌套

Element!误区:

如果一个 Element-son 是另一个 Element-father 的子元素,那么写法是 BlockElement-fatherElement-son_Modifer,嵌套多了会很长么? 不是的!!!

一个 Block 下的所有 Element 无论相互层级如何,都要摊开扁平的属于 Block, 所以 BEM 最多只有 B+E+M 三级,不可能出现 B+E+E+..+E+M 超长 class 名,也要求 E 不能同名

# 7. 我的习惯

  1. 双下划线代表B和E连接例如 menu__item

  2. 单下划线代表B和M或E和M的连接 例如 menu_active 或 menu__item_active

  3. 中划线同英语里做连字符例如 mod-menu 或 mod-menu__item 这里 B或E或M需要多个单词来描述,就使用中划线

#CSS
上次更新: 2023/04/05, 09:41:10
让你的JavaScript代码简单又高效
前端规范-CSS属性那么多(杂),怎么排序

← 让你的JavaScript代码简单又高效 前端规范-CSS属性那么多(杂),怎么排序→

最近更新
01
JavaScript-test
07-20
02
二维码的原理
07-20
03
利用ChatGPT优化代码
07-20
更多文章>
Theme by Vdoing | Copyright © 2021-2023 XingYun | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式