Sass 嵌套规则 #
什么是嵌套? #
嵌套是 Sass 最实用的特性之一,它允许你在一个选择器内部嵌套另一个选择器,使代码结构更清晰、更易读。
scss
// Sass 嵌套写法
nav {
ul {
margin: 0;
padding: 0;
}
li {
display: inline-block;
}
}
// 编译后的 CSS
nav ul {
margin: 0;
padding: 0;
}
nav li {
display: inline-block;
}
选择器嵌套 #
基本嵌套 #
scss
.container {
width: 100%;
.item {
color: red;
.title {
font-size: 20px;
}
}
}
// 编译后
.container {
width: 100%;
}
.container .item {
color: red;
}
.container .item .title {
font-size: 20px;
}
嵌套层级建议 #
scss
// 推荐:最多 3-4 层嵌套
.container {
.item {
.title {
font-size: 20px;
}
}
}
// 不推荐:嵌套层级过深
.container {
.wrapper {
.content {
.section {
.article {
.paragraph {
// 太深了!
}
}
}
}
}
}
父选择器 & #
基本用法 #
& 代表父选择器:
scss
.button {
color: blue;
&:hover {
color: darkblue;
}
&:active {
color: navy;
}
}
// 编译后
.button {
color: blue;
}
.button:hover {
color: darkblue;
}
.button:active {
color: navy;
}
伪类和伪元素 #
scss
.link {
color: blue;
&:hover {
text-decoration: underline;
}
&:visited {
color: purple;
}
&::before {
content: "→ ";
}
&::after {
content: " ←";
}
}
// 编译后
.link {
color: blue;
}
.link:hover {
text-decoration: underline;
}
.link:visited {
color: purple;
}
.link::before {
content: "→ ";
}
.link::after {
content: " ←";
}
BEM 命名模式 #
scss
// Block
.card {
padding: 20px;
// Element
&__header {
font-size: 24px;
}
&__body {
margin-top: 10px;
}
&__footer {
margin-top: 15px;
}
// Modifier
&--featured {
border: 2px solid gold;
}
&--compact {
padding: 10px;
}
}
// 编译后
.card {
padding: 20px;
}
.card__header {
font-size: 24px;
}
.card__body {
margin-top: 10px;
}
.card__footer {
margin-top: 15px;
}
.card--featured {
border: 2px solid gold;
}
.card--compact {
padding: 10px;
}
状态类名 #
scss
.button {
background-color: blue;
&.is-active {
background-color: green;
}
&.is-disabled {
opacity: 0.5;
cursor: not-allowed;
}
&.is-loading {
color: transparent;
}
}
// 编译后
.button {
background-color: blue;
}
.button.is-active {
background-color: green;
}
.button.is-disabled {
opacity: 0.5;
cursor: not-allowed;
}
.button.is-loading {
color: transparent;
}
在选择器后面添加后缀 #
scss
.button {
color: blue;
&-primary {
background-color: blue;
}
&-secondary {
background-color: gray;
}
&-danger {
background-color: red;
}
}
// 编译后
.button {
color: blue;
}
.button-primary {
background-color: blue;
}
.button-secondary {
background-color: gray;
}
.button-danger {
background-color: red;
}
属性嵌套 #
基本语法 #
scss
.container {
font: {
family: Helvetica, sans-serif;
size: 16px;
weight: bold;
}
margin: {
top: 10px;
right: 20px;
bottom: 10px;
left: 20px;
}
border: {
width: 1px;
style: solid;
color: #ccc;
}
}
// 编译后
.container {
font-family: Helvetica, sans-serif;
font-size: 16px;
font-weight: bold;
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;
border-width: 1px;
border-style: solid;
border-color: #ccc;
}
带值的属性嵌套 #
scss
.container {
border: 1px solid #ccc {
radius: 4px;
}
margin: auto {
top: 10px;
bottom: 10px;
}
}
// 编译后
.container {
border: 1px solid #ccc;
border-radius: 4px;
margin: auto;
margin-top: 10px;
margin-bottom: 10px;
}
高级嵌套技巧 #
嵌套媒体查询 #
scss
.container {
width: 100%;
padding: 15px;
@media (min-width: 768px) {
width: 750px;
padding: 20px;
}
@media (min-width: 1024px) {
width: 960px;
}
}
// 编译后
.container {
width: 100%;
padding: 15px;
}
@media (min-width: 768px) {
.container {
width: 750px;
padding: 20px;
}
}
@media (min-width: 1024px) {
.container {
width: 960px;
}
}
嵌套 @at-root #
@at-root 将选择器提升到最外层:
scss
.container {
.item {
color: red;
@at-root .special-item {
color: blue;
}
}
}
// 编译后
.container .item {
color: red;
}
.special-item {
color: blue;
}
@at-root 配合 & #
scss
.button {
color: blue;
@at-root #{&}--primary {
background-color: blue;
}
@at-root #{&}--secondary {
background-color: gray;
}
}
// 编译后
.button {
color: blue;
}
.button--primary {
background-color: blue;
}
.button--secondary {
background-color: gray;
}
嵌套在媒体查询内 #
scss
@media (min-width: 768px) {
.container {
width: 750px;
.item {
float: left;
width: 50%;
}
}
}
// 编译后
@media (min-width: 768px) {
.container {
width: 750px;
}
.container .item {
float: left;
width: 50%;
}
}
实际应用示例 #
组件样式 #
scss
.card {
display: block;
padding: 20px;
border: 1px solid #eee;
border-radius: 8px;
&__image {
width: 100%;
height: auto;
}
&__title {
margin: 15px 0 10px;
font-size: 18px;
font-weight: bold;
}
&__description {
color: #666;
line-height: 1.6;
}
&__actions {
margin-top: 15px;
display: flex;
gap: 10px;
}
&:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
&--featured {
border-color: gold;
box-shadow: 0 0 10px rgba(255, 215, 0, 0.3);
}
}
表单样式 #
scss
.form {
&-group {
margin-bottom: 15px;
}
&-label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
&-input {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
&:focus {
outline: none;
border-color: blue;
box-shadow: 0 0 5px rgba(0, 0, 255, 0.2);
}
&.is-invalid {
border-color: red;
}
&.is-valid {
border-color: green;
}
}
&-error {
margin-top: 5px;
color: red;
font-size: 12px;
}
&-submit {
padding: 10px 20px;
background-color: blue;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
&:hover {
background-color: darkblue;
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}
}
导航菜单 #
scss
.nav {
display: flex;
&__item {
margin-right: 20px;
&:last-child {
margin-right: 0;
}
}
&__link {
display: block;
padding: 10px 15px;
color: #333;
text-decoration: none;
&:hover {
color: blue;
}
&.is-active {
color: blue;
font-weight: bold;
}
}
&--vertical {
flex-direction: column;
.nav__item {
margin-right: 0;
margin-bottom: 10px;
}
}
}
嵌套最佳实践 #
1. 控制嵌套深度 #
scss
// 好:3 层以内
.container {
.item {
.title {
font-size: 20px;
}
}
}
// 不好:嵌套过深
.page {
.content {
.main {
.section {
.article {
.paragraph {
// 难以维护
}
}
}
}
}
}
2. 使用 BEM 避免深层嵌套 #
scss
// 使用 BEM
.article {
&__header {
// ...
}
&__title {
// ...
}
&__content {
// ...
}
}
// 而不是
.article {
.header {
.title {
// ...
}
}
.content {
// ...
}
}
3. 媒体查询放在选择器内 #
scss
// 好
.container {
width: 100%;
@media (min-width: 768px) {
width: 750px;
}
}
// 不好
.container {
width: 100%;
}
@media (min-width: 768px) {
.container {
width: 750px;
}
}
4. 避免过度使用 & #
scss
// 好
.button {
color: blue;
&:hover {
color: darkblue;
}
&--primary {
background-color: blue;
}
}
// 不好:过度使用
.button {
&__text {
&--bold {
&-large {
// 太复杂
}
}
}
}
下一步 #
掌握了嵌套规则后,继续学习 模块化,学习如何组织和管理 Sass 文件!
最后更新:2026-03-28