CSS Containmentã®`size`ããããã£ããã¹ã¿ãŒããã³ã³ããã®å¯žæ³ãåé¢ããŠã¬ã³ããªã³ã°æ§èœãåäžãããã¬ã¹ãã³ã·ãã§è€éãªWebã¢ããªã®äºæž¬å¯èœãªã¬ã€ã¢ãŠããäœæããŸãã
CSS Containmentã®ãµã€ãºèšç®ïŒã³ã³ããã®å¯žæ³ãåé¢ããŠäºæž¬å¯èœãªã¬ã€ã¢ãŠããå®çŸ
é²åãç¶ããWebéçºã®äžçã«ãããŠãCSS Containmentã¯ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãæé©åããããäºæž¬å¯èœã§ä¿å®ããããã¬ã€ã¢ãŠããäœæããããã®åŒ·åãªããŒã«ã»ãããæäŸããŸããContainmentã®æ§ã ãªå€ã®äžã§ãã`size`ã¯ã³ã³ããã®å¯žæ³ãåé¢ããäžã§éèŠãªåœ¹å²ãæãããŸãããã®èšäºã§ã¯ã`contain: size`ã®è€éãªè©³çްã«è¿«ãããã®å©ç¹ããŠãŒã¹ã±ãŒã¹ããããŠã¬ã³ããªã³ã°ããã»ã¹ã«ã©ã®ããã«åœ±é¿ãäžããããæ¢ããŸãã
CSS Containmentãçè§£ãã
CSS Containmentã䜿çšãããšãããã¥ã¡ã³ãã®äžéšãç¬ç«ããã¬ã³ããªã³ã°ã³ã³ããã¹ãã«åé¢ã§ããŸãããã®åé¢ã«ã¯ãããã€ãã®äž»èŠãªå©ç¹ããããŸãïŒ
- ããã©ãŒãã³ã¹ã®æé©åïŒ ç¹å®ã®èŠçŽ ã«ã¬ã³ããªã³ã°ãå°ã蟌ããããšã§ããã©ãŠã¶ã¯äžèŠãªåèšç®ãåæç»ãåé¿ã§ããç¹ã«è€éãªã¬ã€ã¢ãŠãã«ãããŠå€§å¹ ãªããã©ãŒãã³ã¹åäžãæåŸ ã§ããŸãã
- ã¬ã€ã¢ãŠãã®äºæž¬å¯èœæ§ïŒ Containmentã«ãããå°ã蟌ããããèŠçŽ å ã®å€æŽããã®å€åŽã®èŠçŽ ã«åœ±é¿ãäžããªãããšãä¿èšŒãããã¬ã€ã¢ãŠããããäºæž¬å¯èœã§ãããã°ãããããªããŸãã
- ä¿å®æ§ã®åäžïŒ è€éãªã¬ã€ã¢ãŠããããå°ããªãå°ã蟌ããããã³ã³ããŒãã³ãã«åå²ããããšã§ãã³ãŒãã®æ§æãæ¹åãããã¢ããªã±ãŒã·ã§ã³ã®ä¿å®ãšæŽæ°ã容æã«ãªããŸãã
`contain`ããããã£ã¯ããã€ãã®å€ãåãå ¥ãããããããã¬ã³ããªã³ã°ããã»ã¹ã®ç°ãªãåŽé¢ãå¶åŸ¡ããŸãïŒ
- `none`: èŠçŽ ã«Containmentã¯é©çšãããŸããïŒããã©ã«ãïŒã
- `layout`: èŠçŽ ã¯æ°ããã¬ã€ã¢ãŠããã©ãŒãããã³ã³ããã¹ãã確ç«ããŸãã
- `paint`: èŠçŽ ã¯ãã®åå«èŠçŽ ãã¯ãªããããŸãã
- `size`: èŠçŽ ã®ãµã€ãºã¯ãã®ã³ã³ãã³ãããç¬ç«ããŸãã
- `style`: èŠçŽ èªäœãšãã®åå«èŠçŽ ä»¥å€ã«ã圱é¿ãåãŒãå¯èœæ§ã®ããããããã£ã«å¯ŸããŠé©çšãããŸãã
- `content`: `layout paint style`ãšåçã§ãã
- `strict`: `layout paint size style`ãšåçã§ãã
`contain: size`ã®è©³çŽ°è§£èª¬
`contain: size`ã¯ãèŠçŽ ã®ãµã€ãºããã®ã³ã³ãã³ãããç¬ç«ããŠããããšããã©ãŠã¶ã«æç€ºããŸããããã¯ãèŠçŽ ããã®ã³ã³ãã³ãã®ãµã€ãºããŒãã§ãããã®ããã«ã¬ã³ããªã³ã°ãããããšãæå³ããŸãããã©ãŠã¶ã¯ãæç€ºçã«æå®ããã寞æ³ïŒäŸïŒ`width`ã`height`ããããã£ïŒãŸãã¯å åšçãªå¯žæ³ã䜿çšããŠèŠçŽ ã®ãµã€ãºã決å®ããŸããã©ã¡ããå©çšã§ããªãå Žåãå¹ ãšé«ãã0ã§ãããã®ããã«ã¬ã³ããªã³ã°ãããŸãã
`contain: size`ã®ä»çµã¿
`contain: size`ãé©çšããããšããã©ãŠã¶ã¯æ¬è³ªçã«èŠçŽ ã®ãµã€ãºèšç®ãåé¢ããŸãããã®åé¢ã«ã¯ãããã€ãã®éèŠãªçµæã䌎ããŸãïŒ
- æç€ºçãªå¯žæ³ãåªå ãããïŒ èŠçŽ ã®`width`ãš`height`ãæç€ºçã«èšå®ããå Žåããã©ãŠã¶ã¯ã³ã³ãã³ãã«é¢ä¿ãªããããã®å€ã䜿çšããŸãã
- å©çšå¯èœãªå Žåã¯å åšçãªå¯žæ³ã䜿çšãããïŒ æç€ºçãªå¯žæ³ãæå®ãããŠããªãå Žåããã©ãŠã¶ã¯èŠçŽ ã®å åšçãªå¯žæ³ïŒäŸïŒç»åã®èªç¶ãªãµã€ãºããå¹ ãé«ãã®å¶çŽããªãããã¹ãã³ã³ãã³ãã®ãµã€ãºïŒã䜿çšããŸãã
- æ å ±ããªãå Žåã¯ãŒã寞æ³ã«ãªãïŒ æç€ºçãªå¯žæ³ãå åšçãªå¯žæ³ãå©çšã§ããªãå ŽåãèŠçŽ ã¯å¹ ãšé«ãããŒãã§ã¬ã³ããªã³ã°ãããŸããããã¯ãæ éã«æ±ããªããšäºæãã¬ã¬ã€ã¢ãŠãã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
äŸïŒåºæ¬çãª`contain: size`
次ã®HTMLãèããŠã¿ãŸãããïŒ
<div class="container">
<p>This is some content inside the container.</p>
</div>
ãããŠã察å¿ããCSSã§ãïŒ
.container {
contain: size;
width: 300px;
height: 200px;
border: 1px solid black;
}
ãã®äŸã§ã¯ã`.container`èŠçŽ ã«`contain: size`ãé©çšãããŠããŸãã`width`ãš`height`ãæç€ºçã«èšå®ããŠãããããã³ã³ããã¯å éšã®ã³ã³ãã³ãéã«é¢ä¿ãªããåžžã«å¹ 300pxãé«ã200pxã«ãªããŸããã³ã³ãã³ãããããã®å¯žæ³ãè¶ ããå ŽåããªãŒããŒãããŒããŸãã
äŸïŒæç€ºçãªå¯žæ³ããªãå Žå
ã§ã¯ãCSSããæç€ºçãª`width`ãš`height`ãåé€ããŠã¿ãŸãããïŒ
.container {
contain: size;
border: 1px solid black;
}
ãã®å Žåãæç€ºçãªå¯žæ³ãæäŸããŠãããã`contain: size`ã®ããã«ã³ã³ãã³ãããµã€ãºèšç®ã«å¯äžããªããããã³ã³ããã®å¹ ãšé«ãã¯ãŒãã«ãªããŸããèŠçŽ ã¯äºå®äžæããããŸããŸãã
`contain: size`ã®ãŠãŒã¹ã±ãŒã¹
`contain: size`ã¯ãèŠçŽ ã®ãµã€ãºããã®ã³ã³ãã³ãããç¬ç«ããŠå¶åŸ¡ãããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã以äžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ãããã€ã玹ä»ããŸãïŒ
1. ãã¬ãŒã¹ãã«ããŒèŠçŽ
`contain: size`ã䜿çšããŠãéåæã§èªã¿èŸŒãŸããã³ã³ãã³ãã®ããã®ã¹ããŒã¹ã確ä¿ãããã¬ãŒã¹ãã«ããŒèŠçŽ ãäœæã§ããŸããããã«ãããã³ã³ãã³ããæçµçã«è¡šç€ºããããšãã®ã¬ã€ã¢ãŠãã·ãããé²ããŸãã
äŸïŒ ãã¬ãŒã¹ãã«ããŒä»ãã§ç»åãèªã¿èŸŒã
<div class="image-container">
<img id="my-image" src="" alt="Placeholder Image">
</div>
.image-container {
width: 400px;
height: 300px;
contain: size;
background-color: #f0f0f0;
}
#my-image {
width: 100%;
height: 100%;
object-fit: cover; /* Ensures the image fills the container */
}
ãã®äŸã§ã¯ã`.image-container`ã¯åºå®ã®å¹ ãšé«ããæã¡ã`contain: size`ãé©çšãããŠããŸãããã¬ãŒã¹ãã«ããŒã®èæ¯è²ã¯ãç»åã®èªã¿èŸŒã¿äžã«èŠèŠçãªãã£ãŒãããã¯ãæäŸããŸããç»åãèªã¿èŸŒãŸããJavaScriptã䜿çšããŠ`img`ã¿ã°ã®`src`屿§ãåçã«æŽæ°ããããšãã¬ã€ã¢ãŠãã¯å®å®ãããŸãŸã«ãªããŸãã
2. ã¢ã¹ãã¯ãæ¯ã®å¶åŸ¡
`contain: size`ãä»ã®CSSãã¯ããã¯ãšçµã¿åãããããšã§ãã³ã³ãã³ãã«é¢ä¿ãªãèŠçŽ ã®ç¹å®ã®ã¢ã¹ãã¯ãæ¯ãç¶æã§ããŸãã
äŸïŒ 16:9ã®ã¢ã¹ãã¯ãæ¯ãç¶æãã
<div class="aspect-ratio-container">
<div class="content">
<p>Content that needs to fit within the aspect ratio.</p>
</div>
</div>
.aspect-ratio-container {
width: 100%;
contain: size;
position: relative;
}
.aspect-ratio-container::before {
content: "";
display: block;
padding-bottom: 56.25%; /* 16:9 aspect ratio (9 / 16 * 100) */
}
.aspect-ratio-container .content {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
ããã§ã¯ã`::before`ç䌌èŠçŽ ã`padding-bottom`ã䜿çšããŠã¢ã¹ãã¯ãæ¯ãäœæããŠããŸãã`contain: size`ã¯ãã³ã³ããã®ãµã€ãºã`.content`èŠçŽ å ã®ã³ã³ãã³ãã§ã¯ãªããç䌌èŠçŽ ã®`width`ãš`padding-bottom`ã«ãã£ãŠæ±ºå®ãããããšãä¿èšŒããŸãããã®ã¢ãããŒãã«ãããã³ã³ãã³ãã倿ŽãããŠãã¢ã¹ãã¯ãæ¯ãç¶æãããŸãã
3. ä»®æ³åãªã¹ãã«ããããã©ãŒãã³ã¹ã®æé©å
ä»®æ³åãªã¹ãïŒäŸïŒè¡šç€ºãããŠããã¢ã€ãã ã®ã¿ãã¬ã³ããªã³ã°ãããªã¹ãïŒã§ã¯ã`contain: size`ã¯ãããã€ãã®ã¢ã€ãã ã倿Žããããšãã«ãã©ãŠã¶ããªã¹ãå šäœã®ã¬ã€ã¢ãŠããåèšç®ããã®ãé²ãããšã§ãããã©ãŒãã³ã¹ãåäžãããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒ ä»®æ³åãªã¹ãã®ã¢ã€ãã ãäœæãã
<div class="list-item">
<p>Item content here.</p>
</div>
.list-item {
width: 100%;
height: 50px; /* Fixed height for each item */
contain: size;
}
åãªã¹ãã¢ã€ãã ã«åºå®ã®é«ããèšå®ãã`contain: size`ãé©çšããããšã§ãåã¢ã€ãã ã®ãµã€ãºèšç®ãåé¢ããŸããããã«ããããã©ãŠã¶ã¯è¡šç€ºãããŠããã¢ã€ãã ã®ã¿ãæŽæ°ããã°ããããã倧ããªãªã¹ããã¹ã¯ããŒã«ããéã®ã¬ã€ã¢ãŠãèšç®æéãå€§å¹ ã«åæžã§ããŸãã
4. è€éãªã³ã³ããŒãã³ãã«ãããã¬ã€ã¢ãŠãäºæž¬å¯èœæ§ã®åäž
ãã¹ããããèŠçŽ ãåçã³ã³ãã³ããæã€è€éãªUIã³ã³ããŒãã³ãã«ãããŠã`contain: size`ã¯ãã³ã³ããŒãã³ãã®ãµã€ãºããã®åèŠçŽ ã®å€æŽã«åœ±é¿ãããªãããã«ããããšã§ãã¬ã€ã¢ãŠãã®äºæž¬å¯èœæ§ãåäžãããããšãã§ããŸãã
äŸïŒ ããããŒãšããã£ãæã€ã«ãŒãã³ã³ããŒãã³ã
<div class="card">
<div class="card-header">
<h2>Card Title</h2>
</div>
<div class="card-body">
<p>Card content here.</p>
</div>
</div>
.card {
width: 300px;
height: 200px;
border: 1px solid #ccc;
contain: size;
}
.card-header {
padding: 10px;
background-color: #f0f0f0;
}
.card-body {
padding: 10px;
}
`contain: size`ã䜿çšãããšãã«ãŒãã®å¯žæ³ã¯ããããŒãšããã£å ã®ã³ã³ãã³ãã«é¢ä¿ãªãã300x200ãã¯ã»ã«ã«åºå®ãããŸããããã«ããã¬ã€ã¢ãŠããç°¡çŽ åãããã³ã³ãã³ããæŽæ°ããããšãã«ã«ãŒãã®ãµã€ãºãäºæãã倿Žãããã®ãé²ããŸãã
`contain: size`ãšä»ã®Containmentå€ã®çµã¿åãã
`contain: size`ã¯ä»ã®Containmentå€ãšå¹æçã«çµã¿åãããããšã§ãããå æ¬çãªã¬ã³ããªã³ã°ã®åé¢ãå®çŸã§ããŸããäŸãã°ã`contain: layout`ã`contain: paint`ãšçµã¿åãããŠãå®å šã«ç¬ç«ããã¬ã³ããªã³ã°ã³ã³ããã¹ããäœæã§ããŸãã
äŸïŒ`contain: content`ã®äœ¿çš
.container {
contain: content;
width: 400px;
height: 300px;
border: 1px solid blue;
}
`contain: content`ã¯`contain: layout paint style`ã®ã·ã§ãŒããã³ãã§ããæç€ºçãª`width`ãš`height`ãšå ±ã«äœ¿çšãããšãã³ã³ããã®ã¬ã³ããªã³ã°ã广çã«åé¢ããŸããã³ã³ããå ã®ãããªã倿Žããã³ã³ããå€ã®èŠçŽ ã®ã¬ã€ã¢ãŠããæç»ãã¹ã¿ã€ã«ã«åœ±é¿ãäžããŸããã
äŸïŒ`contain: strict`ã®äœ¿çš
.container {
contain: strict;
width: 400px;
height: 300px;
border: 1px solid green;
}
`contain: strict`ã¯`contain: layout paint size style`ã®ã·ã§ãŒããã³ãã§ããããã¯æãå®å šãªåœ¢ã®ContainmentãæäŸããŸãããã©ãŠã¶ã¯èŠçŽ ãå®å šã«ç¬ç«ããã¬ã³ããªã³ã°ã³ã³ããã¹ããšããŠæ±ãããã®ãµã€ãºãã¬ã€ã¢ãŠããæç»ãã¹ã¿ã€ã«ã¯ãã¹ãŠããã¥ã¡ã³ãã®ä»ã®éšåããåé¢ãããŸãã
èæ ®äºé ãšæœåšçãªèœãšã穎
`contain: size`ã¯å€§ããªå©ç¹ãæäŸããŸãããæœåšçãªåé¡ãèæ ®äºé ã«æ³šæããããšãéèŠã§ãïŒ
- ãªãŒããŒãããŒïŒ ã³ã³ãã³ããæå®ããã寞æ³ãè¶ ãããšããªãŒããŒãããŒãçºçããŸãããªãŒããŒãããŒã®åŠçæ¹æ³ãå¶åŸ¡ããããã«`overflow`ããããã£ïŒäŸïŒ`overflow: auto`ã`overflow: scroll`ã`overflow: hidden`ïŒã䜿çšããå¿ èŠããããããããŸããã
- ãŒã寞æ³ïŒ æç€ºçãªå¯žæ³ãå åšçãªå¯žæ³ãæäŸããªãå ŽåãèŠçŽ ã¯å¹ ãšé«ãããŒãã«ãªããŸãããããäºæããŠããªãå Žåãã¬ã€ã¢ãŠãã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
- ãã©ãŠã¶ã®äºææ§ïŒ `contain`ã¯çŸä»£ã®ãã©ãŠã¶ã§åºããµããŒããããŠããŸãããäºææ§ã確èªããå¿ èŠã«å¿ããŠå€ããã©ãŠã¶ã®ããã®ãã©ãŒã«ããã¯ãæäŸããããšã¯åžžã«è¯ãç¿æ £ã§ããCan I Useã®ãããªããŒã«ã䜿çšããŠãçŸåšã®ãµããŒãç¶æ³ã確èªã§ããŸãã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
`contain: size`ã䜿çšããéã¯ãã¢ã¯ã»ã·ããªãã£ãèæ ®ããããšãéèŠã§ããã³ã³ãã³ãããªãŒããŒãããŒãããé ãããããŠããŠããé害ãæã€ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããããã«ããŠãã ãããé©åãªARIA屿§ã䜿çšããŠãã³ã³ãã³ããšãã®æ§é ã«é¢ããæå³æ å ±ãæäŸããŸãã
`contain: size`ã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
`contain: size`ã广çã«äœ¿çšããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- åžžã«å¯žæ³ãæäŸããïŒ äºæãã¬ãŒã寞æ³ã®åé¡ãé¿ããããã«ã`contain: size`ãæã€èŠçŽ ã®`width`ãš`height`ãæç€ºçã«èšå®ããŸãã
- ãªãŒããŒãããŒãåŠçããïŒ æå®ããã寞æ³ãè¶ ããã³ã³ãã³ãã管çããããã«`overflow`ããããã£ã䜿çšããŸããã³ã³ããã¹ãã«åºã¥ããŠé©åãªãªãŒããŒãããŒã®åäœãéžæããŸãã
- 培åºçã«ãã¹ãããïŒ `contain: size`ãæåŸ ã©ããã«æ©èœããŠããããšã確èªããããã«ãããŸããŸãªã³ã³ãã³ããç»é¢ãµã€ãºã§ã¬ã€ã¢ãŠãããã¹ãããŸãã
- ä»ã®Containmentå€ãšäœµçšããïŒ ããå æ¬çãªã¬ã³ããªã³ã°åé¢ãå®çŸããããã«ã`contain: size`ãä»ã®Containmentå€ïŒäŸïŒ`contain: layout`ã`contain: paint`ã`contain: style`ïŒãšçµã¿åãããŸãã
- ã¢ã¯ã»ã·ããªãã£ãèæ ®ããïŒ `contain: size`ã䜿çšããŠããå Žåã§ããã³ã³ãã³ããé害ãæã€ãŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ããç¶ããããšãä¿èšŒããŸãã
çµè«
`contain: size`ã¯ãã³ã³ããã®å¯žæ³ãåé¢ããããäºæž¬å¯èœã§ããã©ãŒãã³ã¹ã®é«ãã¬ã€ã¢ãŠããäœæã§ãã匷åãªCSSããããã£ã§ãããã®ä»çµã¿ãšæœåšçãªãŠãŒã¹ã±ãŒã¹ãçè§£ããããšã§ãWebã¢ããªã±ãŒã·ã§ã³ãæé©åãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããã«å¹æçã«æŽ»çšã§ããŸããã¬ã€ã¢ãŠããå ç¢ã§å æ¬çã§ããããšãä¿èšŒããããã«ãåžžã«æç€ºçãªå¯žæ³ãæäŸãããªãŒããŒãããŒãé©åã«åŠçããã¢ã¯ã»ã·ããªãã£ãèæ ®ããããšãå¿ããªãã§ãã ãããWebéçºãé²åãç¶ããäžã§ã`contain: size`ã®ãããªCSS Containmentæè¡ãç¿åŸããããšã¯ãäžçäžã®ãŠãŒã¶ãŒã«ã·ãŒã ã¬ã¹ãªäœéšãæäŸãããçŸä»£çã§é«æ§èœãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãã