惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
U
Unit 42
L
LangChain Blog
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog
F
Fortinet All Blogs
小众软件
小众软件
I
InfoQ
P
Proofpoint News Feed
D
DataBreaches.Net
Martin Fowler
Martin Fowler
H
Help Net Security
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog

博客园 - 饭特稠

10 年前端经验喂了狗 浪浪山老前端的2025 useAttrs 是响应式的吗(by 豆包) 实时互动教育版的自定义 UI 如何开发 2024,在路上 当蓝牙键盘连不上电脑:一次意外的debug之旅 前端技术选型时有用的网站 好用的zsh插件,打造好用的命令行 2023年终总结:怀孕,装修,还贷和其他 分享一个URL正则 使用 scriptable 实现每日诗词小组件 如何使webpack编译 node_modules 中的 npm 包 小程序中实现图片旋转后保存 Custom Elements 和 Shadow DOM了解一下? 聊聊CSS 缓动函数的新成员linear() chatgpt: 在ts中如何声明一个全局类型 Workbox -- 为serviceWorker量身定做的工具 cache API简介 重新学车 魔幻2022
CSS 原生嵌套来了
饭特稠 · 2023-06-30 · via 博客园 - 饭特稠

前言

在web发展的过程中,有很多API都是浏览器吸收了开源社区的热门库后出现的,比如 document.querySelector 吸收了 jQuery 的精华,或者Promise,JSON的相关API都是先出现在社区,然后被浏览器原生支持。今天我们要谈的css原生嵌套也是借鉴了less,sass等社区方案而出现的。

css原生嵌套

在没有css原生嵌套之前,如果不借助css预处理器,我们可能经常要写这样的代码:

.nesting {
  color: hotpink;
}

.nesting > .is {
  color: rebeccapurple;
}

.nesting > .is > .awesome {
  color: deeppink;
}

有了css原生嵌套之后,我们可以这样写:

.nesting {
  color: hotpink;

  > .is {
    color: rebeccapurple;

    > .awesome {
      color: deeppink;
    }
  }
}

可以发现,使用css嵌套之后,我们的代码量更少,而且结构更清晰。

&符号

在less中, 我们可以用&来表示嵌套的父级选择器,在css原生嵌套中也是这个效果:

.card {
  .featured & {
    /* 表示 .featured .card */
  }

  & .featured  {
    /* 表示 .card  .featured */
  }
  &.featured  {
    /* 表示 .card.featured,注意没有空格 */
  }
}

与less 中 & 的区别

  1. 不支持字符串连接
    在less中,我们可以使用&来拼接选择器的字符串:
.card {
  &--header {
    /* 等于 .card--header/
  }
}

但是在css原生嵌套这么做是不生效的。具体可以看这个解释

  1. 不支持直接嵌套html标签选择器
    在less中,我们可以这么写:
.card {
 h1 {
    /* 等于 .card h1/
  }
}

但是在css嵌套中,这么写是无效的,如果要想达到这样的效果,我们可以这么写:

.card {
 & h1 {
    /* 等于 .card h1/
  }
/*或者*/
:is(h1) {
  /*OK*/
}
}

总结一下就是,被嵌套的选择器必须以下面的字符开头:

所以嵌套 div 之类的 HTML 标签是不生效的

本文完

参考文档:

https://developer.chrome.com/articles/css-nesting/#understanding-the-nesting-parser