display: contents
https://caniuse.com/#feat=css-display-contentsWill make for far easier separation of style and structure, especially with flex/grid layouts.
display: contents
https://caniuse.com/#feat=css-display-contentsWill make for far easier separation of style and structure, especially with flex/grid layouts.
Widespread support for this value can't come soon enough!
<h1>Hi world!</h1>
<p>Lorem ipsum...</p>
<h2>Hi world!</h2>
<p>Lorem ipsum...</p>
<h1>Hi world!</h1>
<p>Lorem ipsum...</p>
Becomes this: <div class="h-group h1-group">
<h1>Hi world!</h1>
<p>Lorem ipsum...</p>
<div class="h-group h2-group">
<h2>Hi world!</h2>
<p>Lorem ipsum...</p>
</div>
</div>
<div class="h-group h1-group">
<h1>Hi world!</h1>
<p>Lorem ipsum...</p>
</div>
Now you can easily select any h2-level group (heading and elements "belonging" to that heading) by just using the `.h2-group` selector. To my knowledge, there is no way to do this with css selectors alone, so you need the divs, or some other element for grouping. But layout might be getting screwed up because of those divs, so add `.h-group { display: contents; }` and it's like those divs were never there to begin with. Problem solved!It's possible that there are other examples where this isn't possible, but I can't think of any right now. Tags can also be nested, and levels can be selected using CSS dsecendant and child combinators.
(This obviously wouldn't change OP's point)
In any case, the point of course is that at times these groups are added to create a kinship between elements that is otherwise not possible to express via css selections, or because it just makes manipulation easier, and you don't want these grouping elements to participate in layout but the children should. In those cases, `display: contents` is the knight in shining armor.
There's no way of doing this with css selectors alone, to my knowledge, you need to wrap the elements in some container.
In an ideal world HTML would be exclusively semantic content (eg, no div elements) and CSS would be exclusively styling (eg, no contents: property). display: contents; does allow us to get a little closer to that ideal.
<div display="grid">
<h2>one line</h2><img />
<h2>text that spans two lines</h2><img />
</div>
With this it could be: <div display="grid">
<Card style="display:contents"><h2>1 line</h2><img /></Card>
<Card style="display:contents"><h2>text that spans two lines</h2><img /></Card>
</div>
But the rub is that you can't both make the "Card" look like a card, and make all the h2's also be the same (minimal) height.display-contents makes this simple. The Javascript workaround for MSIE11 is not so nice.
2. It can sometimes be helpful to group/ungroup elements for responsive layouts.
3. It can be difficult to create semantic HTML (if you care about that sort of thing), because the structure in fact places a huge role in the display.