Мою дилемму можно резюмировать следующим образом:
Семантически правильным HTML было бы вложение <header>
в элемент <article>
, поскольку заголовок принадлежит статье.
Однако, чтобы сетка CSS работала, <header>
должен быть дочерним элементом контейнера сетки.
Есть ли решение этого конфликта?
.layout {
display: grid;
grid-template-columns: 4fr 8fr;
grid-template-rows: auto 1fr;
gap: var(--grid-gap);
grid-template-areas:
"top top"
"menu content";
}
.layout nav {
border: 1px solid aqua;
grid-area: menu;
}
.layout main {
border: 1px solid green;
grid-area: content;
}
.layout header {
border: 1px solid red;
grid-area: top;
}
<div class="layout">
<nav>
<p>nav</p>
</nav>
<main>
<article>
<header>
<h1>Title</h1>
<p>Subtitle</p>
</header>
<p>Lorum ipsum content etc</p>
</article>
</main>
</div>
.layout {
display: grid;
grid-template-columns: 4fr 8fr;
grid-template-rows: auto 1fr;
gap: var(--grid-gap);
grid-template-areas:
"top top"
"menu content";
}
.layout nav {
border: 1px solid aqua;
grid-area: menu;
}
.layout main {
border: 1px solid green;
grid-area: content;
}
.layout header {
border: 1px solid red;
grid-area: top;
}
<div class="layout">
<nav>
<p>nav</p>
</nav>
<header>
<h1>Title</h1>
<p>Subtitle</p>
</header>
<main>
<article>
<p>Lorum ipsum content etc</p>
</article>
</main>
</div>
Это предварительное решение, но я уверен, что нужно перенести навигацию внутри статьи (статья также может иметь навигацию по оглавлению, так что это кажется неправильным).
.layout {
display: grid;
grid-template-columns: 4fr 8fr;
grid-template-rows: auto 1fr;
gap: var(--grid-gap);
grid-template-areas:
"top top"
"menu content";
}
.layout nav {
border: 1px solid aqua;
grid-area: menu;
}
.layout div{
border: 1px solid green;
grid-area: content;
}
.layout header {
border: 1px solid red;
grid-area: top;
}
<article class="layout">
<nav>
<p>nav</p>
</nav>
<header>
<h1>Title</h1>
<p>Subtitle</p>
</header>
<div>
<p>Lorum ipsum content etc</p>
</div>
</article>
Стив, твой несемантический подход несемантичен только в том случае, если у <article>
отсутствует заголовок... то есть <h2>
в данном контексте.
Нет проблем с тем, чтобы каждый <header>
на вашем сайте имел уникальный <h1>
на каждой странице. См. документы MDN для элемента заголовка
Так что я бы использовал этот подход.
Вы можете использовать display: contents
.layout {
display: grid;
grid-template-columns: 4fr 8fr;
grid-template-rows: auto 1fr;
gap: var(--grid-gap);
grid-template-areas:
"top top"
"menu content";
}
.layout nav {
border: 1px solid aqua;
grid-area: menu;
}
.layout main,
.layout article {
display: contents;
}
.layout header {
border: 1px solid red;
grid-area: top;
}
.layout article > p {
grid-area: content;
border: 1px solid green;
margin: 0;
}
<div class="layout">
<nav>
<p>nav</p>
</nav>
<main>
<article>
<header>
<h1>Title</h1>
<p>Subtitle</p>
</header>
<p>Lorum ipsum content etc</p>
</article>
</main>
</div>