Українська

Опануйте CSS container queries для справді адаптивного вебдизайну. Дізнайтеся, як адаптувати макети на основі розміру контейнера, а не лише viewport, для бездоганного користувацького досвіду на всіх пристроях.

Розкриваємо адаптивний дизайн: повний посібник з CSS Container Queries

Роками адаптивний веб-дизайн покладався переважно на медіазапити, що дозволяло веб-сайтам адаптувати свій макет та стилі на основі ширини та висоти viewport (області перегляду). Хоча цей підхід є ефективним, іноді він може здаватися обмежуючим, особливо при роботі зі складними компонентами, які повинні адаптуватися незалежно від загального розміру екрана. Зустрічайте CSS Container Queries — потужний новий інструмент, який дозволяє елементам реагувати на розмір їхнього батьківського елемента-контейнера, а не на сам viewport. Це відкриває новий рівень гнучкості та точності в адаптивному дизайні.

Що таке CSS Container Queries?

CSS Container Queries — це функція CSS, яка дозволяє застосовувати стилі до елемента на основі розміру або інших характеристик його батьківського контейнера. На відміну від медіазапитів, які націлені на viewport, запити до контейнерів націлені на конкретний елемент. Це дає змогу створювати компоненти, які адаптують свої стилі залежно від доступного простору всередині їхнього контейнера, незалежно від розміру екрана.

Уявіть компонент картки, який відображається по-різному залежно від того, чи розміщений він у вузькій бічній панелі, чи в широкій основній області контенту. З медіазапитами вам, можливо, довелося б налаштовувати стиль картки на основі розміру екрана, що могло б призвести до невідповідностей. За допомогою запитів до контейнерів ви можете визначити стилі, які застосовуються саме тоді, коли контейнер картки досягає певної ширини, забезпечуючи послідовний та адаптивний досвід у різних макетах.

Чому варто використовувати Container Queries?

Запити до контейнерів пропонують кілька переваг над традиційними медіазапитами:

Як реалізувати CSS Container Queries

Реалізація запитів до контейнерів CSS включає два ключові кроки: визначення контейнера та написання запитів.

1. Визначення контейнера

Спочатку вам потрібно визначити елемент як *контейнер*. Це робиться за допомогою властивості container-type. Існує два основні значення для container-type:

Ви також можете використовувати container-name, щоб дати своєму контейнеру ім'я, що може бути корисним для націлювання на конкретні контейнери у ваших запитах. Наприклад:

.card-container {
  container-type: inline-size;
  container-name: cardContainer;
}

Цей код оголошує елемент з класом .card-container як контейнер. Ми вказуємо inline-size, щоб дозволити запити на основі ширини контейнера. Ми також дали йому ім'я cardContainer.

2. Написання запитів до контейнера

Після визначення контейнера ви можете писати запити до нього за допомогою правила @container. Синтаксис схожий на медіазапити:

@container cardContainer (min-width: 400px) {
  .card {
    flex-direction: row;
  }
  .card-image {
    width: 40%;
  }
  .card-content {
    width: 60%;
  }
}

Цей запит застосовує стилі у фігурних дужках лише тоді, коли контейнер з назвою cardContainer має мінімальну ширину 400 пікселів. Він націлений на елемент .card (ймовірно, дочірній елемент .card-container) і коригує його макет. Якщо контейнер вужчий за 400 пікселів, ці стилі не будуть застосовані.

Скорочений запис: Ви також можете використовувати скорочену версію правила `@container`, коли вам не потрібно вказувати ім'я контейнера:

@container (min-width: 400px) {
  /* Стилі, що застосовуються, коли контейнер має ширину щонайменше 400px */
}

Практичні приклади Container Queries

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

Приклад 1: Компонент картки

Цей приклад показує, як адаптувати компонент картки на основі ширини його контейнера. Картка буде відображати свій вміст в одній колонці, коли контейнер вузький, і у двох колонках, коли контейнер ширший.

HTML:

Зображення картки

Заголовок картки

Це зразок вмісту для картки.

Дізнатися більше

CSS:

.card-container {
  container-type: inline-size;
  border: 1px solid #ccc;
  margin-bottom: 20px;
}

.card {
  display: flex;
  flex-direction: column;
}

.card-image {
  width: 100%;
  height: auto;
}

.card-content {
  padding: 10px;
}

@container (min-width: 500px) {
  .card {
    flex-direction: row;
  }
  .card-image {
    width: 40%;
  }
  .card-content {
    width: 60%;
  }
}

У цьому прикладі .card-container оголошено як контейнер. Коли ширина контейнера менша за 500 пікселів, .card використовуватиме макет у вигляді стовпця, розміщуючи зображення та вміст вертикально. Коли ширина контейнера становить 500 пікселів або більше, .card переключиться на макет у вигляді рядка, відображаючи зображення та вміст поруч.

Приклад 2: Навігаційне меню

Цей приклад демонструє, як адаптувати навігаційне меню залежно від доступного простору. Коли контейнер вузький, пункти меню будуть відображатися у випадаючому списку. Коли контейнер ширший, пункти меню будуть відображатися горизонтально.

HTML:


CSS:

.nav-container {
  container-type: inline-size;
  background-color: #f0f0f0;
  padding: 10px;
}

.nav-container ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.nav-container li {
  margin-bottom: 5px;
}

.nav-container a {
  display: block;
  padding: 5px 10px;
  text-decoration: none;
  color: #333;
}

@container (min-width: 600px) {
  .nav-container ul {
    display: flex;
  }

  .nav-container li {
    margin-right: 10px;
    margin-bottom: 0;
  }

  .nav-container a {
    display: inline-block;
  }
}

У цьому прикладі .nav-container оголошено як контейнер. Коли ширина контейнера менша за 600 пікселів, пункти меню будуть відображатися як вертикальний список. Коли ширина контейнера становить 600 пікселів або більше, пункти меню будуть відображатися горизонтально за допомогою flexbox.

Приклад 3: Список товарів

Список товарів в інтернет-магазині може адаптувати свій макет на основі ширини контейнера. У менших контейнерах добре працює простий список із зображенням товару, назвою та ціною. У міру збільшення контейнера можна додавати додаткову інформацію, таку як короткий опис або рейтинг клієнтів, для покращення презентації. Це також дозволяє більш детальний контроль, ніж націлювання виключно на viewport.

HTML:

Товар 1

Назва товару 1

$19.99

Товар 2

Назва товару 2

$24.99

CSS:

.product-listing-container {
  container-type: inline-size;
  display: flex;
  flex-wrap: wrap;
}

.product-item {
  width: 100%;
  margin-bottom: 20px;
  border: 1px solid #eee;
  padding: 10px;
}

.product-item img {
  width: 100%;
  height: auto;
  margin-bottom: 10px;
}

.product-item h3 {
  margin-top: 0;
  font-size: 1.2em;
}

.product-item .price {
  font-weight: bold;
  color: #007bff;
}

@container (min-width: 400px) {
  .product-item {
    width: 50%;
    padding: 15px;
  }
}

@container (min-width: 768px) {
  .product-item {
    width: 33.33%;
  }
}

Цей CSS-код спочатку встановлює `product-listing-container` як контейнер. Для вузьких контейнерів (менше 400 пікселів) кожен товар займає 100% ширини. Коли контейнер стає ширшим за 400 пікселів, товари розташовуються у два стовпці. Понад 768 пікселів товари відображаються у три стовпці.

Підтримка браузерами та поліфіли

Container queries мають хорошу підтримку в сучасних браузерах, включаючи Chrome, Firefox, Safari та Edge. Однак старіші браузери можуть не підтримувати їх нативно.

Для підтримки старих браузерів можна використовувати поліфіл. Популярним варіантом є container-query-polyfill, який можна знайти на npm та GitHub. Поліфіли заповнюють прогалини для непідтримуваних функцій, дозволяючи вам використовувати запити до контейнерів навіть у старих браузерах.

Найкращі практики використання Container Queries

Ось кілька найкращих практик, які слід пам'ятати при використанні запитів до контейнерів:

Поширені помилки та як їх уникнути

Container Queries проти Media Queries: вибір правильного інструменту

Хоча запити до контейнерів пропонують значні переваги, медіазапити все ще мають своє місце в адаптивному дизайні. Ось порівняння, яке допоможе вам вирішити, який інструмент найкраще підходить для різних ситуацій:

Характеристика Container Queries Media Queries
Ціль Розмір контейнера Розмір viewport
Адаптивність На основі компонента На основі сторінки
Гнучкість Висока Середня
Дублювання коду Нижче Вище
Випадки використання Компоненти для повторного використання, складні макети Глобальні налаштування макета, базова адаптивність

Загалом, використовуйте container queries, коли вам потрібно адаптувати стиль компонента на основі розміру його контейнера, і використовуйте медіазапити, коли вам потрібно зробити глобальні налаштування макета на основі розміру viewport. Часто найкращим підходом є поєднання обох технік.

Майбутнє адаптивного дизайну з Container Queries

Container queries є значним кроком уперед в адаптивному дизайні, пропонуючи більшу гнучкість та контроль над тим, як елементи адаптуються до різних контекстів. Оскільки підтримка браузерами продовжує покращуватися, запити до контейнерів, ймовірно, стануть все більш важливим інструментом для веб-розробників. Вони дають можливість дизайнерам та розробникам створювати справді адаптивні та зручні для користувача веб-сайти, які забезпечують бездоганний досвід на всіх пристроях та розмірах екранів.

Висновок

CSS Container Queries — це потужне доповнення до інструментарію адаптивного дизайну. Дозволяючи елементам реагувати на розмір їхнього батьківського елемента, вони уможливлюють справжню компонентну адаптивність та відкривають нові рівні гнучкості та точності у веб-дизайні. Розуміючи, як ефективно впроваджувати та використовувати запити до контейнерів, ви можете створювати більш адаптивні, легкі у підтримці та зручні для користувача веб-сайти, які забезпечують кращий досвід для всіх.

Ресурси