你有了解过原生css的scope?

最近再看公司项目源码中发现:scope被用来选择元素很常见,于是就去了解了一下关于原生css的作用于问题。mdn介绍

从mdn中我们可以了解到:scope可以在css和js中进行使用,下面我们来介绍一下他的详细用法。

:scope直接在style标签中使用

:scope直接在style标签中使用他将作用于html元素。不管style标签在哪里编写。

html 复制代码
<div class="div1">
  <style>
    :scope {
      border: 1px solid green;
    }
  </style>
  div1
  <div>
    <span>内部</span>
  </div>
  <span>直接</span>
</div>
<div class="div2">
  div2
</div>

:scope配合@scope, scoped使用

按道理讲scoped等价于@scope不加任何修饰,都表示作用于当前style标签的父元素之内的元素。并且可以使用:scope伪类选择父元素。但是现在浏览器不支持style标签中的scoped属性了,所以即使在style中写了scoped也是作用于全局。

@scope完整语法@scope (scope root) to (scope limit) 作用范围不包含limit内的元素。

当我们不指定root, limit时,他将作用于style标签的直接父元素。并且我们使用:scope伪类就可以选择当前@scope作用的根节点。在@scope中编写的css只会作用于当前:scope匹配的根节点内。

html 复制代码
<div class="div1">
  <style>
    /* 如果不设置作用范围,那么它将以style标签的父元素作为作用域 */
    @scope {
      /* 选中根,给根设置样式 */
      :scope {
        border: 1px solid green;
      }
      /* 作用于根内部 */
      span {
        background: red;
      }
    }
  </style>
  div1
  <div>
    <span>内部</span>
  </div>
  <span>直接</span>
</div>
<div class="div2">
  div2
</div>

其实上面的内容等价于这个,但是由于scoped不被支持了,所以就不生效了对于现代浏览器来说。

html 复制代码
<style scoped> 
  /* 作用域当前父元素。但是浏览器不支持了。所以也是作用于全局 */
  :scope {
    background: red;
  }
  /* 作用于根内部 */
  span {
    background: red;
  }
</style>

这里可以查看@scope, scoped被支持情况

如果将上面的style标签中的内容放在head内部,将不会起任何作用。因为当前head中没有被匹配到对应的选择器。除非设置root, limit内容。

下面我们来看看@scope中设置root, limit的效果。只要加上@scope语法的范围,style不管在哪编写,其中的css都会作用于当前范围内的元素。

html 复制代码
 <div>
    <p>
      p标签
      <b>
        <style>
          @scope (div) to (b) {
            :scope {
              background: red;
            }
      
            span, p {
              color: yellow;
            }
      
            /* 这个b设置无效,因为 @scope 范围不包括 b  */
            b {
              color: blue;
            }
          }
        </style>
        span标签
      </b>
    </p>
  </div>
  <div class="div1">
    div1
    <div>
      <span>内部</span>
    </div>
    <span>直接</span>
  </div>
  <div class="div2">
    div2
  </div>

我们还可以使用&代替:scope:scope表示匹配的范围根,而&表示用于匹配范围根的选择器。因此,可以&多次链接。但是,您只能使用:scope一次。

html 复制代码
  <div>
    <p>
      p标签
      <b>
        <style>
          @scope (div) to (b) {
            /* 但是:scope :scope是不被允许的 */
            & & {
              background: red;
            }
      
            span, p {
              color: yellow;
            }
      
            
            b {
              color: blue;
            }
          }
        </style>
        span标签
      </b>
    </p>
  </div>
  <div class="div1">
    div1
    <div>
      <span>内部</span>
    </div>
    <span>直接</span>
  </div>
  <div class="div2">
    div2
  </div>

:scope在js中使用

当在 DOM API 调用(例如 querySelector()、querySelectorAll()、matches() 或 Element.closest())中使用时,:scope 匹配调用此类方法的元素。所以我们就很容易的选中当前元素的直接子元素。

js 复制代码
  const div1 = document.querySelector(".div1")
  const span = div1.querySelectorAll(":scope > span") // [span]
  const _div1 = div1.querySelector(":scope") // null
  // 虽然_div1为null,但是 div1.querySelectorAll(":scope > span")就是可以选择内容的
  const spanAll = div1.querySelectorAll(":scope span") // [span, span]
  const _document = document.querySelectorAll(":scope") // [html]
  const spanEmpty = document.querySelectorAll(":scope > span") // []
  console.log(_div1, span, spanAll, _document, spanEmpty)

参考文章

往期年度总结

往期文章

专栏文章

结语

本篇文章到此就结束了,欢迎在评论区交流。

🔥如果此文对你有帮助的话,欢迎💗关注 、👍点赞 、⭐收藏✍️评论, 支持一下博主~

相关推荐
再吃一根胡萝卜42 分钟前
08 · 前端:Vue3 + SSE 流式与执行链路可视化
面试
再吃一根胡萝卜1 小时前
03 · 后端:FastAPI 与分层架构
面试
mldong2 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排3 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60614 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角5 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!5 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰5 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
Interview Aid1125 小时前
Walmart Global Tech SDE 三轮面经|基础、并发、压力面
面试·职场和发展
mayaairi6 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js