From 36035df15c638320f6becff3b6a690e98a657147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=CC=88rn=20Zaefferer?= Date: Thu, 10 Dec 2015 11:46:57 +0100 Subject: [PATCH] README: Restructure everything, overhaul details, add logo --- README.md | 68 ++++++++++++++++++++------------------------ pep-logo-shield.png | Bin 0 -> 20112 bytes 2 files changed, 31 insertions(+), 37 deletions(-) create mode 100644 pep-logo-shield.png diff --git a/README.md b/README.md index 2fb67441..e3df284f 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,15 @@ -## Learn the tech +# Pointer Events Polyfill - making pointer events usable today -### Why Pointer Events? +![PEP logo](pep-logo-shield.png) -Mouse Events and Touch Events are fundamentally different beasts in browsers today, and that makes it hard to write cross-platform apps. - -For example, a simple finger paint app needs plenty of work to behave correctly with mouse and touch: - -Current platforms that implement touch events also provide mouse events for backward compatibility; however, only a subset of Mouse Events are fired and the semantics are changed. - -- Mouse Events are only fired after the touch sequence ends. -- Mouse Events are not fired on elements without a `click` event handler. One must be attached by default, or directly on the element with `onclick`. -- `click` events are not fired if the content of the page changes in a `mousemove` or `mouseover` event. -- `click` events are fired 300ms after the touch sequence ends. -- More information: [Apple Developer Documentation](http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safariwebcontent/HandlingEvents/HandlingEvents.html). +PEP polyfills pointer events in all browsers that haven't yet implemented them, providing a unified, responsive input model for all devices and input types. You can [read more about Pointer Events below](#why-pointer-events). -Additionally, Touch Events are sent only to the element that received the `touchstart`. This is fundamentally different than Mouse Events, which fire on the element that is under the mouse. To make them behave similarly, Touch Events need to be retargeted with `document.elementFromPoint`. - -These incompatibilities lead to applications having to listen to 2 sets of events, mouse on desktop and touch for mobile. +## Getting Started -**This forked interaction experience is cumbersome and hard to maintain.** - -Instead, there should exist a set of events that are normalized such that they behave exactly the same, no matter the source: touch, mouse, stylus, skull implant, etc. To do this right, this normalized event system needs to be available for all the web platform to use. - -*Thus, Pointer Events!* - -### Basic Usage - -By default, no Pointer Events are sent from an element. This maximizes possibility that a browser can deliver smooth scrolling and jank-free gestures. If you want to receive events, you must set the `touch-action` property of that element. +1. Place the PEP script in the document head + - `` -1. Set up some elements to create events with the [`touch-action` attribute](http://www.w3.org/TR/pointerevents/#the-touch-action-css-property). +1. By default, no Pointer Events are sent from an element. This maximizes the possibility that a browser can deliver smooth scrolling and jank-free gestures. If you want to receive events, you must set the `touch-action` property of that element. Set up some elements to create events with the [`touch-action` attribute](http://www.w3.org/TR/pointerevents/#the-touch-action-css-property). 1. Listen for the desired events - `pointermove`: a pointer moves, similar to touchmove or mousemove. @@ -42,9 +23,10 @@ By default, no Pointer Events are sent from an element. This maximizes possibili 1. As elements come and go, or have their `touch-action` attribute changed, they will send the proper set of Pointer Events. -See also the [examples in the W3C Pointer Events specification](http://www.w3.org/TR/pointerevents/#examples). -#### Using PEP with jQuery +See also the [examples in the W3C Pointer Events specification](http://www.w3.org/TR/pointerevents/#examples) and our own [samples for using PEP](http://jquery.github.io/PEP/). + +### Using PEP with jQuery You can use pointer events with jQuery and PEP: ```html @@ -61,18 +43,30 @@ Check out [this jsbin demo](http://jsbin.com/bojumofowa/1/edit?html,css,js,outpu jQuery doesn't copy all properties from the original event object to the event object provided in the event handler. You can find [a list of copied and normalized properties on the jQuery API docs](http://api.jquery.com/category/events/event-object/). To access any other original properties, use `event.originalEvent`. -## Polyfill Details -### Getting Started +## Why Pointer Events? -1. Place the PEP script in the document head - - `` -1. Set up your event listeners -1. You're done! +Mouse Events and Touch Events are fundamentally different beasts in browsers today, and that makes it hard to write cross-platform apps. -### Samples +For example, a simple finger paint app needs plenty of work to behave correctly with mouse and touch: + +Current platforms that implement touch events also provide mouse events for backward compatibility; however, only a subset of Mouse Events are fired and the semantics are changed. -Check out some of the samples at http://jquery.github.io/PEP/. +- Mouse Events are only fired after the touch sequence ends. +- Mouse Events are not fired on elements without a `click` event handler. One must be attached by default, or directly on the element with `onclick`. +- `click` events are not fired if the content of the page changes in a `mousemove` or `mouseover` event. +- `click` events are fired 300ms after the touch sequence ends. +- More information: [Apple Developer Documentation](http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safariwebcontent/HandlingEvents/HandlingEvents.html). + +Additionally, Touch Events are sent only to the element that received the `touchstart`. This is fundamentally different than Mouse Events, which fire on the element that is under the mouse. To make them behave similarly, Touch Events need to be retargeted with `document.elementFromPoint`. + +These incompatibilities lead to applications having to listen to 2 sets of events, mouse on desktop and touch for mobile. + +**This forked interaction experience is cumbersome and hard to maintain.** + +Instead, there should exist a set of events that are normalized such that they behave exactly the same, no matter the source: touch, mouse, stylus, skull implant, etc. To do this right, this normalized event system needs to be available for all the web platform to use. + +*Thus, Pointer Events!* ## Polyfill Limitations @@ -87,4 +81,4 @@ Touches will not generate events unless inside of an area that has a valid `touc ### Browser Compatibility -PEP should work on IE 10+ and the latest versions of Chrome, Safari, Firefox, and Opera. +PEP should work on IE 10+ and the latest versions of Chrome, Safari, Firefox, and Opera. In any [browser implementing Pointer Events natively](http://caniuse.com/#feat=pointer) (detected by checking for `window.PointerEvent`), PEP won't do anything. diff --git a/pep-logo-shield.png b/pep-logo-shield.png new file mode 100644 index 0000000000000000000000000000000000000000..bfeaab893538e3bb0f1386b098c6c9fffa9bed12 GIT binary patch literal 20112 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 literal 0 HcmV?d00001