Completely rewritten, with reusable gesture recognizers, and better support for the recent mobile browsers by
making use of the touch-action
css property when possible. Also support for multiple Hammer instances the same
time, so multi-user became possible.
You can get the pre-build versions from the Hammer.js website,
or do this by yourself running npm install -g grunt-cli && npm install && grunt build
.
Hammer is easy to use. Just create an instance and bind the events.
var mc = Hammer(myElement);
mc.on("swipeleft swiperight", mySwipeHandler);
By default it adds the tap
, doubletap
and press
, horizontal pan
and swipe
, and the multi-touch pinch
and
rotate
recognizers. The pinch and rotate recognizers are disabled by default because they would make the element
blocking, but you can enable them by calling mc.get('pinch').set({enable: true})
Also the viewport meta tag is recommended, it gives more control back to the webpage by disableing the doubletap/pinch zoom. More recent browsers that support the touch-action property don't require this.
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">
You can setup your own set of recognizers for your instance. This requires a bit more code, but it gives you more control and slightly better performance.
var myOptions = { };
var mc = new Hammer.Manager(myElement, myOptions);
mc.add(new Hammer.Pan({ direction: Hammer.DIRECTION_ALL }));
mc.add(new Hammer.Tap({ event: 'quadrupletap', taps: 4 }));
mc.on("pan", handlePan);
mc.on("quadrupletap", handleTaps);
The example above creates an instance containing a pan
and a quadrupletap
gesture. The recognizer instances you
create a being executed in the order they are added, and only one can be recognized at the time.
If you want to recognize two gestures simultaneously, you can use the the recognizeWith()
method. The example
below does this with the pinch and rotate recognizers, which will improve usability.
var pinch = new Hammer.Pinch();
var rotate = new Hammer.Rotation();
pinch.recognizeWith(rotate); // recognize the pinch-rotation recognizers simultaneous
Now Hammer is able to run pinch and rotate the same time. You can also separate them with the dropRecognizeWith()
method on
the recognizer instance.
With the method requireFailure()
you can let a recognizer require the failure of an other recognizer before recognizing.
This could become useful when you want to nest two gestures, like pan-horizontal and pan-vertical.
var horizontal = new Hammer.Pan({ event: 'panh', direction: Hammer.DIRECTION_HORIZONTAL });
var vertical = new Hammer.Pan({ event: 'panv', direction: Hammer.DIRECTION_VERTICAL });
verical.requireFailure(horizontal);
Removing the dependency could be done with the dropRequireFailure()
method.
Chrome 35+, IE10+ and soon FireFox, support the touch-action
property. This property tells the browser how to
handle touches on an element. It improves the detection and experience of the gestures a lot, because it can prevent
scrolling of the page without any JavaScript has to be executed, which can be too late in some cases.
Hammer uses a fallback for this property when needed, so it is working with older browsers too.
By default it sets a value based on the recognizer settings. You can overwrite this by giving the option touchAction
to the Manager.
When you set the touchAction to auto
it doesnt prevent any defaults, and Hammer would probably break. You have to
call preventDefault
manually to fix this. You should only use this if you know what you're doing.
If you do want to set your own value, then the table below should help you a bit...
Gesture | Least restrictive touch-action value |
---|---|
press | auto |
tap | auto |
multitap | manipulation |
vertical pan/swipe | pan-x |
horizontal pan/swipe | pan-y |
rotate | pan-x pan-y |
pinch | pan-x pan-y |
The source code is well documented (JSDoc), you could figure out the rest of the API over there!
Creates a Manager instance with a default set of recognizers and returns the manager instance. The default set
contains tap
, doubletap
, pan
, swipe
, press
, pinch
and rotate
recognizer instances.
Create a Manager. This sets up the input event listeners, and sets the touch-action property for you on the element.
The touchAction
option accepts the auto
, pan-y
, pan-x
and none
values, just like the css property. By default
it is set to compute
, which computes the correct touchAction property based on the added recognizers.
Option | Default | Description |
---|---|---|
touchAction | compute | accepts the compute , auto , pan-y , pan-x and none values. |
domEvents | false | this let's hammer also fire domEvents. |
enable | true | boolean, or an function that should return a boolean which is. |
Add a new Recognizer
instance to the Manager. The order of adding is also the order of the recognizers being
executed. Just like the get
method, it returns the added Recognizer
instance.
The get
and remove
methods takes the event name (from a recognizer) or a recognizer instance as an argument.
Listen to events triggered by the added recognizers, or remove the binded events. Accepts multiple events seperated by a space.
Stop recognizing for the current input session. When forced, the recognizer cycle is stopped immediately.
Unbinds all events and input events and makes the manager unusable. It does NOT unbind any domEvent listeners.
Every Recognizer extends from this class. All recognizers also have the option enable
,
which is a boolean value or a callback function to enable/disable the recognizer on the fly.
Run the recognizer simultaneous with the given other recognizer, in both directions. This is usable for like combining a pan with a swipe at the end, or a pinch with the ability to rotate the target as well. Dropping the connection only removes the link on the recognizer, not on the other recognizer.
Run the recognizer only when the other recognizer fails. Dropping the connection only removes the link on the recognizer, not on the other recognizer.
Recognized when the pointer is down for x ms without any movement.
Option | Default | Description |
---|---|---|
event | press | Name of the event. |
pointers | 1 | Required pointers. |
threshold | 5 | Minimal movement that is allowed while pressing. |
time | 500 | Minimal press time in ms. |
- press
Recognized when the pointer is down and moved in the allowed direction.
Option | Default | Description |
---|---|---|
event | pan | Name of the event. |
pointers | 1 | Required pointers. 0 for all pointers. |
threshold | 10 | Minimal pan distance required before recognizing. |
direction | DIRECTION_ALL | Direction of the panning. |
- pan
- panleft
- panright
- panup
- pandown
- panstart
- panmove
- panend
- pancancel
Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).
Option | Default | Description |
---|---|---|
event | pinch | Name of the event. |
pointers | 2 | Required pointers, with a minimal of 2. |
threshold | 0 | Minimal scale before recognizing. |
- pinch
- pinchin
- pinchout
- pinchstart
- pinchmove
- pinchend
- pinchcancel
Recognized when two or more pointer are moving in a circular motion.
Option | Default | Description |
---|---|---|
event | rotate | Name of the event. |
pointers | 2 | Required pointers, with a minimal of 2. |
threshold | 0 | Minimal rotation before recognizing. |
- rotate
- rotatestart
- rotatemove
- rotateend
- rotatecancel
Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.
Option | Default | Description |
---|---|---|
event | swipe | Name of the event. |
pointers | 1 | Required pointers. |
distance | 10 | Minimal distance required before recognizing. |
direction | DIRECTION_ALL | Direction of the panning. |
velocity | 0.65 | Minimal velocity required before recognizing, unit is in px per ms. |
- swipe
- swipeleft
- swiperight
- swipeup
- swipedown
- swipe
Recognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur between the given interval and position. The delay option can be used to recognize multi-taps without firing a single tap.
The eventData from the emitted event contains the property tapCount
, which contains the amount of multi-taps being
recognized.
Option | Default | Description |
---|---|---|
event | tap | Name of the event. |
pointers | 1 | Required pointers. |
taps | 1 | Amount of taps required. |
interval | 300 | Maximum time in ms between multiple taps. |
time | 250 | Maximum press time in ms. |
threshold | 2 | While doing a tap some small movement is allowed. |
posThreshold | 10 | The maximum position difference between multiple taps. |
- tap
Developed by Jorik Tangelder in his spare time and at Eight Media in Arnhem, the Netherlands.
Special thanks to Pepe Cano for his contributions.
It's recommended to listen to this loop while using hammer.js.