Мої найкращі практики – CSS

1. Передмова

Сьогодні можливості CSS використовують далеко не повністю. Між розробниками на Angular/React/Vue/... та UI-дизайнерами пролягає прірва.

UI-дизайнер вкладає тридцять <div> один в одного й навішує на них сорок CSS-класів, тоді як Angular-розробник кожні два тижні кайфує від найновішої бібліотеки, а його dependency hell давно вже не збирається без npm i --force, бо peer-залежності конфліктують. CSS і HTML фанатика TypeScript мало цікавлять. Навіть для найпростіших полів введення він бере Material, бо боїться, що інакше не впорається з валідацією. І вже точно не хоче гаяти час на винайдення велосипеда. Того, що при першій же вимозі, яку бібліотека не покриває, він втратить увесь зекономлений час і зануриться в читання GitHub-issues цієї бібліотеки, він не усвідомлює.

Розробник у fullstack-проєкті рідко має змогу проявити себе як фронтенд-дизайнер. Він отримує макети екранів у Figma й мусить реалізувати їх точнісінько так. Більшість фронтенд-розробників такого типу навіть не підозрюють, що адаптивний макет можна зробити одним-єдиним рядком CSS. CSS потужніший, ніж будь-коли. Минули часи JS-хаків для стилів, численних media queries та обхідних рішень для IE 8. Ура!

2. Ідеальне центрування

На співбесідах це не завжди сприймали добре, але мені подобалося: на запитання, чи я добре знаюся на фронтенді, я любив відповідати: «О так. Я вмію вертикально центрувати <div>».

Відцентрувати div — горезвісно складне завдання.

Тепер уже ні:

:)
.parent {
    display: grid;
    place-items: center
}

3. Адаптивна сітка

1
2
3
4
.parent {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}

4. Адаптивний Flexbox

1
2
3
.parent {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
}

.box {
    flex: 1 1 150px; /*  Stretching: */
    flex: 0 1 150px; /*  No stretching: */
    margin: 5px;
}

5. Макет сторінки

Шапка
Основна частина
Підвал
.parent {
    display: grid;
    grid-template-rows: auto 1fr auto;
}

6. Бічна панель

Мін.: 150px / Макс.: 25%
Цей елемент займає другу позицію в сітці (1fr), тобто заповнює весь простір, що залишився.
.parent {
    display: grid;
    grid-template-columns: minmax(150px, 25%) 1fr;
}

7. Джерела

1-Line Layouts