@content 是 Sass 中用于插入样式块的编译期宏,非变量或字符串,必须配合 @include 大括号语法使用,支持作用域继承但不支持运行时逻辑、多实例或跨文件传递。

@content 是什么,为什么不能直接用变量传样式
它不是变量,也不是字符串拼接工具,而是一个“样式块插入点”。Sass 编译时会把调用处的嵌套样式原封不动地塞进 @content 的位置——这决定了你没法用 $style 变量去存一段 CSS 再传进去,那样只会被当作文本字面量处理,不编译、不作用域继承、不支持嵌套。
常见错误现象:@mixin card($styles) { border: 1px solid #ccc; #card { $styles; } } —— 这会报错,因为 $styles 是值,不是可展开的样式块。
-
@content必须配合@include的大括号语法使用,例如@include card { color: red; p { font-weight: bold; } } - 它自动继承调用处的作用域:父选择器、变量、函数都可用
- 不支持多个
@content;一个 mixin 里只能有一个(Sass 旧版本甚至不允许嵌套调用带@content的 mixin)
怎么写一个带 @content 的基础 mixin
核心就三步:声明 mixin、放 @content、调用时用大括号包裹样式块。没有额外配置项,也不需要参数来“接收样式”。
@mixin responsive-container {
width: 100%;
@media (min-width: 768px) {
width: 750px;
margin: 0 auto;
}
@content;
}
使用时:
.header {
@include responsive-container {
background: #222;
color: white;
text-align: center;
}
}
编译后,@content 部分会插在媒体查询内部,且自动带上 .header 前缀。
- 注意缩进:Sass 对空格敏感,
@content前后的缩进要和上下文一致,否则可能生成意外嵌套 - 如果想让
@content插入到特定选择器下(比如只作用于子元素),就在 mixin 里写好结构,再把@content放进去,而不是指望调用方“自己控制”
如何组合 @content 和普通参数(比如主题色、断点)
参数和 @content 完全不冲突,参数用来控制逻辑分支或值,@content 负责注入样式结构。这是最常用的混合模式。
@mixin theme-card($bg: #fff, $border: #ddd) {
background: $bg;
border: 1px solid $border;
padding: 1rem;
@content;
}
调用时依然用大括号:
.card--featured {
@include theme-card(#f0f8ff, #4a90e2) {
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
h2 { color: #4a90e2; }
}
}
- 参数必须放在
@content前面声明,Sass 不允许@content出现在参数列表中间或之后 - 不要试图用参数去“开关”
@content是否执行——它总是会被插入;如需条件逻辑,用@if包裹其他样式,而非@content - 兼容性没问题:所有现代 Sass 实现(Dart Sass、Node Sass 4.14+)都支持,但 LibSass 旧版本有 bug,建议升级
容易踩的坑:@content 不是万能插入点
它只在编译期静态展开,无法做运行时判断,也不能跨文件传递——如果你在 _mixins.scss 里定义了带 @content 的 mixin,就不能把它“导出成变量”供 JS 或其他语言调用。
- 不能在
@for/@each循环里直接用@content(会报错),必须把循环逻辑写在 mixin 内部,再把@content放在循环体里或外侧 - 如果调用时忘了加大括号,比如写成
@include card;,Sass 不报错,但@content部分直接消失,样式丢失且无提示 - 调试困难:Chrome DevTools 里看不到
@content的来源行号,它会被合并进调用处的 CSS 行中,所以别指望靠 sourcemap 精确定位“哪段@content出了问题”
真正麻烦的地方在于:它看起来像高阶函数,实际是编译宏。想复用逻辑,优先拆成多个小 mixin;想动态注入,得靠 CSS 自定义属性或 JS 控制类名——@content 只负责“把这块样式原样塞进来”,仅此而已。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











