12-колоночна css-сітка

CSS-сітка (css-grid)

Сітка - розбиття сайту на колонки певної ширини. Сітка значно спрощує зробити сайт адаптивним.

Зазвичай використовують 12-колоночну сітку: об'єднуючи колонки можна легко отримати блоки з такими ширинами:
- 50% - об'єднуємо 6 колонок;
- 33% - об'єднуємо 4 колонки;
- 25% - об'єднуємо 3 колонки;
- 16.6% - об'єднуємо 2 колонки.

Кожен блок теж розбивається на 12 умовних колонок. Таким чином можна, наприклад, зробити 8 колонок: спочатку блок розбиваємо на 2 колонки по 50%, після чого кожен з них - по 25% на 4 колонки.

Сітка дуже важлива для адаптації сайтів під різні розширення.

Grid
Шаблон сайта і накладена на нього сітка.

Та не всі дизайни можна нормально натягнути на сітку.

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

Bad for grid
Не дуже вдалий дизайн для сітки.
Good for grid
Типовий сайт, зроблений під сітку.

Рядки та колонки

Розберемо як за допомогою CSS зробити сітку. Контент зазвичай огортається одним з наступних блоків:

.container { margin: 0 auto; width: 980px; }
.container-fluid { width: 100%; }
.container,
.container-fluid { padding: 0 16px 16px; }

Перший клас - для сайтів фіксованої ширини на десктопній версії сайту, другий - для сайту, що займає всю ширину екрана.

Фактично, це наш клас .resize.

 

Далі контент розбивається на строки, а строки в свою чергу - на колонки. Щось схоже на таблиці. Для цього нам знадобляться такі класи:

.row:after { content: ""; display: block; clear: both; }
.col-1 { float: left; width: 8.33333333%; }
.col-2 { float: left; width: 16.66666666%; }
.col-3 { float: left; width: 25%; }
.col-4 { float: left; width: 33.33333333%; }
.col-5 { float: left; width: 41.66666666%; }
.col-6 { float: left; width: 50%; }
.col-7 { float: left; width: 58.33333333%; }
.col-8 { float: left; width: 66.66666666%; }
.col-9 { float: left; width: 75%; }
.col-10 { float: left; width: 83.33333333%; }
.col-11 { float: left; width: 91.66666666%; }
.col-12 { float: left; width: 100%; }

Або більш оптимально:

.row:after { content: ""; display: block; clear: both; }
.col-1, .col-2, .col-3, ..., .col-11, .col-12 { float: left; }
.col-1 { width: 8.33333333%; }
.col-2 { width: 16.66666666%; }
.col-3 { width: 25%; }
.col-4 { width: 33.33333333%; }
.col-5 { width: 41.66666666%; }
.col-6 { width: 50%; }
.col-7 { width: 58.33333333%; }
.col-8 { width: 66.66666666%; }
.col-9 { width: 75%; }
.col-10 { width: 83.33333333%; }
.col-11 { width: 91.66666666%; }
.col-12 { width: 100%; }

Обережно можна використати шаблон:

.row:after { content: ""; display: block; clear: both; }
[class^="col-"], [class*=" col-"] { float: left; }
.col-1 { width: 8.33333333%; }
.col-2 { width: 16.66666666%; }
...

І тепер, щоб розбити головну частину сайту на 2 частини - контент і сайдбар, достатньо використати рядок і дві колонки:

<div class="row">
  <aside class="col-4">
    Бокова панель
  </aside>
  <main class="col-8>
    Основний контент
  </main>
</div>

Сума цифр в класах колонок не повинна перевищувати 12 (в ідеалі - дорівнювати цьому числу).

Горизонтальні відступи

Як правило, між колонками контенту мають бути відступи. Вони робляться хитрим образом:

.row { margin: 0 -16px; }
.col-* { padding: 0 16px; box-sizing: border-box; }

Така "магія" потрібна для того, щоб відступи між колонками завжди залишалася по 32 пікселя.

Увага! Через таку особливу комбінацію зовнішніх та внутрішніх відступів колонки можна вставляти тільки в рядки. В колонку можна вставити інший рядок. Рядки один в один вставляти не можна, колонки одну в одну - також не можна.

Правильно:

<div class="row">
  <div class="col-8">
    <div class="row">
      <div class="col-6">...</div>
      <div class="col-6">...</div>
    ...

Неправильно:

<div class="container-fluid">
  <div class="container">
    ...

<div class="row">
  <div class="row">
    ...

<div class="col-8">
  <div class="col-4">...</div>
  <div class="col-4">...</div>
  ...

Приклад верстки:

<div class="container-fluid">
  <div class="row">
    <section class="container">
      <div class="row">
        <aside class="col-4">
          Сайдбар
        </aside>
        <main class="col-8">
          <div class="row">
            <div class="col-8">
              <div class="row">
                <div class="col-6">Колонка 1</div>
                <div class="col-6">Колонка 2</div>
              </div>
            </div>
            <div class="col-4">Бокова панелька</div>
          </div>
        </main>
      </div>
    </section>
  </div>
</div>

Адаптивність

Нехай у нас на сайті є 12 блоків, розбиті на 4 колонки, при зменшенні ширини екрану необхідно перетворити спочатку на 3 колонки, потім на 2 і на невеликих екранах - на одну.

Для адаптації колонок будемо використовувати суфікси:
col-lg-* - десктопна версія (більше 1024 px);
col-md-* - версія для планшетів (820..1024 px);
col-sm-* - версія для смартфонів (481..819 px);
col-xs-* - версія для маленьких пристроїв (до 481 px);

Потрібно створити набір стилів:

.col-lg-* { width: ...; }
@media screen and (max-width: 1024px) {
  .col-md-* { width: ...; }
}

@media screen and (max-width: 819px) {
  .col-sm-* { width: ...; }
}

@media screen and (max-width: 480px) {
  .col-xs-* { width: ...; }
}

HTML-код буде таким:

<div class="row">
  <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">Колонка 1</div>
  <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">Колонка 2</div>
  <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">Колонка 3</div>
  ...
  <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">Колонка 9</div>
  <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">Колонка 10</div>
  <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">Колонка 11</div>
  <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">Колонка 12</div>
</div>

Якщо нам потрібно, щоб на всіх версіях, окрім найменшої, зберігалося 4 колонки, то наступний код буде надлишковим:

<div class="row">
  <div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">Колонка 1</div>
  <div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">Колонка 2</div>
  ...
  <div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">Колонка 12</div>
</div>

Проміжні класи можна сміливо видалити:

<div class="row">
  <div class="col-lg-3 col-xs-12">Колонка 1</div>
  <div class="col-lg-3 col-xs-12">Колонка 2</div>
  ...
  <div class="col-lg-3 col-xs-12">Колонка 12</div>
</div>

Домашнє завдання

  1. Зробіть адаптивну верстку сайту Minecraft, використовуючи CSS-сітку.
    Почистіть стилі від зайвих класів.