Гибкий макет на основе сетки
Я не собираюсь подробно расписывать все правила верстки адаптивного дизайна. На практике при его реализации трудности возникают также и из-за требований, связанных с «причудливым» контентом; требований, связанных со сложным макетом страницы, а также из-за необходимости добавлять функции, поддерживаемые новейшими версиями браузеров, при этом обеспечивая функциональность макета и в старых версиях браузеров. В этом руководстве мы не будем вдаваться в эти детали. Я собираюсь рассказать о трех основных составляющих адаптивного дизайна. А именно о гибких сетках, изображениях и медиа-запросах.
Достижение гибкости
Чтобы проиллюстрировать основные принципы, мы начнем с рассмотрения обычного сайта с фиксированной шириной 960 пикселей.
Большинство сайтов состоят из следующих частей:
- Шапка;
- Логотип;
- Меню навигации;
- Тело;
- Контент;
- Контент боковой панели;
- Подвал;
- Копирайт;
- Социальные ссылки.
Шаг 0 — исправление сетки
Эта структура не содержит ничего необычного. Я хочу сразу предупредить вас, что это не будет лучший дизайн в мире, но в данном случае нас больше интересует принцип реализации и основные правила верстки:
Этот сайт состоит из ранее упомянутых мной элементов. Вы уже должны были заметить, что он выглядит не совсем правильно, когда вы просматриваете его на данной странице. Он отображается внутри элемента <iframe>, и ширина сайта превышает ширину окна просмотра, в котором он размещается. Поэтому, чтобы просмотреть его полностью, необходима горизонтальная прокрутка.
Для каждого элемента задаются фиксированные размеры в пикселях:
.container {
width: 960px;
}
.header {
width: 960px;
height: 100px;
}
.logo {
width: 100px;
padding: 10px;
}
.navigation {
width: 840px;
}
.main-nav {
width: 800px;
}
.main-nav li {
width: 198px;
border-left:1px;
border-right:1px;
}
.content {
width: 600px;
padding: 30px;
}
.sidebar {
width: 280px;
padding: 10px;
}
.footer {
width: 900px;
padding: 30px;
}
Установка правильного размера окна просмотра
80% проблем, с решением которых люди просят меня помочь, возникают еще в самом начале построения адаптивного дизайна и связаны с одной единственной строкой кода между тегами <HEAD> </ HEAD>. Это одно из основных правил верстки сайта:
<meta name="viewport" content="width=device-width, initial-scale=1" />
Когда в нашу жизнь вошли смартфоны, и появилось большое количество сайтов для небольших экранов, Apple пришла в голову идея создать окно просмотра с шириной 960 пикселей, чтобы это соответствовало основам построения большинства сайтов. Это позволило обеспечить пропорциональное сжатие ресурсов. С помощью двойного нажатия мы могли увеличить его, чтобы найти и нажать крошечную ссылку.
Добавление этой одной строки означает, что ширина окна просмотра устанавливается в зависимости от размера экрана самого устройства. Это работает на любом существующем устройстве и будет работать на всех новых, которые будут выпущены в будущем. При этом масштаб задается 1к 1, то есть сайт не будет сжат и растянут.
Получение гибкости
Первое, что нам нужно сделать, это «размять» наш дизайн. Но на это бы ушло слишком много времени, если бы мы пытались охватить каждый элемент сайта и разработать для него идеальный макет. Вместо этого нужно найти основные переломные точки, а между ними позволить дизайну свободно сжиматься и растягиваться.
Одно из правил адаптивной верстки заключается в использовании процентов или em вместо привычных пикселей.
Далее в дело вступает математика. Чтобы получить необходимый результат, нужно разделить размер целевого элемента на размер (родительского элемента) и задать соотношение в процентах. Взгляните на приведенный ниже CSS-код. В нем каждое значение в пикселях выражено в процентах от его родительского элемента:
.container {
/* width: 960px;*/
/* container не имеет родительского элемента, поэтому я задаю для него размер 100%. Если мне нужно, чтобы он не растягивался слишком сильно, я могу ограничить максимальную ширину, применив значение max-width. Чтобы увидеть на практике, как это работает, нужно растянуть окно шире этого значения.
*/
width: 1200px;
max-width: 100%;
}
.header {
/* width: 960px;*/
/* header имеет родительский элемент - container. Поэтому здесь нужны математические вычисления. 960 / 960 = 1
1 * 100 = 100%
*/
width: 100%;
}
.logo {
/* width: 100px;
padding: 10px;
logo имеет ширину 100px и размещается внутри header. Поэтому вычисления будут такие:
100 / 960 = 0.1041666666666667
0.1041666666666667 * 100 = 10.41666666666667%
padding также зависит от контекста, но так как отступ в десять раз меньше, чем logo, я разделю его ширину на 10 и не буду отдельно вычислять ширину отступа.
padding: 1.041666666666667%;
*/
width: 10.41666666666667%;
padding: 1.041666666666667%;
}
.navigation {
/* width: 840px;
navigation имеет ширину 840px и размещается внутри header. Поэтому вычисления будут такие:
840 / 960 = 0.875
0.875 * 100 = 87.5%
*/
width: 87.5%;
}
.main-nav {
/* Я думаю, вы уже поняли, что мы делим значение ширины элемента на значение ширины его контекста (родительского элемента) и умножаем на 100, чтобы получить значение в процентах. Поэтому я больше не буду расписывать это правило верстки, а просто приведу вычисления.
width: 800px; 800 / 840 = 95.23809523809524%
padding: 0 20px 20 / 840 = 2.380952380952381% */
width: 95.23809523809524%;
padding: 0 2.380952380952381;
}
.main-nav li {
/*
width: 198px;
border-left:1px;
border-right:1px;
198 / 800 = 24.75%
Так как мы не можем сделать рамку меньше чем 1 пиксель, я оставлю эти значения без изменений.
*/
width: 24.75%;
border-left:1px;
border-right:1px;
}
.content {
/*width: 600px;
padding: 30px;
600/960 = 62.5%
30/960 = 3.125%
*/
width: 62.5%;
padding: 3.125%;
}
.sidebar {
/* width: 280px;
padding: 10px;
280/960 = 29.16666666666667%
10/960 = 1.041666666666667%
*/
width: 29.16666666666667%;
padding: 1.041666666666667%;
}
.footer {
/* width: 900px;
padding: 30px;
900/960 = 93.75%
30/960 = 3.125%
*/
width: 93.75%;
padding: 3.125%;
}
Если мы зададим все эти правила адаптивной верстки, то в конечном итоге должна получиться страница, которая выглядит приблизительно так:
Посмотреть на полном экране
Вот таким образом мы все сделали гибким.
Перевод статьи «A FLEXIBLE, GRID BASED LAYOUT» был подготовлен дружной командой проекта Сайтостроение от А до Я.