现代 CSS 解决方案:原生嵌套(Nesting)

这篇具有很好参考价值的文章主要介绍了现代 CSS 解决方案:原生嵌套(Nesting)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

很早之前,就写过一篇与原生嵌套相关的文章 -- CSS 即将支持嵌套,SASS/LESS 等预处理器已无用武之地?,彼时 CSS 原生嵌套还处于工作草案 Working Draft (WD) 阶段,而今天(2023-09-02),CSS 原生嵌套 Nesting 终于成为了既定的规范!

现代 CSS 解决方案:原生嵌套(Nesting)

CSS 原生嵌套语法

在之前,只有在 LESS、SASS 等预处理器中,我们才能使用嵌套的写法,像是这样:

div {
    & > p {
        color: red;
    }

    &:hover {
        color: yellow;
    }
}

从 Chrome 112 开始,原生 CSS 也可以使用嵌套语法了。

其语法规则大致如下:

parentRule {
  /* parent rule style properties */
  & childRule {
    /* child rule style properties */
  }
}

CSS 原生嵌套语法能力边界

大部分同学对嵌套应该还是非常熟悉的,下面我们一起看看,CSS 原生嵌套的能力边界,语法支持范围。

支持嵌套,并且支持多层嵌套

这个很好理解,直接看 DEMO:

<div class="g-container">
    <h3 class="g-h3">CSS 
        <span class="g-span">Nesting</span>
    </h3>
</div>
div {
    border: 1px solid #000;
    
    .g-h3 {
        color: red;
        
        .g-span {
            color: blue;
        }
    }
}

效果如下:

现代 CSS 解决方案:原生嵌套(Nesting)

当然,这里有个值得注意的点。如果我们不使用具体的 ClassName,而是使用标签名称选择器,像是这样:

div {
    border: 1px solid #000;
    
    h3 {
        color: red;
        
        span {
            color: blue;
        }
    }
}

嵌套规则是不会生效的,此时,我们需要在标签名称选择器前,加上 & 符合:

div {
    border: 1px solid #000;
    
    & h3 {
        color: red;
        
        & span {
            color: blue;
        }
    }
}

与 SASS 等类似,& 符号在嵌套中,也表示嵌套的父选择器本身,因此,上面两个嵌套选择器最终的表达式实则为:

  • div h3 { color: red };
  • div h3 span { color blue };

在嵌套中使用伪元素和伪类

直接上代码,这个也是传统 CSS 预处理器支持的内容:

div {
  /* ... */
  &:hover {
    color: red;
  }

  &:is(.content, footer) {
    padding: 16px;
  }

  &::before {
    content: "";
    /* ... */
  }
}

上述代码中,我们能够在嵌套中使用伪类、伪元素。

在嵌套中使用媒体查询

这个就比较有意思了,我们甚至可以在嵌套中,使用媒体查询语法。

<div class="g-container">
    <h3>CSS Nesting without @media</h3>
</div>
<div class="g-container media">
    <h3>CSS Nesting with @media</h3>
</div>

.media {
  @media (min-width: 600px) {
      & h3 {
          color: red;
      }
  }
}

此时,下方带有 .media class 的容器,在视口宽度大于 600px 的时候,设置 color: red

效果如下:

现代 CSS 解决方案:原生嵌套(Nesting)

完整的 DEMO,你可以戳这里试一下:CodePen Demo -- CSS Nesting Demo

在嵌套中嵌套自身

哈?什么是在嵌套中嵌套自身

其实也很好理解,也就是 & 符号的时候,上面提到了,& 符号在嵌套中,也表示嵌套的父选择器本身,因此,我们还可以有这样的写法:

div {
    & h2 & {
        /* 表示 div h2 div {} */
    }
}

这种写法也是允许的,我们只需要将 & 替换成 div 即可,此时表示 div h2 div {}

总结一下

总结而言,CSS 原生的嵌套功能相当强大,基本是传统预处理器的平替。使用嵌套规则的好处在于:

  1. 更加易读和易维护,嵌套帮助我们编写更易于维护的 CSS,基于嵌套,我们可以更好的控制样式的作用域
  2. 更少的代码,嵌套帮助我们编写更少的代码,因为我们不需要一遍又一遍地重复父选择器

随着兼容性的铺开,慢慢地,我们可以尝试真正运用它们到实际代码中。

最后

好了,本文到此结束,希望对你有帮助 😃

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。文章来源地址https://www.toymoban.com/news/detail-705894.html

到了这里,关于现代 CSS 解决方案:原生嵌套(Nesting)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UI系列一Android多子view嵌套通用解决方案

    百度App在17年的版本中实现2个子view嵌套滚动,用于Feed落地页(webview呈现文章详情 + recycle呈现Native评论)。原理是在外层提供一个UI容器(我们称之为”联动容器”)处理WebView和Recyclerview连贯嵌套滚动。 当时的联动容器对子view限制比较大,仅支持WebView和Recyclerview进行联动滚动

    2024年04月16日
    浏览(41)
  • 【已解决】element-ui组件嵌套太多层,导致内部el-input和el-select 等组件无法正常输入解决方案

    如果 element-ui 组件嵌套太多层,可能会导致内部的 el-input 和 el-select 等组件无法正常输入。 出现这种问题通常是由于 z-index 属性设置不正确导致的。 解决这个问题的方法是调整组件的 z-index 属性,使其不会被其他组件覆盖。以下是一个解决方法: 在上面的代码中,我们首先

    2023年04月13日
    浏览(53)
  • 【云原生应用安全简介(含CloudStrike解决方案)】

    1、云环境通常包含应用程序、数据库实例和对象存储(如AWS S3或SEO blob)。 2、现代应用程序通常依赖容器化和微服务架构。 3、云管理员扮演着管理云环境和各类工作负载的重要角色。 1、攻击者倾向于利用云配置中的漏洞来进行恶意活动,如信息泄露或造成破坏。 2、常见

    2024年02月04日
    浏览(35)
  • 云原生全栈监控解决方案(全面详解)

    【作者】 JasonXu 当前全球企业云化、数字化进程持续加速,容器、微服务等云原生技术在软件架构中快速渗透,IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型,以及为了考虑系统的弹性、效率,企业软件开发中大量云原生技术的应用推动全球 IT 监控

    2024年01月23日
    浏览(46)
  • 【云原生】私有镜像的解决方案-Harbor管理实战

    通过前面的镜像管理,我们知道docker的开发和运行都离不开镜像管理,如果要进行镜像管理就需要使用镜像仓库。 docker官方提供的镜像仓库是: docker hub, 很方面但从安全和效率的角度考虑,这样的公有镜像环境就无法在企业私有环境中使用了。所以我们今天来探讨下企业中

    2024年02月05日
    浏览(50)
  • css相邻元素边框重合问题,解决方案

    给每个元素设置margin-top以及margin-left为负的边框 我的解决方案是在宽度上下手,根据观察,发现一行三列,实际导致缺失的是两个边框的大小,那么将这两个边框的大小平分到每行三列模块的开宽度内即可解决,其他情况下,由此推导

    2024年03月08日
    浏览(35)
  • 阿里云云原生弹性方案:用弹性解决集群资源利用率难题

    随着上云的认知更加普遍,我们发现除了以往占大部分的互联网类型的客户,一些传统的企业,一些制造类的和工业型企业客户也都开始使用云原生的方式去做 IT 架构的转型,提高集群资源使用率也成为企业上云的一致共识。大家上云的同时,开始思考有没有云原生的方法能

    2024年02月02日
    浏览(47)
  • uniapp - 完美解决 <swiper> 嵌套 video 视频时卡顿不流畅问题,swiper滑块视图容器里面包含视频播放器和图片共存时滑动切换特别卡,滑动不流畅问题的解决方案(保证解决此问题)

    在uniapp项目开发中,swiper组件内有多个视频、图片和视频混合时会出现滑动不流畅卡顿问题,并且视频自动轮播时没等看完视频就轮播走了。 解决方案全端(H5网页/小程序/app安卓苹果等)兼容适用,uview组件库同理也能用,保证解决卡顿不流畅的问题。

    2024年02月05日
    浏览(95)
  • 关于Redmi K50刷安卓原生(Pixel Experience)的解决方案

    请注意,目前pe的gsi仍然存在蓝牙耳机无声音、打电话对面能听见但是对面说话你听不见的问题,5G信号也比较差(应该是系统支持的频段变少了很多),这三个大问题目前仍无法解决,但是不得不否认流畅度和系统响应速度简直秒杀miui,同时指纹人脸识别什么的功能都是正

    2024年02月15日
    浏览(41)
  • Android原生键盘弹起,H5页面被压缩的两种解决方案

    移动H5项目中,会出现input框获得焦点键盘弹出把页面元素顶上去压缩到一起,影响页面布局. 方案一:监听页面变化,动态的展示和隐藏底部被顶上来的内容 这种方法经调试还不算十分完美 方案二:监听页面变化,键盘弹起时将变化之前的高度赋值给压缩后的页面         这种

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包