Открыть меню    

Отзывчивый веб-дизайн: макеты и медиа-запросы

отзывчивый дизайн С ростом числа смартфонов произведенных за последние три года и вытекающим отсюда большим разнообразием размеров экранов, становится практически невозможно игнорировать пользователей чьим 'браузером' является мобильный телефон. Неважно, какие технические характеристики (а нас в первую очередь волнует размер экрана) у устройства пользователя: любое устройство заслуживает наилучшего решения. Наша цель, как дизайнеров, обеспечить пользователей наилучшим (с точки зрения внешнего вида) продуктом, независимо от устройства просмотра.

Сегодня многие клиенты хотят сайт совместимый с мобильными устройствами, что наиболее перспективно. Создавать отдельную версию сайта под каждое устройство неразумно не только из-за огромного количества разнообразных девайсов, но и потому, что мы просто не имеем возможности предсказывать будущее. Вот тут и приходит на помощь концепция отзывчивого дизайна.

Отзывчивый сайт – это сайт, который будет реагировать и адаптироваться к поведению пользователя и размеру экрана. Идей заключается в следующем: изменить и реорганизовать дизайн, адаптировать изображения, шрифт, колонки, и т.д. к размеру браузера (окна просмотра) , разрешению и ориентации, вместо того, чтобы создавать отдельные сайты под каждое устройство.

Рассмотрим три типа макетов

Резиновый макет

Основа резинового макета в использование относительных единиц. Это значит, что такой макет способен тянуться и сжиматься; многие дизайнеры используют резиновые сетки, основанные на процентах, чтобы создавать такие макеты.

Идея проста: вместо того чтобы задавать макету жесткую ширину в пикселях, мы назначаем относительные единицы в процентах.

Демо резинового макета:

резиновый макет

Файл style.css дает нам общее представление о стилях страницы (цвет, шрифт), но давайте взглянем на файл fluid.css:

CSS

#header {
    width: 100%;
    margin: 0;
    padding: 0;
}
#content {
    float: left;
    width: 60%;
    margin: 0 0 20px 0;
    padding: 0;
}
#content .inner {
    margin-right: 2%;
}
.sidebar{
    float: left;
    margin: 0 0 20px 1%;
    padding: 0;
}
#bar1{
    width:20%;
}
#bar2{
    width:18%;
}
#footer {
    clear: both;
    width: 100%;
    margin: 0;
    padding: 0;
}

Шапка и подвал имеют ширину равную 100%: в нашем случае по ширине они займут все окно просмотра. Также мы имеем основной блок равный по ширине 60% и две боковые колонки шириной 20% и 18% (по 1% на поля), соответственно, что соответствует полной ширине окна браузера, простите за тавтологию.

Этот дизайн прекрасно адаптируется под современные экраны, но при слишком сильном сужении текст в боковых колонках становится трудно читаемым.

Адаптивный макет

В основе адаптивного макета лежит простая идея: вместо процентов используем фиксированные размеры. Однако фиксированные размеры будут меняться в зависимости от браузера/окна просмотра, таким образом, наш макет предполагает различные 'точки останова'.

Макет будет адаптировать под различные экраны при помощи точек останова и медиа-запросов.

Как это работает можно увидеть на приведенном ниже изображении/demo:

резиновый макет

HTML и style.css не изменились; изменилась структура страницы. Давайте взглянем на файл adaptive.css.

'Нормальный' сайт использует следующие стили:

CSS

body{
    width:1280px;
    margin:0 auto;
}
#header {
    width: 100%;
    margin: 0;
    padding: 0;
}
#content {
    float: left;
    width: 800px;
    margin: 0 0 20px 0;
    padding: 0;
}
#content .bloc{
    margin-right: 10px;
}
.sidebar{
    float: left;
    margin: 0 0 20px 20px;
    padding: 0;
    width:220px;
}
#footer {
    clear: both;
    width: 100%;
    margin: 0;
    padding: 0;
}

Шапка и подвал имеют 100% ширину, однако блок с контентом, боковые колонки, и сам сайт строго фиксированную. Давайте рассмотрим самую важную часть стилей: точки останова и медиа-запросы.

CSS

/* Media queries */
@media screen and (max-width: 1200px) {
    body{
    width:1000px;
    margin:0 auto;
    }
    #content {
    width: 700px;
    }
    .sidebar{
    width:280px;
    }
}

@media screen and (max-width: 980px) {
body{
    width:850px;
    margin:0 auto;
    }
    #content {
    width: 550px;
    }
    .sidebar{
    width:280px;
    }
}

@media screen and (max-width: 750px) {
    body{
    width:600px;
    margin:0 auto;
    }
    #content {
    width: 400px;
    }
    .sidebar{
    width:190px;
    margin: 0 0 20px 10px;
    }
}

@media screen and (max-width: 540px) {
    body{
    width:450px;
    margin:0 auto;
    }
    #content {
    width: 450px;
    }
    #content .bloc{
    margin:0px;
    }
    .sidebar{
    width:450px;
    margin: 0 0 10px 0;
    }
}

@media screen and (max-width: 380px) {
    body{
    width:360px;
    margin:0 auto;
    }
    #content {
    width: 360px;
    }
    #content .bloc {
    margin:0px;
    }
    .sidebar{
    width:360px;
    margin: 0 0 10px 0;
    }
}

Каждая точка останова имеет свой медиа-запрос, при этом меняются размеры тега body, блока с контентом и колонок. При ширине ниже 540px текст в боковых колонках становится трудно читаемым, поэтому в этом случае я сделал так, что ширина боковых колонок становится равной ширине блока с контентом и боковые колонки располагаются под блоком с основным содержимым.

Отличительная особенность (со знаком плюс) адаптивных макетом в том, что вы можете менять не только размеры блоков, но и сам макет, включая положение блоков на странице.

Большая трудность заключается в выборе точек останова. Точки останова могут подбираться исходя из общих (наиболее распространенных) размеров устройств. Например, можно обратиться к уже подобранному списку медиа-запросов. Другой путь заключается в подборе точек останова на лету: то есть вы меняете размеры экрана и фиксируете уродливый дизайн и трудночитаемый текст, ставя при этом необходимую точку останова.

Ниже приведен пример адаптивного макета:

адаптивный сайт -  пример

Отзывчивый макет

Отзывчивый макет можно определить как смесь между резиновым и адаптивным макетом. Он будет использовать относительные единицы из резинового макета и точки останова из адаптивного.

Здесь вы можете увидеть демо отзывчивого макета.

Для 'нормальной' версии используем следующие стили:

CSS

#page{
    max-width:1280px;
}
#header {
    width: 100%;
    margin: 0;
    padding: 0;
}
#content {
    float: left;
    width: 60%;
    margin: 0 0 20px 0;
    padding: 0;
}
#content .bloc {
    margin-right: 2%;
}
.sidebar{
    float: left;
    margin: 0 0 20px 1%;
    padding: 0;
}
#bar1{
    width:20%;
}
#bar2{
    width:18%;
}
#footer {
    clear: both;
    width: 100%;
    margin: 0;
    padding: 0;
}

Что важно здесь мы используем max-width (вместо фиксированной ширины для адаптивного макета). Именно это свойство позволяет нам создать плавный переход. Свойство max-width позволяет нам сократить количество точек останова по сравнению с адаптивным макетом; для всех других размеров мы используем относительные единицы (проценты для нашего примера).

CSS с медиа-запросами:

CSS

/* The media queries*/
@media screen and (max-width: 1000px) {
    #bar1,
    #bar2{
    width:39%;
    }
    .sidebar{
    float: left;
    margin: 0 0 20px 1%;
    padding: 0;
    }
}

@media screen and (max-width: 540px) {
    #bar1,
    #bar2{
    clear:both;
    width:100%;
    }
    .sidebar{
    float: left;
    margin: 0 0 20px 1%;
    padding: 0;
    }
    #content {
    clear:both;
    width:100%;
    }
    #content .bloc {
    margin:0;
    }
}

Все размеры задаются в процентах относительно max-width элемента body.

Отметьте, что для экранов, чьи размеры по ширине меньше 540px, ширина боковых колонок и основного блока равна 100%.

Преимущество отзывчивого макета, как уже говорилось выше, в отсутствие большого количества точек останова. Так как размеры задаются в процентах, дизайн автоматически подстраивается под размеры экрана, при этом важно расположить точки останова так, где дизайн разрушается. В этом случае роль остановов состоит в реорганизации макета для наилучшего и комфортного чтения пользователем.

отзывчивый макет -  пример

Медиа-запросы: создать и определить точки останова

Медиа-запросы введены в CSS3 спецификацию. Медиа-запросы (media queries) позволяют создавать условия (основанные на ширине, высоте, ориентации, цвете и т.д.), по которым подключаются определенные стили. Существует огромный список медиа-запросов доступный на официальном сайте w3c. Вот наиболее часто используемые медиа-запросы и их определения:

Медиа-запросы Использование
Min-width: используется, когда ширина окна просмотра равна или больше указанной ширины
max-width: используется, когда ширина окна просмотра равна или меньше указанной ширины
min-device-width: используется, когда ширина экрана устройства равна или больше указанной ширины
max-device-width: используется, когда ширина экрана устройства равна или меньше указанной ширины
orientation : portrait // orientation: landscape используется при текущей ориентации (альбомная или портретная)
-webkit-min-device-pixel-ratio : 1.5 устанавливаем стиль для экранов с соотношением сторон 1.5 и более (android и ios)

Медиа-запросы можно подключить при помощи основного файла CSS, или вы можете создать отдельный файл CSS для разного типа устройств. Отдельный файл легко организовать и он не будет загружен, если медиа-запросы не поддерживается браузером, но при этом используется дополнительный http-запрос. В случае использования основного CSS файла у вас не будет дополнительного http-запроса, но стили будут подгружены, даже если браузер не поддерживает медиа-запросы, и такой файл труднее организовать. Оба метода имеют свои плюсы и минусы, на каком остановиться решать вам.

Используем медиа-запросы в основном стилевом файле:

CSS

body {
    background: gray;
}
@media all and (max-width:500px) {
body {
        background: blue;
    }
} 

Подключаем отдельный стилевой файл для определенного типа устройств:

HTML

<link rel="stylesheet" type="text/CSS"  media="screen and (max-device-width: 480px) " href="mobile.CSS" /> 

Полезные 'трюки' при использовании медиа-запросов

Вопрос каскада

Как и для любого css кода важно понимание каскада.

Рассмотрим следующий пример:

CSS

#container{
background:rgba(111, 78, 152, 0.9); /* violet  */
color:rgb(1, 1, 1);

@media all and (min-width:500px) {
    #container{
    background: rgba(255, 0, 0, 0.9); /* red */
    color: white;
    }
}
@media all and (min-width:700px) {
   #container{
    background: rgba(0, 0, 255,0.9); /*blue */
    font-family: serif;
    }
}

Если ширина нашего браузера больше 500px, цвет текста имеет белый цвет, а фон странички красный. Если ширина окна станет больше 700px, фон странички поменяется на синий, а цвет текст по-прежнему останется белым, потому что свойство цвета унаследовано от предыдущего медиа-запроса (min-width:500px).

Стек из медиа-запросов

Рассмотрим следующий пример:

CSS

#container{
    background:rgba(111, 78, 152, 0.9); /*violet */
    padding:10px 5px;
    color:rgb(1, 1, 1);
}

@media all and (min-width:500px) and (max-width:699px) {
   #container{
   background: rgba(255, 0, 0, 0.9); /* rouge */
   font-family: serif;
   }
}
@media all and (min-width:700px) {
   #container{
   background: rgba(0, 0, 255,0.9); /*bleu */
   color: white;
   font-family: serif;
   }
} 

Первый медиа-запрос определяет стили для экранов с шириной от 500 до 699 пикселов, второй – от 700 пикселов. В случае, когда для медиа-запроса задана минимальная и максимальная ширина свойства не наследуются. Для нашего примера, если для экранов с шириной от 700px мы захотим использовать шрифт с засечками, нам придется повторить свойство family.

Вам потребуется мета тег viewport, чтобы медиа-запросы заработали. Мета тег viewport позволяет взять под контроль поведение области просмотра на мобильных устройствах. В принципе, если вы не подключите мета тег viewport, на мобильных устройствах сайт попытается соответствовать экрану, что приведет к масштабированию сайта до совсем небольших размеров.

Meta тег viewport выглядит следующим образом:

HTML

<meta name="viewport"  content="initial-scale=1, width=device-width">

Этим мы сообщаем браузеру, что содержимое должно быть широким насколько это возможно, и при этом его масштаб должен соответствовать 1 к 1.

Не только о мобильниках

В моих примерах я показал, как использовать медиа-запросы для устройств, в том числе, с небольшим размером экрана. Однако в заключении я хочу подчеркнуть, что медиа запросы применяются не только для оптимизации сайтов под мобильные устройства. Мы можем отметить все больше и больше мобильных устройств, но и размеры обычных экранов меняются также часто.

Тестируем отзывчивый веб-дизайн:

  • Responsive Design Tester
  • Responsivepx

Истточник

Комментарии к статье

аватарка пользователя
2013-10-13
Виктория

Спасибо огромное за большую и подробную статью, за Ваш труд. Очень актуально, наглядно и гениально просто.

аватарка пользователя
2014-08-11
Victor

Спасибо за статью, буду реализовывать.