Урок 7 из 8 · 20 мин · обновлено
Адаптивная вёрстка: сайт на телефоне и компьютере
Как сделать, чтобы страница хорошо выглядела на любом экране: метатег viewport, относительные единицы, гибкие картинки, медиазапросы и подход mobile first.
Зачем нужна адаптивность
Больше половины людей открывают сайты с телефона. Страница, свёрстанная только под большой экран, на телефоне превращается в мелкий текст, который приходится раздвигать пальцами. Адаптивная вёрстка — это подход, при котором одна и та же страница подстраивается под любой экран.
Шаг 1: метатег viewport
Без этой строки в <head> мобильный браузер покажет страницу как на компьютере, только уменьшенной:
<meta name="viewport" content="width=device-width, initial-scale=1">
Она говорит: «ширина страницы равна ширине экрана устройства». Добавляйте её в каждую страницу.
Шаг 2: гибкие размеры
Фиксированная ширина в пикселях — главный враг адаптивности. Блок шириной 1000px на телефоне шириной 375px вылезет за экран. Поэтому используют гибкие единицы:
| Единица | Что означает | Где пригодится |
|---|---|---|
% |
доля от ширины родителя | ширина колонок |
rem |
от базового размера шрифта страницы, обычно 16px | шрифты, отступы |
vw |
1% ширины экрана | крупные заголовки |
max-width |
«не шире, чем» | контейнеры, картинки |
.container {
max-width: 1080px; /* на большом экране не шире 1080px */
margin: 0 auto;
padding: 0 16px;
}
h1 {
font-size: 2rem; /* 32px при стандартных настройках */
}
Размеры в rem уважают пользователя: если человек со слабым зрением увеличит шрифт в браузере, ваш текст увеличится вместе с ним.
Шаг 3: картинки не вылезают
img {
max-width: 100%;
height: auto;
}
Картинка показывается в своём размере, если места хватает, и пропорционально уменьшается, если контейнер уже. Это правило есть почти в каждом проекте.
Шаг 4: медиазапросы
Медиазапрос применяет стили только при определённой ширине экрана:
.cards {
display: flex;
flex-direction: column; /* на телефоне — столбцом */
gap: 16px;
}
@media (min-width: 768px) {
.cards {
flex-direction: row; /* от 768px — в ряд */
}
}
Ширину, на которой меняется вёрстка, называют брейкпоинтом. Частые значения: 768px (планшет) и 1024px (небольшой ноутбук), но правильнее менять раскладку там, где она начинает ломаться, а не под конкретные устройства.
Mobile first
Обратите внимание на порядок в примере: сначала стили для телефона, а потом медиазапрос min-width «расширяет» вёрстку для больших экранов. Этот подход называется mobile first. Он удобен по двум причинам: мобильная версия обычно проще, а значит, базовый CSS короче, и вы с самого начала думаете о большинстве пользователей.
Как проверять
Не нужно держать под рукой десяток телефонов. В инструментах разработчика есть режим устройства — в Chrome он включается сочетанием Ctrl+Shift+M. Можно выбрать модель телефона или потянуть за край, меняя ширину, и смотреть, где вёрстка ломается.
Попробуйте сами. Есть блок с текстом и картинкой. На телефоне картинка должна быть над текстом, а от 768px — слева от текста, причём картинка занимает треть ширины.
Решение
<section class="about">
<img src="images/team.jpg" alt="Команда пиццерии на кухне">
<p>Мы готовим пиццу по неаполитанским рецептам с 2015 года.</p>
</section>
img {
max-width: 100%;
height: auto;
}
.about {
display: flex;
flex-direction: column;
gap: 16px;
}
@media (min-width: 768px) {
.about {
flex-direction: row;
align-items: center;
}
.about img {
width: 33%;
}
}
Базовые стили описывают телефон, медиазапрос — экраны побольше. Это и есть mobile first.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Зачем нужен метатег viewport?
Без него мобильный браузер считает, что страница сделана для экрана около 980 пикселей, и уменьшает её — текст становится мелким.
-
Что сделает правило img { max-width: 100%; }?
Картинка сохранит свой размер, если места хватает, и уменьшится, если контейнер уже неё. Так она не вылезет за край экрана.
-
Когда сработают стили внутри @media (min-width: 768px)?
min-width означает «от этой ширины и больше». Это основа подхода mobile first: базовые стили — для телефона, медиазапросы — для экранов побольше.
-
Чем удобна единица rem?
1rem — это базовый размер шрифта, обычно 16px. Если человек увеличит шрифт в настройках браузера, размеры в rem увеличатся вместе с ним.