React の Fragment に近いイメージです
要素をまとめるための要素が存在するのに 無いものとして扱わせたいときに使います
例えば
<style>
.row {
display: flex;
}
</style>
<div class="row">
<div>A</div>
<div class="wrap">
<div>B</div>
<div>C</div>
</div>
<div>D</div>
</div>
div.row は display: flex なので横並びになりますが 2 つめの子要素は普通の div なのでここは縦並びになります
ABD
C
B と C を囲む div.wrap を無いものにしたいときは これに display: contents をつけます
これで
ABCD
という並びにできます
flex だと div.wrap も flex にすればいいのであまり必要なかもですが grid だともっと役立ちます
そんな display: contents ですが 完全に無いものとしては扱えず不便なときもあります
例えば 子要素にスタイルを当てるとき
<style>
.container > * {
margin-top: 10px;
}
.contents {
display: contents;
}
</style>
<div class="container">
<div>A</div>
<div class="contents">
<div>B</div>
<div>C</div>
</div>
<div>D</div>
</div>
こういうケースでは div.contents にマージンは効かず この div を透過して B と C にマージンが設定されることもありません
A と D にだけマージンが設定されます
React などをつかっていると div.container の子要素はコンポーネントで生成していて イベントをまとめて受け取るためなどで display: contents の要素でトップレベルをラップしてるとかもありえます
そうなるとこういう子要素に共通でスタイルを当てたいというときにうまく動かないケースが出てくるのですよね
CSS セレクタの > や + などでも display: contents は透過してくれるといいのですけど