A javascript scrollbar plugin which hides native scrollbars, provides custom styleable overlay scrollbars and keeps the native functionality and feeling.
npx @tessl/cli install tessl/npm-overlayscrollbars@1.13.0OverlayScrollbars is a JavaScript scrollbar plugin that hides native scrollbars and provides custom, styleable overlay scrollbars while maintaining native functionality and feeling. It supports both vanilla JavaScript and jQuery implementations with extensive browser compatibility (IE8+), automatic update detection, powerful scroll animations, and a rich extension system.
npm install overlayscrollbarsES Modules:
import OverlayScrollbars from "overlayscrollbars";CommonJS:
const OverlayScrollbars = require("overlayscrollbars");UMD (Browser Global):
<script src="node_modules/overlayscrollbars/js/OverlayScrollbars.min.js"></script>
<link rel="stylesheet" href="node_modules/overlayscrollbars/css/OverlayScrollbars.min.css">
<script>
// OverlayScrollbars is available globally
</script>jQuery Plugin:
import "overlayscrollbars/js/jquery.overlayScrollbars.min.js";
// or
<script src="overlayscrollbars/js/jquery.overlayScrollbars.min.js"></script>import OverlayScrollbars from "overlayscrollbars";
// Initialize on a single element
const osInstance = OverlayScrollbars(document.querySelector('.content'), {
className: "os-theme-dark",
scrollbars: {
autoHide: "leave"
}
});
// Initialize on multiple elements
const instances = OverlayScrollbars(document.querySelectorAll('.scrollable'), {
resize: "both",
scrollbars: {
visibility: "auto",
autoHide: "scroll"
}
});
// jQuery usage
$('.content').overlayScrollbars({
className: "os-theme-dark",
callbacks: {
onScrollStart: function() {
console.log("Scrolling started");
}
}
});OverlayScrollbars is built around several key components:
OverlayScrollbars() function for creating instancesglobals(), defaultOptions(), etc.)Primary constructor and instance management functionality for creating, configuring, and controlling OverlayScrollbars instances.
function OverlayScrollbars(
target: Element | NodeList | string,
options?: OverlayScrollbarsOptions,
extensions?: OverlayScrollbarsExtensions
): OverlayScrollbarsInstance | OverlayScrollbarsInstance[];Instance methods for updating, scrolling, controlling behavior, and managing extensions on individual OverlayScrollbars instances.
interface OverlayScrollbarsInstance {
update(force?: boolean): OverlayScrollbarsInstance;
scroll(coordinates: ScrollCoordinates, duration?: number, easing?: string | function, complete?: function): OverlayScrollbarsInstance;
scrollStop(): OverlayScrollbarsInstance;
destroy(): OverlayScrollbarsInstance;
ext(extensionName?: string): OverlayScrollbarsExtension | OverlayScrollbarsExtension[] | undefined;
addExt(extensionName: string, extensionOptions?: object): OverlayScrollbarsExtension | undefined;
removeExt(extensionName: string): boolean;
}Global methods for configuring default options, validating instances, and managing extensions across all OverlayScrollbars instances.
interface OverlayScrollbarsStatic {
globals(): OverlayScrollbarsGlobals;
defaultOptions(newOptions?: OverlayScrollbarsOptions): OverlayScrollbarsOptions;
valid(instance: any): boolean;
extension(name: string, extension?: function, defaultOptions?: object): any;
}Comprehensive configuration system with nested options for scrollbar behavior, appearance, callbacks, and specialized functionality.
interface OverlayScrollbarsOptions {
className?: string | null;
resize?: "none" | "both" | "horizontal" | "vertical";
sizeAutoCapable?: boolean;
scrollbars?: ScrollbarsOptions;
overflowBehavior?: OverflowBehaviorOptions;
callbacks?: CallbackOptions;
}Plugin architecture for extending OverlayScrollbars functionality with custom extensions that can be registered globally and used across instances.
interface OverlayScrollbarsExtension {
added(instance: OverlayScrollbarsInstance): void;
removed?(): void;
}jQuery plugin interface providing seamless integration with jQuery selectors and chaining while maintaining full API compatibility.
interface JQuery {
overlayScrollbars(options: OverlayScrollbarsOptions, extensions?: OverlayScrollbarsExtensions): JQuery;
overlayScrollbars(): OverlayScrollbarsInstance | OverlayScrollbarsInstance[];
}type ScrollCoordinates = {
x?: number | string;
y?: number | string;
} | number | string | Element;
interface OverlayScrollbarsGlobals {
defaultOptions: OverlayScrollbarsOptions;
autoUpdateRecommended: boolean;
supportMutationObserver: boolean;
supportResizeObserver: boolean;
supportPassiveEvents: boolean;
supportTransform: boolean;
supportTransition: boolean;
restrictedMeasuring: boolean;
nativeScrollbarStyling: boolean;
cssCalc: string | null;
nativeScrollbarSize: { x: number; y: number };
nativeScrollbarIsOverlaid: { x: boolean; y: boolean };
overlayScrollbarDummySize: { x: number; y: number };
rtlScrollBehavior: { i: boolean; n: boolean };
}
interface ScrollbarsOptions {
visibility?: "visible" | "hidden" | "auto";
autoHide?: "never" | "scroll" | "leave" | "move";
autoHideDelay?: number;
dragScrolling?: boolean;
clickScrolling?: boolean;
touchSupport?: boolean;
snapHandle?: boolean;
}
interface OverflowBehaviorOptions {
x?: "visible-hidden" | "visible-scroll" | "scroll" | "hidden";
y?: "visible-hidden" | "visible-scroll" | "scroll" | "hidden";
}
interface CallbackOptions {
onInitialized?: (instance: OverlayScrollbarsInstance) => void;
onInitializationWithdrawn?: (instance: OverlayScrollbarsInstance) => void;
onDestroyed?: (instance: OverlayScrollbarsInstance) => void;
onScrollStart?: (instance: OverlayScrollbarsInstance) => void;
onScroll?: (instance: OverlayScrollbarsInstance) => void;
onScrollStop?: (instance: OverlayScrollbarsInstance) => void;
onOverflowChanged?: (instance: OverlayScrollbarsInstance) => void;
onOverflowAmountChanged?: (instance: OverlayScrollbarsInstance) => void;
onDirectionChanged?: (instance: OverlayScrollbarsInstance) => void;
onContentSizeChanged?: (instance: OverlayScrollbarsInstance) => void;
onHostSizeChanged?: (instance: OverlayScrollbarsInstance) => void;
onUpdated?: (instance: OverlayScrollbarsInstance) => void;
}
type OverlayScrollbarsExtensions = object | object[];