CSS Grid Layout с максимальной шириной, центрированное содержимое

Я нахожусь в процессе изучения 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, и если да, то как?

Ваш вопрос коренным образом изменился с момента публикации. Поэтому мой ответ сейчас неполный.

Michael Benjamin 26.02.2019 18:30

Возможный дубликат: stackoverflow.com/q/53110368/3597276

Michael Benjamin 26.02.2019 18:30
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
6
2
5 933
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас может быть сетка с двумя столбцами с 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)

Для этого вы можете сделать следующее:

  1. Сначала исправитьlogo и nav в первой строке, установив свойства grid-row и grid-column

  2. Теперь используйте псевдоэлемент для wrapper, перекрывающего первую строку (но сложенный ниже, используя свойство z-index).

  3. Установите свойство 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>

Я бы по-прежнему хотел, чтобы сплошная заливка за логотипом/навигацией расширяла всю ширину страницы и соответствовала высоте строки логотипа/навигации. Это возможно?

Brett DeWoody 26.02.2019 03:26

Фиксирована ли высота строки логотипа/навигации?

Michael Benjamin 26.02.2019 03:40

@BrettDeWoody Я не думаю, что вы можете соответствовать высоте nav и в то же время заставить навигация + логотип иметь max-width, если, возможно, высота логотипа + навигации не фиксирована ...

kukkuz 26.02.2019 03:59

@Michael_B Высота строки логотипа / навигации является переменной, как в демонстрации (на основе vw). В конце он будет содержать изображение, размер которого изменяется в зависимости от ширины экрана.

Brett DeWoody 26.02.2019 10:20

@kukkuz очень круто, я не знал, что псевдоэлементы будут работать с сеткой.

Brett DeWoody 26.02.2019 18:05

Центрирование

Горизонтальное центрирование контейнера сетки относительно просто. Используйте свойства гибкого выравнивания для родителя:

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.


2-колоночный макет

Вы написали:

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>

Другие вопросы по теме