如何在Sass中使用@mixin生成BEM类名_提高CSS编写效率

千晨小哥_5345

千晨小哥_5345

2026-05-08

768人浏览

原创

直接拼接bem类名易出错,因&会带入完整父链导致非法结构;可靠方案是显式传入块名的@mixin bem($block),并通过element()和modifier()声明子级,禁用&手动拼接。

如何在sass中使用@mixin生成bem类名_提高css编写效率

为什么直接拼接BEM类名容易出错

在 Sass 中用字符串拼接生成 BEM 类名(比如 #{&}__item)看似简洁,但实际会破坏嵌套上下文——尤其当父选择器本身带条件(如 .is-active 或媒体查询)时,& 会把整个父链带进来,生成类似 .menu.is-active__item 这种非法 BEM 结构。BEM 要求修饰符必须作用于块级元素本身,而非其子元素。

@mixin bem() 必须接收 $block 参数

一个可靠的 @mixin bem 不能依赖 & 推导块名,而应显式传入块名。否则无法支持多层嵌套、混合块名或动态块(如组件库中 $block: $c-button)。常见错误是写成无参 @mixin element,导致复用时必须重复写块名,反而降低效率。

推荐写法:

@mixin bem($block) {
  .#{$block} {
    @content;

    @mixin element($name) {
      &__#{$name} {
        @content;
      }
    }

    @mixin modifier($name) {
      &--#{$name} {
        @content;
      }
    }
  }
}

调用时明确传入块名:

@include bem('card') {
  padding: 1rem;

  @include element('header') {
    font-weight: bold;
  }

  @include modifier('compact') {
    padding: 0.5rem;
  }
}

避免在 @content 中使用 & 引发选择器污染

很多人在 @content 里继续写 &__title,以为能自动挂载到当前块下,结果生成的是 .card .card__title(多了一个空格),而不是预期的 .card__title。这是因为 & 在 @content 作用域中仍指向外层 .card,但 Sass 不会自动“扁平化”它。

CSS婚礼策划服务机构宣传网站模板
CSS婚礼策划服务机构宣传网站模板

CSS婚礼策划服务机构宣传网站模板是一款适合提供婚礼策划和婚庆服务机构宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。

下载

正确做法是:所有子级结构都通过 @include element() 或 @include modifier() 声明,不手动拼接 &。如果真要写组合选择器(如 .card__item.is-active),应单独定义修饰符,而不是在 element 内部硬编码。

  • ✅ 正确:@include element('item') { @include modifier('active') { ... } }
  • ❌ 错误:@include element('item') { &.is-active { ... } }(生成 .card__item.is-active 是对的,但语义错位;且若后续加了 @media,& 会把媒体查询也带进去)

生产环境要考虑 CSS 输出体积和调试友好性

这套 @mixin 本质是语法糖,编译后仍是扁平 CSS。但要注意两点:一是嵌套过深(比如三层 element 套 modifier)会让源码可读性下降;二是开发者工具里看到的选择器是最终结果(如 .card__header),但找不到对应 Sass 行号——因为 @content 是动态注入的。

建议:

  • 限定最多两层嵌套:块 → 元素 或 块 → 修饰符,避免 element 内再套 element
  • 在 @mixin bem() 开头加 // @group #{$block} 注释,方便 IDE 折叠和搜索
  • 禁用 compress 模式输出,保留换行和缩进,否则调试时无法对应源文件位置

真正难的不是写出这个 @mixin,而是团队约定好什么时候该用它、什么时候该手写——比如原子类、工具类或第三方组件覆盖样式,就不该塞进 bem() 里。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

4456

6

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

977

5

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.28

1838

6

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

2023.08.01

3486

7

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

2023.08.10

6965

11

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

2023.08.10

5931

7

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

2023.08.21

2017

9

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

2023.08.22

2811

5

css禁止点击事件
css禁止点击事件

实现css禁止点击事件的方法有使用CSS的pointer-events属性和使用JavaScript禁用点击事件。本专题为大家提供点击事件相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2453

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.9万人学习

CSS教程
CSS教程

共754课时 | 96.7万人学习