@scope
åºçº¿
2025
æè¿å¯ç¨
èª December 2025 èµ·ï¼æ¤ç¹æ§å·²å¨ææ°æµè§å¨ä¸å¾å°æ¯æãä½å¨è¾æ§çè®¾å¤ææµè§å¨ä¸å¯è½æ æ³è¿è¡ã
@scope CSS at è§åè½å¤è®©ä½ éä¸ç¹å®ç DOM åæ ä¸çå
ç´ ï¼æ éç¼åè¿äºå
·ä½çé¾ä»¥è¦ççéæ©å¨å°±è½åç¡®å°å®ä½å
ç´ ï¼ä¹ä¸ç¨å°éæ©å¨ä¸ DOM ç»æç´§å¯å°è¦åã
å¨ JavaScript ä¸ï¼å¯ä»¥éè¿ CSS å¯¹è±¡æ¨¡åæ¥å£ CSSScopeRule è®¿é® @scopeã
è¯æ³
@scope at è§åå
å«äºä¸ä¸ªæå¤ä¸ªè§åéï¼ç§°ä¸ºåéï¼scopedï¼æ ·å¼è§åï¼ï¼å¹¶å®ä¹ä¸ä¸ªåºç¨äºéå®å
ç´ çä½ç¨åã@scope æä¸¤ç§ç¨æ³ï¼
-
ä½ä¸º CSS ä¸çä¸ä¸ªç¬ç«åï¼å¨è¿ç§æ åµä¸ï¼å®å å«ä¸ä¸ªåç½®é¨åï¼è¿é¨åå æ¬åæ ¹ï¼scope rootï¼åå¯éçåè¾¹çï¼scope limitï¼éæ©å¨ââè¿äºéæ©å¨å®ä¹äºä½ç¨åçä¸ä¸è¾¹çã
css@scope (scope root) to (scope limit) { è§åé } -
ä½ä¸º HTML ä¸å å«å¨
<style>å ç´ éé¢çå èæ ·å¼ï¼è¿ç§æ åµä¸ï¼åç½®é¨åå¯ä»¥çç¥ï¼æå å«çè§åéçä½ç¨åä¼èªå¨éå®å¨<style>å ç´ çç¶å ç´ å ãhtml<parent-element> <style> @scope { è§åé } </style> </parent-element>ä¹å¯ä»¥å°å è
@scopeä¸åè¾¹çéæ©å¨ç»åå¨ä¸èµ·ï¼åè¿æ ·@scope to (scope limit) { ... }ã
æè¿°
ä¸ä¸ªå¤æç Web ææ¡£å¯è½å æ¬é¡µçã页èãæ°é»æç« ãå°å¾ãåªä½ææ¾å¨ã广ååå ¶å®ç»ä»¶ãéç夿æ§è¶æ¥è¶é«ï¼ææå°ç®¡çè¿äºç»ä»¶çæ ·å¼åå¾å°¤ä¸ºéè¦ï¼ææå°å®ä¹æ ·å¼çèå´æå©äºéä½å¤ææ§ãæä»¬æ¥ççä¸é¢ç DOM æ ï¼
body
ââ article.feature
ââ section.article-hero
â ââ h2
â ââ img
â
ââ section.article-body
â ââ h3
â ââ p
â ââ img
â ââ p
â ââ figure
â ââ img
â ââ figcaption
â
ââ footer
ââ p
ââ img
å¦æä½ æ³å¨å
·æ article-body ç±»åç <section> å
éä¸ <img> å
ç´ ï¼
ä½ å¯ä»¥æ§è¡ä»¥ä¸æä½ï¼
- ç¼åä¸ä¸ªç±»ä¼¼äº
.feature > .article-body > imgçéæ©å¨ãç¶èï¼è¿æ ·çéæ©å¨è¿äºå ·ä½ï¼å¯¼è´å¾é¾è¢«è¦çï¼å¹¶ä¸ä¸ DOM ç»æç´§å¯è¦åãå¦æè¢«æ è®°çç»æå¨å°æ¥åçäºååï¼ä½ å¯è½éè¦éå CSSã - ç¼åä¸ä¸ªç±»ä¼¼äº
.article-body imgä¸å¤ªå ·ä½çéæ©å¨ãç¶èï¼è¿å°éä¸sectionå çææå¾åã
è¿å°±ä½ç°äº @scope çæç¨ä¹å¤ãå®å
è®¸ä½ å®ä¹ä¸ä¸ªç²¾ç¡®çä½ç¨åï¼å¨è¯¥ä½ç¨åå
ï¼ä½ çéæ©å¨å
许å®ä½å
ç´ ãä¾å¦ï¼ä½ å¯ä»¥ä½¿ç¨ä¸ä¸ªç¬ç«ç @scope åæ¥è§£å³ä¸è¿°é®é¢ï¼å¦ä¸æç¤ºï¼
@scope (.article-body) to (figure) {
img {
border: 5px solid black;
background-color: goldenrod;
}
}
.article-body åæ ¹éæ©å¨å®ä¹äº DOM æ ä½ç¨åçä¸è¾¹çï¼è§åéå°åºç¨äºè¯¥åºåå
ï¼è figure åè¾¹çéæ©å¨å®ä¹äºä¸è¾¹çãæç»ï¼åªæå¨å
·æ article-body ç±»åç <section> å
ï¼ä½ä¸å¨ <figure> å
ç´ å
ç <img> å
ç´ ä¼è¢«éä¸ã
夿³¨ï¼è¿ç§ä½ç¨åççå®ââå ·æä¸ä¸è¾¹ççââé常被称为ç¯å½¢ä½ç¨åï¼donut scopeï¼ã
ä½ç¨åçä¸è¾¹çæ¯å
æ¬å¨å
çï¼èä¸è¾¹çæ¯ä¸å
æ¬çãæ³è¦æ´æ¹è¿ä¸è¡ä¸ºï¼ä½ å¯ä»¥å°ä»»ä¸éæ©å¨ä¸éç¨åéæ©å¨ç»å使ç¨ãä¾å¦ï¼@scope (scope root) to (scope limit > *) 使ä¸ä¸è¾¹çå
æ¬å¨å
ï¼@scope (scope root > *) to (scope limit) ä¸å
æ¬ä¸¤ä¸ªè¾¹çï¼è @scope (scope root > *) to (scope limit > *) å°ä¸å
æ¬ä¸è¾¹çèå
æ¬ä¸è¾¹çã
å¦æä½ æ³éä¸å¸¦æ article-body ç±»åç <section> å
çææå¾åï¼ä½ å¯ä»¥å¿½ç¥åè¾¹çï¼
@scope (.article-body) {
img {
border: 5px solid black;
background-color: goldenrod;
}
}
æè
ä½ å¯ä»¥å° @scope åå
èå° <style> å
ç´ å
ï¼è <style> å
ç´ åä½äºå¸¦æ article-body ç±»åç <section> ä¸ã
<section class="article-body">
<style>
@scope {
img {
border: 5px solid black;
background-color: goldenrod;
}
}
</style>
<!-- ... -->
</section>
夿³¨ï¼éè¦çæ¯è¦æç½ï¼è½ç¶ @scope å
è®¸ä½ å°éæ©å¨çåºç¨èå´éå¶å¨ç¹å®ç DOM åæ ä¸ï¼ä½å®å¹¶ä¸è½å®å
¨å°åºç¨çæ ·å¼éå¶å¨è¿äºåæ å
é¨ãç»§æ¿è¡¨ç°å¾æä¸ºæ¾èââç±åå
ç´ ç»§æ¿ç屿§ï¼æ¯å¦ color æ font-familyï¼ä»ä¼è¢«ç»§æ¿ï¼ä¸åä»»ä½è®¾å®çåè¾¹çéå¶ã
:scope 伪类
å¨ @scope åçä¸ä¸æä¸ï¼:scope ä¼ªç±»ä»£è¡¨åæ ¹ââ宿ä¾äºä¸ç§ä»ä½ç¨åå
é¨ä¸ºåæ ¹åºç¨æ ·å¼çç®åæ¹æ³ï¼
@scope (.feature) {
:scope {
background: rebeccapurple;
color: antiquewhite;
font-family: sans-serif;
}
}
å®é
ä¸ï¼:scope éå¼å°æ·»å å°ææåéæ ·å¼è§åçåé¢ãåªè¦ä½ æ³ï¼ä½ ä¹å¯ä»¥æ¾å¼å°å¨æ ·å¼è§åå颿·»å :scope æè
åµå¥éæ©å¨ï¼&ï¼ä»¥å®ç°åæ ·çææã
ä¸ååºåä¸çä¸ç§è§åæéä¸çå ç´ é½æ¯çåçï¼
@scope (.feature) {
img { ... }
:scope img { ... }
& img { ... }
}
åééæ©å¨ä½¿ç¨è¯´æ
-
åè¾¹çå¯ä»¥ä½¿ç¨
:scopeæå®åè¾¹çååæ ¹ä¹é´ç¹å®çå ³ç³»æ¡ä»¶ãä¾å¦ï¼css/* å½ figure ä½ä¸º :scope çç´ç³»å项æ¶ï¼figure 为çé */ @scope (.article-body) to (:scope > figure) { ... } -
åè¾¹çå¯ä»¥ä½¿ç¨
:scopeæ¥å¼ç¨åæ ¹ä¹å¤çå ç´ ãä¾å¦ï¼css/* å½ :scope ä½äº .feature å 鍿¶ï¼figure 为çé */ @scope (.article-body) to (.feature :scope figure) { ... } -
åéæ ·å¼è§åæ¯æ æ³è±ç¦»åæ çãå
:scope + pè¿æ ·çéæ©æ¯æ æçï¼å 为å®éä¸çå ç´ ä¼å¤äºåæ ä¹å¤ã -
å°åæ ¹ååè¾¹çå®ä¹ä¸ºéæ©å¨å表æ¯å®å ¨ææçï¼è¿å°ä¼å®ä¹å¤ä¸ªä½ç¨åãä¸å示ä¾ä¸ï¼æ ·å¼å°åºç¨äºä»»æå ·æ
article-heroæarticle-bodyç±»åç<section>ä¸ç<img>ï¼ä½ä¸ä¼åºç¨äºåµå¥å¨<figure>ä¸ç<img>ï¼css@scope (.article-hero, .article-body) to (figure) { img { border: 5px solid black; background-color: goldenrod; } }
@scope ä¸çä¼å
级
å
å«äº @scope åä¸çè§åéä¸ä¼å½±åå
¶éæ©å¨çä¼å
级ï¼ä¸è®ºæ¯ç¨äºåæ ¹è¿æ¯åè¾¹çéæ©å¨ãä¾å¦ï¼
@scope (.article-body) {
/* æ£å¦é¢æé£æ ·ï¼img çä¼å
级为 0-0-1 */
img { ... }
}
ç¶èï¼å¦æä½ å³å®æ¾å¼å°å¨éæ©å¨åæ·»å :scope 伪类ï¼å½è®¡ç®ä¼å
级æ¶ä½ å¿
é¡»æå®èèè¿å»ã:scope 䏿æå¸¸è§ä¼ªç±»ä¸æ ·ï¼å
·æ 0-1-0 çä¼å
级ãä¾å¦ï¼
@scope (.article-body) {
/* :scope img çä¼å
级为ï¼0-1-0 + 0-0-1 = 0-1-1 */
:scope img { ... }
}
å½å¨ @scope åä¸ä½¿ç¨ & 鿩卿¶ï¼& è¡¨ç¤ºåæ ¹éæ©å¨ï¼å®ä¼å¨å
é¨è¢«è®¡ç®ä¸ºå
è£¹å¨ :is() ä¼ªç±»å½æ°ä¸çéæ©å¨ãä¾å¦ï¼å¨ï¼
@scope (figure, #primary) {
& img { ... }
}
& img çåäº :is(figure, #primary) imgãç±äº :is() åå
¶æå
·ä½åæ°çä¼å
级ï¼å¨æ¬ä¾ä¸ä¸º #primaryï¼ï¼å æ¤ä½ç¨åä¸ç & img éæ©å¨çä¼å
级为 1-0-0 + 0-0-1 = 1-0-1ã
å¨ @scope ä¸ :scope ä¸ & çåºå«
:scope 代表å¹é
çåæ ¹ï¼è & 代表ç¨äºå¹é
åæ ¹çéæ©å¨ï¼å æ¤ï¼å¯ä»¥å¤æ¬¡é¾æ¥ &ãç¶èä½ åªè½ä½¿ç¨ä¸æ¬¡ :scopeââä½ ä¸è½å¨åæ ¹å
å¹é
åæ ¹ã
@scope (.feature) {
/* éä¸å¨å¹é
æ ¹çéæ©å¨ .feature å
ç .feature */
& & { ... }
/* æ æ */
:scope :scope { ... }
}
å¦ä½è§£å³ @scope å²çª
@scope 为 CSS å±å æ·»å äºä¸ä¸ªæ°çæ åï¼ä½ç¨åå°±è¿ååãè¿è¯´æï¼å½ä¸¤ä¸ªä½ç¨åçæ ·å¼åå¨å²çªæ¶ï¼å¨ DOM æ ä¸è·³å°åæ ¹æéå±çº§æ°æå°çæ ·å¼å°ä¼è¢«åºç¨ã让æä»¬çä¸ä¸ªä¾åï¼ççè¿æå³çä»ä¹ã
以ä¸é¢ç HTML 代ç çæ®µä¸ºä¾ï¼ä¸å主é¢çå¡çäºç¸åµå¥ï¼
<div class="light-theme">
<p>æµ
è²ä¸»é¢ææ¬</p>
<div class="dark-theme">
<p>æ·±è²ä¸»ä½ææ¬</p>
<div class="light-theme">
<p>æµ
è²ä¸»é¢ææ¬</p>
</div>
</div>
</div>
å¦æä½ åè¿æ ·ç¼å CSS 主é¢ï¼å°±ä¼éå°éº»ç¦ï¼
.light-theme {
background: #ccc;
}
.dark-theme {
background: #333;
}
.light-theme p {
color: black;
}
.dark-theme p {
color: white;
}
ææ·±å±ç段è½çåä½é¢è²åºè¯¥ä¸ºé»è²ï¼å 为å®ä½äºæµ
è²ä¸»é¢å¡ä¸ãç¶èï¼å®åæ¶è¢« .light-theme p å .dark-theme p å½ä¸ãç±äº .dark-theme p è§å卿ºä»£ç ä¸åºç°å¾è¾åï¼å®ä¼è¢«åºç¨ï¼æ®µè½çåä½é¢è²æç»é误å°è®¾ç½®ä¸ºç½è²ã
为äºè§£å³è¿ä¸ªé®é¢ï¼ä½ å¯ä»¥åä¸é¢è¿æ ·ä½¿ç¨ @scopeï¼
@scope (.light-theme) {
:scope {
background: #ccc;
}
p {
color: black;
}
}
@scope (.dark-theme) {
:scope {
background: #333;
}
p {
color: white;
}
}
ç°å¨ææ·±å±ç段è½çåä½é¢è²æ£ç¡®å°è®¾ç½®ä¸ºé»è²ï¼è¿æ¯å ä¸ºå¨ DOM æ ä¸è·ç¦» .light-theme åæ ¹åªæä¸ä¸ªå±çº§ï¼èè·ç¦» .dark-theme åæ ¹æä¸¤ä¸ªå±çº§ãå æ¤ï¼æµ
è²æ ·å¼çä¼å
级é«ã
夿³¨ï¼ä½ç¨åå°±è¿ååå°æ è§æºä»£ç 顺åºï¼ä½å ¶èªèº«ä¼è¢«å ¶å®ä¼å 级æ´é«çæ åè¦çï¼æ¯å¦ï¼importanceãå±å å±åä¼å 级ã
å½¢å¼è¯æ³
@scope =
@scope <scope-boundaries>? { <block-contents> }
<scope-boundaries> =
[ [ ( <scope-start> ) ]? [ to ( <scope-end> ) ]? ]!
<scope-start> =
<selector-list>
<scope-end> =
<selector-list>
<selector-list> =
<complex-selector-list>
<complex-selector-list> =
<complex-selector>#
<complex-selector> =
<complex-selector-unit> [ <combinator>? <complex-selector-unit> ]*
<complex-selector-unit> =
[ <compound-selector>? <pseudo-compound-selector>* ]!
<combinator> =
'>' |
'+' |
'~' |
[ '|' '|' ] |
[ / <wq-name> / ]
<compound-selector> =
[ <type-selector>? <subclass-selector>* ]!
<pseudo-compound-selector> =
<pseudo-element-selector> <pseudo-class-selector>*
<wq-name> =
<ns-prefix>? <ident-token>
<type-selector> =
<wq-name> |
<ns-prefix>? '*'
<subclass-selector> =
<id-selector> |
<class-selector> |
<attribute-selector> |
<pseudo-class-selector>
<pseudo-element-selector> =
: <pseudo-class-selector> |
<legacy-pseudo-element-selector>
<pseudo-class-selector> =
: <ident-token> |
: <function-token> <any-value> )
<ns-prefix> =
[ <ident-token> | '*' ]? '|'
<id-selector> =
<hash-token>
<class-selector> =
'.' <ident-token>
<attribute-selector> =
'[' <wq-name> ']' |
'[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'
<legacy-pseudo-element-selector> =
: [ before | after | first-line | first-letter ]
<attr-matcher> =
[ '~' | '|' | '^' | '$' | '*' ]? '='
<attr-modifier> =
i |
s
示ä¾
>åæ ¹çåºç¡æ ·å¼
å¨è¿ä¸ªç¤ºä¾ä¸ï¼æä»¬ä½¿ç¨ä¸¤ä¸ªåç¬ç @scope ååå«å¹é
å¨å
·æ .light-scheme å .dark-scheme ç±»åçå
ç´ ä¸ç龿¥ã请注æ :scope æ¯å¦ä½éä¸ä»¥åç»èªèº«æä¾æ ·å¼çãå¨è¿ä¸ªç¤ºä¾ä¸ï¼åæ ¹é½æ¯åºç¨äºç±»ç <div> å
ç´ ã
HTML
<div class="light-scheme">
<p>
MDN å
å«ä¸
<a href="/proxy/developer.mozilla.org/zh-CN/docs/Web/HTML">HTML</a>ã<a href="/proxy/developer.mozilla.org/zh-CN/docs/Web/CSS"
>CSS</a
>
å <a href="/proxy/developer.mozilla.org/zh-CN/docs/Web/JavaScript">JavaScript</a> æå
³çå¾å¤ä¿¡æ¯ã
</p>
</div>
<div class="dark-scheme">
<p>
MDN å
å«ä¸
<a href="/proxy/developer.mozilla.org/zh-CN/docs/Web/HTML">HTML</a>ã<a href="/proxy/developer.mozilla.org/zh-CN/docs/Web/CSS"
>CSS</a
>
å <a href="/proxy/developer.mozilla.org/zh-CN/docs/Web/JavaScript">JavaScript</a> æå
³çå¾å¤ä¿¡æ¯ã
</p>
</div>
CSS
@scope (.light-scheme) {
:scope {
background-color: plum;
}
a {
color: darkmagenta;
}
}
@scope (.dark-scheme) {
:scope {
background-color: darkmagenta;
color: antiquewhite;
}
a {
color: plum;
}
}
ç»æ
ä¸è¿°ä»£ç å°æ¸²æä¸ºè¿æ ·ï¼
åæ ¹ååè¾¹ç
å¨è¿ä¸ªç¤ºä¾ä¸ï¼æä»¬æä¸æ®µ HTML 代ç çæ®µï¼å®ä¸æä»¬ä¹åå¨æè¿°å°èä¸è®¨è®ºç DOM ç»æç¸å¹é
ãæ¤ç»æä»£è¡¨ä¸ä¸ªå
¸åçæç« æè¦ï¼å¼å¾æ³¨æçå
³é®ç¹å¾æ¯ <img> å
ç´ ï¼å®ä»¬è¢«åµå¥äºä¸åçç»æå±çº§ã
è¿ä¸ªç¤ºä¾å±ç¤ºäºå¦ä½ä½¿ç¨åæ ¹ååè¾¹çä»é¡¶å±å¼å§ä¸º <img> å
ç´ æ·»å æ ·å¼ï¼ä½åªä¸é»è³ï¼ä¸å
æ¬ï¼<figure> å
ç´ ä¸ç <img>ââå®é
ä¸å建äºä¸ä¸ªç¯å½¢ä½ç¨åã
HTML
<article class="feature">
<section class="article-hero">
<h2>æç« æ é¢</h2>
<img alt="image" />
</section>
<section class="article-body">
<h3>æç« åæ é¢</h3>
<p>
ç
§é¡¾ç
人ãè·éç
人å¾éè¦ï¼ä½ä¼åçå¨è¿æ ·çæ¶åï¼æå¾å¤å·¥ä½åçè¦ãç»ç©¶èµ·æ¥ï¼ä»»ä½äººé½ä¸åºè¯¥ä»äºä»»ä½ä¸ç§å·¥ä½ï¼é¤éä»è½ä»ä¸å¾å°ä¸äºå¥½å¤ãä¸è¦å¨æ¤æä¸å¨çè¦ä¸å¨æ¥è´£ä¸å¨å¿«ä¹ä¸ä»æ³è¦æä¸ºä¸æ ¹å¤´åï¼ä»çè¦ä¸å¸ææ²¡ææ»çãé¤é被æ
欲èè½ï¼å¦åä»ä»¬å°±æ²¡æè¿éï¼é£äºæ¾å¼èè´£ã软åçµéç人ï¼å³å³å¨è
ã
</p>
<img alt="image" />
<p>ç
§é¡¾ç
人ãè·éç
人å¾éè¦ï¼ä½ä¼åçå¨è¿æ ·çæ¶åï¼æå¾å¤å·¥ä½åçè¦ã</p>
<figure>
<img alt="image" />
<figcaption>个人信æ¯å¾</figcaption>
</figure>
</section>
<footer>
<p>ç± Chris Mills æ°åã</p>
<img alt="image" />
</footer>
</article>
CSS
å¨ CSS æ ·å¼ä¸ï¼æä¸¤ä¸ª @scope åºåï¼
- 第ä¸ä¸ª
@scopeåºåå®ä¹äºå¸¦æ.featureç±»åçå ç´ ä½ä¸ºåæ ¹ï¼å¨æ¬ä¾ä¸ï¼åªæå¤é¨ç<article>ï¼ï¼æ¼ç¤ºäºå¦ä½ä½¿ç¨@scopeå°æ ·å¼åºç¨äºç¹å®ç HTML åéã - 第äºä¸ª
@scopeåºåä¹å®ä¹äºå¸¦æ.featureç±»åçå ç´ ä½ä¸ºåæ ¹ï¼è¿å®ä¹äºfigureçåè¾¹çãè¿ç¡®ä¿äºæå å«çè§åéåªåºç¨äºå¨åæ ¹ï¼å¨æ¤ä¾ä¸ä¸º<article class="feature"> ... </article>ï¼å ç¸å¹é çå ç´ ï¼è¿äºå ç´ é½ä¸åµå¥å¨å代<figure>å ç´ ä¸ãè¿ä¸ª@scopeåºåå å«ä¸ä¸ªè§åéï¼è¯¥è§åé为<img>å ç´ è®¾ç½®ç²é»è²è¾¹æ¡åéè²èæ¯è²çæ ·å¼ã
/* åé CSS */
@scope (.feature) {
:scope {
background: rebeccapurple;
color: antiquewhite;
font-family: sans-serif;
}
figure {
background-color: white;
border: 2px solid black;
color: black;
padding: 10px;
}
}
/* ç¯å½¢ä½ç¨å */
@scope (.feature) to (figure) {
img {
border: 5px solid black;
background-color: goldenrod;
}
}
ç»æ
卿¸²æç代ç ä¸ï¼è¯·æ³¨æææ <img> å
ç´ æ¯å¦ä½è¢«è®¾ç½®ä¸ºç²é»è¾¹æ¡åéè²èæ¯æ ·å¼çï¼é¤äº <figure> å
çå
ç´ ï¼æ 记为â个人信æ¯å¾âï¼ã
è§è
| è§è |
|---|
| CSS Cascading and Inheritance Level 6> # scoped-styles> |
æµè§å¨å ¼å®¹æ§
>css.at-rules.scope
css.selectors.nesting.at-scope
åè§
:scopeCSSScopeRule- ä½¿ç¨ CSS
@scopeat è§åéå¶éæ©å¨çèå´ï¼æ¥èª developer.chrome.google.cnï¼2023ï¼