Touch
или как верстать под "мобилки"

Кувалдин Артем, Мохов Олег

Предыстория

Статистика мобильных устройств в России

Разрешения экранов

Размеры экранов

4''
320px
1136px
568px
640px

Pixels

device pixel

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

CSS pixels

— абстрактная величина, используемая браузерами для точного отображения контента на страницах, вне зависимости от экрана

Плотность пикселей

PPI (Pixels Per Inch) - пиксели на дюйм.

Дисплеи с повышенной плотностью

Retina display

— общее маркетинговое название ЖК-дисплеев, используемых в устройствах Apple и отличающихся настолько высокой плотностью пикселей.

Retina display

Отличия

Какие браузеры популярны?


Макеты (layout)

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

Ширина контента не меняется в зависимости от размеров окна браузера.

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

Подстраивание контента под ширину экрана путем сжатия элементов.

Особенности

  • На одной странице максимальное количество информации
  • Не заботится о том, как контент будет выглядеть на экранах с критически большой или маленькой шириной

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

Сайт подстраивается под разрешение и размер экрана

Особенности

  • Адаптация под различные разрешения экранов
  • Не можем предугадать как будет выглядеть контент на всех устройствах

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

Особенности

  • Не «прыгает» по контрольным точкам
  • Тщательная проработка

Стратегии разработки

Progressive enhancement

Cоздание веб-интерфейса происходит поэтапно, от самого простого к сложному

Особенности

  • Гарантированная работа проекта в любом браузере
  • Выкатывать новые возможности и изменения раньше
  • Увеличение сложности реализации back-end’а

Mobile first

Начинаете проектирование сервиса с мобильной версии
Не mobile first
mobile first

Особенности

  • Фокус на самом главном
  • Полнофункциональная мобильная версия
  • Мобильная версия может хорошо работать в “большом” вебе
  • У вас не сразу будет версия для “большого“ веба
  • Подход сложно применим для больших порталов

Responsive web design

Вы делаете одну версию вашего веб-проекта для всех устройств с любым размером экрана
хорошая книга

Особенности

  • Одна версия сайта
  • Преемственность интерфейса
  • Неоптимальное использование возможностей всех устройств
  • Возрастают требования к проработке интерфейса и дизайна

Шаблоны отзывчивых макетов

Инструменты

Two viewports

visual viewport
layout viewport

Какая ширина layout viewport?

  • Safari iPhone = 980px,
  • Opera = 850px,
  • Android WebKit = 800px,
  • IE = 974px,

Meta–тэг viewport

<meta name="viewport" content="width=device-width">

Другие значения

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

<meta name="viewport" content="width=device-width, initial-scale=1.0
                                maximum-scale=1.0, user-scalable=no">

@viewport

@viewport {//@-o-viewport | @-ms-viewport
  width: auto; // auto | device-width | length | %

  max-width: auto;
  min-width: auto;

  zoom: auto; // auto | number | %

  max-zoom: 5; // Largest allowed zoom factor.
  min-zoom: 0.25; // Smallest allowed zoom factor.

  user-zoom: zoom; // fixed | zoom

  orientation: auto; // auto | portrait | landscape
}

Media queries

Правило @media - позволяет указать тип устройства, для которого будет применяться указанный стиль.

@media [not|only] mediatype [and (media feature)] {
    CSS-Code;
}

Минимум

@media {
    a {
        color: red;
    }
}

Media types

  • all – все устройства(по-умолчанию)
  • print – принтеры и режим "Print preview"
  • screen – все утройства не print и не speech
  • speech – скринридеры

Версия для печати

body {
  color: red
}
@media print {
  body {
    color: blue
  }
}

Для печати и экранов

@media print, screen {
  body {
    color: blue
  }
}

media features

– задают технические характеристики устройства, на котором отображается документ.

Ширина

@media (min-width:600px) {
    aside {
        float: left;
        width: 300px;
        margin: 10px;
    }
}
@media (max-width:600px) {
    aside {
        float: none;
        color: blue;
    }
}
Пример

Диапазон

h1 {
    font-size: 50px;
}

@media (min-width:400px) and (max-width:600px) {
    h1 {
        font-size: 20px;
        color: red;
    }
}
Пример

Диапазон

h1 {
    font-size: 50px;
}

@media (min-width:600px), (max-width:400px) {
    h1 {
        font-size: 20px;
        color: red;
    }
}
Пример

device width

@media (min-device-width: 200px) and
       (max-device-width: 400px) {
    body {
        color: red;
    }
}
Пример

В чем разница?

@media (min-width: 300px) {
    body {
        color: red;
    }
}
@media (min-device-width: 300px) and
       (max-device-width: 400px) {
    body {
        color: blue;
    }
}
Пример

Ориентация

//landscape | portrait
@media (orientation: landscape) {
    body {
        color: red;
    }
}
Пример

Pixel ratio

.selector {
    background: url(../apple.png) no-repeat;
}

// -o-min-device-pixel-ratio
// min--moz-device-pixel-ratio
// -webkit-min-device-pixel-ratio
@media (min-device-pixel-ratio: 2) {
  .selector {
    background-image: url(../apple@2x.png);
    background-size: cover;
  }
}

resolution

@media (min-device-pixel-ratio:2),
       //dpi (dots per inch) - точек на дюйм
       //для экранов 1DPI = 1PPI
       (min-resolution: 192dpi),
       //dppx (dots per pixel) - точек на пиксель
       (min-resolution: 2dppx) { ... }

Остальные media features

  • min-height, max-height
  • device-min-height, device-max-height
  • grid – устройство с фиксированным размером символов
  • min-resolution, max-resolution
  • color (min-color, max-color)

Отрицание

@media not all and (monochrome) { ... }
То же самое что:
@media not (all and (monochrome)) { ... }
Но не:
@media (not all) and (monochrome) { ... }

Но

@media not screen and (color), print and (color) { ... }
То же самое что:
@media (not (screen and (color))), print and (color) { ... }

Аттрибут media

<link rel="stylesheet" media="(max-width: 640px)" href="max-640px.css">
<link rel="stylesheet" media="(min-width: 640px)" href="min-640px.css">
<link rel="stylesheet" media="(orientation: portrait)" href="portrait.css">
<link rel="stylesheet" media="(orientation: landscape)" href="landscape.css">

Перерыв

 









Практика

Автоопределение телефонов


+73191111110
                

https://jsfiddle.net/14euzh53/1/

Автоопределение телефонов

<head>
    
</head>
                +73191111110

input

<input type="...">

button, checkbox, color, date, datetime-local, email, file, hidden, image, month, number, password, number, radio, range, reset, search, submit, tel, text, time, url, week

https://jsfiddle.net/z8ubygof/1/

email

email

url

number

tel

date

datetime-local

month

time

input

MDN::<input>

Подсветка элемента

-webkit-tap-highlight-color

Устанавливает цвет подсветки ссылки или любого кликабельного элемента


.wrapper {
    –webkit-tap-highlight-color: transparent
}
                

-webkit-appearance

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


.element {
    –webkit-appearance: none | button | radio | ...;
}
                

Все значения

-webkit-overflow-scrolling


.element {
    -webkit-overflow-scrolling: touch;
}
                

Ретина

1. Всегда x2



                

2. media-queries


.logo {
    background: url(image.png);
}

@media screen and (device-pixel-ratio: 2) {
    .logo {
        background: url(image-x2.png);
    }
}
                

3. Вектор


.logo {
    background: url(logo.svg);
    background-size: 100px 60px;
}
                

4. «Стандартный»

4.1. image-set

.logo {
    background-image: image-set(
        "logo.png" 1x,
        "logo-2x.png" 2x,
        "logo-print.png" 600dpi);
}

Can I Use CSS image set

4.2. srcset

Can I Use srcset

4.3. <picture>


    
    

Can I Use tag Picture

position: fixed

  • Android 2.1 и ниже нет фиксированного позиционирования.
  • Android 2.2 позиционирует только после завершения прокрутки.
  • Android 2.3 поддерживает фиксированное позиционирование, но при запрете масштабирования.
  • Opera Mobile - Частично, после скрола элемент прыгает в выще/ниже
  • Opera Mini - не поддерживает
  • Windows Phone 7 - не поддерживает

Fixed Positioning in Mobile Browsers

JavaScript на touch-устройствах

Почему веб-приложения на мобильных платформах работают медленно

Особенности

  • Нет мышки
  • Есть события «на пальцах»
  • Есть события с девайсом

Документация Apple по тач-событиям

Чем пользуемся мы?

i-ua.js

Своего рода modernizr. Навешивает необходимые классы на body

                    .i-ua_svg_ yes/no.i-ua_platform_ ios/android/wp/opera/bada/other.i-ua_orientation_ portrait/landscape.i-ua_size_ small/normal/big
                

i-scroll5

iScroll is a high performance, small footprint, dependency free, multi-platform javascript scroller.

Как тестировать?

  • Инспекторы
  • Подключение девайса и инспектинг (iOS, Android)
  • Эмуляторы: iOS (XCode), Android, Opera Emulator
  • Но лучше всего

Домашнее задание

github.com/urfu-2015/webdev-tasks-5