CSS 嵌套语法(CSS Nesting)

CSS 嵌套(CSS Nesting)是最新的 CSS 正式语法之一。它允许我们在编写样式时,将子选择器直接嵌套在父选择器内部,更直观地表达层级关系,减少重复书写父选择器,从而提升开发效率和样式可维护性。

虽然主流浏览器已经支持 CSS 嵌套语法,但为了兼容旧版浏览器,建议在项目中配合 PostCSS 插件(如 postcss-preset-env)使用 。这样可以在构建阶段自动将嵌套 CSS 转换为普通平铺 CSS,确保样式兼容所有环境。具体浏览器支持情况可参考 Can I use - CSS Nesting

需要注意的是,CSS 嵌套本质上只是原生 CSS 的"语法糖"。无论是手动平铺还是嵌套写法,最终生成的选择器及其特异性(优先级)完全一致。

因此,在实际开发中,推荐如下使用方式:

  • 结合 BEM 命名规范,将样式模块化管理,提升结构清晰度和可维护性。
  • 控制嵌套层级在 2--3 层以内,避免出现"嵌套地狱",确保样式易于维护和拓展。

基本用法

css 复制代码
 .card {
   color: #333;
 ​
   .title {
     font-weight: 600;
   }
 ​
   .subtitle {
     color: #666;
   }
 }

等价的原生 CSS:

复制代码
 .card { ... }
 .card .title { ... }
 .card .subtitle { ... }

使用 & 引用父选择器

& 代表"父选择器本身",可以灵活地组合伪类、修饰类等。

css 复制代码
 .button {
   padding: 8px 12px;
   background: #1677ff;
   color: #fff;
 ​
   &:hover {
     background: #145bd6;
   }
 ​
   &.is-active {
     background: #0e44a5;
   }
 ​
   &::before {
     content: "★";
     display: inline-block;
     margin-right: 6px;
     font-size: 1em;
     vertical-align: middle;
   }
 }

等价的原生 CSS:

css 复制代码
 .button { ... }
 .button:hover { ... }
 .button.is-active { ... }
 .button::before { ... }

反向引用

嵌套中也可以实现"反向引用",即子选择器中引用外部父级选择器:

css 复制代码
 .card {
   .featured & {
     border: 1px solid #e5e6eb;
   }
 }

等价的原生 CSS:

复制代码
 .featured .card { ... }

选择器组合与层级关系

嵌套语法同样支持各种选择器的组合与层级关系表达:

css 复制代码
 .list {
   > .item { padding: 8px; }
   
   .bar { margin-top: 8px; }
 ​
   + .foo { margin: 8px; }
   
   ~ .baz {  background: #e5e6eb; }
 ​
   .entry, .cell {
     &:hover { background: #f6f7fb; }
   }
 }

等价的原生 CSS:

css 复制代码
 .list > .item { ... }
 .list .bar { ... }
 .list + .foo { ... }
 .list ~ .baz { ... }
 .list .entry:hover,
 .list .cell:hover { ... }

媒体查询嵌套

CSS 嵌套语法天然支持媒体查询(如 @media@container)的嵌套写法:

css 复制代码
 .grid {
   background: #10b981;
   width: 100px;
   height: 100px;
 ​
   /* 这里可以直接写 width >= 768px 替代 min-width: 768px */
   @media (width >= 768px) {
     background: #ea580c;
   }
 }

等价的原生 CSS:

scss 复制代码
 .grid { ... }
 ​
 @media (min-width: 768px) {
   .grid { ... }
 }
相关推荐
淡笑沐白4 分钟前
ECharts入门指南:数据可视化实战
前端·javascript·echarts
魔卡少女15 分钟前
Nginx配置代码化自动部署詹金斯/Github方案
前端·nginx·github
开发者如是说8 分钟前
可能是最好用的多语言管理工具
android·前端·后端
是上好佳佳佳呀10 分钟前
【前端(六)】HTML5 新特性笔记总结
前端·笔记·html5
北城笑笑25 分钟前
FPGA 与 市场主流芯片分类详解:SoC/CPU/GPU/DPU 等芯片核心特性与工程应用
前端·单片机·fpga开发·fpga
A923A44 分钟前
【从零开始学 React | 第四章】useEffect和自定义Hook
前端·react.js·fetch·useeffect
ZC跨境爬虫1 小时前
批量爬取小说章节并优化排版(附完整可运行脚本)
前端·爬虫·python·自动化
ZC跨境爬虫1 小时前
海南大学交友平台登录页开发实战day4(解决python传输并读取登录信息的问题)
开发语言·前端·python·flask·html
来一颗砂糖橘1 小时前
pnpm:现代前端开发的高效包管理器
前端·pnpm
前端摸鱼匠1 小时前
Vue 3 的defineProps编译器宏:详解<script setup>中defineProps的使用
前端·javascript·vue.js·前端框架·ecmascript