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

nanoscroller

v0.8.7

Published

A jQuery plugin that offers a simplistic way of implementing Lion OS scrollbars.

Downloads

48,047

Readme

nanoScroller.js NPM version

nanoScroller.js is a jQuery plugin that offers a simple way of implementing Mac OS X Lion-styled scrollbars for your website. It uses minimal HTML markup being .nano > .nano-content. The other scrollbar div elements .pane > .nano-slider are added during run time to prevent clutter in templating. The latest version utilizes native scrolling and works with the iPad, iPhone, and some Android Tablets.

Downloads

To start using, you need three basic things:

1. Markup

The following type of markup structure is needed to make the plugin work:

<div id="about" class="nano">
    <div class="nano-content"> ... content here ...  </div>
</div>

Copy the HTML markup. Change .nano into something related to your content. Though you can also remove that attribute as long as you have a parent div with an ID reference. e.g. #parent > .nano. nano and nano-content classnames can be customized via plugin options (in that case you must rename them inside the plugin's CSS file as well).

2. CSS

Link to the nanoscroller.css file inside your page's <head> section (...or copy the contents from it to your page's main stylesheet file).

<link rel="stylesheet" href="nanoscroller.css">

You should specify a width and a height to your container, and apply some custom styling for your scrollbar. Here's an example:

.nano { background: #bba; width: 500px; height: 500px; }
.nano > .nano-content { padding: 10px; }
.nano > .nano-pane   { background: #888; }
.nano > .nano-pane > .nano-slider { background: #111; }

3. JavaScript

Running this script will apply the nanoScroller plugin to all DOM elements with a .nano className.

$(".nano").nanoScroller();

Advanced methods

scroll

To scroll at the top:

$(".nano").nanoScroller({ scroll: 'top' });

To scroll at the bottom:

$(".nano").nanoScroller({ scroll: 'bottom' });

To scroll at the top with an offset value:

$(".nano").nanoScroller({ scrollTop: value });

To scroll at the bottom with an offset value:

$(".nano").nanoScroller({ scrollBottom: value });

To scroll to an element:

$(".nano").nanoScroller({ scrollTo: $('#a_node') });

stop:

To stop the operation. This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI.

$(".nano").nanoScroller({ stop: true });

destroy:

Destroys nanoScroller and restores browser's native scrollbar.

$(".nano").nanoScroller({ destroy: true });

flash:

To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s). Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him.

$(".nano").nanoScroller({ flash: true });

nanoScroller();

Refresh the scrollbar. This simply re-calculates the position and height of the scrollbar gadget.

$(".nano").nanoScroller();

Custom events

'scrollend'

A custom 'scrollend' event is triggered on the element every time the user has scrolled to the end of the content element (does not get triggered more than once when user tries to scroll down and has already reached the end of scrollable content).

$(".nano").bind("scrollend", function(e){
    console.log("current HTMLDivElement", e.currentTarget);
});

Some browsers trigger this event more than once each time, so to listen to the custom event, instead of using jQuery's normal .bind or .on, you most likely want to use this tiny jQuery debounce plugin to prevent browsers from firing your function more than once every 100ms.

$(".nano").debounce("scrollend", function() {
    alert("The end");
}, 100);

'scrolltop'

Same as the 'scrollend' event, but it is triggered every time the user has scrolled to the top of the content element.

'update'

Same as the 'scrolltop' and 'scrollend' events, but it's triggered every time the user scrolls. It also carries a JavaScript object with the current position, the maximum height and the direction (up or down).

$(".nano").on("update", function(event, values){
    console.debug( values );
});

Plugin Options

There are a few options that you can change when running nanoScroller, e.g. $(".nano").nanoScroller({ paneClass: 'myclass' });

iOSNativeScrolling

Set to true if you want to use native scrolling in iOS 5+. This will disable your custom nanoScroller scrollbar in iOS 5+ and use the native one instead. While the native iOS scrollbar usually works much better, there could possibly be bugs in certain situations.

Notice that .pane and .slider elements are not generated/added for devices that support iOS native scrolling when iOSNativeScrolling option is enabled.

Default: false

$(".nano").nanoScroller({ iOSNativeScrolling: true });

sliderMinHeight

Sets the minimum height of the slider element.

Default: 20

$(".nano").nanoScroller({ sliderMinHeight: 40 });

sliderMaxHeight

Sets the maximum height of the slider element.

Default: null

$(".nano").nanoScroller({ sliderMaxHeight: 200 });

preventPageScrolling

Set to true to prevent page scrolling when top or bottom inside the content div is reached.

Default: false

$(".nano").nanoScroller({ preventPageScrolling: true });

disableResize

Set to true to disable the resize from nanoscroller. Useful if you want total control of the resize event. If you set this option to true remember to call the reset method so that the scroll don't have strange behavior.

Default: false

$(".nano").nanoScroller({ disableResize: true });

alwaysVisible

Set to true to stop the scrollbar from auto-hiding itself.

Default: false

$(".nano").nanoScroller({ alwaysVisible: true });

flashDelay:

Use this setting to specify the scrollbar hide delay in milliseconds if you have enabled the flash option.

$(".nano").nanoScroller({ flashDelay: 1000 });

Default: 1500

paneClass

A classname for scrollbar track element. If you change this setting, you also have to change it in the plugin's CSS file.

Default: 'nano-pane'

$(".nano").nanoScroller({ paneClass: 'scrollPane' });

sliderClass

A classname for scrollbar thumb element. If you change this setting, you also have to change it in the plugin's CSS file.

Default: 'nano-slider'

$(".nano").nanoScroller({ sliderClass: 'scrollSlider' });

contentClass

A classname for your content div. If you change this setting, you also have to change it in the plugin's CSS file.

Default: 'nano-content'

$(".nano").nanoScroller({ contentClass: 'sliderContent' });

tabIndex

Set the tab order of the scrollable content. Set to -1 to skip over the scrollable content when tabbing.

Default: 0

$(".nano").nanoScroller({ tabIndex: 0 });

How it works

Fig 1.

The plugin works by creating a scrollbar gadget (with pre-defined css for styling) and then subscribing the .nano-content's scroll events to it. Mouse press and drag events are also subscribed to the .nano-pane and .nano-pane > .nano-slider to emulate the native scrollbar's mechanism. The system scrollbars are hidden from the viewport (Fig 1). By doing this, we still retain the natural scrolling experience provided by the OS.

We are still working on doing a horizontal scrolling feature. If you're interested in contributing to the project, you are free to fork it and create a pull request.

Development

To build nanoScroller from source you need the following libraries installed:

How to build & contribute

  1. Make sure that you have Grunt installed.
  2. In terminal move to nanoscroller folder and run npm install to install all dependencies.
  3. Make all Javascript changes in Coffeescript file(s), CSS changes in CSS file(s).
  4. run grunt to build nanoScroller
  5. Make sure that all changes are valid and open a pull request.

How to run tests

  1. You need to have PhantomJS installed. On Mac OS X the easiest way is to install Homebrew and run brew install phantomjs.
  2. run grunt test in terminal

Browser compatibility

Tested desktop browsers:

  • IE7+
  • Firefox 3+
  • Chrome
  • Safari 4+
  • Opera 11.60+

Mobile support:

  • iOS 5+ (iPhone, iPad and iPod Touch)
  • iOS 4 (with a polyfill)
  • Android Firefox
  • Android 2.2/2.3 native browser (with a polyfill)
  • Android Opera 11.6 (with a polyfill)
  • If you see it's broken on other tablets and mobile devices, please file a ticket in the git repo. Along with model name, and OS of the device.

If you find a bug, please report here at the issues section.

Using a polyfill for better mobile browser support

You can use overthrow.js polyfill (~1.5kb minified and gzipped) to make nanoScroller work on many mobile devices. It emulates CSS overflow (overflow: auto;/overflow: scroll;) in devices that are lacking it.

To use overthrow, link to the javascript file in your HTML document...

<script src="overthrow.js"></script>

...and add an overthrow class to your content div.

<div id="about" class="nano">
    <div class="overthrow nano-content"> ... content here ...  </div>
</div>

Contributors

Other people who have contributed code:

Credits