У вас уже есть решение, с не идеальной поддержкой браузера, но в любом случае работающее, то есть display: content
Вам нужно обернуть ваши элементы во вспомогательный div, я установил их в класс карта .Затем заставьте карту исчезнуть из слоя с отображением: content:
.grid {
display: grid;
grid-gap: 10px;
grid-auto-columns: 1fr;
grid-auto-flow: dense;
}
.card {
display: contents;
}
.card:nth-child(odd) * {
grid-column-start: 1;
}
.card:nth-child(even) * {
grid-column-start: 2;
}
@media screen and ( min-width: 1300px) {
.card:nth-child(3n + 0) * {
grid-column-start: 3;
}
.card:nth-child(3n + 1) * {
grid-column-start: 1;
}
.card:nth-child(3n + 2) * {
grid-column-start: 2;
}
}
<div class="grid">
<div class="card">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100">
<p class="c">text
</p>
<button class="d">Button</button>
</div>
<div class="card">
<h2 class="a">Header 2 is longer and may span multiple lines</h2>
<img class="b" src="https://placekitten.com/400/100">
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est.
</p>
<button class="d">Button</button>
</div>
<div class="card">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100">
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est, non ultricies lectus placerat eget.
</p>
<button class="d">Button</button>
</div>
<div class="card">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100">
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est, non ultricies lectus placerat eget. Suspendisse pulvinar arcu massa, quis
varius velit facilisis tincidunt. Proin sed cursus orci.
</p>
<button class="d">Button</button>
</div>
<div class="card">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100">
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</p>
<button class="d">Button</button>
</div>
</div>
Я просто упустил самое простое решение:
Поскольку у вас уже есть плоский HTML и вы собираетесь использовать медиа-запросы, вы можете простоиспользуйте ту же идею, (nth-селекторы), но на плоской HTMl
.grid {
display: grid;
grid-gap: 10px;
grid-auto-flow: dense;
grid-auto-rows: 1fr;
}
.card {
display: contents;
}
h2,
img,
p,
button {
grid-column-start: 1;
}
h2:nth-of-type(even),
img:nth-of-type(even),
p:nth-of-type(even),
button:nth-of-type(even) {
grid-column-start: 2;
}
@media screen and ( min-width: 1300px) {
h2:nth-of-type(3n + 1),
img:nth-of-type(3n + 1),
p:nth-of-type(3n + 1),
button:nth-of-type(3n + 1) {
grid-column-start: 1;
}
h2:nth-of-type(3n + 2),
img:nth-of-type(3n + 2),
p:nth-of-type(3n + 2),
button:nth-of-type(3n + 2) {
grid-column-start: 2;
}
h2:nth-of-type(3n),
img:nth-of-type(3n),
p:nth-of-type(3n),
button:nth-of-type(3n) {
grid-column-start: 3;
}
}
<div class="grid">
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">text
</p>
<button class="d">Button</button>
<h2 class="a">Header 2 is longer and may span multiple lines</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est.
</p>
<button class="d">Button</button>
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est, non ultricies lectus placerat eget.
</p>
<button class="d">Button</button>
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis et cursus ligula. Maecenas non pharetra dui, eu tincidunt mi. Vivamus vitae luctus risus. Etiam vehicula sem est, non ultricies lectus placerat eget. Suspendisse pulvinar arcu massa, quis
varius velit facilisis tincidunt. Proin sed cursus orci.
</p>
<button class="d">Button</button>
<h2 class="a">Header 1</h2>
<img class="b" src="https://placekitten.com/400/100" />
<p class="c">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</p>
<button class="d">Button</button>
</div>