contain
åºçº¿
广æ³å¯ç¨
èª 2022å¹´3æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
CSS 屿§ contain æ 示äºå
ç´ åå
¶å
容尽å¯è½ç¬ç«äºææ¡£æ çå
¶ä½é¨åãå±é使 DOM çä¸é¨åå¾ä»¥è¢«é离ï¼ä¸éè¿å°å¸å±ãæ ·å¼ãç»å¶ã尺寸æå
¶ä»»æç»åç计ç®éå¶äº DOM åæ èéæ´ä¸ªé¡µé¢ä½¿æ§è½åçãå±éä¹å¯ç¨äºéå¶ CSS 计æ°å¨åå¼å·çä½ç¨åã
å°è¯ä¸ä¸
contain: none;
contain: size;
contain: layout;
contain: paint;
contain: strict;
<section class="default-example" id="default-example">
<div class="card" id="example-element">
<h2>Element with '<code>contain</code>'</h2>
<p>
The Goldfish is a species of domestic fish best known for its bright
colors and patterns.
</p>
<div class="fixed"><p>Fixed right 4px</p></div>
</div>
</section>
h2 {
margin-top: 0;
}
#default-example {
text-align: left;
padding: 4px;
font-size: 16px;
}
.card {
text-align: left;
border: 3px dotted;
padding: 20px;
margin: 10px;
width: 85%;
min-height: 150px;
}
.fixed {
position: fixed;
border: 3px dotted;
right: 4px;
padding: 4px;
margin: 4px;
}
æåç§ç±»åç CSS å±éââ尺寸ãå¸å±ãæ ·å¼åç»å¶ï¼ä¸å设置å¨å®¹å¨ä¸ãæ¤å±æ§ä¸ºäºä¸ªæ åå¼çåéæä¸¤ä¸ªç®åå¼ä¹ä¸ææçä»¥ç©ºæ ¼åéçå表ãå¨å®¹å¨å 对被å±é屿§çä¿®æ¹ä¸ä¼ä¼ æå°è¢«å±éå ç´ å¤ç页é¢çå ¶ä½é¨åãå±éç主è¦çå¤å¨äºæµè§å¨æ éç»å¸¸é渲 DOM æé¡µé¢å¸å±ï¼ç±æ¤å¨éæé¡µé¢ç渲æä¸å¸¦æ¥å°å¹ æ§è½æ¶çï¼å¨æ´å¨æçåºç¨ä¸å¸¦æ¥æ´å¤çæ§è½æ¶çã
卿ç¬ç«å
ç´ ç»ç页é¢ä¸ä½¿ç¨ contain 屿§è¾ä¸ºæç¨ï¼æ¤å±æ§å¯ä»¥é²æ¢å
ç´ å
é¨å¨å
¶å
å´çå¤äº§çå¯ä½ç¨ã
夿³¨ï¼ä¸ºæ¤å±æ§ä½¿ç¨ layoutãpaintãstrict æ content å¼å°å建ï¼
- æ°çå
å«åºåï¼é对å
¶
position屿§ä¸ºabsoluteæfixedçå代å ç´ ï¼ã - æ°çå±å ä¸ä¸æã
- æ°çåºåæ ¼å¼åä¸ä¸æã
è¯æ³
/* å
³é®è¯å¼ */
contain: none;
contain: strict;
contain: content;
contain: size;
contain: inline-size;
contain: layout;
contain: style;
contain: paint;
/* å¤ä¸ªå
³é®è¯ */
contain: size paint;
contain: size layout paint;
contain: inline-size layout;
/* å
¨å±å¼ */
contain: inherit;
contain: initial;
contain: revert;
contain: revert-layer;
contain: unset;
åå¼
contain 屿§å¯æä¸ååå¼ä¸çä»»æä¸ä¸ªï¼
- å
³é®è¯
noneï¼æ - 以任æé¡ºåºç±ç©ºæ ¼åéçå
³é®è¯
sizeï¼æinline-sizeï¼ãlayoutãstyleåpaintä¸çè³å°ä¸ä¸ªï¼æ - ç®åå¼
strictæcontentä¹ä¸
è¿äºå ³é®è¯æä¸åå«ä¹ï¼
none-
å ç´ ç §å¸¸æ¸²æï¼ä¸åºç¨å±éã
strict-
å°ææå±éè§ååºç¨äºå ç´ ãæ¤å¼çä»·äº
contain: size layout paint styleã content-
å°é¤
sizeå¤çææå±éè§ååºç¨äºå ç´ ãæ¤å¼çä»·äºcontain: layout paint styleã size-
å¨è¡ååååä¸å°å°ºå¯¸å±éåºç¨äºå ç´ ãå ç´ å°ºå¯¸å¯æ è§åå ç´ åç¬è®¡ç®ãæ¤å¼ä¸å¯ä¸
inline-sizeç»å使ç¨ã inline-size-
å°è¡å尺寸å±éåºç¨äºå ç´ ãå ç´ çè¡åå°ºå¯¸å¯æ è§åå ç´ åç¬è®¡ç®ãæ¤å¼ä¸å¯ä¸
sizeç»å使ç¨ã layout-
ä»é¡µé¢çå ¶ä½é¨åä¸é离åºå ç´ çå é¨å¸å±ãæ¤å¼æå³çå ç´ å¤çä»»æå 容åå ç´ å é¨å¸å±äºä¸å½±åã
style-
对äºå¯å¨å ç´ åå ¶å代å¤äº§çå½±åç屿§ï¼å ¶å½±åå°ä¸ä¼é离å å«å ç´ ã计æ°å¨åå¼å·çä½ç¨å被éå¶ä¸ºå ç´ åå ¶å 容ã
paint-
å ç´ å代ä¸å¨å ç´ è¾¹ç夿¾ç¤ºãè¥å å«çå¨å±å¤ï¼åæµè§å¨æ éç»å¶å ¶è¢«å±éçå ç´ ââè¿äºå ç´ å 为å®å ¨å±éäºæ¤çæ å¿ å®ä¹å¨å±å¤ãè¥å代å ç´ æº¢åºå å«å ç´ çè¾¹çï¼åæ¤å代å ç´ å°è¢«è£åªè³å å«å ç´ çè¾¹æ¡çã
å½¢å¼å®ä¹
| åå§å¼ | none |
|---|---|
| éç¨å ç´ | ææå ç´ |
| æ¯å¦æ¯ç»§æ¿å±æ§ | å¦ |
| 计ç®å¼ | as specified |
| å¨ç»ç±»å | Not animatable |
å½¢å¼è¯æ³
contain =
none |
strict |
content |
[ [ size | inline-size ] || layout || style || paint ]
示ä¾
>ç»å¶å±é
ä¸å示ä¾å±ç¤ºäºå¦ä½ä½¿ç¨ contain: paint 鲿¢å
ç´ å代å¨å
ç´ è¾¹çå¤è¢«ç»å¶ã
div {
width: 100px;
height: 100px;
background: red;
margin: 10px;
font-size: 25px;
}
<div style="contain: paint">
<p>æ¤ææ¬å°è¢«è£åªè³çåè¾¹çã</p>
</div>
<div>
<p>æ¤ææ¬å°ä¸è¢«è£åªè³çåè¾¹çã</p>
</div>
å¸å±å±é
èèä¸å示ä¾ï¼æ¤ç¤ºä¾æ¾ç¤ºäºå ç´ å¨åºç¨ä¸ä¸åºç¨å¸å±å±éæ¶å¦ä½è¡¨ç°ï¼
<div class="card" style="contain: layout;">
<h2>å¡ç 1</h2>
<div class="fixed"><p>åºå®ç 1</p></div>
<div class="float"><p>æµ®å¨ç 1</p></div>
</div>
<div class="card">
<h2>å¡ç 2</h2>
<div class="fixed"><p>åºå®ç 2</p></div>
<div class="float"><p>æµ®å¨ç 2</p></div>
</div>
<div class="card">
<h2>å¡ç 3</h2>
<!-- â¦â¦ -->
</div>
.card {
width: 70%;
height: 90px;
}
.fixed {
position: fixed;
right: 10px;
top: 10px;
background: coral;
}
.float {
float: left;
margin: 10px;
background: aquamarine;
}
第ä¸å¼ å¡çåºç¨äºå¸å±å±éï¼å ¶å¸å±è¢«ä»é¡µé¢å ¶ä½é¨åä¸éç¦»å¼æ¥ãæä»¬å¯ä»¥å¨é¡µé¢ä¸çå ¶ä»å°æ¹å¤ç¨è¿å¼ å¡çï¼æ éæ å¿éæ°è®¡ç®å ¶ä»å ç´ çå¸å±ã卿µ®å¨ä½ä¸å¡çè¾¹çéå æ¶ï¼é¡µé¢å ¶ä½é¨åçå ç´ ä¸åå½±åã彿µè§å¨éæ°è®¡ç®å å«å ç´ çåæ æ¶ï¼ä» ææ¤å ç´ è¢«éæ°è®¡ç®ã被å±éå ç´ ä¹å¤çä»»æå ç´ åæ ééæ°è®¡ç®ãæ¤å¤ï¼åºå®çå°å¡çç¨ä½å¸å±å®¹å¨ä¸ºèªèº«å®ä½ã
第äºå第ä¸å¼ å¡çæ å±éã第äºå¼ å¡çä¸åºå®ççå¸å±ä¸ä¸æä¸ºæ ¹å
ç´ ï¼å æ¤åºå®çç½®äºé¡µé¢å³ä¸è§ãä¸ç¬¬äºå¼ å¡çéå çæµ®å¨ä½å¯¼è´ç¬¬ä¸å¼ å¡çåºç°æå¤çå¸å±æ¼ç§»ï¼ç± <h2> å
ç´ çå®ä½å¯è§æ¤æ¼ç§»ãå½åºç°éæ°è®¡ç®æ¶ï¼è®¡ç®ä¸åªéäºå®¹å¨ãç±æ¤å½±åæ§è½ä¸å¹²æ°é¡µé¢å¸å±çå
¶ä½é¨åã
æ ·å¼å±é
æ ·å¼å±éå°è®¡æ°å¨åå¼å·çä½ç¨åéå¶ä¸ºè¢«å±éå
ç´ ãå¯¹äº CSS 计æ°å¨ï¼counter-increment å counter-set 屿§çä½ç¨å被éå¶ä¸ºæ¤å
ç´ ï¼ä¸å°å
ç´ è§ä¸ºå¨ææ¡£æ ¹é¨ã
å±éä¸è®¡æ°å¨
ä¸å示ä¾èå¯äºè®¡æ°å¨å¨åºç¨æ ·å¼å±éæ¶å¦ä½å·¥ä½ï¼
<ul>
<li>å
ç´ ç²</li>
<li>å
ç´ ä¹</li>
<li class="container">å
ç´ ä¸</li>
<li>å
ç´ ä¸</li>
<li>å
ç´ æ</li>
</ul>
body {
counter-reset: list-items;
}
li::before {
counter-increment: list-items;
content: counter(list-items) "ï¼";
}
.container {
contain: style;
}
è¥æ å±éï¼å计æ°å¨å°å¨æ¯ä¸ªå
ç´ ä¸ä» 1 å¢å å° 5ãæ ·å¼å±éå¯¼è´ counter-increment 屿§çä½ç¨å被éå¶ä¸ºå
ç´ åæ ï¼è®¡æ°å¨ä» 1 éæ°å¼å§ï¼
å±éä¸å¼å·
CSS å¼å·å类似影åï¼ä¸å¼å·ç¸å
³ç content å¼çä½ç¨å被éå¶ä¸ºæ¤å
ç´ ï¼
<!-- ææ ·å¼å±é -->
<span class="open-quote"
>å¤<span style="contain: style;"
><span class="open-quote">å
</span></span
></span
><span class="close-quote">é</span>
<br />
<!-- æ å±é -->
<span class="open-quote"
>å¤<span><span class="open-quote">å
</span></span></span
><span class="close-quote">é</span>
body {
quotes: "ã" "ã" "ã" "ã";
}
.open-quote:before {
content: open-quote;
}
.close-quote:after {
content: close-quote;
}
第ä¸ä¸ªéå¼å·å 为å±éèæ è§å
ä¾§ç span 并使ç¨å¤ä¾§ span çéå¼å·ï¼
è§è
| è§è |
|---|
| CSS Containment Module Level 2 > # contain-property > |
æµè§å¨å ¼å®¹æ§
åè§
- CSS å±é
- CSS 容卿¥è¯¢
- CSS 屿§
content-visibility - CSS 屿§
position