Краткое руководство по CSS Grid и Flexbox

Автор: Мухаммед Арслан Сарвар

Введение

Flexbox помогает в создании одномерных макетов благодаря возможностям распределения пространства и выравнивания. Flexbox облегчает разработку отзывчивых макетов без использования float или позиционирования. Он значительно облегчил жизнь людям, использующим CSS.

Grid — это двухмерная модель макета, которая помогает создавать макет и выравнивать элементы в нем. Она предлагает систему компоновки с рядами и колонками, облегчая разработку веб-страниц без использования плавающих элементов и позиционирования.

Создание макетов с помощью CSS может быть непростым делом, и оно осложняется тем, что для проектирования макетов страниц используются и flexbox, и grid. Это руководство включает в себя некоторые различия между flexbox и grid. Мы рассмотрим, как решить, какой из них использовать при разработке макета.

В этом руководстве мы рассмотрим:

  • Управление дочерними элементами
  • Внутреннее и внешнее изменение размеров
  • Выравнивание блоков
  • Поведение Flexbox и Grid
  • Примеры использования
  • Поддержка браузеров

Предварительные условия

  • Основы верстки CSS
  • Базовое понимание CSS flexbox
  • Базовое понимание CSS grid

Управление дочерними элементами

Flexbox дает дочерним элементам большой контроль. В следующем примере у вас есть три дочерних элемента.

Если вы установите display: flex, это создаст гибкий макет. Вы заметите, что у вас нет трех одинаковых колонок. Это происходит по умолчанию при использовании flexbox, когда все рассчитывается для размера.

<div class="parent">
  <div class="child">
    <h3>Lorem ipsum</h3>
    <p>Lorem ipsum dolor sit.</p>
  </div>
  <div class="child">
    <h3>Lorem ipsum</h3>
    <p>Aestiae voluptatum expedita minima doloribus nemo ipsa vel. Ducimus nam, vel rerum quisquam illum maxime cumque.</p>
  </div>
  <div class="child">
    <h3>Lorem ipsum</h3>
    <p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Vitae molestiae voluptatum expedita minima doloribus nemo ipsa vel. Ducimus nam, </p>
  </div>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима
.parent {
  display: flex;
  width: 100%;
  max-width: 50rem;
  margin: 0 auto;
  padding: 1rem;
  border: 3px solid lime;
}

.child {
  padding: 1rem;
  border: 3px dashed red;
  background: white;
}
Войти в полноэкранный режим Выход из полноэкранного режима

Если вы хотите сделать три одинаковые колонки, вы не можете сделать это в родительском элементе. Вы должны сделать это в дочернем элементе как width:100% или flex:1. Это создаст три одинаковых дочерних элемента по ширине.

По сути, дочерние элементы имеют контроль, потому что родительский элемент делегирует его дочерним элементам в flexbox. Если дочерние элементы имеют одинаковое содержимое, они будут равны по размеру без применения width:100% или flex:1.

Поэтому нужно быть осторожным при использовании flexbox.

В отличие от flexbox, родитель полностью контролирует сетку. Давайте создадим приведенный выше макет с помощью сетки:

.parent {
  display: grid;
  width: 100%;
  max-width: 50rem;
  margin: 0 auto;
  padding: 1rem;
  border: 3px solid lime;
}
Войти в полноэкранный режим Выход из полноэкранного режима

Ничего не произойдет, если мы изменим display: flex на display: grid Нужно сделать что-то еще, чтобы все встало на свои места.

Итак, добавьте эту строку grid-template-columns: 1fr 1fr 1fr 1fr в родительский элемент. Тогда содержимое будет помещаться в созданные колонки. Когда вы создаете сетку, дочерние элементы сетки помещаются в эти ячейки.

Внутренние и внешние размеры

В CSS есть внутренние и внешние размеры, например:

.intrinsic-size {
    width: auto;
}
.extrinsic-size {
    width: 500px;
}
Войти в полноэкранный режим Выход из полноэкранного режима

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

При внешнем определении размера вы объявляете конкретную ширину. Flexbox в значительной степени полагается на внутренний размер элементов при увеличении и уменьшении.

<div class="product">
  <img src="https://assets.codepen.io/308367/betteroutreach-logo.avif">
  <div class="product__info">
    <h2>Product One</h2>
    <p>A collection of the best cold email templates ever sent</p>
    <div class="product__meta">
      <div>Free Options</div>
      <div>Email</div>
    </div>
  </div>
</div>

<div class="product">
  <img src="https://assets.codepen.io/308367/sliderule-logo.avif">
  <div class="product__info">
    <h2>Product two</h2>
    <p>The no-code rules engine for risk & fraud</p>
    <div class="product__meta">
      <div>Free</div>
      <div>Social Network</div>
    </div>
  </div>
</div>

<div class="product">
  <img src="https://assets.codepen.io/308367/warmy-logo.avif">
  <div class="product__info">
    <h2>Product three</h2>
    <p>Auto all-in-one tool to make your email channel reliable</p>
    <div class="product__meta">
      <div>Free Options</div>
      <div>Email</div>
    </div>
  </div>
</div>
Вход в полноэкранный режим Выход из полноэкранного режима
.product__meta {
  font-size: 12px;
  outline: 3px solid red;
  display: flex;
  gap: 1rem;
}

.product__meta > * {
  border: 3px solid lime;
}

body {
  display: grid;
  padding: var(--size-9);
  align-content: start;
  gap: var(--size-9);
  background: white;
}

.product {
  display: grid;
  gap: var(--size-5);
  grid-template-columns: 5rem 1fr;
}

.product__info {
  display: grid;
  grid-template-rows: min-content;
}
Войти в полноэкранный режим Выход из полноэкранного режима

Flexbox в первую очередь определяет размер содержимого. Когда вы делаете display:flex, размер элемента полностью основывается на размере содержимого.

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

В отличие от сетки, где каждая колонка занимает всю ширину, или вам нужно указать размер в родительском элементе.

.product__meta {
  font-size: 12px;
  outline: 3px solid red;
 // ====>
  display: grid;
 // <====
  gap: 1rem;
}
Вход в полноэкранный режим Выход из полноэкранного режима

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

Выравнивание полей

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

Flexbox можно использовать и в макете сетки. Если вам нужно создать макет с определенным выравниванием или распределением пространства, лучше использовать flexbox.

Поведение Flexbox и Grid

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

Поскольку flexbox основан на внутреннем размере, вы можете использовать flexbox, когда макет зависит от содержимого. С другой стороны, сетка полезна, когда содержимое зависит от макета.

Примеры использования

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

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

Используйте flexbox:

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

Используйте сетку:

  • Когда элементы должны располагаться в строках и столбцах.
  • Если макет формирует содержимое, используется подход «макет в первую очередь».
  • Когда вы хотите разработать комбинированный макет страницы.

Поддержка браузеров

Заключение

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

Подведем итог: когда следует использовать flexbox, а когда — сетку. Хотя вы можете разработать любой макет с использованием как flexbox, так и grid, вам нужно идти по пути наименьшего сопротивления.


Создавайте CRUD-приложения на основе React без ограничений

Создание CRUD-приложений включает в себя множество повторяющихся задач, отнимающих ваше драгоценное время разработки. Если вы начинаете с нуля, вам также придется внедрять собственные решения для критически важных частей приложения, таких как аутентификация, авторизация, управление состоянием и сетевое взаимодействие.

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

refine — это фреймворк на базе React с открытым исходным кодом для создания CRUD-приложений без ограничений.
Он может ускорить время разработки до 3 раз без ущерба для свободы стиля, кастомизации и рабочего процесса проекта.

refine является безголовым по своей конструкции и подключает 30+ бэкенд-сервисов «из коробки», включая пользовательские REST и GraphQL API.

Посетите GitHub-репозиторий refine для получения дополнительной информации, демонстраций, учебников и примеров проектов.

Оцените статью
devanswers.ru
Добавить комментарий