Latest commit

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Flickable.js -- A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Zepto is great for handling basic gesture events, but for more complex touch interactions it can be lacking. Flickable allows you to make any element touchable; useful for flicking between sections, or sliding elements around the page.

Primary target platforms are:

  • iOS 5+
  • Android 2.2+

v1.0.4 -- Fixed bug introduced with 1.0.3

Oops, somehow I managed to break the touch movement with 1.0.3 without noticing. Sorry about that -- I've fixed it with 1.0.4!

Big thanks to Hay for bringing this to my attention :)

Detailed Info and Pretty Diagrams

I've written a post with a lot of info here: http://labs.kojo.com.au/flickable-zepto-plugin/

Demos

BYO touchscreen.

  • Page Flipper: This demo allows you to swipe between 'cards' within a set area. Tap a card to flip it around.
  • Thumbnail Slider: This is similar to the way the App Store allows you to flip through app screenshots, but it can also be used to allow users to slide through navigation items that don't fit within a single page.
  • Vertical Jigsaw: Swipe up or down on the three segments to match up the images.

Installation

Make sure you load flickable after Zepto

<scripttype="text/javascript" src="libs/zepto.min.js"></script><scripttype="text/javascript" src="plugins/zepto.flickable.js"></script>

Usage

To use it, simply target the element you want to be Flickable, and apply the plugin to it. At minimum you should provide the number of segments Flickable will slice the element.

HTML:

<divid="wrapper"><ulid="flickable-element"><li>Content</li><li>Content</li><li>Content</li></ul></div>

JavaScript:

$('#flickable-element').flickable({segments:3});

Documentation

Event Callbacks

onCreate

Triggered when Flickable object is created.

$('#thing').flickable({onCreate: function(flickableObjects){/* do stuff */}});

onStart

Triggered when a touch event begins.

$('#thing').flickable({onStart: function(eventData){/* do stuff */}});

onMove

Triggered when the element is moved via a gesture in any direction.

$('#thing').flickable({onMove: function(eventData){/* do stuff */}});

onScroll

Triggered when element snaps to the nearest segment in any direction.

$('#thing').flickable({onScroll: function(eventData,segment){/* do stuff */}});

onScrollPrev

Triggered when element snaps to the previous segment.

$('#thing').flickable({onScrollPrev: function(eventData,segment){/* do stuff */}});

onScrollNext

Triggered when element snaps to the next segment.

$('#thing').flickable({onScrollNext: function(eventData,segment){/* do stuff */}});

onFlick

Triggered when element user flicks in a valid direction.

$('#thing').flickable({onFlick: function(eventData,segment){/* do stuff */}});

onFlickLeft

Triggered when element user flicks from right to left.

$('#thing').flickable({onFlickLeft: function(eventData,segment){/* do stuff */}});

onFlickRight

Triggered when element user flicks from left to right.

$('#thing').flickable({onFlickRight: function(eventData,segment){/* do stuff */}});

onFlickUp

Triggered when element user flicks from bottom to top.

$('#thing').flickable({onFlickUp: function(eventData,segment){/* do stuff */}});

onFlickDown

Triggered when element user flicks from up to down.

$('#thing').flickable({onFlickDown: function(eventData,segment){/* do stuff */}});

onEnd

Triggered when the user lifts their finger off the screen, ending the touch event.

$('#thing').flickable({onEnd: function(eventData,segment){/* do stuff */}});

Event Data Object

Most events also include the event data object, which is structured like so:

eventData={// Starting touchpoint [x pos, y pos, timestamp]start: {x:0,y:0,time: 0},delta: {// Previous touchpointprevPos: {x:0,y:0},// Distance relative to original touchpointdist: {x:0,y:0},// Direction of touch// [-1 left/up, +1 right/down, 0 no movement]dir: {x:0,y:0}},end: {// Duration of touchduration: 0,// Speed of movement along x and y axisspeed: {x:0,y:0},// +1/-1 if the touch was deemed to// be a flick left/right up/downflick: {x:0,y:0}}}

Options

segments

Type: Number; Default: 5

Number of segments in which to divide the target element.

$('#thing').flickable({segments: 3});

flickThreshold

Type: Float; Default: 0.7

Threshold in which a simple "touch and move" gesture becomes a "flick".

If you're targeting Android, you may need to lower this to make it more sensitive because of Android's lower frame rates for translate3d animations.

$('#thing').flickable({flickThreshold: 0.5});

flickDirection

Type: 'x' or 'y'; Default: 'auto'

Direction in which to divide the element into sections, and in which the user can flick.

If not specified, the direction will be automatically calculated based on which side of the target element is the longest.

$('#thing').flickable({flickDirection: 'x'});

snapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when released (note this is separate from flickSnapSpeed).

$('#thing').flickable({snapSpeed: 1});

flickSnapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when flicked.

$('#thing').flickable({flickSnapSpeed: 1});

preventDefault

Type: Boolean; Default: true

Whether or not to cancel default actions on the target element. Note that if this is set to false, the page will scroll with the gesture.

$('#thing').flickable({preventDefault: false});

Methods

segment

Gets or sets the current segment. Note segments start at 0.

$('#thing').flickable('segment');// gets current segment$('#thing').flickable('segment',5);// sets segment to 5

scrollNext

Scroll to next segment.

$('#thing').flickable('scrollNext');

scrollPrev

Scroll to previous segment.

$('#thing').flickable('scrollPrev');

About

Flickable: A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Flickable.js -- A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Zepto is great for handling basic gesture events, but for more complex touch interactions it can be lacking. Flickable allows you to make any element touchable; useful for flicking between sections, or sliding elements around the page.

Primary target platforms are:

  • iOS 5+
  • Android 2.2+

v1.0.4 -- Fixed bug introduced with 1.0.3

Oops, somehow I managed to break the touch movement with 1.0.3 without noticing. Sorry about that -- I've fixed it with 1.0.4!

Big thanks to Hay for bringing this to my attention :)

Detailed Info and Pretty Diagrams

I've written a post with a lot of info here: http://labs.kojo.com.au/flickable-zepto-plugin/

Demos

BYO touchscreen.

  • Page Flipper: This demo allows you to swipe between 'cards' within a set area. Tap a card to flip it around.
  • Thumbnail Slider: This is similar to the way the App Store allows you to flip through app screenshots, but it can also be used to allow users to slide through navigation items that don't fit within a single page.
  • Vertical Jigsaw: Swipe up or down on the three segments to match up the images.

Installation

Make sure you load flickable after Zepto

<scripttype="text/javascript" src="libs/zepto.min.js"></script><scripttype="text/javascript" src="plugins/zepto.flickable.js"></script>

Usage

To use it, simply target the element you want to be Flickable, and apply the plugin to it. At minimum you should provide the number of segments Flickable will slice the element.

HTML:

<divid="wrapper"><ulid="flickable-element"><li>Content</li><li>Content</li><li>Content</li></ul></div>

JavaScript:

$('#flickable-element').flickable({segments:3});

Documentation

Event Callbacks

onCreate

Triggered when Flickable object is created.

$('#thing').flickable({onCreate: function(flickableObjects){/* do stuff */}});

onStart

Triggered when a touch event begins.

$('#thing').flickable({onStart: function(eventData){/* do stuff */}});

onMove

Triggered when the element is moved via a gesture in any direction.

$('#thing').flickable({onMove: function(eventData){/* do stuff */}});

onScroll

Triggered when element snaps to the nearest segment in any direction.

$('#thing').flickable({onScroll: function(eventData,segment){/* do stuff */}});

onScrollPrev

Triggered when element snaps to the previous segment.

$('#thing').flickable({onScrollPrev: function(eventData,segment){/* do stuff */}});

onScrollNext

Triggered when element snaps to the next segment.

$('#thing').flickable({onScrollNext: function(eventData,segment){/* do stuff */}});

onFlick

Triggered when element user flicks in a valid direction.

$('#thing').flickable({onFlick: function(eventData,segment){/* do stuff */}});

onFlickLeft

Triggered when element user flicks from right to left.

$('#thing').flickable({onFlickLeft: function(eventData,segment){/* do stuff */}});

onFlickRight

Triggered when element user flicks from left to right.

$('#thing').flickable({onFlickRight: function(eventData,segment){/* do stuff */}});

onFlickUp

Triggered when element user flicks from bottom to top.

$('#thing').flickable({onFlickUp: function(eventData,segment){/* do stuff */}});

onFlickDown

Triggered when element user flicks from up to down.

$('#thing').flickable({onFlickDown: function(eventData,segment){/* do stuff */}});

onEnd

Triggered when the user lifts their finger off the screen, ending the touch event.

$('#thing').flickable({onEnd: function(eventData,segment){/* do stuff */}});

Event Data Object

Most events also include the event data object, which is structured like so:

eventData={// Starting touchpoint [x pos, y pos, timestamp]start: {x:0,y:0,time: 0},delta: {// Previous touchpointprevPos: {x:0,y:0},// Distance relative to original touchpointdist: {x:0,y:0},// Direction of touch// [-1 left/up, +1 right/down, 0 no movement]dir: {x:0,y:0}},end: {// Duration of touchduration: 0,// Speed of movement along x and y axisspeed: {x:0,y:0},// +1/-1 if the touch was deemed to// be a flick left/right up/downflick: {x:0,y:0}}}

Options

segments

Type: Number; Default: 5

Number of segments in which to divide the target element.

$('#thing').flickable({segments: 3});

flickThreshold

Type: Float; Default: 0.7

Threshold in which a simple "touch and move" gesture becomes a "flick".

If you're targeting Android, you may need to lower this to make it more sensitive because of Android's lower frame rates for translate3d animations.

$('#thing').flickable({flickThreshold: 0.5});

flickDirection

Type: 'x' or 'y'; Default: 'auto'

Direction in which to divide the element into sections, and in which the user can flick.

If not specified, the direction will be automatically calculated based on which side of the target element is the longest.

$('#thing').flickable({flickDirection: 'x'});

snapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when released (note this is separate from flickSnapSpeed).

$('#thing').flickable({snapSpeed: 1});

flickSnapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when flicked.

$('#thing').flickable({flickSnapSpeed: 1});

preventDefault

Type: Boolean; Default: true

Whether or not to cancel default actions on the target element. Note that if this is set to false, the page will scroll with the gesture.

$('#thing').flickable({preventDefault: false});

Methods

segment

Gets or sets the current segment. Note segments start at 0.

$('#thing').flickable('segment');// gets current segment$('#thing').flickable('segment',5);// sets segment to 5

scrollNext

Scroll to next segment.

$('#thing').flickable('scrollNext');

scrollPrev

Scroll to previous segment.

$('#thing').flickable('scrollPrev');

About

Flickable: A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Flickable.js -- A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Zepto is great for handling basic gesture events, but for more complex touch interactions it can be lacking. Flickable allows you to make any element touchable; useful for flicking between sections, or sliding elements around the page.

Primary target platforms are:

  • iOS 5+
  • Android 2.2+

v1.0.4 -- Fixed bug introduced with 1.0.3

Oops, somehow I managed to break the touch movement with 1.0.3 without noticing. Sorry about that -- I've fixed it with 1.0.4!

Big thanks to Hay for bringing this to my attention :)

Detailed Info and Pretty Diagrams

I've written a post with a lot of info here: http://labs.kojo.com.au/flickable-zepto-plugin/

Demos

BYO touchscreen.

  • Page Flipper: This demo allows you to swipe between 'cards' within a set area. Tap a card to flip it around.
  • Thumbnail Slider: This is similar to the way the App Store allows you to flip through app screenshots, but it can also be used to allow users to slide through navigation items that don't fit within a single page.
  • Vertical Jigsaw: Swipe up or down on the three segments to match up the images.

Installation

Make sure you load flickable after Zepto

<scripttype="text/javascript" src="libs/zepto.min.js"></script><scripttype="text/javascript" src="plugins/zepto.flickable.js"></script>

Usage

To use it, simply target the element you want to be Flickable, and apply the plugin to it. At minimum you should provide the number of segments Flickable will slice the element.

HTML:

<divid="wrapper"><ulid="flickable-element"><li>Content</li><li>Content</li><li>Content</li></ul></div>

JavaScript:

$('#flickable-element').flickable({segments:3});

Documentation

Event Callbacks

onCreate

Triggered when Flickable object is created.

$('#thing').flickable({onCreate: function(flickableObjects){/* do stuff */}});

onStart

Triggered when a touch event begins.

$('#thing').flickable({onStart: function(eventData){/* do stuff */}});

onMove

Triggered when the element is moved via a gesture in any direction.

$('#thing').flickable({onMove: function(eventData){/* do stuff */}});

onScroll

Triggered when element snaps to the nearest segment in any direction.

$('#thing').flickable({onScroll: function(eventData,segment){/* do stuff */}});

onScrollPrev

Triggered when element snaps to the previous segment.

$('#thing').flickable({onScrollPrev: function(eventData,segment){/* do stuff */}});

onScrollNext

Triggered when element snaps to the next segment.

$('#thing').flickable({onScrollNext: function(eventData,segment){/* do stuff */}});

onFlick

Triggered when element user flicks in a valid direction.

$('#thing').flickable({onFlick: function(eventData,segment){/* do stuff */}});

onFlickLeft

Triggered when element user flicks from right to left.

$('#thing').flickable({onFlickLeft: function(eventData,segment){/* do stuff */}});

onFlickRight

Triggered when element user flicks from left to right.

$('#thing').flickable({onFlickRight: function(eventData,segment){/* do stuff */}});

onFlickUp

Triggered when element user flicks from bottom to top.

$('#thing').flickable({onFlickUp: function(eventData,segment){/* do stuff */}});

onFlickDown

Triggered when element user flicks from up to down.

$('#thing').flickable({onFlickDown: function(eventData,segment){/* do stuff */}});

onEnd

Triggered when the user lifts their finger off the screen, ending the touch event.

$('#thing').flickable({onEnd: function(eventData,segment){/* do stuff */}});

Event Data Object

Most events also include the event data object, which is structured like so:

eventData={// Starting touchpoint [x pos, y pos, timestamp]start: {x:0,y:0,time: 0},delta: {// Previous touchpointprevPos: {x:0,y:0},// Distance relative to original touchpointdist: {x:0,y:0},// Direction of touch// [-1 left/up, +1 right/down, 0 no movement]dir: {x:0,y:0}},end: {// Duration of touchduration: 0,// Speed of movement along x and y axisspeed: {x:0,y:0},// +1/-1 if the touch was deemed to// be a flick left/right up/downflick: {x:0,y:0}}}

Options

segments

Type: Number; Default: 5

Number of segments in which to divide the target element.

$('#thing').flickable({segments: 3});

flickThreshold

Type: Float; Default: 0.7

Threshold in which a simple "touch and move" gesture becomes a "flick".

If you're targeting Android, you may need to lower this to make it more sensitive because of Android's lower frame rates for translate3d animations.

$('#thing').flickable({flickThreshold: 0.5});

flickDirection

Type: 'x' or 'y'; Default: 'auto'

Direction in which to divide the element into sections, and in which the user can flick.

If not specified, the direction will be automatically calculated based on which side of the target element is the longest.

$('#thing').flickable({flickDirection: 'x'});

snapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when released (note this is separate from flickSnapSpeed).

$('#thing').flickable({snapSpeed: 1});

flickSnapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when flicked.

$('#thing').flickable({flickSnapSpeed: 1});

preventDefault

Type: Boolean; Default: true

Whether or not to cancel default actions on the target element. Note that if this is set to false, the page will scroll with the gesture.

$('#thing').flickable({preventDefault: false});

Methods

segment

Gets or sets the current segment. Note segments start at 0.

$('#thing').flickable('segment');// gets current segment$('#thing').flickable('segment',5);// sets segment to 5

scrollNext

Scroll to next segment.

$('#thing').flickable('scrollNext');

scrollPrev

Scroll to previous segment.

$('#thing').flickable('scrollPrev');

About

Flickable: A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Flickable.js -- A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Zepto is great for handling basic gesture events, but for more complex touch interactions it can be lacking. Flickable allows you to make any element touchable; useful for flicking between sections, or sliding elements around the page.

Primary target platforms are:

  • iOS 5+
  • Android 2.2+

v1.0.4 -- Fixed bug introduced with 1.0.3

Oops, somehow I managed to break the touch movement with 1.0.3 without noticing. Sorry about that -- I've fixed it with 1.0.4!

Big thanks to Hay for bringing this to my attention :)

Detailed Info and Pretty Diagrams

I've written a post with a lot of info here: http://labs.kojo.com.au/flickable-zepto-plugin/

Demos

BYO touchscreen.

  • Page Flipper: This demo allows you to swipe between 'cards' within a set area. Tap a card to flip it around.
  • Thumbnail Slider: This is similar to the way the App Store allows you to flip through app screenshots, but it can also be used to allow users to slide through navigation items that don't fit within a single page.
  • Vertical Jigsaw: Swipe up or down on the three segments to match up the images.

Installation

Make sure you load flickable after Zepto

<scripttype="text/javascript" src="libs/zepto.min.js"></script><scripttype="text/javascript" src="plugins/zepto.flickable.js"></script>

Usage

To use it, simply target the element you want to be Flickable, and apply the plugin to it. At minimum you should provide the number of segments Flickable will slice the element.

HTML:

<divid="wrapper"><ulid="flickable-element"><li>Content</li><li>Content</li><li>Content</li></ul></div>

JavaScript:

$('#flickable-element').flickable({segments:3});

Documentation

Event Callbacks

onCreate

Triggered when Flickable object is created.

$('#thing').flickable({onCreate: function(flickableObjects){/* do stuff */}});

onStart

Triggered when a touch event begins.

$('#thing').flickable({onStart: function(eventData){/* do stuff */}});

onMove

Triggered when the element is moved via a gesture in any direction.

$('#thing').flickable({onMove: function(eventData){/* do stuff */}});

onScroll

Triggered when element snaps to the nearest segment in any direction.

$('#thing').flickable({onScroll: function(eventData,segment){/* do stuff */}});

onScrollPrev

Triggered when element snaps to the previous segment.

$('#thing').flickable({onScrollPrev: function(eventData,segment){/* do stuff */}});

onScrollNext

Triggered when element snaps to the next segment.

$('#thing').flickable({onScrollNext: function(eventData,segment){/* do stuff */}});

onFlick

Triggered when element user flicks in a valid direction.

$('#thing').flickable({onFlick: function(eventData,segment){/* do stuff */}});

onFlickLeft

Triggered when element user flicks from right to left.

$('#thing').flickable({onFlickLeft: function(eventData,segment){/* do stuff */}});

onFlickRight

Triggered when element user flicks from left to right.

$('#thing').flickable({onFlickRight: function(eventData,segment){/* do stuff */}});

onFlickUp

Triggered when element user flicks from bottom to top.

$('#thing').flickable({onFlickUp: function(eventData,segment){/* do stuff */}});

onFlickDown

Triggered when element user flicks from up to down.

$('#thing').flickable({onFlickDown: function(eventData,segment){/* do stuff */}});

onEnd

Triggered when the user lifts their finger off the screen, ending the touch event.

$('#thing').flickable({onEnd: function(eventData,segment){/* do stuff */}});

Event Data Object

Most events also include the event data object, which is structured like so:

eventData={// Starting touchpoint [x pos, y pos, timestamp]start: {x:0,y:0,time: 0},delta: {// Previous touchpointprevPos: {x:0,y:0},// Distance relative to original touchpointdist: {x:0,y:0},// Direction of touch// [-1 left/up, +1 right/down, 0 no movement]dir: {x:0,y:0}},end: {// Duration of touchduration: 0,// Speed of movement along x and y axisspeed: {x:0,y:0},// +1/-1 if the touch was deemed to// be a flick left/right up/downflick: {x:0,y:0}}}

Options

segments

Type: Number; Default: 5

Number of segments in which to divide the target element.

$('#thing').flickable({segments: 3});

flickThreshold

Type: Float; Default: 0.7

Threshold in which a simple "touch and move" gesture becomes a "flick".

If you're targeting Android, you may need to lower this to make it more sensitive because of Android's lower frame rates for translate3d animations.

$('#thing').flickable({flickThreshold: 0.5});

flickDirection

Type: 'x' or 'y'; Default: 'auto'

Direction in which to divide the element into sections, and in which the user can flick.

If not specified, the direction will be automatically calculated based on which side of the target element is the longest.

$('#thing').flickable({flickDirection: 'x'});

snapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when released (note this is separate from flickSnapSpeed).

$('#thing').flickable({snapSpeed: 1});

flickSnapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when flicked.

$('#thing').flickable({flickSnapSpeed: 1});

preventDefault

Type: Boolean; Default: true

Whether or not to cancel default actions on the target element. Note that if this is set to false, the page will scroll with the gesture.

$('#thing').flickable({preventDefault: false});

Methods

segment

Gets or sets the current segment. Note segments start at 0.

$('#thing').flickable('segment');// gets current segment$('#thing').flickable('segment',5);// sets segment to 5

scrollNext

Scroll to next segment.

$('#thing').flickable('scrollNext');

scrollPrev

Scroll to previous segment.

$('#thing').flickable('scrollPrev');

About

Flickable: A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Flickable.js -- A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Zepto is great for handling basic gesture events, but for more complex touch interactions it can be lacking. Flickable allows you to make any element touchable; useful for flicking between sections, or sliding elements around the page.

Primary target platforms are:

  • iOS 5+
  • Android 2.2+

v1.0.4 -- Fixed bug introduced with 1.0.3

Oops, somehow I managed to break the touch movement with 1.0.3 without noticing. Sorry about that -- I've fixed it with 1.0.4!

Big thanks to Hay for bringing this to my attention :)

Detailed Info and Pretty Diagrams

I've written a post with a lot of info here: http://labs.kojo.com.au/flickable-zepto-plugin/

Demos

BYO touchscreen.

  • Page Flipper: This demo allows you to swipe between 'cards' within a set area. Tap a card to flip it around.
  • Thumbnail Slider: This is similar to the way the App Store allows you to flip through app screenshots, but it can also be used to allow users to slide through navigation items that don't fit within a single page.
  • Vertical Jigsaw: Swipe up or down on the three segments to match up the images.

Installation

Make sure you load flickable after Zepto

<scripttype="text/javascript" src="libs/zepto.min.js"></script><scripttype="text/javascript" src="plugins/zepto.flickable.js"></script>

Usage

To use it, simply target the element you want to be Flickable, and apply the plugin to it. At minimum you should provide the number of segments Flickable will slice the element.

HTML:

<divid="wrapper"><ulid="flickable-element"><li>Content</li><li>Content</li><li>Content</li></ul></div>

JavaScript:

$('#flickable-element').flickable({segments:3});

Documentation

Event Callbacks

onCreate

Triggered when Flickable object is created.

$('#thing').flickable({onCreate: function(flickableObjects){/* do stuff */}});

onStart

Triggered when a touch event begins.

$('#thing').flickable({onStart: function(eventData){/* do stuff */}});

onMove

Triggered when the element is moved via a gesture in any direction.

$('#thing').flickable({onMove: function(eventData){/* do stuff */}});

onScroll

Triggered when element snaps to the nearest segment in any direction.

$('#thing').flickable({onScroll: function(eventData,segment){/* do stuff */}});

onScrollPrev

Triggered when element snaps to the previous segment.

$('#thing').flickable({onScrollPrev: function(eventData,segment){/* do stuff */}});

onScrollNext

Triggered when element snaps to the next segment.

$('#thing').flickable({onScrollNext: function(eventData,segment){/* do stuff */}});

onFlick

Triggered when element user flicks in a valid direction.

$('#thing').flickable({onFlick: function(eventData,segment){/* do stuff */}});

onFlickLeft

Triggered when element user flicks from right to left.

$('#thing').flickable({onFlickLeft: function(eventData,segment){/* do stuff */}});

onFlickRight

Triggered when element user flicks from left to right.

$('#thing').flickable({onFlickRight: function(eventData,segment){/* do stuff */}});

onFlickUp

Triggered when element user flicks from bottom to top.

$('#thing').flickable({onFlickUp: function(eventData,segment){/* do stuff */}});

onFlickDown

Triggered when element user flicks from up to down.

$('#thing').flickable({onFlickDown: function(eventData,segment){/* do stuff */}});

onEnd

Triggered when the user lifts their finger off the screen, ending the touch event.

$('#thing').flickable({onEnd: function(eventData,segment){/* do stuff */}});

Event Data Object

Most events also include the event data object, which is structured like so:

eventData={// Starting touchpoint [x pos, y pos, timestamp]start: {x:0,y:0,time: 0},delta: {// Previous touchpointprevPos: {x:0,y:0},// Distance relative to original touchpointdist: {x:0,y:0},// Direction of touch// [-1 left/up, +1 right/down, 0 no movement]dir: {x:0,y:0}},end: {// Duration of touchduration: 0,// Speed of movement along x and y axisspeed: {x:0,y:0},// +1/-1 if the touch was deemed to// be a flick left/right up/downflick: {x:0,y:0}}}

Options

segments

Type: Number; Default: 5

Number of segments in which to divide the target element.

$('#thing').flickable({segments: 3});

flickThreshold

Type: Float; Default: 0.7

Threshold in which a simple "touch and move" gesture becomes a "flick".

If you're targeting Android, you may need to lower this to make it more sensitive because of Android's lower frame rates for translate3d animations.

$('#thing').flickable({flickThreshold: 0.5});

flickDirection

Type: 'x' or 'y'; Default: 'auto'

Direction in which to divide the element into sections, and in which the user can flick.

If not specified, the direction will be automatically calculated based on which side of the target element is the longest.

$('#thing').flickable({flickDirection: 'x'});

snapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when released (note this is separate from flickSnapSpeed).

$('#thing').flickable({snapSpeed: 1});

flickSnapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when flicked.

$('#thing').flickable({flickSnapSpeed: 1});

preventDefault

Type: Boolean; Default: true

Whether or not to cancel default actions on the target element. Note that if this is set to false, the page will scroll with the gesture.

$('#thing').flickable({preventDefault: false});

Methods

segment

Gets or sets the current segment. Note segments start at 0.

$('#thing').flickable('segment');// gets current segment$('#thing').flickable('segment',5);// sets segment to 5

scrollNext

Scroll to next segment.

$('#thing').flickable('scrollNext');

scrollPrev

Scroll to previous segment.

$('#thing').flickable('scrollPrev');

About

Flickable: A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Flickable.js -- A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Zepto is great for handling basic gesture events, but for more complex touch interactions it can be lacking. Flickable allows you to make any element touchable; useful for flicking between sections, or sliding elements around the page.

Primary target platforms are:

  • iOS 5+
  • Android 2.2+

v1.0.4 -- Fixed bug introduced with 1.0.3

Oops, somehow I managed to break the touch movement with 1.0.3 without noticing. Sorry about that -- I've fixed it with 1.0.4!

Big thanks to Hay for bringing this to my attention :)

Detailed Info and Pretty Diagrams

I've written a post with a lot of info here: http://labs.kojo.com.au/flickable-zepto-plugin/

Demos

BYO touchscreen.

  • Page Flipper: This demo allows you to swipe between 'cards' within a set area. Tap a card to flip it around.
  • Thumbnail Slider: This is similar to the way the App Store allows you to flip through app screenshots, but it can also be used to allow users to slide through navigation items that don't fit within a single page.
  • Vertical Jigsaw: Swipe up or down on the three segments to match up the images.

Installation

Make sure you load flickable after Zepto

<scripttype="text/javascript" src="libs/zepto.min.js"></script><scripttype="text/javascript" src="plugins/zepto.flickable.js"></script>

Usage

To use it, simply target the element you want to be Flickable, and apply the plugin to it. At minimum you should provide the number of segments Flickable will slice the element.

HTML:

<divid="wrapper"><ulid="flickable-element"><li>Content</li><li>Content</li><li>Content</li></ul></div>

JavaScript:

$('#flickable-element').flickable({segments:3});

Documentation

Event Callbacks

onCreate

Triggered when Flickable object is created.

$('#thing').flickable({onCreate: function(flickableObjects){/* do stuff */}});

onStart

Triggered when a touch event begins.

$('#thing').flickable({onStart: function(eventData){/* do stuff */}});

onMove

Triggered when the element is moved via a gesture in any direction.

$('#thing').flickable({onMove: function(eventData){/* do stuff */}});

onScroll

Triggered when element snaps to the nearest segment in any direction.

$('#thing').flickable({onScroll: function(eventData,segment){/* do stuff */}});

onScrollPrev

Triggered when element snaps to the previous segment.

$('#thing').flickable({onScrollPrev: function(eventData,segment){/* do stuff */}});

onScrollNext

Triggered when element snaps to the next segment.

$('#thing').flickable({onScrollNext: function(eventData,segment){/* do stuff */}});

onFlick

Triggered when element user flicks in a valid direction.

$('#thing').flickable({onFlick: function(eventData,segment){/* do stuff */}});

onFlickLeft

Triggered when element user flicks from right to left.

$('#thing').flickable({onFlickLeft: function(eventData,segment){/* do stuff */}});

onFlickRight

Triggered when element user flicks from left to right.

$('#thing').flickable({onFlickRight: function(eventData,segment){/* do stuff */}});

onFlickUp

Triggered when element user flicks from bottom to top.

$('#thing').flickable({onFlickUp: function(eventData,segment){/* do stuff */}});

onFlickDown

Triggered when element user flicks from up to down.

$('#thing').flickable({onFlickDown: function(eventData,segment){/* do stuff */}});

onEnd

Triggered when the user lifts their finger off the screen, ending the touch event.

$('#thing').flickable({onEnd: function(eventData,segment){/* do stuff */}});

Event Data Object

Most events also include the event data object, which is structured like so:

eventData={// Starting touchpoint [x pos, y pos, timestamp]start: {x:0,y:0,time: 0},delta: {// Previous touchpointprevPos: {x:0,y:0},// Distance relative to original touchpointdist: {x:0,y:0},// Direction of touch// [-1 left/up, +1 right/down, 0 no movement]dir: {x:0,y:0}},end: {// Duration of touchduration: 0,// Speed of movement along x and y axisspeed: {x:0,y:0},// +1/-1 if the touch was deemed to// be a flick left/right up/downflick: {x:0,y:0}}}

Options

segments

Type: Number; Default: 5

Number of segments in which to divide the target element.

$('#thing').flickable({segments: 3});

flickThreshold

Type: Float; Default: 0.7

Threshold in which a simple "touch and move" gesture becomes a "flick".

If you're targeting Android, you may need to lower this to make it more sensitive because of Android's lower frame rates for translate3d animations.

$('#thing').flickable({flickThreshold: 0.5});

flickDirection

Type: 'x' or 'y'; Default: 'auto'

Direction in which to divide the element into sections, and in which the user can flick.

If not specified, the direction will be automatically calculated based on which side of the target element is the longest.

$('#thing').flickable({flickDirection: 'x'});

snapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when released (note this is separate from flickSnapSpeed).

$('#thing').flickable({snapSpeed: 1});

flickSnapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when flicked.

$('#thing').flickable({flickSnapSpeed: 1});

preventDefault

Type: Boolean; Default: true

Whether or not to cancel default actions on the target element. Note that if this is set to false, the page will scroll with the gesture.

$('#thing').flickable({preventDefault: false});

Methods

segment

Gets or sets the current segment. Note segments start at 0.

$('#thing').flickable('segment');// gets current segment$('#thing').flickable('segment',5);// sets segment to 5

scrollNext

Scroll to next segment.

$('#thing').flickable('scrollNext');

scrollPrev

Scroll to previous segment.

$('#thing').flickable('scrollPrev');

About

Flickable: A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Flickable.js -- A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Zepto is great for handling basic gesture events, but for more complex touch interactions it can be lacking. Flickable allows you to make any element touchable; useful for flicking between sections, or sliding elements around the page.

Primary target platforms are:

  • iOS 5+
  • Android 2.2+

v1.0.4 -- Fixed bug introduced with 1.0.3

Oops, somehow I managed to break the touch movement with 1.0.3 without noticing. Sorry about that -- I've fixed it with 1.0.4!

Big thanks to Hay for bringing this to my attention :)

Detailed Info and Pretty Diagrams

I've written a post with a lot of info here: http://labs.kojo.com.au/flickable-zepto-plugin/

Demos

BYO touchscreen.

  • Page Flipper: This demo allows you to swipe between 'cards' within a set area. Tap a card to flip it around.
  • Thumbnail Slider: This is similar to the way the App Store allows you to flip through app screenshots, but it can also be used to allow users to slide through navigation items that don't fit within a single page.
  • Vertical Jigsaw: Swipe up or down on the three segments to match up the images.

Installation

Make sure you load flickable after Zepto

<scripttype="text/javascript" src="libs/zepto.min.js"></script><scripttype="text/javascript" src="plugins/zepto.flickable.js"></script>

Usage

To use it, simply target the element you want to be Flickable, and apply the plugin to it. At minimum you should provide the number of segments Flickable will slice the element.

HTML:

<divid="wrapper"><ulid="flickable-element"><li>Content</li><li>Content</li><li>Content</li></ul></div>

JavaScript:

$('#flickable-element').flickable({segments:3});

Documentation

Event Callbacks

onCreate

Triggered when Flickable object is created.

$('#thing').flickable({onCreate: function(flickableObjects){/* do stuff */}});

onStart

Triggered when a touch event begins.

$('#thing').flickable({onStart: function(eventData){/* do stuff */}});

onMove

Triggered when the element is moved via a gesture in any direction.

$('#thing').flickable({onMove: function(eventData){/* do stuff */}});

onScroll

Triggered when element snaps to the nearest segment in any direction.

$('#thing').flickable({onScroll: function(eventData,segment){/* do stuff */}});

onScrollPrev

Triggered when element snaps to the previous segment.

$('#thing').flickable({onScrollPrev: function(eventData,segment){/* do stuff */}});

onScrollNext

Triggered when element snaps to the next segment.

$('#thing').flickable({onScrollNext: function(eventData,segment){/* do stuff */}});

onFlick

Triggered when element user flicks in a valid direction.

$('#thing').flickable({onFlick: function(eventData,segment){/* do stuff */}});

onFlickLeft

Triggered when element user flicks from right to left.

$('#thing').flickable({onFlickLeft: function(eventData,segment){/* do stuff */}});

onFlickRight

Triggered when element user flicks from left to right.

$('#thing').flickable({onFlickRight: function(eventData,segment){/* do stuff */}});

onFlickUp

Triggered when element user flicks from bottom to top.

$('#thing').flickable({onFlickUp: function(eventData,segment){/* do stuff */}});

onFlickDown

Triggered when element user flicks from up to down.

$('#thing').flickable({onFlickDown: function(eventData,segment){/* do stuff */}});

onEnd

Triggered when the user lifts their finger off the screen, ending the touch event.

$('#thing').flickable({onEnd: function(eventData,segment){/* do stuff */}});

Event Data Object

Most events also include the event data object, which is structured like so:

eventData={// Starting touchpoint [x pos, y pos, timestamp]start: {x:0,y:0,time: 0},delta: {// Previous touchpointprevPos: {x:0,y:0},// Distance relative to original touchpointdist: {x:0,y:0},// Direction of touch// [-1 left/up, +1 right/down, 0 no movement]dir: {x:0,y:0}},end: {// Duration of touchduration: 0,// Speed of movement along x and y axisspeed: {x:0,y:0},// +1/-1 if the touch was deemed to// be a flick left/right up/downflick: {x:0,y:0}}}

Options

segments

Type: Number; Default: 5

Number of segments in which to divide the target element.

$('#thing').flickable({segments: 3});

flickThreshold

Type: Float; Default: 0.7

Threshold in which a simple "touch and move" gesture becomes a "flick".

If you're targeting Android, you may need to lower this to make it more sensitive because of Android's lower frame rates for translate3d animations.

$('#thing').flickable({flickThreshold: 0.5});

flickDirection

Type: 'x' or 'y'; Default: 'auto'

Direction in which to divide the element into sections, and in which the user can flick.

If not specified, the direction will be automatically calculated based on which side of the target element is the longest.

$('#thing').flickable({flickDirection: 'x'});

snapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when released (note this is separate from flickSnapSpeed).

$('#thing').flickable({snapSpeed: 1});

flickSnapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when flicked.

$('#thing').flickable({flickSnapSpeed: 1});

preventDefault

Type: Boolean; Default: true

Whether or not to cancel default actions on the target element. Note that if this is set to false, the page will scroll with the gesture.

$('#thing').flickable({preventDefault: false});

Methods

segment

Gets or sets the current segment. Note segments start at 0.

$('#thing').flickable('segment');// gets current segment$('#thing').flickable('segment',5);// sets segment to 5

scrollNext

Scroll to next segment.

$('#thing').flickable('scrollNext');

scrollPrev

Scroll to previous segment.

$('#thing').flickable('scrollPrev');

About

Flickable: A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Flickable.js -- A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Zepto is great for handling basic gesture events, but for more complex touch interactions it can be lacking. Flickable allows you to make any element touchable; useful for flicking between sections, or sliding elements around the page.

Primary target platforms are:

  • iOS 5+
  • Android 2.2+

v1.0.4 -- Fixed bug introduced with 1.0.3

Oops, somehow I managed to break the touch movement with 1.0.3 without noticing. Sorry about that -- I've fixed it with 1.0.4!

Big thanks to Hay for bringing this to my attention :)

Detailed Info and Pretty Diagrams

I've written a post with a lot of info here: http://labs.kojo.com.au/flickable-zepto-plugin/

Demos

BYO touchscreen.

  • Page Flipper: This demo allows you to swipe between 'cards' within a set area. Tap a card to flip it around.
  • Thumbnail Slider: This is similar to the way the App Store allows you to flip through app screenshots, but it can also be used to allow users to slide through navigation items that don't fit within a single page.
  • Vertical Jigsaw: Swipe up or down on the three segments to match up the images.

Installation

Make sure you load flickable after Zepto

<scripttype="text/javascript" src="libs/zepto.min.js"></script><scripttype="text/javascript" src="plugins/zepto.flickable.js"></script>

Usage

To use it, simply target the element you want to be Flickable, and apply the plugin to it. At minimum you should provide the number of segments Flickable will slice the element.

HTML:

<divid="wrapper"><ulid="flickable-element"><li>Content</li><li>Content</li><li>Content</li></ul></div>

JavaScript:

$('#flickable-element').flickable({segments:3});

Documentation

Event Callbacks

onCreate

Triggered when Flickable object is created.

$('#thing').flickable({onCreate: function(flickableObjects){/* do stuff */}});

onStart

Triggered when a touch event begins.

$('#thing').flickable({onStart: function(eventData){/* do stuff */}});

onMove

Triggered when the element is moved via a gesture in any direction.

$('#thing').flickable({onMove: function(eventData){/* do stuff */}});

onScroll

Triggered when element snaps to the nearest segment in any direction.

$('#thing').flickable({onScroll: function(eventData,segment){/* do stuff */}});

onScrollPrev

Triggered when element snaps to the previous segment.

$('#thing').flickable({onScrollPrev: function(eventData,segment){/* do stuff */}});

onScrollNext

Triggered when element snaps to the next segment.

$('#thing').flickable({onScrollNext: function(eventData,segment){/* do stuff */}});

onFlick

Triggered when element user flicks in a valid direction.

$('#thing').flickable({onFlick: function(eventData,segment){/* do stuff */}});

onFlickLeft

Triggered when element user flicks from right to left.

$('#thing').flickable({onFlickLeft: function(eventData,segment){/* do stuff */}});

onFlickRight

Triggered when element user flicks from left to right.

$('#thing').flickable({onFlickRight: function(eventData,segment){/* do stuff */}});

onFlickUp

Triggered when element user flicks from bottom to top.

$('#thing').flickable({onFlickUp: function(eventData,segment){/* do stuff */}});

onFlickDown

Triggered when element user flicks from up to down.

$('#thing').flickable({onFlickDown: function(eventData,segment){/* do stuff */}});

onEnd

Triggered when the user lifts their finger off the screen, ending the touch event.

$('#thing').flickable({onEnd: function(eventData,segment){/* do stuff */}});

Event Data Object

Most events also include the event data object, which is structured like so:

eventData={// Starting touchpoint [x pos, y pos, timestamp]start: {x:0,y:0,time: 0},delta: {// Previous touchpointprevPos: {x:0,y:0},// Distance relative to original touchpointdist: {x:0,y:0},// Direction of touch// [-1 left/up, +1 right/down, 0 no movement]dir: {x:0,y:0}},end: {// Duration of touchduration: 0,// Speed of movement along x and y axisspeed: {x:0,y:0},// +1/-1 if the touch was deemed to// be a flick left/right up/downflick: {x:0,y:0}}}

Options

segments

Type: Number; Default: 5

Number of segments in which to divide the target element.

$('#thing').flickable({segments: 3});

flickThreshold

Type: Float; Default: 0.7

Threshold in which a simple "touch and move" gesture becomes a "flick".

If you're targeting Android, you may need to lower this to make it more sensitive because of Android's lower frame rates for translate3d animations.

$('#thing').flickable({flickThreshold: 0.5});

flickDirection

Type: 'x' or 'y'; Default: 'auto'

Direction in which to divide the element into sections, and in which the user can flick.

If not specified, the direction will be automatically calculated based on which side of the target element is the longest.

$('#thing').flickable({flickDirection: 'x'});

snapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when released (note this is separate from flickSnapSpeed).

$('#thing').flickable({snapSpeed: 1});

flickSnapSpeed

Type: Float; Default: 0.3

Speed in which the element will snap to the nearest segment when flicked.

$('#thing').flickable({flickSnapSpeed: 1});

preventDefault

Type: Boolean; Default: true

Whether or not to cancel default actions on the target element. Note that if this is set to false, the page will scroll with the gesture.

$('#thing').flickable({preventDefault: false});

Methods

segment

Gets or sets the current segment. Note segments start at 0.

$('#thing').flickable('segment');// gets current segment$('#thing').flickable('segment',5);// sets segment to 5

scrollNext

Scroll to next segment.

$('#thing').flickable('scrollNext');

scrollPrev

Scroll to previous segment.

$('#thing').flickable('scrollPrev');

About

Flickable: A Zepto Plugin to Enable Touch Gestures on Any HTML Element

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors