SlideShare une entreprise Scribd logo
1  sur  54
Адаптивный веб-дизайн
     на практике

       Антон Епрев
   a.eprev@corp.mail.ru
goo.gl/YFsuS
2
Responsive Web Design
    o Резиновая верстка
    o Плавающие изображения
    o Медиа-запросы




3
goo.gl/rCZ4Z
4
Mobile First
    Использование мобильного
    интернета удваивается с
    каждым годом [goo.gl/F17AD]

    В рунете 10% посещений
    приходятся на мобильные
    устройства [goo.gl/fBLCF]


5
Mobile First
    o Фокус на главном
    o Полнофункциональная мобильная версия
    o Рабочая большая версия




6
Мобильные браузеры




7                        goo.gl/vfs1d
Классы поддержки браузеров
    Graded Browser Support [goo.gl/3vbtC]

    C:   IE7-
    A:   IE8/9, Chrome, Safari, Firefox, Opera,
         Opera Mobile, Opera Mini 4/6
    X:   Chrome 12, Firefox 4, Opera 10

8
Отрубаем концы
     <!DOCTYPE html>
     <html><head>
       <!--[if !(IE)|(gte IE 8)]><!-->
       <link type="text/css" ... />
       <script ...></script>
       <!--<![endif]-->
     </head><body>
         ...
     </body></html>


10
Progressive Enhancement
     +   Гарантированная работа сервиса в
         любом устройстве
     +   Возможность выкатывать новые
         изменения раньше
     –   Сложность реализации

11
12
Требования к веб-дизайну
     o «Pixel-perfect»
     o Поддержка touch-устройств
     o Минимальное поддерживаемое
       разрешение 240px


13
14
15
16
Настрой Viewport
     <meta name="viewport" content="
       width=device-width,
       initial-scale=1,
       minimum-scale=1,
       maximum-scale=1,
       user-scalable=0
     " />

17
Поддержка:hover
     var touch = 'ontouchstart' in window;
     $('html').addClass(
       touch ? 'touch-yes' : 'touch-no'
     );

     .touch-no .item .item__link {
       display: none;
     }
     .touch-no .item:hover .item__link {
       display: block;
     }


18
Определение возможностей
     var video = !!document.createElement('video').canPlayType;

     var flash = (typeof navigator.plugins['Shockwave Flash']
                  == 'object');

     if (!flash && typeof window.ActiveXObject != 'undefined')
       try {
         new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
         flash = true;
       } catch (e) {}



19
Отлавливаем scroll
     <ul class="feed">
       <li class="feed__item">...</li>
       <!-- ... -->
       <li class="feed__next-page">...</li>
     </ul>

     .feed__next-page { display: block; }

     $(document).one('scroll', function() {
       $('.feed__next-page').hide();
     });


20
Desktop vs. Mobile




21
Облегчаем функционал
     var desktop = screen.width > 768 && !touch;

     $('.button').click(function (e) {
       if (desktop) {
         e.preventDefault();
         // AJAX
       }
     });



22
Задача




24
Каркас
     <a href="#" class="button">
       <span class="button__inner"></span>
     </a>

     .button { // Sass (SCSS)
       padding: $border-width;
       height: $height - $border-width * 2;
     }
     .button__inner {
       line-height: $height - $border-width * 2;
     }


25
<a href="#" class="button">
       <span class="button__inner">
         <img src="empty.png"
              class="button__icon" alt="Icon" />
       </span>
     </a>

     .button__icon {
       width: ...; height: ...; background:...;
     }

     IE6:                     Chrome:

26
<a href="#" class="button">
       <span class="button__inner">
         <img src="empty.png"
              class="button__icon" alt="Icon" />
       </span>
     </a>

     .button__icon {
       width: ...; height: ...; background:...;
     }

     IE6:                     Chrome:

27
<a href="#" class="button">
       <span class="button__inner">
         <i class="button__icon">Icon</i>
       </span>
     </a>

     .button__icon {
       ...
       text-indent: -9999px;
     }

     IE6:                      Chrome:

28
<a href="#" class="button">
       <span class="button__inner">
         <i class="button__icon">Icon</i>
         <u class="button__text">Text</u>
       </span>
     </a>

     <button class="button">
       <span class="button__inner">
         <i class="button__icon">Icon</i>
         <u class="button__text">Text</u>
       </span>
     </button>


29
.button {
       height: $height - $border-width * 2;
     }

     .button {
       @include box-sizing(content-box);
       height: $height - $border-width * 2;
     }

              <A>                       <BUTTON>




30
.button {
       height: $height - $border-width * 2;
     }

     .button {
       @include box-sizing(content-box);
       height: $height - $border-width * 2;
     }

              <A>                       <BUTTON>




31
Opera Mini и line-height
     .button__inner {
       line-height: $height - $border-width * 2;
     }




              <A>                       <BUTTON>



32
Opera Mini и line-height
     .button__inner {
       line-height: 1; // сбрасываем для всех
       padding: (
         $height - $border-width * 2 - $font-size
       )/2 0;
       height: $font-size;
     }
              <A>                       <BUTTON>



33
Handheld!
     Режимы Opera Mini:
     o Desktop
     o Mobile

     См. goo.gl/XixDM

34
Handheld!
     Режимы Opera Mini:
     o Desktop
     o Mobile

     См. goo.gl/XixDM

35
Handheld!
     Режимы Opera Mini:
     o Desktop
     o Mobile

     См. goo.gl/XixDM

36
<link
       href="..."
       rel="stylesheet"
       type="text/css"
       media="all"
     />

     <link
       href="..."
       rel="stylesheet"
       type="text/css"
       media="all, handheld"
     />


37
<link
       href="..."
       rel="stylesheet"
       type="text/css"
       media="all"
     />

     <link
       href="..."
       rel="stylesheet"
       type="text/css"
       media="all, handheld"
     />


38
@media screen and
       (max-width: 320px) {
         .button__text {
           display: none;
         }}




39
Handheld!
     @media screen and
       (max-width: 320px) {
         .button__text {
           display: none;
         }}

     @media handheld, screen and
       (max-width: 320px) {
         .button__text {
           display: none;
         }}

40
Handheld!
     @media screen and
       (max-width: 320px) {
         .button__text {
           display: none;
         }}

     @media handheld, screen and
       (max-width: 320px) {
         .button__text {
           display: none;
         }}

41
Handheld!
     @media screen and
       (max-width: 320px) {
         .button__text {
           display: none;
         }}

     @media all and
       (max-width: 320px) {
         .button__text {
           display: none;
         }}

42
Особенности click в iOS
     <a class="button">...</a>

     .button {
       ...
     }

     $('body').delegate(
       '.button', 'click', function () {
         // :)
       }
     );


43
Особенности click в iOS
     <div class="button">...</div>

     .button {
       ...
     }

     $('body').delegate(
       '.button', 'click', function () {
         // :(
       }
     );


44
Особенности click в iOS
     <div class="button">...</div>

     .button {
       cursor: pointer;
     }

     $('body').delegate(
       '.button', 'click', function () {
         // :)
       }
     );


45
Особенности click в iOS
     <div class="button">...</div>

     .button {
       cursor: pointer;
     }

     $('body').delegate(
       '.button', 'click', function () {
         // :)
       }
     );


46
Ни жив, не мёртв…
     o {position: fixed}
       iOS 5, Android 3, Opera Mobile

     o {overflow: scroll}
       iOS 5, Android 3.2

     o Opera Mini: JavaScript
       См. goo.gl/XixDM

47
Средства разработчика
     o iOS Simulator
     o Opera Mobile Emulator [goo.gl/QIkmf]
     o Opera Mini Online Simulator [goo.gl/fHEv4]
     o Opera Remote Debugging
     o Weinre [goo.gl/TmXxo]
     o Adobe Shadow [goo.gl/hfN6Y]
48
49
50
51
52
53
Q&A

    Антон Епрев
a.eprev@corp.mail.ru

Contenu connexe

Similaire à Адаптивный веб-дизайн на практике (Антон Епрев)

Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Ontico
 
Программирование под Maemo
Программирование под MaemoПрограммирование под Maemo
Программирование под Maemodmitryml
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндексit-people
 
Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Ян...
Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Ян...Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Ян...
Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Ян...Ontico
 
DUMP-2013 Frontend - Принципы разработки поддерживаемых и гибких интерфейсов ...
DUMP-2013 Frontend - Принципы разработки поддерживаемых и гибких интерфейсов ...DUMP-2013 Frontend - Принципы разработки поддерживаемых и гибких интерфейсов ...
DUMP-2013 Frontend - Принципы разработки поддерживаемых и гибких интерфейсов ...it-people
 
Принципы разработки гибких и поддерживаемых интерфейсов
Принципы разработки гибких и поддерживаемых интерфейсовПринципы разработки гибких и поддерживаемых интерфейсов
Принципы разработки гибких и поддерживаемых интерфейсовVasiliy Aksyonov
 
Всеволод Шмыров, Яндекс
Всеволод Шмыров, ЯндексВсеволод Шмыров, Яндекс
Всеволод Шмыров, ЯндексElena Voynova
 
Журат М. - AFramework
Журат М. - AFrameworkЖурат М. - AFramework
Журат М. - AFrameworkInnim
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Anton Arhipov
 
всплывающее окно при закрытии сайта
всплывающее окно при закрытии сайта  всплывающее окно при закрытии сайта
всплывающее окно при закрытии сайта Olga Pirozhenko
 
Кроссбраузерные решения в рекламной сети Яндекса
Кроссбраузерные решения в рекламной сети ЯндексаКроссбраузерные решения в рекламной сети Яндекса
Кроссбраузерные решения в рекламной сети ЯндексаMedia Gorod
 
Кир Белевич "Touch it: универсальные тач-события и слайдер"
Кир Белевич "Touch it: универсальные тач-события и слайдер"Кир Белевич "Touch it: универсальные тач-события и слайдер"
Кир Белевич "Touch it: универсальные тач-события и слайдер"Yandex
 
Android - 08 - Action bar
Android - 08 - Action barAndroid - 08 - Action bar
Android - 08 - Action barNoveo
 
Владимир Варанкин — «БЭМ»
Владимир Варанкин — «БЭМ»Владимир Варанкин — «БЭМ»
Владимир Варанкин — «БЭМ»Yandex
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)Dmitry Evteev
 
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...it-people
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript ApplicationMikhail Davydov
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 

Similaire à Адаптивный веб-дизайн на практике (Антон Епрев) (20)

Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
Программирование под Maemo
Программирование под MaemoПрограммирование под Maemo
Программирование под Maemo
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс
 
Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Ян...
Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Ян...Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Ян...
Принципы разработки поддерживаемых и гибких интерфейсов / Василий Аксёнов (Ян...
 
DUMP-2013 Frontend - Принципы разработки поддерживаемых и гибких интерфейсов ...
DUMP-2013 Frontend - Принципы разработки поддерживаемых и гибких интерфейсов ...DUMP-2013 Frontend - Принципы разработки поддерживаемых и гибких интерфейсов ...
DUMP-2013 Frontend - Принципы разработки поддерживаемых и гибких интерфейсов ...
 
Принципы разработки гибких и поддерживаемых интерфейсов
Принципы разработки гибких и поддерживаемых интерфейсовПринципы разработки гибких и поддерживаемых интерфейсов
Принципы разработки гибких и поддерживаемых интерфейсов
 
Всеволод Шмыров, Яндекс
Всеволод Шмыров, ЯндексВсеволод Шмыров, Яндекс
Всеволод Шмыров, Яндекс
 
Журат М. - AFramework
Журат М. - AFrameworkЖурат М. - AFramework
Журат М. - AFramework
 
Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)Domain Specific Languages (for business rules)
Domain Specific Languages (for business rules)
 
всплывающее окно при закрытии сайта
всплывающее окно при закрытии сайта  всплывающее окно при закрытии сайта
всплывающее окно при закрытии сайта
 
Кроссбраузерные решения в рекламной сети Яндекса
Кроссбраузерные решения в рекламной сети ЯндексаКроссбраузерные решения в рекламной сети Яндекса
Кроссбраузерные решения в рекламной сети Яндекса
 
Кир Белевич "Touch it: универсальные тач-события и слайдер"
Кир Белевич "Touch it: универсальные тач-события и слайдер"Кир Белевич "Touch it: универсальные тач-события и слайдер"
Кир Белевич "Touch it: универсальные тач-события и слайдер"
 
Android - 08 - Action bar
Android - 08 - Action barAndroid - 08 - Action bar
Android - 08 - Action bar
 
Владимир Варанкин — «БЭМ»
Владимир Варанкин — «БЭМ»Владимир Варанкин — «БЭМ»
Владимир Варанкин — «БЭМ»
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)
 
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript Application
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 

Plus de Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

Plus de Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Адаптивный веб-дизайн на практике (Антон Епрев)

  • 1. Адаптивный веб-дизайн на практике Антон Епрев a.eprev@corp.mail.ru
  • 3. Responsive Web Design o Резиновая верстка o Плавающие изображения o Медиа-запросы 3
  • 5. Mobile First Использование мобильного интернета удваивается с каждым годом [goo.gl/F17AD] В рунете 10% посещений приходятся на мобильные устройства [goo.gl/fBLCF] 5
  • 6. Mobile First o Фокус на главном o Полнофункциональная мобильная версия o Рабочая большая версия 6
  • 8. Классы поддержки браузеров Graded Browser Support [goo.gl/3vbtC] C: IE7- A: IE8/9, Chrome, Safari, Firefox, Opera, Opera Mobile, Opera Mini 4/6 X: Chrome 12, Firefox 4, Opera 10 8
  • 9.
  • 10. Отрубаем концы <!DOCTYPE html> <html><head> <!--[if !(IE)|(gte IE 8)]><!--> <link type="text/css" ... /> <script ...></script> <!--<![endif]--> </head><body> ... </body></html> 10
  • 11. Progressive Enhancement + Гарантированная работа сервиса в любом устройстве + Возможность выкатывать новые изменения раньше – Сложность реализации 11
  • 12. 12
  • 13. Требования к веб-дизайну o «Pixel-perfect» o Поддержка touch-устройств o Минимальное поддерживаемое разрешение 240px 13
  • 14. 14
  • 15. 15
  • 16. 16
  • 17. Настрой Viewport <meta name="viewport" content=" width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0 " /> 17
  • 18. Поддержка:hover var touch = 'ontouchstart' in window; $('html').addClass( touch ? 'touch-yes' : 'touch-no' ); .touch-no .item .item__link { display: none; } .touch-no .item:hover .item__link { display: block; } 18
  • 19. Определение возможностей var video = !!document.createElement('video').canPlayType; var flash = (typeof navigator.plugins['Shockwave Flash'] == 'object'); if (!flash && typeof window.ActiveXObject != 'undefined') try { new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); flash = true; } catch (e) {} 19
  • 20. Отлавливаем scroll <ul class="feed"> <li class="feed__item">...</li> <!-- ... --> <li class="feed__next-page">...</li> </ul> .feed__next-page { display: block; } $(document).one('scroll', function() { $('.feed__next-page').hide(); }); 20
  • 22. Облегчаем функционал var desktop = screen.width > 768 && !touch; $('.button').click(function (e) { if (desktop) { e.preventDefault(); // AJAX } }); 22
  • 23.
  • 25. Каркас <a href="#" class="button"> <span class="button__inner"></span> </a> .button { // Sass (SCSS) padding: $border-width; height: $height - $border-width * 2; } .button__inner { line-height: $height - $border-width * 2; } 25
  • 26. <a href="#" class="button"> <span class="button__inner"> <img src="empty.png" class="button__icon" alt="Icon" /> </span> </a> .button__icon { width: ...; height: ...; background:...; } IE6: Chrome: 26
  • 27. <a href="#" class="button"> <span class="button__inner"> <img src="empty.png" class="button__icon" alt="Icon" /> </span> </a> .button__icon { width: ...; height: ...; background:...; } IE6: Chrome: 27
  • 28. <a href="#" class="button"> <span class="button__inner"> <i class="button__icon">Icon</i> </span> </a> .button__icon { ... text-indent: -9999px; } IE6: Chrome: 28
  • 29. <a href="#" class="button"> <span class="button__inner"> <i class="button__icon">Icon</i> <u class="button__text">Text</u> </span> </a> <button class="button"> <span class="button__inner"> <i class="button__icon">Icon</i> <u class="button__text">Text</u> </span> </button> 29
  • 30. .button { height: $height - $border-width * 2; } .button { @include box-sizing(content-box); height: $height - $border-width * 2; } <A> <BUTTON> 30
  • 31. .button { height: $height - $border-width * 2; } .button { @include box-sizing(content-box); height: $height - $border-width * 2; } <A> <BUTTON> 31
  • 32. Opera Mini и line-height .button__inner { line-height: $height - $border-width * 2; } <A> <BUTTON> 32
  • 33. Opera Mini и line-height .button__inner { line-height: 1; // сбрасываем для всех padding: ( $height - $border-width * 2 - $font-size )/2 0; height: $font-size; } <A> <BUTTON> 33
  • 34. Handheld! Режимы Opera Mini: o Desktop o Mobile См. goo.gl/XixDM 34
  • 35. Handheld! Режимы Opera Mini: o Desktop o Mobile См. goo.gl/XixDM 35
  • 36. Handheld! Режимы Opera Mini: o Desktop o Mobile См. goo.gl/XixDM 36
  • 37. <link href="..." rel="stylesheet" type="text/css" media="all" /> <link href="..." rel="stylesheet" type="text/css" media="all, handheld" /> 37
  • 38. <link href="..." rel="stylesheet" type="text/css" media="all" /> <link href="..." rel="stylesheet" type="text/css" media="all, handheld" /> 38
  • 39. @media screen and (max-width: 320px) { .button__text { display: none; }} 39
  • 40. Handheld! @media screen and (max-width: 320px) { .button__text { display: none; }} @media handheld, screen and (max-width: 320px) { .button__text { display: none; }} 40
  • 41. Handheld! @media screen and (max-width: 320px) { .button__text { display: none; }} @media handheld, screen and (max-width: 320px) { .button__text { display: none; }} 41
  • 42. Handheld! @media screen and (max-width: 320px) { .button__text { display: none; }} @media all and (max-width: 320px) { .button__text { display: none; }} 42
  • 43. Особенности click в iOS <a class="button">...</a> .button { ... } $('body').delegate( '.button', 'click', function () { // :) } ); 43
  • 44. Особенности click в iOS <div class="button">...</div> .button { ... } $('body').delegate( '.button', 'click', function () { // :( } ); 44
  • 45. Особенности click в iOS <div class="button">...</div> .button { cursor: pointer; } $('body').delegate( '.button', 'click', function () { // :) } ); 45
  • 46. Особенности click в iOS <div class="button">...</div> .button { cursor: pointer; } $('body').delegate( '.button', 'click', function () { // :) } ); 46
  • 47. Ни жив, не мёртв… o {position: fixed} iOS 5, Android 3, Opera Mobile o {overflow: scroll} iOS 5, Android 3.2 o Opera Mini: JavaScript См. goo.gl/XixDM 47
  • 48. Средства разработчика o iOS Simulator o Opera Mobile Emulator [goo.gl/QIkmf] o Opera Mini Online Simulator [goo.gl/fHEv4] o Opera Remote Debugging o Weinre [goo.gl/TmXxo] o Adobe Shadow [goo.gl/hfN6Y] 48
  • 49. 49
  • 50. 50
  • 51. 51
  • 52. 52
  • 53. 53
  • 54. Q&A Антон Епрев a.eprev@corp.mail.ru