Задача
СкопированоКолонка с контентом определённой ширины по центру экрана — частый паттерн в веб-дизайне. В этом рецепте разберём, как и какими способами можно это сделать. Также рассмотрим ситуацию, когда некоторые секции должны быть растянуты на весь экран.
Термины
Скопировано.container
— специальный класс, который ограничивает по ширине и располагает по центру страницы блок с контентом. Стили для этого класса пишутся разработчиком и могут изменяться.
Имя класса может быть любым в зависимости от договорённостей внутри конкретной команды или от привычек верстальщика.
Можно использовать класс в любом нужном месте:
<header class="header"> <div class="container"> <h1>Привет, мир!</h1> </div></header>
<header class="header"> <div class="container"> <h1>Привет, мир!</h1> </div> </header>
Стили для класса container
:
.container { max-width: 1024px; margin-left: auto; margin-right: auto;}
.container { max-width: 1024px; margin-left: auto; margin-right: auto; }
Значение для max
может быть любым, всё зависит от дизайна и от того, насколько нужно ограничить ширину контента.
В примере значение 1024px
служит для ограничения контента, больше чем 1024px
контент не будет растягиваться и выходить за эти рамки, а свойство margin
расположит блок с контентом по центру экрана по горизонтали.
Готовое решение
СкопированоКод для адаптивного сайта. При необходимости меняйте ширину и отступы под свою задачу.
.container { max-width: 1024px; margin-left: auto; margin-right: auto;}@media (max-width: 1024px) { .container { padding-left: 128px; padding-right: 128px; }}@media (max-width: 768px) { .container { padding-left: 64px; padding-right: 64px; }}@media (max-width: 425px) { .container { padding-left: 24px; padding-right: 24px; }}
.container { max-width: 1024px; margin-left: auto; margin-right: auto; } @media (max-width: 1024px) { .container { padding-left: 128px; padding-right: 128px; } } @media (max-width: 768px) { .container { padding-left: 64px; padding-right: 64px; } } @media (max-width: 425px) { .container { padding-left: 24px; padding-right: 24px; } }
Пример разметки:
<header class="header"> <div class="container"> <!-- Контент --> </div></header><section class="section contacts"> <div class="container"> <!-- Контент --> </div></section>
<header class="header"> <div class="container"> <!-- Контент --> </div> </header> <section class="section contacts"> <div class="container"> <!-- Контент --> </div> </section>
Разбор решения
СкопированоБлагодаря использованию padding
на каждой точке перехода, контент внутри container
не будет прижат к краям страницы, а будет иметь отступ слева и справа.
При изменении ширины фрейма срабатывает медиавыражение, которое добавляет отступы слева и справа.
Готовое решение № 2
СкопированоТак же можно не писать несколько медиазапросов, а воспользоваться функцией clamp
и рассчитывать нужную ширину .container
для каждой ширины экрана.
В этом примере в первую и третью секции вложен блок с классом container
, контент в них будет ограничен по ширине и размещён по центру экрана. А во второй секции не будет вложен .container
и контент будет растянут на всю ширину экрана.
<section class="section-one"> <div class="container"> <!-- Контент --> </div></section><section class="section-two"> <!-- Контент --></section><section class="section-third"> <div class="container"> <!-- Контент --> </div></section>
<section class="section-one"> <div class="container"> <!-- Контент --> </div> </section> <section class="section-two"> <!-- Контент --> </section> <section class="section-third"> <div class="container"> <!-- Контент --> </div> </section>
В стилях используем функцию clamp
.container { width: clamp(360px, 90%, 1024px); margin-left: auto; margin-right: auto;}
.container { width: clamp(360px, 90%, 1024px); margin-left: auto; margin-right: auto; }
Разбор решения № 2
СкопированоКод сократился, при этом работает как нужно.
Как именно функция clamp
рассчитывает width
:
- Первый параметр
360px
— задаёт минимальное значение ширины блока; - Последний параметр
1024px
— задаёт максимальное значение; - Средний параметр
90
— применяется в тех случаях, когда нижний или верхний пределы не достигнуты.%
Заключение
СкопированоПодобных утилитарных классов может быть сколько угодно в проекте. Их удобно использовать, когда нужно многократно повторить одинаковое поведение блоков. Достаточно вставить блок с нужным классом в разметку.
Представим «макет» блога, где весь контент расположен в .container
, а вот текст статей будет ещё меньше основной колонки контента. Обернём его в блок .wrapper
:
<section class="section"> <div class="container"> <h1>Заголовок для блога</h1> <div class="wrapper"> <!-- Текст статьи --> </div> </div></section>
<section class="section"> <div class="container"> <h1>Заголовок для блога</h1> <div class="wrapper"> <!-- Текст статьи --> </div> </div> </section>
Стилизуем любым удобным способом: через max
или при помощи функции clamp
:
.container { width: clamp(360px, 90%, 1024px); margin-left: auto; margin-right: auto;}.wrapper { width: clamp(280px, 90%, 768px); margin-left: auto; margin-right: auto;}
.container { width: clamp(360px, 90%, 1024px); margin-left: auto; margin-right: auto; } .wrapper { width: clamp(280px, 90%, 768px); margin-left: auto; margin-right: auto; }