UNPKG

perfect-scrollbar

Version:

Minimalistic but perfect custom scrollbar plugin

106 lines (85 loc) 2.94 kB
/* Copyright (c) 2015 Hyunje Alex Jun and other contributors * Licensed under the MIT License */ 'use strict'; var d = require('../../lib/dom') , h = require('../../lib/helper') , instances = require('../instances') , updateGeometry = require('../update-geometry'); function bindMouseScrollXHandler(element, i) { var currentLeft = null; var currentPageX = null; function updateScrollLeft(deltaX) { var newLeft = currentLeft + deltaX; var maxLeft = i.containerWidth - i.scrollbarXWidth; if (newLeft < 0) { i.scrollbarXLeft = 0; } else if (newLeft > maxLeft) { i.scrollbarXLeft = maxLeft; } else { i.scrollbarXLeft = newLeft; } var scrollLeft = h.toInt(i.scrollbarXLeft * (i.contentWidth - i.containerWidth) / (i.containerWidth - i.scrollbarXWidth)); element.scrollLeft = scrollLeft; } var mouseMoveHandler = function (e) { updateScrollLeft(e.pageX - currentPageX); updateGeometry(element); e.stopPropagation(); e.preventDefault(); }; var mouseUpHandler = function () { h.stopScrolling(element, 'x'); i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler); }; i.event.bind(i.scrollbarX, 'mousedown', function (e) { currentPageX = e.pageX; currentLeft = h.toInt(d.css(i.scrollbarX, 'left')); h.startScrolling(element, 'x'); i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler); i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler); e.stopPropagation(); e.preventDefault(); }); } function bindMouseScrollYHandler(element, i) { var currentTop = null; var currentPageY = null; function updateScrollTop(deltaY) { var newTop = currentTop + deltaY; var maxTop = i.containerHeight - i.scrollbarYHeight; if (newTop < 0) { i.scrollbarYTop = 0; } else if (newTop > maxTop) { i.scrollbarYTop = maxTop; } else { i.scrollbarYTop = newTop; } var scrollTop = h.toInt(i.scrollbarYTop * (i.contentHeight - i.containerHeight) / (i.containerHeight - i.scrollbarYHeight)); element.scrollTop = scrollTop; } var mouseMoveHandler = function (e) { updateScrollTop(e.pageY - currentPageY); updateGeometry(element); e.stopPropagation(); e.preventDefault(); }; var mouseUpHandler = function () { h.stopScrolling(element, 'y'); i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler); }; i.event.bind(i.scrollbarY, 'mousedown', function (e) { currentPageY = e.pageY; currentTop = h.toInt(d.css(i.scrollbarY, 'top')); h.startScrolling(element, 'y'); i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler); i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler); e.stopPropagation(); e.preventDefault(); }); } module.exports = function (element) { var i = instances.get(element); bindMouseScrollXHandler(element, i); bindMouseScrollYHandler(element, i); };