Все началось с « Отзывчивого веб-дизайна» , статьи Этана Маркотта об A List Apart По сути, в статье предлагалось адресовать постоянно меняющийся ландшафт устройств, браузеров, размеров экрана и ориентации путем создания гибких, гибких и адаптивных веб-сайтов. Вместо того, чтобы отвечать сегодняшним потребностям в настольной веб-версии, адаптированной к наиболее распространенному разрешению экрана, наряду с конкретной мобильной версией (часто специфичной для одного мобильного устройства), идея состоит в том, чтобы подойти к проблеме с другой стороны: использовать гибкий и жидкостные макеты, которые адаптируются практически к любому экрану.
Основные понятия
В основе адаптивного веб-дизайна лежат три ключевые технические особенности:
- Медиа-запросы и слушатели медиа-запросов
- Гибкий макет на основе сетки, который использует относительный размер
- Гибкие изображения и мультимедиа с помощью динамического изменения размера или CSS
По-настоящему отзывчивый веб-дизайн требует реализации всех трех функций.
Ключевым моментом является адаптация к потребностям пользователя и возможностям устройства. Предположим, что мобильный пользователь будет просматривать ваш сайт на маленьком экране. Учет потребностей пользователя означает не только адаптацию контента к размеру экрана. Это также означает, что сначала нужно подумать о том, что потребуется этому мобильному пользователю при посещении вашего сайта, а затем соответствующим образом выложить содержимое. Возможно, вы представите информацию в другом порядке. Не думайте, что пользователю не понадобится доступ ко всей информации сайта, потому что он на мобильном устройстве. Возможно, вам придется изменить шрифты или области взаимодействия, чтобы лучше реагировать на прикосновения. Все эти факторы влияют на адаптивный веб-дизайн.
В то время как мобильные устройства меняют ландшафт дисплея, с появлением все большего количества маленьких экранов, не забывайте, что происходит на другом конце спектра. Дисплеи также становятся все больше и больше. Необходимость обслуживать оба сегмента также не должна мешать дизайнерам быть инновационными.
Медиа-запросы
Начиная с CSS 2.1, типы носителей использовались для применения CSS как для экрана, так и для печати. Возможно, вы помните эти типы медиа:
<link rel="stylesheet" type="text/css" href="style.css" media="screen" /> <link rel="stylesheet" type="text/css" href="printfriendly.css" media="print" />
Вот и все! К счастью, W3C улучшил медиазапросы в CSS3, сделав их большим шагом вперед.
Сегодня вы можете использовать медиазапросы для определения стилей для определенных возможностей, применяя различные стили в зависимости от возможностей, соответствующих вашему запросу. Вы даже можете комбинировать запросы, которые проверяют несколько функций, используя семантические операторы, такие как AND и NOT). Возможности включают ширину, высоту, максимальную ширину, максимальную высоту, высоту устройства, ориентацию, соотношение сторон, разрешение и многое другое.
Существует три способа реализации медиазапросов:
- Используйте правило @import для импорта правил стилей из других таблиц стилей:
- @import url(style600min.css) screen and (min-width: 600px);
- Поместите медиа-запросы непосредственно в таблицу стилей, как показано на рисунке 1 . Это самый распространенный подход.
Рис. 1. Реализация медиазапросов непосредственно в таблице стилей
#nav { float: right; } #nav ul { list-style: none; } @media screen and (min-width: 400px) and (orientation: portrait) { #nav li { float: right; margin: 0 0 0 .5em; border:1px solid #000000; } } @media screen and (min-width: 800px) { #nav { width: 200px; } #nav li { float: left; margin: 0 0 0 .5em; border: none; } }
3. Включите запрос в медиа-атрибут связанной таблицы стилей:
<link rel="stylesheet" type="text/css" media="screen and (max-device-width: 800px)" href="style800.css" />
Из-за (каскадной) природы CSS стили по умолчанию определяются вверху, а правила и стили соответствия медиазапросов — ниже. Стили, определенные в верхней части, будут каскадированы к соответствующим стилям в правиле или даже полностью перезаписаны.
Следующие изображения представляют пример адаптивного подхода веб-дизайна, который использует медиа-запросы. На рис. 2 и 3 показан рабочий стол с Internet Explorer 9 в двух разных разрешениях. На рисунке 4 показан тот же самый отзывчивый сайт на Windows Phone, также с Internet Explorer 9.
Рисунок 2: навигация слева
Рисунок 3 В окне с измененным размером 800×600 навигация переключается на верх
Рисунок 4 Тот же сайт на Windows Phone
Если вы ищете несколько отличных примеров адаптивного веб-дизайна, которые в полной мере используют медиа-запросы, сайт http://mediaqueri.es/ энтузиастов может вызвать привыкание, как показано на рисунке 5 .
Рис. 5. Коллекция сайтов, использующих медиазапросы.
Media Query Listeners
Сделав медиа-запросы на шаг вперед, рабочая группа CSS Object Model (CSSOM) в W3C также создала прослушиватели медиа-запросов, которые предоставляют API для реагирования на изменения медиа-запросов. Вместо того, чтобы запрашивать изменения или загружать несколько версий ресурса, вы можете использовать API, например, для загрузки изображений только определенного размера, когда инициируется совпадение медиазапроса.
Сегодня Firefox и Internet Explorer 10 Platform Preview реализуют прослушиватели медиа-запросов; Вы можете увидеть демо « CSS3 Media Queries & Media Query Listeners » на IE Test Drive.
Слово о Вьюпорте
При тестировании медиазапросов в мобильных браузерах вы можете заметить, что правильные медиазапросы на самом деле не применяются. Когда это происходит, мобильный браузер выполняет некоторые действия от вашего имени, чтобы оптимально отобразить страницу на меньшем экране.
Так вы думаете, что нет способа получить реальное разрешение? На самом деле, есть, в метатеге viewport. Метатег viewport управляет логическими размерами и масштабированием окна мобильного браузера (без хрома). Установка ширины, равной ширине устройства, решает проблему:
<meta name="viewport" content="width=device-width">
Другие настройки окна просмотра включают максимальное увеличение и начальный масштаб.
Гибкие сетки
Гибкий макет на основе сетки является одним из краеугольных камней адаптивного дизайна. Термин «сетка» используется довольно свободно и не подразумевает требования для реализации какой-либо из доступных структур сетки. Здесь это означает использование CSS для позиционирования и разметки полей и интервалов, а также для реализации различных типов веб-макетов по-новому. Макеты и размеры текста обычно выражаются в пикселях. Дизайнеры любят пиксели. Фотошоп любит пиксели. Но пиксель может быть одной точкой на одном устройстве и восемью точками на другом. Итак, как вы подходите к адаптивному веб-дизайну, если все основано на пикселях? Вам может не понравиться ответ: вы перестаете использовать пиксельные макеты и начинаете использовать проценты или em для определения размера.
Исходя из размеров, ширины и полей текста в процентах или в единицах измерения em, основанных на размере шрифта, вы можете превратить фиксированный размер в относительный размер. Это означает, что вам нужно немного подсчитать, чтобы создать гибкую систему размеров сетки и текста. Но формула для расчета их очень проста:
target ÷ context = result
Допустим, нормальный контекст для размера основного шрифта составляет 16 пикселей. Если дизайнер указывает, что H1 должен быть 24 пикселя, вы можете рассчитать следующее:
24 ÷ 16 = 1.5
Это приводит к следующему стилю CSS:
h1{ font-size: 1.5em; }
Всегда принимайте во внимание контекст. Продолжая предыдущий пример, если у вас есть элемент внутри H1, который должен быть 12 пикселей, вы используете текущий H1 в качестве контекста. Контекст теперь составляет 24 пикселя, поэтому вычисление контекста для «H1 a»:
12 ÷ 24 = 0.5
И стиль CSS это:
h1 a{ font-size: 0.5em; }
Вы также можете использовать проценты. Алгоритм расчета такой же; вы просто в конечном итоге с процентами.
Гибкие сетки используют этот подход. Вы можете найти несколько структур, которые помогут вам создать свою сетку, например, Fluid Grid System или Fluid 960 Grid System (жидкостная версия 960 Grid System). Более того, несколько групп в W3C представили новые спецификации для более гибких сеток с некоторыми полезными результатами.
CSS3 Grid Layout
Grid Layout CSS3 (также известный как сетки выравнивание или, проще говоря, Grid), приводит типичную систему сетки на CSS, похожую на то , что разработчики XAML или Silverlight могут быть знакомы. На момент написания этой статьи спецификация была «Черновик редактора». Он позволяет определять области в макете с помощью столбцов и строк, разметки, интервалов, отступов, шаблонов сетки и т. Д., Обеспечивая полное разделение задач между элементами HTML и CSS. В отличие от HTML-таблиц, которые являются содержимым, Grid позволяет размещать HTML-примитивы в областях сетки отдельно от реального содержимого.
Сочетание CSS3 Grid с медиа-запросами создает мощное решение для создания гибких, отзывчивых приложений.
Как работает Сетка? Вы начинаете с установки блока дисплея на «сетку». (Вам необходимо использовать префиксы поставщика CSS, потому что это еще не рекомендация CSS3. В настоящий момент только предварительный просмотр платформы Internet Explorer 10 поддерживает спецификацию, поэтому вы увидите здесь префикс поставщика CSS -ms-, используемый здесь.) Давайте рассмотрим три примеры того, как вы можете настроить различные виды в зависимости от размера экрана. Медиа-запросы используются для применения различных стилей сетки в зависимости от ширины экрана.
В первом примере HTML-код для определения содержимого состоит из одного заголовка и трех различных блоков текста (см. Рисунок 6) .
Рисунок 6 Определение содержимого для сетки
<div id="mygrid"> <header id="myheader"> <h1>Hello world</h1> </header> <div id="block1"> <h2>Lorem Ipsum section 1</h2> <p> Phasellus venenatis sem vel velit tincidunt tincidunt. Curabitur gravida, ante sit amet [... ...] </p> </div> <div id="block2"> <h2>Lorem Ipsum section 2</h2> <p> Nam tempus justo eu massa ultrices eget imperdiet ligula placerat. Suspendisse [... ...]. </p> </div> <div id="block3"> <h2>Lorem Ipsum section 3</h2> <ul> <li>Curabitur ultrices tristique purus, sed pellentesque magna scelerisque ut.</li> <li>[... ...] </li> </ul> </div> </div>
Вы начинаете с того, что размещаете блоки контента друг под другом, чтобы контент подходил для смартфонов (см. Рисунок 7 ). Вы можете добавить цвета фона, как показано на рисунке 8, чтобы было яснее работать с элементами сетки.
Рисунок 7. Размещение блоков контента.
@media only screen and (max-width : 480px) { #mygrid { display: -ms-grid; margin: 3px; -ms-grid-columns: 100%; /*one column taking full width */ -ms-grid-rows: 70px auto auto auto; /*4 rows */ } #myheader { -ms-grid-row: 1; -ms-grid-column: 1; } #block1 { -ms-grid-row: 2; /*place into row 2 / column 1*/ -ms-grid-column: 1; } #block2 { -ms-grid-row: 3; -ms-grid-column: 1; } #block3 { -ms-grid-row: 4; -ms-grid-column: 1; } }
Рисунок 8. Блоки содержимого с фоновыми цветами
Во втором примере медиазапрос применяет стили, определенные для экранов с размерами, превышающими 481 пиксель — что угодно шире, чем у обычного смартфона. Вы можете использовать Grid для определения двух столбцов и перемещения блоков в желаемые позиции (см. Рисунок 9 ). Результаты показаны на рисунке 10 .
Рисунок 9. Определение нового макета для увеличенного экрана.
@media only screen and (min-width : 481px) { /*make two columns and move block 3 next to 1 — just because we can*/ #mygrid { display: -ms-grid; -ms-grid-columns: 10px 1fr 10px 1fr 10px; /*10px columns to spacing in between*/ -ms-grid-rows: 100px 1fr 1fr; /*100px row and two rows each taking 1 fraction of available space*/ margin: 5px; } #myheader { -ms-grid-row: 1; -ms-grid-column: 1; -ms-grid-column-span: 5; background-color: #EEB215; } #block1 { -ms-grid-row: 2; -ms-grid-column: 2; background-color: #B2B0B0; } #block2 { -ms-grid-row: 3; -ms-grid-column: 2; background-color: #726E6E; } #block3 { -ms-grid-row: 2; /*block 3 can go into row 2*/ -ms-grid-column: 4; background-color: #515050; } }
Рисунок 10. Новый макет с двумя соседними столбцами.
Третий образец сетки отображается на экранах шириной более 1220 пикселей. Вы определяете сетку с широким заголовком, который охватывает несколько столбцов, а затем определяете три столбца, каждый из которых занимает одну долю доступного пространства, с несколькими 10-пиксельными столбцами между ними (см. Рисунок 11 ). Результаты показаны на рисунке 12 .
Рисунок 11 Определение макета для более широких экранов
@media only screen and (min-width: 1220px) { #mygrid { display: -ms-grid; -ms-grid-columns: 1fr 10px 1fr 10px 1fr; -ms-grid-rows: 100px 1fr; margin: 5px; } #myheader { -ms-grid-row: 1; -ms-grid-column: 1; -ms-grid-column-span: 5; background-color: #EEB215; } #block1 { -ms-grid-row: 2; -ms-grid-column: 1; background-color: #B2B0B0; } #block2 { -ms-grid-row: 2; -ms-grid-column: 3; background-color: #726E6E; } #block3 { -ms-grid-row: 2; -ms-grid-column: 5; background-color: #515050; } }
Рисунок 12. Три параллельных колонны с остовным заголовком.
Спецификация Grid — желанное дополнение для реализации адаптивных веб-дизайнов.
Стоит также упомянуть о двух других новых спецификациях CSS: модуль разметки гибких блоков (Flexbox) и модуль разметки с несколькими столбцами . Оба показывают многообещающие возможности для разработки адаптивных веб-сайтов.
Flexbox, в настоящее время рабочий проект на W3C, добавляет поддержку четырех новых режимов макета: блочный, встроенный, табличный и позиционированный. Это позволяет вам размещать сложные страницы с относительным положением и постоянным размером, даже при изменении размеров экрана.
Модуль многостолбцовой разметки в настоящее время является рекомендацией кандидата на W3C. Это решение предназначено для контента, который необходимо выложить в столбцы и который перетекает из одного столбца в другой. Вы можете просмотреть интерактивный пример многоколоночной разметки в этой лабораторной работе .
Гибкие изображения и медиа
Последний аспект адаптивного веб-дизайна — это гибкие изображения и медиа. По сути, эта функция позволяет вам по-разному адаптировать ваши изображения или другие медиафайлы в зависимости от устройства, либо масштабируя, либо используя свойство переполнения CSS.
Масштабирование в CSS довольно просто реализовать как для изображений, так и для видео. Вы можете установить максимальную ширину медиа-элемента на 100 процентов, и браузер будет уменьшать и расширять изображение в зависимости от его контейнера. Вы должны предоставить изображение в наилучшем возможном качестве и размере, а затем позволить CSS адаптировать изображение к нужному размеру.
img, object { max-width: 100%; }
Альтернативой масштабированию изображений является их обрезка с помощью CSS. Например, применение overflow: hidden позволяет динамически обрезать изображения, чтобы они помещались в свои контейнеры по мере изменения размеров контейнеров в соответствии с новой экранной средой.
Наличие нескольких параметров для масштабирования и обрезки изображений в CSS может быть недостаточно. Вы действительно должны использовать всю мобильную пропускную способность посетителя, потому что у вас нет уменьшенной версии изображения? Чтобы лучше обслуживать пользователей, гибкие изображения могут означать использование альтернативного изображения или вообще никакого изображения. Люди из сообщества веб-дизайнеров предлагают решения на основе JavaScript и файлов cookie, и вы можете ожидать большего от этого, поскольку адаптивный веб-дизайн развивается и становится основой для многих качественных веб-сайтов.
Устаревшие браузеры
А как насчет старых браузеров, которые не поддерживают медиа-запросы? А как насчет Internet Explorer до версии 8, которая имеет проблемы с масштабированием изображений? Решения в виде полифилов могут помочь. Вот несколько полезных примеров.
- css3-mediaqueries.js, автор Ваутер ван дер Грааф: code.google.com/p/css3-mediaqueries-js/
- Response.js: github.com/scottjehl/Respond
- Жидкие изображения: unstoppablerobotninja.com/entry/fluid-images/
В заключение
Прыгать на отзывчивом фургоне веб-дизайна — это не то, что нужно воспринимать легкомысленно. Примите во внимание то, что вам нужно достичь, и подумайте, имеет ли смысл обслуживать конкретную версию настольного или мобильного устройства.
Адаптивный веб-дизайн находится на начальной стадии. Веб-дизайнеры будут и впредь предлагать различные мнения и рекомендовать указания, касающиеся того, стоит ли сначала создавать мобильные приложения, как встраивать эти решения в процесс проектирования, нарезать ли фрагменты на все экраны разных размеров и т. Д. И по мере того, как будет появляться все больше и больше размеров экрана и форм-факторов, разговор будет продолжен.
Стандарты HTML и CSS развиваются, чтобы помочь веб-дизайнерам справиться с этими проблемами. Ясно, что для решения задач будет использоваться некая форма адаптивного веб-дизайна, и в равной степени ясно, что стандарты будут продолжать развиваться по мере того, как будут открываться лучшие способы обработки изменяющегося мира устройств и браузеров.