Я нахожусь в процессе изучения CSS Grid (я знаю, давно пора). Я поставил перед собой задачу преобразовать относительно стандартный макет на основе плавающей точки в сетку, но не могу понять последнюю часть.
Моя цель — создать макет, в котором контент (логотип + навигация и боковая панель + контент) расположен по центру с max-width. Например, логотип + навигация должны иметь max-width 600 пикселей. У меня также есть требование иметь сплошной фон заливки, покрывающий всю ширину окна просмотра (соответствующий высоте строки логотипа / навигации переменной высоты).
Первый столбец (логотип и боковая панель) должен уменьшаться, чтобы соответствовать их содержимому, поэтому ширина первого столбца равна ширине между логотипом и боковой панелью. Затем навигация/контент должен заполнить оставшееся пространство, разрешенное max-width.
Следующее - моя лучшая попытка. Ширина основного контента не заполняет max-width. Вместо этого ширина основного содержимого равна ширине логотипа + 250 пикселей (ширина определяется столбцами сетки).
Чего я надеюсь достичь, так это определить max-width логотипа + Nav для определенной ширины (скажем, 600 пикселей) и уменьшить размер столбца логотипа, чтобы он соответствовал его содержимому.
body {
margin: 40px;
}
.fill {
grid-column-start: 1;
grid-column-end: 6;
grid-row-start: 1;
grid-row-end: 1;
background-color: gray;
}
.logo {
grid-area: logo;
font-size: calc(1rem + 4vw);
}
.sidebar {
grid-area: sidebar;
}
.content {
grid-area: content;
}
.nav {
grid-area: nav;
text-align: right;
}
.footer {
grid-area: footer;
}
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: auto min-content 120px 120px auto;
grid-template-areas: "... logo nav nav ..." "... sidebar content content ..." "... footer footer footer ...";
background-color: #fff;
color: #444;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 10px;
}
.header,
.footer {
background-color: #999;
}<div class = "wrapper">
<div class = "fill"></div>
<div class = "box logo">Logo</div>
<div class = "box nav">Nav</div>
<div class = "box sidebar">Sidebar</div>
<div class = "box content">Content
<br /> More content than we had before so this column is now quite tall.</div>
<div class = "box footer">Footer</div>
</div>Возможно ли это с помощью CSS Grid, и если да, то как?
Возможный дубликат: stackoverflow.com/q/53110368/3597276






У вас может быть сетка с двумя столбцами с grid-template-columns: auto 1fr, чтобы первый столбец занимал ширину своего содержимого (такой же ширины, как ширина между логотипом и боковой панелью), а второй столбец занимал оставшееся пространство (обратите внимание, что я установил max-width: 600px на сетка-контейнер).
I also have a requirement of having a solid fill background covering the full-width of the viewport (matching the height of the variable height logo/nav row)
Для этого вы можете сделать следующее:
Сначала исправитьlogo и nav в первой строке, установив свойства grid-row и grid-column
Теперь используйте псевдоэлемент для wrapper, перекрывающего первую строку (но сложенный ниже, используя свойство z-index).
Установите свойство margin-left как calc(-50vw + 50%) и width как 100vw, чтобы растянуть сплошная заливка фона по области просмотра.
См. демо ниже:
body {
margin: 40px;
}
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: auto 1fr; /* 2-column grid */
/* background-color: #fff;*/
color: #444;
max-width: 600px; /* max-width of the layout */
margin: 0 auto; /* center in the viewport */
}
.logo {
font-size: calc(1rem + 4vw);
grid-row: 1; /* fix the logo in the first row */
grid-column: 1; /* fix the logo in the first column */
}
.nav {
text-align: right;
grid-row: 1; /* fix the nav in the first row */
grid-column: 2; /* fix the nav in the second column */
}
.footer {
grid-column: span 2; /* footer spans the two columns */
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 10px;
}
.header,
.footer {
background-color: #999;
}
.wrapper:after { /* position this in the first row */
content: '';
display: block;
grid-row: 1;
grid-column: 1/ 3;
width: 100vw;
margin-left: calc(-50vw + 50%);
background: gray;
z-index: -1; /* push it behind the first row */
}<div class = "wrapper">
<div class = "box logo">Logo</div>
<div class = "box nav">Nav</div>
<div class = "box sidebar">Sidebar</div>
<div class = "box content">Content
<br /> More content than we had before so this column is now quite tall.</div>
<div class = "box footer">Footer</div>
</div>Я бы по-прежнему хотел, чтобы сплошная заливка за логотипом/навигацией расширяла всю ширину страницы и соответствовала высоте строки логотипа/навигации. Это возможно?
Фиксирована ли высота строки логотипа/навигации?
@BrettDeWoody Я не думаю, что вы можете соответствовать высоте nav и в то же время заставить навигация + логотип иметь max-width, если, возможно, высота логотипа + навигации не фиксирована ...
@Michael_B Высота строки логотипа / навигации является переменной, как в демонстрации (на основе vw). В конце он будет содержать изображение, размер которого изменяется в зависимости от ширины экрана.
@kukkuz очень круто, я не знал, что псевдоэлементы будут работать с сеткой.
Горизонтальное центрирование контейнера сетки относительно просто. Используйте свойства гибкого выравнивания для родителя:
body {
display: flex;
justify-content: center;
}
Вы можете создать максимальную ширину контейнера сетки с помощью свойства max-width или flex.
.wrapper {
flex: 600px 0 1;
}
Это правило гласит:
flex-basis: 600px (начальная ширина)flex-grow: 0 (элемент не может расширяться за пределы 600 пикселей)flex-shrink: 1 (предмет может уменьшаться)Эта команда по существу эквивалентна max-width: 600px.
Вы написали:
The first column (logo and sidebar) should shrink to fit their content - so the first column is only as wide as the wider between logo/sidebar. The nav/content should then fill the remaining space allowed by the max-width.
Попробуй это:
.wrapper {
flex: 600px 0 1;
display: grid;
grid-template-columns: min-content 1fr;
}
body {
margin: 40px;
display: flex;
justify-content: center;
}
.wrapper {
flex: 600px 0 1;
display: grid;
grid-gap: 10px;
grid-template-columns: min-content 1fr;
grid-template-areas: "logo nav"
"sidebar content"
"footer footer";
background-color: #fff;
color: #444;
}
.logo {
grid-area: logo;
font-size: calc(1rem + 4vw);
}
.sidebar {
grid-area: sidebar;
}
.content {
grid-area: content;
}
.nav {
grid-area: nav;
text-align: right;
}
.footer {
grid-area: footer;
}
.fill {
background-color: gray;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 10px;
}
.header,
.footer {
background-color: #999;
}<div class = "wrapper">
<div class = "box logo">Logo</div>
<div class = "box nav">Nav</div>
<div class = "box sidebar">Sidebar</div>
<div class = "box content">Content
<br /> These lines wrap when the text hits 600px maximum width. These lines wrap when the text hits 600px maximum width. These lines wrap when the text hits 600px maximum width. These lines wrap when the text hits 600px maximum width. These lines wrap when the text hits 600px maximum width. These lines wrap when the text hits 600px maximum width.</div>
<div class = "box footer">Footer</div>
</div>
Ваш вопрос коренным образом изменился с момента публикации. Поэтому мой ответ сейчас неполный.