npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

overflowandroid

v1.0.0

Published

Implement the inertia scroll for `overflow` element. And the polyfill for `overflow:scroll` / `overflow:auto` and `element.scrollLeft` / `element.scrollTop` on Android browser.

Downloads

32

Readme

OverflowAndroid

npm GitHub issues David license

Implement the inertia scroll for overflow element. And the polyfill for overflow:scroll / overflow:auto and element.scrollLeft / element.scrollTop on Android browser.

The desktop can implement UI that scrolls by mouse drag, inertia scroll like touch device. And problems of Android browser are solved.

ss-01

Android browser has problems as below:

  • overflow:scroll and overflow:auto don't work on Android 2.x. The elements don't accept scroll operations (swipe, flick, drag, etc.).
  • element.scrollLeft and element.scrollTop don't work on Android 4.0.x. The elements can't scroll via JavaScript. Strange to say, the element that is set overflow:hidden can scroll. But of course that element doesn't accept scroll operations.

OverflowAndroid solves problems above.

See DEMO

Usage

Hammer.js is required.

<script src="hammer.min.js"></script>
<script src="overflow-android.min.js"></script>
<!-- This `overflow:auto` isn't necessary. It works on desktop PC as native. -->
<div id="view" style="overflow: auto; width: 300px; height: 300px;">  <!-- Like an iframe window -->
  <img src="photo.jpg" width="900" height="600" alt="sample">         <!-- Like an iframe document -->
</div>
var element = document.getElementById('view');
new OverflowAndroid(element);
// Now, the element accepts scroll operations (swipe, flick, drag, etc.).

// And it can scroll via scrollLeft/scrollTop.
element.scrollLeft = 30;

Constructor

overflowA = new OverflowAndroid(element)

The OverflowAndroid constructor accepts an element that is scrolling frame. It gets a first child element that includes contents and it moves when scrolling. The specified element like an iframe window, and the first child element like an iframe document.
That has already finished. Now, the specified element accepts scroll operations (swipe, flick, drag, etc.), and it can scroll via scrollLeft/scrollTop.
And the instance that is returned by constructor has some methods. (see below)
NOTE: The contents that is included in specified element other than a first child element of it are ignored.

Methods

scrollLeft

currentLeft = overflowA.scrollLeft([newLeft])

Return the number of pixels that the element's content is scrolled to the left. If an argument is given, the element scrolls to specified position and it is returned.
This work equals element.scrollLeft property.

scrollTop

currentTop = overflowA.scrollTop([newTop])

Return the number of pixels that the element's content is scrolled upward. If an argument is given, the element scrolls to specified position and it is returned.
This work equals element.scrollTop property.

scroll

currentLeftTop = overflowA.scroll([newLeft[, newTop]])

Return the Object that has left as the number of pixels that the element's content is scrolled to the left, and top as the number of pixels that the element's content is scrolled upward. If arguments are given, the element scrolls to specified position and it is returned.

stop

self = overflowA.stop()

Stop scroll immediately.

initSize

self = overflowA.initSize([newLeft[, newTop]])

OverflowAndroid computes the size of elements for scroll. It computes again automatically when a window is resized. Therefore you usually don't need to call this method.
If you changed the size of elements, you must call this method. If arguments are given, the size of elements is computed and the element scrolls to specified position.

Properties

clientWidth, clientHeight

width = overflowA.clientWidth
height = overflowA.clientHeight

Size of the element's view-area. This area is padding-box in CSS. In other words, a part of contents in child element that has this size is shown.

scrollWidth, scrollHeight

width = overflowA.scrollWidth
height = overflowA.scrollHeight

Size of scrolled area. This area is all of contents in child element that includes margins, and padding of target element.
In CSS, border-box of child element + margins of child element + paddings of target element. Therefore this might differ from element.scrollWidth/element.scrollHeight.

Event

The scroll event is fired when the target element has been scrolled. The Event object that is passed to event listeners has an additional property below.

inertia

Type: Boolean

Indicate whether the current event was fired by inertia scroll after fast scroll operations. i.e. user isn't touching the element now, if this is true.

Example:

element.addEventListener('scroll', function(e) {
  console.log('left: ' + e.target.scrollLeft +
    ', top: ' + e.target.scrollTop + ', more scrolling: ' + e.inertia);
}, false);

Options

You can tune the behavior of OverflowAndroid via options below.

OverflowAndroid.enable

By default, OverflowAndroid works only touch-device. You can control the working or not via specifying a boolean to this option.
NOTE: This must be done before making an instance.

Example:

// Android only
OverflowAndroid.enable = navigator.userAgent.indexOf('Android') >= 0;
// Anytime
OverflowAndroid.enable = true;

OverflowAndroid.friction

Default: 0.001

This is strength of slowdown of inertia scroll after fast scroll operations. This is a number of pixels per milli second.

OverflowAndroid.fps

Default: 60

This is frame rate of animation of inertia scroll after fast scroll operations. This is a number of frames per second.
This is ignored when CSS Animations is used (see OverflowAndroid.transition).

OverflowAndroid.cursorScrollable

Default: grab

The CSS cursor value when the target element is not receiving scroll operations.
If '' is specified, cursor is not changed.

OverflowAndroid.cursorScrolling

Default: grabbing

The CSS cursor value when the target element is receiving scroll operations.
If '' is specified, cursor is not changed.

OverflowAndroid.scrollBar

Default: true

Show scroll bars.
Now, these scroll bars are mere indicators that only show each scroll-position, user can not scroll the element by operating these scroll bars.

OverflowAndroid.scrollBarWidth

Default: 5

Size of scroll bars. This is a number of pixels.

OverflowAndroid.scrollBarColor

Default: 'rgba(0,0,0,0.5)'

Color of scroll bars.

OverflowAndroid.transition

If true is specified to this option, the inertia scroll after fast scroll operations uses CSS Animations in modern browsers. The default is false.
NOTE: This must be done before making an instance.

The CSS Animations work smoothly in many browsers, but some browsers (particularly Firefox for Android) are not. I tried many ways (e.g. hardware acceleration), but I found nothing yet... Someone, please let me know the way. (But Firefox for Android can't scroll smoothly normal overflow:scroll in the first place.)

See Also

jQuery.overflowAndroid is jQuery plugin that is wrapper of OverflowAndroid.