the-finger
v1.0.4
Published
JavaScript library to detect touch gestures: tap, double tap, press, long press, drag, flick, rotate, pinch, spread, pan, two-finger.
Maintainers
Readme
The Finger
JavaScript library for detecting touch gestures on HTML elements.
Supported gestures:
- tap
- double tap
- press
- long press
- drag
- pinch & spread
- rotate
- pan
- two finger tap
- double tap & drag
Fast drag, pan, and double-tap-and-drag gestures may include flick: true in the callback data.
Installation
npm install the-fingerUsage
ES Module
import TheFinger from 'the-finger';
const element = document.getElementById('target');
const finger = new TheFinger(element);
finger.track('tap', (gesture) => {
console.log('Tapped at:', gesture.x, gesture.y);
});Browser IIFE Build
<script src="https://unpkg.com/the-finger/dist/thefinger.min.js"></script>
<script>
const finger = new TheFinger(element);
</script>Gesture Names for .track() Method
tapdouble-tappresslong-pressdrag(includesflickproperty when speed > 0.75)panrotatepinch-spreadtwo-finger-tapdouble-tap-and-drag
API
Constructor
new TheFinger(element, settings)Parameters:
element- HTML element to tracksettings(optional)preventDefault: true- Prevent default touch behaviorvisualize: true- Show touch points (requires visualizer.js)
Methods
track(gesture, callback, settings)
Start tracking a gesture.
finger.track('drag', (gesture, touchHistory) => {
console.log(gesture.x, gesture.y);
}, {
preventDefault: 'horizontal' // 'vertical', true, or false
});untrack(gesture)
Stop tracking a gesture.
finger.untrack('drag');on(element) / off(element)
Manually attach/detach touch listeners.
Gesture Data
Each gesture callback receives:
gesture- Object with gesture-specific data (coordinates, distance, angle, etc.)touchHistory- Map of touch point histories, except forlong-press
The gesture object does not include a type property. Its shape depends on the tracked gesture.
Gesture Properties:
tap, double-tap, press, long-press
xy
two-finger-tap
xytouches
drag
xystartXstartYstepspeedangleinitial_direction- Final callback adds properties:
endX,endY,final_direction,flick
pan
touchesxystartXstartYstepspeedangleinitial_direction- Final callback adds properties:
endX,endY,final_direction,flick
double-tap-and-drag
xystartXstartYdxdydist- Final callback adds properties:
endX,endY,speed,final_direction,flick
rotate
touchesrotationangleAbsoluteangleRelative
pinch-spread
touchesdistancescale- Final callback adds properties:
end: true
press emits immediately on touch start. long-press emits after about 350ms if the finger does not move.
Package Files
./dist/thefinger.es.js- ES module./dist/thefinger.umd.js- UMD module./dist/thefinger.min.js- Minified IIFE build for direct browser use- Build output includes source map files for the generated JavaScript files
Testing
This library includes development integration helpers that simulate natural finger movements using index.html, dev/test.js, and dev/visualizer.js.
Running Tests
Install development dependencies:
npm installStart the browser integration tests:
npm testThis starts Vite, opens the demo page with
?test, and runs the gesture simulations in the browser. Check DevTools Console for green PASS and red FAIL results.
Manual Browser Test
Start the development server:
npm startIf startup fails with a missing package such as
vite-plugin-browser-sync, runnpm installagain and retrynpm start.Open the page in your browser with the
?testquery parameter. Use the local URL printed by Vite, for example:http://localhost:5173/?test
Check the browser console for test results, which will log PASS or FAIL for each gesture along with detection details.
Tests run sequentially for all supported gestures.
Creating Future Tests
Tests are implemented in dev/test.js. To add tests for new gestures or modify existing ones:
- Add the gesture name to the
gesturesarray inrunIntegrationTests(). - Implement a new simulation function (e.g.,
simulateNewGesture(cx, cy, target)) that dispatches a sequence ofTouchEvents to mimic the gesture's natural finger movements. - Add a case for the new gesture in the
simulateGesture()switch statement to call your new function.
Simulations use programmatic Touch objects and TouchEvent dispatching to replicate real touch interactions, including timings and position changes for realism.
For example, to test a new 'swirl' gesture, you would define simulateSwirl() with looped touch moves in a circular pattern and add it to the test flow.
License
ISC
