Медіафункції
Конспект лекції: чек-лист мобільного дизайну, медіафункції width, height, resolution, hover та pointer
1. Чек-лист приймання мобільного дизайну
Верстальник — це «очі» між дизайнером і розробником. Перед початком верстки варто перевірити макет і дати зворотний зв'язок дизайнеру.
Відмінності мобільного інтерфейсу
- Немає hover — палець не може «навести» на елемент без натискання
- Більша область кліку — мінімальний розмір інтерактивного елемента ~48×48 px
- Немає клавіатури — вводити текст складніше, краще використовувати чекбокси, радіокнопки, перемикачі
- Жести — свайп, зум; але на сайтах жести майже не використовуються
Імітація hover на мобільних
На iOS для імітації hover потрібен інтерактивний елемент — <a> або
<button>. Звичайний <span> не спрацює. На Android працює з будь-яким
елементом.
Що перевіряти в макеті
- Розмір інтерактивних елементів (мін. 48×48 px)
- Відсутність горизонтальних випадаючих списків
- Читабельність тексту без масштабування
- Достатні відступи між кнопками / посиланнями
- Елементи з двома значеннями → чекбокс або перемикач
- Мала кількість варіантів → радіокнопки замість випадаючого списку
2. meta viewport — налаштування області перегляду
Без мета-тегу viewport мобільний браузер відображає сайт як стаціонарний (із шириною ~980 px), і користувачу доводиться масштабувати вручну.
<meta name="viewport" content="width=device-width, initial-scale=1.0">
| Параметр | Значення | Опис |
|---|---|---|
width |
device-width |
Ширина viewport = рекомендована ширина пристрою (з урахуванням DPR) |
initial-scale |
1.0 |
Початковий масштаб (1.0 = 100%) |
minimum-scale |
число | Мінімальний допустимий масштаб |
maximum-scale |
число | Максимальний допустимий масштаб |
user-scalable |
yes / no |
Дозволити/заборонити масштабування користувачем |
user-scalable=no та maximum-scale=1
заважають користувачам збільшувати дрібний текст або розглядати зображення. Це погіршує доступність сайту.
3. Медіазапроси в CSS — розширений синтаксис
Медіазапрос у CSS можна поєднувати з типом пристрою:
@media screen {
body {
font-size: 14px;
}
}
Складніший запит — з умовою на ширину:
@media (max-width: 480px) {
/* Стилі для екранів до 480px включно */
}
Стратегія: менше медіазапитів — краще
Замість двох парних запитів (до 480 і від 481) — залиште базовий CSS для мобільних і один запит від 481:
/* Базові стилі — працюють завжди (мобільні) */
.sidebar,
.content {
width: 100%;
}
/* Від 481px — додаються колонки */
@media (min-width: 481px) {
.content { width: 75%; }
.sidebar { width: 25%; }
}
4. Критичний CSS (Critical CSS)
Критичний CSS — це мінімальний набір стилів, необхідний для відображення першого екрану
сайту. Він вбудовується безпосередньо в <style> всередині <head>.
Навіщо?
- Зовнішній CSS-файл потребує часу на завантаження
- Вбудований CSS відображається миттєво разом зі сторінкою
- Користувач бачить контент першого екрану до завантаження основного CSS
Що впливає на швидкість
| Фактор | Рекомендація |
|---|---|
| Кількість файлів | Менше файлів — менше запитів до сервера |
| Розмір файлів | Мініфікація, оптимізація зображень |
| Складність CSS | Простіші селектори — швидший рендеринг |
| Відкладене завантаження | Lazy loading для зображень поза першим екраном |
5. Одиниця em — розмір шрифту поточного елемента
1em = значення font-size поточного елемента. Якщо у елемента немає явного font-size,
значення успадковується від батька вгору по ланцюжку до кореневого елемента.
.box {
font-size: 20px;
width: 10em; /* 10 × 20 = 200px */
padding: 1em; /* 1 × 20 = 20px */
}
font-size, усі
розміри в em зміняться пропорційно. Це може призвести до неочікуваного збільшення або зменшення
елемента.
6. Одиниця rem — розмір шрифту кореневого елемента
1rem = значення font-size елемента <html> (не
<body>). На відміну від em, rem не залежить від контексту
вкладеності.
html {
font-size: 10px; /* 1rem = 10px, зручно рахувати */
}
.box {
width: 30rem; /* 300px */
padding: 1.5rem; /* 15px */
}
Коли rem зручний
- Версія для слабкозорих — змінюємо лише
font-sizeуhtml, і все масштабується - Глобальне масштабування — якщо клієнт попросить «зменшити все в 1.5 рази», достатньо змінити одне значення
html { font-size: 10px; } — тоді значення з макету (наприклад, 961px)
просто ділиться на 10 → 96.1rem.
7. Де використовувати які одиниці
| Одиниця | Тип | Де використовувати |
|---|---|---|
px |
Відносна | Основна одиниця — все, що не потрапляє в інші категорії |
% |
Відносна | Колонки (25%, 33%, 50%, 75%, 100%) — лише коли візуально видно поділ |
em |
Відносна | Рідко; коли є чітка пропорція відносно розміру шрифту |
rem |
Відносна | Версія для слабкозорих, глобальне масштабування |
vw, vh |
Відносна | Адаптивність (ознайомлення на наступних заняттях) |
cm, mm, in |
Абсолютна | Тільки для друку (@media print) |
pt |
Абсолютна | Поліграфія, типографіка (рідко в вебі) |
8. Корисні CSS-скорочення (Shorthands)
inset — скорочення для позиціювання
Властивість inset замінює одночасне задання top, right,
bottom, left:
.overlay {
position: absolute;
/* Замість top: 0; right: 0; bottom: 0; left: 0; */
inset: 0;
}
Синтаксис аналогічний margin: одне значення — для всіх сторін, два — для вертикалі/горизонталі,
чотири — для кожної сторони окремо.
Логічні властивості: margin-inline та padding-block
Логічні властивості задають відступи відносно напрямку тексту, а не фізичних сторін екрана:
| Логічна властивість | Фізичний еквівалент (для LTR) |
|---|---|
margin-inline |
margin-left + margin-right |
padding-block |
padding-top + padding-bottom |
margin-inline-start |
margin-left (для LTR) / margin-right (для RTL) |
.card {
margin-inline: auto; /* Центрування по горизонталі */
padding-block: 2rem; /* Відступи зверху та знизу */
}
place-items та place-content — швидке центрування
У Grid-контейнері place-items — скорочення для align-items +
justify-items, а place-content — для align-content +
justify-content:
.container {
display: grid;
place-items: center; /* Центрує контент по обох осях */
}
display: grid; place-items: center; — два рядки для
ідеального центрування елементів і по горизонталі, і по вертикалі.
9. Не переоптимізовуйте з em
Поширена помилка — побачити, що заголовок у 2.5 рази більший за текст, і замінити font-size на
2.5em. Це працює, поки дизайнер не змінить один розмір без іншого.
Погана оптимізація
.service p {
font-size: 16px;
}
.service h2 {
font-size: 2.5em; /* 40px, але залежить від font-size батька */
}
Краще — явні значення
.service p {
font-size: 16px;
}
.service h2 {
font-size: 40px;
}
@media (max-width: 768px) {
.service p { font-size: 14px; }
.service h2 { font-size: 28px; }
}
10. Схлопування зовнішніх відступів (margin collapsing)
У звичайному потоці (без flex) вертикальні відступи сусідніх елементів не додаються, а схлопуються — залишається більший з двох.
.block-1 {
margin-bottom: 70px;
}
.block-2 {
margin-top: 30px;
}
/* Відстань між блоками = 70px (не 100px!) */
| Контекст | Вертикальні margin |
|---|---|
| Звичайний потік | Схлопуються (залишається більший) |
| Flex-контейнер | Додаються (сума) |
| Grid-контейнер | Додаються (сума) |
11. Додаткові медіафункції
Крім min-width / max-width існують інші медіафункції:
| Функція | Приклад | Опис |
|---|---|---|
orientation |
@media (orientation: landscape) |
Альбомна орієнтація пристрою |
orientation |
@media (orientation: portrait) |
Портретна орієнтація пристрою |
min-height |
@media (min-height: 600px) |
Мінімальна висота viewport |
max-height |
@media (max-height: 400px) |
Максимальна висота viewport |
min-width / max-width. Орієнтація —
рідше. Висота — ще рідше, бо сторінка прокручується вертикально.
12. Медіафункції aspect-ratio та orientation
aspect-ratio
Визначає співвідношення ширини до висоти відображуваної області (viewport). Записується як дріб:
@media (min-aspect-ratio: 16/9) {
/* Стилі для широких екранів */
}
Підтримує приставки min- та max-. Щоб зрозуміти, яке співвідношення більше —
переведіть дріб у десяткове: 16/9 = 1.78, 16/10 = 1.6. Отже, min-aspect-ratio: 16/9 не включає
монітори 16:10.
Популярні співвідношення сторін
| Співвідношення | Де зустрічається |
|---|---|
| 4:3 | Старі монітори з CRT-трубкою, дизайнерські монітори |
| 16:9 | Найпопулярніше: Full HD, HD, 4K |
| 3:2 | Microsoft Surface, деякі сучасні ноутбуки |
| 16:10 | MacBook Pro, деякі ноутбуки (більше висоти — зручніше для коду) |
| 21:9 | Ультраширокі монітори, кінематографічний формат |
orientation
Визначає орієнтацію пристрою. Приймає два значення:
portrait— вертикальна (висота > ширина)landscape— горизонтальна (ширина > висота)
@media (orientation: landscape) {
/* Стилі для горизонтальної орієнтації */
}
Комбінований медіазапит
Для коректної роботи на різних пристроях часто потрібна комбінація:
@media (min-width: 641px),
(orientation: landscape) and (max-width: 640px) {
/* Великі екрани АБО горизонтальні телефони */
.menu {
display: flex;
flex-wrap: wrap;
}
.menu__item {
width: 49%;
}
}
Просто orientation: landscape недостатньо — на вертикально розташованому iPad (великий екран!)
елементи будуть по одному в рядку. А вертикально повернутий монітор теж визначиться як portrait.
13. Інструменти верстальника
| Інструмент | Призначення |
|---|---|
| Chrome Workspaces | Зміни CSS у DevTools автоматично зберігаються у файл — без ручного копіювання |
| Pixel Perfect (розширення) | Накладає зображення макету поверх сайту для піксельного порівняння |
letter-spacing |
Регулює міжлітерну відстань (можна від'ємне значення для «ущільнення») |
| Figma | Дозволяє копіювати часткові CSS-властивості елементів, прискорює верстку |
14. Підсумкова таблиця
| Тема | Ключові моменти |
|---|---|
| meta viewport | width=device-width, initial-scale=1.0 — обов'язковий тег для адаптивної верстки |
| Медіазапити в CSS | @media (min-width: ...) — Mobile First; @media (max-width: ...) — Desktop
First
|
| Критичний CSS | CSS першого екрану вбудовується в <style> для миттєвого рендерингу |
| em | 1em = font-size поточного елемента; залежить від контексту |
| rem | 1rem = font-size елемента <html>; незалежний від
вкладеності
|
| CSS Shorthands | inset (позиціювання), margin-inline/padding-block (логічні), place-items (центрування) |
| Схлопування margin | У звичайному потоці вертикальні margin схлопуються; у flex/grid — ні |
| overflow: hidden | Костиль для горизонтальної прокрутки — краще знайти першопричину |
| aspect-ratio | Співвідношення ширини/висоти viewport; підтримує min-/max- |
| orientation | portrait (вертикально) / landscape (горизонтально) |