Микромакеты

Когда мы думаем о макетах, мы часто представляем себе дизайн страницы в целом. Но более мелкие компоненты внутри страницы могут иметь свои собственные, самодостаточные макеты.

В идеале, эти макеты на уровне компонентов должны автоматически подстраиваться под свое положение на странице. Могут возникнуть ситуации, когда вы не знаете, будет ли компонент размещен в основной колонке контента, в боковой панели или и там, и там. Не зная наверняка, где окажется компонент, необходимо убедиться, что он может адаптироваться к своему контейнеру.

Двухколоночная компоновка: одна широкая, другая узкая. Медиаобъекты располагаются по-разному в зависимости от того, находятся ли они в широкой или узкой колонке.

Сетка

CSS-сетка используется не только для разметки страниц. Она также хорошо подходит для компонентов, которые в неё входят.

В этом примере псевдоэлементы ::before и ::after создают декоративные линии по обеим сторонам заголовка. Сам заголовок представляет собой контейнер в виде сетки. Отдельные элементы расположены таким образом, что линии всегда заполняют доступное пространство.

h1 {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: 1em;
}
h1::before,
h1::after {
  content: "";
  border-top: 0.1em double black;
  align-self: center;
}
Инструменты разработчика в Firefox отображают наложение сетки.Инструменты разработчика в Chrome отображают наложение сетки.
В настольных браузерах, таких как Firefox и Chrome, есть инструменты разработчика, которые позволяют отображать сетку и области, наложенные на ваш дизайн.

Узнайте, как проверять макеты сетки в инструментах разработчика Chrome.

Flexbox

Как следует из названия, flexbox позволяет сделать ваши компоненты гибкими. Вы можете указать, какие элементы в вашем компоненте должны иметь минимальный или максимальный размер, а остальные элементы будут подстраиваться под него.

В этом примере изображение занимает четверть доступного пространства, а текст — остальные три четверти. Но размер изображения никогда не превышает 200 пикселей.

.media {
  display: flex;
  align-items: center;
  gap: 1em;
}
.media-illustration {
  flex: 1;
  max-inline-size: 200px;
}
.media-content {
  flex: 3;
}
Инструменты разработчика в Firefox, отображающие наложение flexbox.Инструменты разработчика в Chrome отображают наложение flexbox.
Инструменты разработчика в Firefox и Chrome помогут вам визуализировать форму ваших компонентов Flexbox.

Узнайте, как проверять макеты flexbox в инструментах разработчика Chrome.

Запросы контейнеров

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

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

При работе с макетами страниц ширина контейнера известна , поскольку контейнером является область просмотра браузера; медиа-запросы сообщают размеры контейнера на уровне страницы.

Для получения информации о размерах любого контейнера используйте запросы к контейнерам .

Для начала определим, какие элементы выступают в роли контейнеров.

main,
aside {
  container-type: inline-size;
}

Это означает, что вам нужно запросить значение по встроенной оси. Для англоязычных документов это горизонтальная ось. Вы будете изменять стили в зависимости от ширины контейнера.

Если компонент находится внутри одного из этих контейнеров, вы можете применять стили аналогично тому, как вы применяете медиа-запросы.

.media-illustration {
  max-width: 200px;
  margin: auto;
}

@container (min-width: 25em) {
  .media {
    display: flex;
    align-items: center;
    gap: 1em;
  }

  .media-illustration {
    flex: 1;
  }

  .media-content {
    flex: 3;
  }
}

Если медиаобъект находится внутри контейнера шириной менее 25em , стили flexbox не применяются. Изображение и текст отображаются вертикально.

Однако, если ширина содержащего элемента превышает 25em , изображение и текст отображаются рядом.

С помощью контейнерных запросов вы можете стилизовать компоненты независимо друг от друга. Вы можете писать правила, основанные на ширине содержащего элемента; ширина области просмотра больше не имеет значения.

Два контейнера разного размера.

Объединение запросов

Для разметки страницы можно использовать медиа-запросы, а для компонентов внутри страницы — контейнерные запросы.

Здесь общая структура страницы включает main элемент и aside элемент. Внутри обоих элементов находятся медиаобъекты.

<body>
  <main>
     <div class="media">…</div>
     <div class="media">…</div>
  </main>
  <aside>
     <div class="media">…</div>
  </aside>
</body>

Медиа-запрос применяет сеточную компоновку к main и aside элементам, когда ширина области просмотра превышает 45em .

@media (min-width: 45em) {
  body {
    display: grid;
    grid-template-columns: 3fr 1fr;
  }
}

Правило запроса контейнера для медиаобъектов остается прежним: горизонтальная компоновка flexbox применяется только в том случае, если содержащий элемент шире 25em .

Двухколоночная компоновка, одна широкая, другая узкая. Медиаобъекты располагаются по-разному в зависимости от того, находятся ли они в широкой или узкой колонке.

Контейнерные запросы кардинально меняют представление о микромакетах. Ваши компоненты могут быть самодостаточными и независимыми от размера области просмотра браузера.

Проверьте свое понимание

Проверьте свои знания в области микропланировки.

И сетка, и flexbox полезны для микромакетов?

Истинный
🎉 Правильно!
ЛОЖЬ
Неверно. И сетка, и flexbox очень полезны, даже для самых маленьких макетов.

Ранее вы изучали макромакеты на уровне страницы. Теперь вы знаете о микромакетах на уровне компонентов.

Далее вы углубитесь в самые основы вашего контента и узнаете, как сделать ваши изображения адаптивными. Сначала вы познакомитесь с адаптивной типографикой .