172
Карточный домик Роман Дворнов Avito WSD, Минск, 2014

Карточный домик

  • Upload
    basisjs

  • View
    839

  • Download
    2

Embed Size (px)

DESCRIPTION

Не так давно случился значимый прецедент в истории W3C. Были приняты две конфликтующие спецификации, решающие одну проблему: Touch Events и Pointer Events. Почему так получилось, что это значит и что с этим делать? Конференция WSD, Минск, 26 октября 2014 Видео: http://www.youtube.com/watch?v=dQoz5KZUH2M

Citation preview

Page 1: Карточный домик

Карточный домикРоман Дворнов

Avito

WSD, Минск, 2014

Page 2: Карточный домик

2

Page 3: Карточный домик

О себе• Работаю в Avito • Делаю SPA • Автор basis.js

3

Page 4: Карточный домик

4

tinyurl.com/baba-yaga-protiv

Баба-яга против!Екатеринбург, 19 cентября 2014

Page 5: Карточный домик

Touch Events vs. Pointer Events

Page 6: Карточный домик

6

Часть первая+Урок истории Самая скучная часть доклада

Page 7: Карточный домик

Touch Events

7

Page 8: Карточный домик

8

Page 9: Карточный домик

Mobile Safari –рождение Touch Events

9

июнь 2007

Page 10: Карточный домик

Apple не стала вносить реализацию в WebKit

10

июнь 2007

Page 11: Карточный домик

в WebKit появилась реализация Touch Events

(от Android)

11

конец 2009

Page 12: Карточный домик

А как же стандарт?

12

Page 13: Карточный домик

W3C начал работать над Touch Events

13

май 2011

Page 14: Карточный домик

Candidate Recommendation

14

декабрь 2011

Page 15: Карточный домик
Page 16: Карточный домик

Apple раскрыла* свои патенты

16

декабрь 2011

* Члены W3C обязаны это делать согласно Patent Policy www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure

Page 17: Карточный домик

W3C гарантирует «юридическую чистоту»*

спецификации

17

Знаете ли вы?

* нет нарушения патентов или авторских прав

Page 18: Карточный домик

W3C не требует от держателей патентов отказываться от их конкурентного преимущества

18

Page 19: Карточный домик

Для W3C приемлема ‟Royalty-free” лицензия,

разрешающая реализацию только в браузерах

19

Page 20: Карточный домик

– Не вариант, – сказала Apple

Page 21: Карточный домик

TE PAG

21

www.w3.org/2012/01/touch-pag-charterTouch Events Patent Advisory Group

январь 2012

Page 22: Карточный домик
Page 23: Карточный домик

Touch Events version 2

23

Page 24: Карточный домик

Touch Events version 2

23

сентябрь 2012

в пользу Pointer Events

Page 25: Карточный домик

Recommendation

24

октябрь 2013

www.w3.org/TR/touch-events/

Page 26: Карточный домик

2007 – 2013

25

Page 27: Карточный домик

Pointer Events

26

Page 28: Карточный домик

W3C задумалась об унифицированной модели работы с указателями: мышь, touch, перо и т.д.

27

2009

Page 29: Карточный домик

Спецификация

28

2009

Page 30: Карточный домик

Спецификация

28

2009

МНОГО БУ

КВ

Page 31: Карточный домик

Спецификации должны быть как можно проще, чтобы быстрее доводить

до рекомендации

29

– Позиция W3C

Page 32: Карточный домик

30

Вы же помните историю сCSS 2.1?

Page 33: Карточный домик

IE10 mobile – рождение Pointer Events

31

июнь 2012

Page 34: Карточный домик

Опять Microsoft со своим велосипедом…

Page 35: Карточный домик

Проясним ситуацию, в это время…

• Touch Events заблокирована патентом Apple

• Microsoft выводит на рынок новые продукты

• W3C нужна универсальная модель

33

Page 36: Карточный домик

Ну что ж Microsoft, давай – удиви…

Page 37: Карточный домик

Заявка от Microsoft в W3C: Pointer Events

35

сентябрь 2012

www.w3.org/Submission/pointer-events/

Page 38: Карточный домик

Засчитано: Working Draft

36

декабрь 2012

www.w3.org/TR/pointerevents/

Page 39: Карточный домик

CandidateRecommendation

37

май 2013

www.w3.org/TR/pointerevents/

Page 40: Карточный домик

Recommendation

38

август 2014

www.w3.org/TR/pointerevents/

Page 41: Карточный домик

Recommendation

38

август 2014???

www.w3.org/TR/pointerevents/

Page 42: Карточный домик

А теперь все вместе

39

Page 43: Карточный домик

40

июль 2007 iPhone

2009 WebKit

WD май 2011

CR дек 2011

янв 2012 TE PAG

REC окт 2013

Заявка сен 2012

WD дек 2012

CR май 2013

июнь 2012 IE10 Mobile

Touch Events

Pointer Events

сен 2012 TE v2

REC ???

Page 44: Карточный домик

41

Часть вторая+Матчасть Самая техническая

Page 45: Карточный домик

Touch Events и Pointer Events разные решения одной

проблемы

42

Page 46: Карточный домик

Touch Events – решает одну задачу,

работа с touch

43

Page 47: Карточный домик

Pointer Events –универсальная модель,

для любых типов указателей

44

Page 48: Карточный домик

45

Pointer EventsTouch EventsСобытия +touchstart touchend touchmove touchcancel

Интерфейсы + TouchEvent : UIEvent Touch TouchList +

Расширения + Document createTouchEvent createTouchList

События +pointerdown pointerup pointermove pointercancel pointerover pointerout pointerenter pointerleave gotpointercapture lostpointercapture +

CSS +touch-action

Интерфейсы + PointerEvent : MouseEvent +

Расширения + Element setPointerCapture releasePointerCapture +

Navigator! pointerEnabled maxTouchPoints

Page 49: Карточный домик

Изучение

46

Pointer EventsTouch Events

≈ Mouse Eventsсовсем другая модель

Page 50: Карточный домик

Touch Events

47

B

C

A Событие target

Page 51: Карточный домик

Touch Events

47

B

C

A Событие target

Page 52: Карточный домик

Touch Events

47

B

C

A Событие target

touchstart B

Page 53: Карточный домик

Touch Events

47

B

C

A Событие target

touchstart Btouchmove B

touchmove B…

Page 54: Карточный домик

Touch Events

47

B

C

A Событие target

touchstart Btouchmove B

touchmove B…

touchmove B…

Page 55: Карточный домик

Touch Events

47

B

C

A Событие target

touchstart B

touchend B

touchmove B

touchmove B…

touchmove B…

Page 56: Карточный домик

Pointer Events

48

B

C

A Событие target

Page 57: Карточный домик

Pointer Events

48

B

C

A Событие target

Page 58: Карточный домик

Pointer Events

48

B

C

A Событие

pointerdown B

target

Page 59: Карточный домик

Pointer Events

48

B

C

A Событие

pointerdown Bpointermove B

pointermove A…

target

Page 60: Карточный домик

Pointer Events

48

B

C

A Событие

pointerdown Bpointermove B

pointermove A…

pointermove C…

target

Page 61: Карточный домик

Pointer Events

48

B

C

A Событие

pointerdown B

pointerup C

pointermove B

pointermove A…

pointermove C…

target

Page 62: Карточный домик

Pointer Events

48

B

C

A Событие

pointerdown B

pointerup C

pointermove B

pointermove A…

pointermove C…

target

Hit-testing

Page 63: Карточный домик

Pointer Events + pointer capture

49

B

C

A Событие target

Page 64: Карточный домик

Pointer Events + pointer capture

49

B

C

A Событие target

Page 65: Карточный домик

Pointer Events + pointer capture

49

B

C

A Событие

pointerdown B

target

Page 66: Карточный домик

Pointer Events + pointer capture

49

B

C

A Событие

pointerdown BB.setPointerCapture(e.pointerId)

target

Page 67: Карточный домик

Pointer Events + pointer capture

49

B

C

A Событие

pointerdown B

pointermove B

pointermove B…

B.setPointerCapture(e.pointerId)

target

Page 68: Карточный домик

Pointer Events + pointer capture

49

B

C

A Событие

pointerdown B

pointermove B

pointermove B…

pointermove B…

B.setPointerCapture(e.pointerId)

target

Page 69: Карточный домик

Pointer Events + pointer capture

49

B

C

A Событие

pointerdown B

pointerup B

pointermove B

pointermove B…

pointermove B…

B.setPointerCapture(e.pointerId)

target

Page 70: Карточный домик

Расширяемость

50

Pointer EventsTouch Events

под любой тип указателя

только touch

Page 71: Карточный домик

PointerEvent : MouseEvent

51

• pointerType • isPrimary • width / height • pressure • tiltX / tiltY

Page 72: Карточный домик

PointerEvent : MouseEvent

52

• pointerType • isPrimary • width / height • pressure • tiltX / tiltY

Тип указателя: mouse, pen, touch …

Page 73: Карточный домик

PointerEvent : MouseEvent

53

• pointerType • isPrimary • width / height • pressure • tiltX / tiltY

Главный указательдля своего типа

Page 74: Карточный домик

PointerEvent : MouseEvent

54

• pointerType • isPrimary • width / height • pressure • tiltX / tiltY

Ширина и высота области контакта

Page 75: Карточный домик

PointerEvent : MouseEvent

55

• pointerType • isPrimary • width / height • pressure • tiltX / tiltY

Сила надавливания

Page 76: Карточный домик

PointerEvent : MouseEvent

56

• pointerType • isPrimary • width / height • pressure • tiltX / tiltY

Углы наклона (пера)к поверхности

Page 77: Карточный домик

One more thing

57

Page 78: Карточный домик

Pointer Events (CSS)

58

touch-action: auto | none | [ pan-x || pan-y ] | manipulation

Page 79: Карточный домик

59

Минус:

Плюс: Позволяет оптимизировать действия (отдельный процесс, GPU) +

Нет pointer* событий (для касаний, участвующих в действии)

Page 80: Карточный домик

MSManipulationStateChanged

60

technet.microsoft.com/en-us/ie/hh771908(v=vs.71).aspx

Позволяет отслеживать состояние touch-actionПока не в спецификации

Page 81: Карточный домик

Polyfill

61

Page 82: Карточный домик

Touch Events → Pointer Events

62

touchstart touchend touchmove touchcancel

document.elementFromPoint()+

«Ручной» hit-testing

Page 83: Карточный домик

Touch Events → Pointer Events

63

Нельзя заполифилить touch-action

Page 84: Карточный домик

64

pointerdown pointerup pointermove pointercancel

element.setPointerCapture()+

Pointer Events → Touch Events

Page 85: Карточный домик

В спецификациях нет жестов (gesture)

65

Page 86: Карточный домик

Touch Events пока ограничены*

66

* многое должно было быть в TEv2

Page 87: Карточный домик

В спецификации Touch Events много белых пятен*

67

* многое должно было быть в TEv2

Page 88: Карточный домик

Pointer events могут заменить все остальные API –

Mouse Events и Touch Events

68

Page 89: Карточный домик

Часть третьяМир пополам

Самая внезапная

Page 90: Карточный домик

Реализации

70

Pointer EventsTouch Events• Apple (Safari) • WebKit (Android, etc) • Blink (Chrome, Opera) • IE11 mobile (эмуляция) • Firefox (в планах)

• IE10/11 • Firefox (в планах)

Page 91: Карточный домик

Touch Events первое решение проблемы

71

Page 92: Карточный домик

Pointer Events более продуманное решение

72

Page 93: Карточный домик

Pointer Events все встретили хорошо…

Page 94: Карточный домик

Кроме Apple…

Page 95: Карточный домик

Microsoft помогает с реализацией

WebKit, Blink и Firefox

75

tinyurl.com/k8uqx8u

Page 96: Карточный домик
Page 97: Карточный домик

Google официально отказалась реализовывать

Pointer Events в Blink

77

август 2014

tinyurl.com/nbeqpsb

Page 98: Карточный домик

Pointer Events, вы нам больше не нужны…

Page 99: Карточный домик

79

www.youtube.com/watch?v=ngBy0H_q-GY

Инженеры оправдываются…

Page 100: Карточный домик

Mobile first

80

Причина №1

Page 101: Карточный домик

Safari поддерживает только Touch Events, поэтому Pointer Events не стать популярными

81

Page 102: Карточный домик

Браво! Слова настоящих инноваторов!

Page 103: Карточный домик

83

Другие 3,73%Firefox 3,57%

IE6 92,7%

Доля браузеров Q3 2004

Mozilla изменила Web

Пришлось следовать стандартам

Page 104: Карточный домик

84

Доля мобильных браузеров Q3 2014Другие

4%IE

2,53%

Opera Mini 7,87%

Chrome 19,62%

Android Browser 21,11%

Safari 44,86%

Несокрушимая сила?

Page 105: Карточный домик

«В мобильном вебе, Safari стал новым IE6. Многие мобильные

сайты делаются не по стандартам, они делаются под Safari.»

85

tinyurl.com/m3lqb43

Page 106: Карточный домик

Позиция Google – укрепляет положение Safari

86

Page 107: Карточный домик

К черту стандарты, делаем все как Safari?!

87

Page 108: Карточный домик

Триумф Apple?

Page 109: Карточный домик

Триумф Apple?

Page 110: Карточный домик

Быстродействие

90

Причина №2

Page 111: Карточный домик

Pointer Events требуют hit-testing на движение пальца

(все как в Mouse Events)

91

Page 112: Карточный домик

Зато позволяют вынести часть работы в отдельный процесс

и привлечь GPU (scroll, zooming etc)

92

Page 113: Карточный домик

93

Google

Hit-testing

big performance issues*

~0.15 мс

Microsoft

* большие проблемы с быстродействием

Page 114: Карточный домик

93

Google

Hit-testing

big performance issues*

~0.15 мс

Microsoft

поверьте на слово=

0.00015 сек=

* большие проблемы с быстродействием

Page 115: Карточный домик

94

Android

Hit-testing

Заведется везде где есть

«процессор»

Строгие требования к оборудованию

Windows Phone

Page 116: Карточный домик

Вы на что-то намекаете?

Page 117: Карточный домик

96

Android

Hit-testing

Windows Phone

Page 118: Карточный домик

Нужно будет поддерживать две событийные модели –

это ударит по быстродействию

97

Page 119: Карточный домик

Making the web “just work”: в IE11 Mobile сделали эмуляцию Touch Events

98

Microsoft

tinyurl.com/ph4kxdr

Page 120: Карточный домик

Touch Events «In development»

99

Microsoft

status.modern.ie/?term=touch%20events

Page 121: Карточный домик

Мы не хотим реализовывать ненужное API

100

Google

Page 122: Карточный домик

101

Чтобы не случилось, все время говори "big performance issues" –

должно сработать...

Page 123: Карточный домик

Функциональность

102

Причина №3

Page 124: Карточный домик

Pointer Events – скролл и обработка событий

взаимоисключаются

103

Page 125: Карточный домик

Нельзя сделать pull-to-refresh

104

Page 126: Карточный домик

105

Page 127: Карточный домик

105

Page 128: Карточный домик

106

dwcares.com/pull-to-refresh-2

Решение: chained scrollers & snap points

-ms-scroll-snap

-ms-overflow-style

MSManipulationStateChanged

Правда, с применением проприетарных решений:

Зато работает!

Page 129: Карточный домик

Хорошо… как там…big performance issues?

Page 130: Карточный домик

«pull-to-refresh» запатентован – патент принадлежит Twitter

108

tinyurl.com/n4zsqef

Между прочим

Page 131: Карточный домик

IPA+Innovator’s Patent Agreementblog.twitter.com/2013/brewing-our-first-ipa-patent-and-new-adopters

Page 132: Карточный домик

Только мне причины кажутся неубедительными?

110

Page 133: Карточный домик

Ну давай, срабатывай уже… big performance issues… big performance issues…

Page 134: Карточный домик

Окей, Google, а что делать с недостающими вещами

в Touch Events?

112

Page 135: Карточный домик

Так мы это… свое запилим! Вот например, touch – и соль в тарелке!

Page 136: Карточный домик

«Вместо внедрения Pointer Events, нам кажется будет лучше для веба,

постепенная доработка API, которое широко используется.»

114

tinyurl.com/kfwpf2d

Page 137: Карточный домик

«Как всегда, мы добавляем в Blink только те новые API, что имеют поддержку от других производителей браузеров и правильно стандартизированы.»

115

tinyurl.com/kfwpf2d

Page 138: Карточный домик

Все правильно, никаких противоречий…

Page 139: Карточный домик

План? tinyurl.com/m7yqlrz

117

Page 140: Карточный домик

Стандарт?

118

Page 141: Карточный домик

Будут ли эти расширения поддерживать другие браузеры и когда?

119

Page 142: Карточный домик

Консистентность реализаций?

120

Page 143: Карточный домик

Сейчас много расхождений в реализации Touch Events:

Safari, WebKit, Blink, IE

121

На подходе Firefox

Page 144: Карточный домик

Добро пожаловать в открытый веб!

Page 145: Карточный домик

Мнение разработчиков ПО

123

Page 146: Карточный домик

«Мы (команда jQuery) считаем, что Pointer Events проще

использовать и они больше нацелены на будущее…»

124

tinyurl.com/kgocn4n

Page 147: Карточный домик

«Команда Polymer уверена, что Pointer Events лучшее решение для обработки

пользовательского ввода…»

125

tinyurl.com/mcctmbe

Page 148: Карточный домик

Да, да… я вас слушаю, слушаю…

Page 149: Карточный домик

Часть четвертая+Влияние на инновации

Page 150: Карточный домик

Используемые в браузерах API влияют на производителей

оборудования

128

Page 151: Карточный домик

Что делать с пером и стилусом?

129

Page 152: Карточный домик

Что делать с новыми типами ввода?

130

Page 153: Карточный домик

Что если устройства получат новые технические

возможности?

131

Page 154: Карточный домик

Hover считался невозможным

для touch

132

Page 155: Карточный домик

133

Sony Xperia sola

Первый смартфон с функцией регистрации поднесенного пальца (на расстоянии ~20мм)

Page 156: Карточный домик

134

Sony Xperia sola

Это дает возможность реализации hover,но без поддержки на уровне браузерного API

Page 157: Карточный домик

Touch Events – не позволяют использовать, нет механизмов для регистрации hover

135

Pointer Events – позволяют

Page 158: Карточный домик

Да кому это надо?

Page 159: Карточный домик

Touch Events были разработаны для

определенного устройства и определенного типа ввода

137

Page 160: Карточный домик

Pointer Eventsуниверсальное решение для разработчиков и

для производителей устройств

138

Page 161: Карточный домик

Без поддержки на уровне браузера, иновации в

устройствах – под вопросом

139

Page 162: Карточный домик

Инновации говорите… Мы тут Watch делаем – вот где инновации!..

Page 163: Карточный домик

Что дальше? (заключение)

141

Часть заключительная+Время собирать камни Или что с этим делать?

Page 164: Карточный домик

Фрустрировать?

Page 165: Карточный домик

Разобраться в ситуации

143

Page 166: Карточный домик

Рассказать другим

144

Никому не рассказывать о бойцовском клубе

Page 167: Карточный домик

Высказывать свое мнение разработчикам браузеров

145

Page 168: Карточный домик

Поддерживать Pointer Events

146

Как минимум пробовать это делать

Page 169: Карточный домик

Перестать смотреть на IEчерез призму прошлого

147

Нет, Microsoft мне не платит ;)

Page 170: Карточный домик

Все можно изменить к лучшему, главное, захотеть

Вспомним Mozilla в начале 2000-х

Page 171: Карточный домик
Page 172: Карточный домик

Спасибо!

150

Роман Дворнов @rdvornov [email protected]

basis.js basisjs.com

github.com/basisjs