The two-value syntax of the CSS Display property
hacks.mozilla.org
hacks.mozilla.org
display: contents
https://caniuse.com/#feat=css-display-contentsWill make for far easier separation of style and structure, especially with flex/grid layouts.
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.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.
display-contents makes this simple. The Javascript workaround for MSIE11 is not so nice.
<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.
Widespread support for this value can't come soon enough!
I mean, this has always been a pain, and it's great that they are refactoring it. But the way a block behaves and the way it treats its children really are two distinct concepts.
If I have a list of items, I may very well want the same "outer display" and a different "content display", and yet, I'll have to define outer display everywhere.
Not a massive issue, but display: block flow could be a shorthand for display-outer: block; display-content: flow. In the same way margins or padding work...
But at one point there was a proposal to add two new properties, "display-inside" and "display-outside". And "display" was then redefined as a shorthand which combined both. This have been removed (https://www.w3.org/TR/css-display-3/#changes-wd) with this justification:
Removed display-inside, display-outside, and display-extras longhands, in favor of just making display multi-value. (This was done to impose constraints on what can be combined. Future levels of this specification may relax some or all of those restrictions if they become unnecessary or unwanted.)
It seems this is to restrict combinations with "display:none" and "display:content" and the various "display:table-*".