From 6d6a9f72fa10483d8b0f915a54a55e0f2debea3d Mon Sep 17 00:00:00 2001 From: e-cloud Date: Thu, 9 Apr 2015 00:03:44 +0800 Subject: [PATCH 01/32] ### basic 1. add umd wrapper to the plugin 2. improve angular support (no test yet) 3. wrap the updateScrollbars function into IIEF --- jquery.scrollbar.js | 159 ++++++++++++++++++++++++++------------------ 1 file changed, 94 insertions(+), 65 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 53d095a..89946a5 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -11,10 +11,22 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ -; -(function($, doc, win){ + +// just use the umd declaration mode and remove the explicit global exports +;(function(root, factory){ + if(typeof define === 'function' && define.amd){ + // AMD. Register as an anonymous module. + define(['jquery', 'angular'], factory); + } else { + factory(root.jQuery, root.angular, root, root.document); + } +}(this, function($, angular, doc, win){ 'use strict'; + if(doc === undefined || win === undefined){ + win = window; + doc = win.document; + } // init flags & variables var debug = false; var lmb = 1, px = "px"; @@ -135,7 +147,6 @@ }, - getScrollbar: function(d){ var scrollbar = this.options["scroll" + d]; @@ -187,7 +198,6 @@ }, - init: function(options){ // init variables @@ -608,70 +618,49 @@ */ $.fn.scrollbar.options = defaults; - /** - * Extend AngularJS as UI directive - * - * - */ - if(win.angular){ - (function(angular){ - var app = angular.module('jQueryScrollbar', []); - app.directive('jqueryScrollbar', function(){ - return { - "link": function(scope, element){ - element.scrollbar(scope.options).on('$destroy', function(){ - element.scrollbar('destroy'); - }); - }, - "restring": "AC", - "scope": { - "options": "=jqueryScrollbar" - } - }; - }); - })(win.angular); - } /** * Check if scroll content/container size is changed */ - var timer = 0, timerCounter = 0; - var updateScrollbars = function(force){ - var i, c, o, s, w, x, y; - for( i = 0; i < browser.scrolls.length; i++){ - s = browser.scrolls[i]; - c = s.container; - o = s.options; - w = s.wrapper; - x = s.scrollx; - y = s.scrolly; - if(force || (o.autoUpdate && w && w.is(":visible") && - (c.prop("scrollWidth") != x.size - || c.prop("scrollHeight") != y.size - || w.width() != x.visible - || w.height() != y.visible - ))){ - s.init(); - - if(debug){ - browser.log({ - "scrollHeight": c.prop("scrollHeight") + ":" + s.scrolly.size, - "scrollWidth": c.prop("scrollWidth") + ":" + s.scrollx.size, - "visibleHeight": w.height() + ":" + s.scrolly.visible, - "visibleWidth": w.width() + ":" + s.scrollx.visible - }, true); - timerCounter++; + + var updateScrollbars = (function(){ + var timer = 0, + timerCounter = 0; + + return function(force){ + var i, container, options, scroll, wrapper, scrollx, scrolly; + for (i = 0; i < browser.scrolls.length; i++){ + scroll = browser.scrolls[i]; + container = scroll.container; + options = scroll.options; + wrapper = scroll.wrapper; + scrollx = scroll.scrollx; + scrolly = scroll.scrolly; + if(force || (options.autoUpdate && wrapper && wrapper.is(":visible") && + (container.prop("scrollWidth") != scrollx.size || container.prop("scrollHeight") != scrolly.size || wrapper.width() != scrollx.visible || wrapper.height() != scrolly.visible))){ + scroll.init(); + + if(debug){ + browser.log({ + "scrollHeight": container.prop("scrollHeight") + ":" + scroll.scrolly.size, + "scrollWidth": container.prop("scrollWidth") + ":" + scroll.scrollx.size, + "visibleHeight": wrapper.height() + ":" + scroll.scrolly.visible, + "visibleWidth": wrapper.width() + ":" + scroll.scrollx.visible + }, true); + timerCounter++; + } } } - } - if(debug && timerCounter > 10){ - browser.log("Scroll updates exceed 10"); - updateScrollbars = function(){}; - } else { - clearTimeout(timer); - timer = setTimeout(updateScrollbars, 300); - } - }; + if(debug && timerCounter > 10){ + browser.log("Scroll updates exceed 10"); + updateScrollbars = function(){ + }; + } else { + clearTimeout(timer); + timer = setTimeout(updateScrollbars, 300); + } + }; + })(); /* ADDITIONAL FUNCTIONS */ /** @@ -752,11 +741,51 @@ function isVerticalScroll(event){ var e = event.originalEvent; - if (e.axis && e.axis === e.HORIZONTAL_AXIS) + if(e.axis && e.axis === e.HORIZONTAL_AXIS) return false; - if (e.wheelDeltaX) + if(e.wheelDeltaX) return false; return true; } -})(jQuery, document, window); \ No newline at end of file + + /** + * Extend AngularJS as UI directive + * and expose a provider for override default config + * + */ + if(angular){ + angular.module('jQueryScrollbar', []) + .provider('jQueryScrollbar', function(){ + var defaultOptions = defaults; + + return { + setOptions: function(options){ + angular.extend(defaultOptions, options); + }, + $get: function(){ + return { + options: angular.copy(defaultOptions) + }; + } + }; + }) + .directive('jqueryScrollbar', function(jQueryScrollbar){ + return { + "restrict": "AC", + "link": function(scope, element, attrs){ + + var model = $parse(attrs.ngMyDirective), + options = model(scope); + + element.scrollbar(options || jQueryScrollbar.options) + .on('$destroy', function(){ + element.scrollbar('destroy'); + }); + } + }; + }); + } + + +})); \ No newline at end of file From 35c04fbc6c387123240e0f22c810d9c9085b6afa Mon Sep 17 00:00:00 2001 From: e-cloud Date: Thu, 9 Apr 2015 20:22:36 +0800 Subject: [PATCH 02/32] 1. fix argument order bug 2. remove angular dependency( i have a test: angular always expose an object to window) --- jquery.scrollbar.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 89946a5..4c0ab92 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -16,14 +16,14 @@ ;(function(root, factory){ if(typeof define === 'function' && define.amd){ // AMD. Register as an anonymous module. - define(['jquery', 'angular'], factory); + define(['jquery'], factory); } else { - factory(root.jQuery, root.angular, root, root.document); + factory(root.jQuery, root, root.document); } -}(this, function($, angular, doc, win){ +}(this, function($, win, doc){ 'use strict'; - if(doc === undefined || win === undefined){ + if(win === undefined || doc === undefined){ win = window; doc = win.document; } @@ -754,8 +754,9 @@ * and expose a provider for override default config * */ - if(angular){ - angular.module('jQueryScrollbar', []) + if(win.angular){ + (function(angular){ + angular.module('jQueryScrollbar', []) .provider('jQueryScrollbar', function(){ var defaultOptions = defaults; @@ -770,12 +771,12 @@ } }; }) - .directive('jqueryScrollbar', function(jQueryScrollbar){ + .directive('jqueryScrollbar', function(jQueryScrollbar, $parse){ return { "restrict": "AC", "link": function(scope, element, attrs){ - var model = $parse(attrs.ngMyDirective), + var model = $parse(attrs.jqueryScrollbar), options = model(scope); element.scrollbar(options || jQueryScrollbar.options) @@ -785,7 +786,7 @@ } }; }); + })(win.angular) } - })); \ No newline at end of file From f87611bd14cb642d72dd93c15775bc4efb5ced72 Mon Sep 17 00:00:00 2001 From: Aaron Roberson Date: Fri, 15 May 2015 09:47:16 -0700 Subject: [PATCH 03/32] Added npm package.json --- package.json | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..be36cc2 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "jquery.scrollbar", + "version": "0.2.7", + "description": "Cross-browser CSS customizable scrollbar", + "main": "jquery.scrollbar.min.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/gromo/jquery.scrollbar.git" + }, + "keywords": [ + "jquery", + "scrollbar", + "angular", + "textarea" + ], + "author": "Yuriy Khabarov", + "license": "MIT", + "bugs": { + "url": "https://github.com/gromo/jquery.scrollbar/issues" + }, + "homepage": "https://github.com/gromo/jquery.scrollbar" +} From 622973b048176836e56f877bbbb44f34e65f99e7 Mon Sep 17 00:00:00 2001 From: Aaron Roberson Date: Fri, 15 May 2015 10:08:03 -0700 Subject: [PATCH 04/32] Added angular module jQueryScrollbar to exports --- index.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 index.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..68e57d8 --- /dev/null +++ b/index.js @@ -0,0 +1,3 @@ +require('./jquery.scrollbar'); +module.exports = 'jQueryScrollbar'); + From 44ed5330596c9beda401c5265f1d160734ecfe0f Mon Sep 17 00:00:00 2001 From: Aaron Roberson Date: Mon, 18 May 2015 11:35:54 -0700 Subject: [PATCH 05/32] Updated main to point to the new index.js for npm Sorry about the second PR, but in order to take advantage of the module.exports the main in package.json needs to point to index.js --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index be36cc2..0717f54 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jquery.scrollbar", "version": "0.2.7", "description": "Cross-browser CSS customizable scrollbar", - "main": "jquery.scrollbar.min.js", + "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, From b2dc0ede7837b52f6008d16944c835ed286c269a Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Wed, 22 Jul 2015 19:46:48 +0500 Subject: [PATCH 06/32] fix issue #50 when removed content does not update container height --- jquery.scrollbar.css | 4 +- jquery.scrollbar.js | 533 +++++++++++++++++++--------------------- jquery.scrollbar.min.js | 8 +- 3 files changed, 258 insertions(+), 287 deletions(-) diff --git a/jquery.scrollbar.css b/jquery.scrollbar.css index be51fc1..492c2e3 100644 --- a/jquery.scrollbar.css +++ b/jquery.scrollbar.css @@ -9,10 +9,10 @@ .scroll-wrapper > .scroll-content { border: none !important; box-sizing: content-box !important; - height: auto; + height: auto !important; left: 0; margin: 0; - max-height: none !important; + max-height: none; max-width: none !important; overflow: scroll !important; padding: 0; diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 4c0ab92..eacd382 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -1,62 +1,39 @@ /** * jQuery CSS Customizable Scrollbar * - * Copyright 2014, Yuriy Khabarov + * Copyright 2015, Yuriy Khabarov * Dual licensed under the MIT or GPL Version 2 licenses. * * If you found bug, please contact me via email <13real008@gmail.com> * * @author Yuriy Khabarov aka Gromo - * @version 0.2.6 + * @version 0.2.8 * @url https://github.com/gromo/jquery.scrollbar/ * */ -// just use the umd declaration mode and remove the explicit global exports -;(function(root, factory){ - if(typeof define === 'function' && define.amd){ - // AMD. Register as an anonymous module. +; +(function (root, factory) { + if (typeof define === 'function' && define.amd) { define(['jquery'], factory); } else { - factory(root.jQuery, root, root.document); + factory(root.jQuery); } -}(this, function($, win, doc){ +}(this, function ($) { 'use strict'; - if(win === undefined || doc === undefined){ - win = window; - doc = win.document; - } // init flags & variables var debug = false; var lmb = 1, px = "px"; var browser = { "data": {}, - "macosx": win.navigator.platform.toLowerCase().indexOf('mac') !== -1, - "mobile": /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(win.navigator.userAgent), + "macosx": navigator.platform.toLowerCase().indexOf('mac') !== -1, + "mobile": /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent), "overlay": null, "scroll": null, "scrolls": [], - "webkit": /WebKit/.test(win.navigator.userAgent), - - "log": debug ? function(data, toString){ - var output = data; - if(toString && typeof data != "string"){ - output = []; - $.each(data, function(i, v){ - output.push('"' + i + '": ' + v); - }); - output = output.join(", "); - } - if(win.console && win.console.log){ - win.console.log(output); - } else { - alert(output); - } - } : function(){ - - } + "webkit": /WebKit/.test(navigator.userAgent) }; var defaults = { @@ -70,7 +47,7 @@ "scrollStep": 30, // scroll step for scrollbar arrows "showArrows": false, // add class to show arrows "stepScrolling": true, // when scrolling to scrollbar mousedown position - "type":"simple", // [advanced|simple] scrollbar html type + "type": "simple", // [advanced|simple] scrollbar html type "scrollx": null, // horizontal scroll element "scrolly": null, // vertical scroll element @@ -82,19 +59,18 @@ }; - var customScrollbar = function(container, options){ + var customScrollbar = function (container, options) { - if(!browser.scroll){ - browser.log("Init jQuery Scrollbar v0.2.6"); + if (!browser.scroll) { browser.overlay = isScrollOverlaysContent(); browser.scroll = getBrowserScrollSize(); updateScrollbars(); - $(win).resize(function(){ + $(window).resize(function () { var forceUpdate = false; - if(browser.scroll && (browser.scroll.height || browser.scroll.width)){ + if (browser.scroll && (browser.scroll.height || browser.scroll.width)) { var scroll = getBrowserScrollSize(); - if(scroll.height != browser.scroll.height || scroll.width != browser.scroll.width){ + if (scroll.height != browser.scroll.height || scroll.width != browser.scroll.width) { browser.scroll = scroll; forceUpdate = true; // handle page zoom } @@ -104,7 +80,7 @@ } this.container = container; - this.options = $.extend({}, defaults, win.jQueryScrollbarOptions || {}); + this.options = $.extend({}, defaults, window.jQueryScrollbarOptions || {}); this.scrollTo = null; this.scrollx = {}; this.scrolly = {}; @@ -113,75 +89,71 @@ }; customScrollbar.prototype = { + destroy: function () { - destroy: function(){ - - if(!this.wrapper){ + if (!this.wrapper) { return; } // init variables var scrollLeft = this.container.scrollLeft(); - var scrollTop = this.container.scrollTop(); + var scrollTop = this.container.scrollTop(); this.container.insertBefore(this.wrapper).css({ - "height":"", - "margin":"" + "margin": "", + "max-height": "" }) - .removeClass("scroll-content") - .removeClass("scroll-scrollx_visible") - .removeClass("scroll-scrolly_visible") - .off(".scrollbar") - .scrollLeft(scrollLeft) - .scrollTop(scrollTop); + .removeClass("scroll-content") + .removeClass("scroll-scrollx_visible") + .removeClass("scroll-scrolly_visible") + .off(".scrollbar") + .scrollLeft(scrollLeft) + .scrollTop(scrollTop); this.scrollx.scrollbar.removeClass("scroll-scrollx_visible").find("div").andSelf().off(".scrollbar"); this.scrolly.scrollbar.removeClass("scroll-scrolly_visible").find("div").andSelf().off(".scrollbar"); this.wrapper.remove(); - $(doc).add("body").off(".scrollbar"); + $(document).add("body").off(".scrollbar"); - if($.isFunction(this.options.onDestroy)) + if ($.isFunction(this.options.onDestroy)) this.options.onDestroy.apply(this, [this.container]); }, - - - getScrollbar: function(d){ + getScrollbar: function (d) { var scrollbar = this.options["scroll" + d]; var html = { "advanced": - '
' + - '
' + - '
' + - '
' + - '
' + // required! used for scrollbar size calculation ! - '
' + - '
' + // used for handling scrollbar click - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
', - + '
' + + '
' + + '
' + + '
' + + '
' + // required! used for scrollbar size calculation! + '
' + + '
' + // used for handling scrollbar click + '
' + + '
' + + '
' + + '
' + // required + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
', "simple": - '
' + - '
' + // required! used for scrollbar size calculation ! - '
' + // used for handling scrollbar click - '
' + - '
' + '
' + + '
' + // required! used for scrollbar size calculation! + '
' + // used for handling scrollbar click + '
' + // required + '
' }; var type = html[this.options.type] ? this.options.type : "advanced"; - if(scrollbar){ - if(typeof(scrollbar) == "string"){ + if (scrollbar) { + if (typeof (scrollbar) == "string") { scrollbar = $(scrollbar).appendTo(this.wrapper); } else { scrollbar = $(scrollbar); @@ -190,15 +162,13 @@ scrollbar = $("
").addClass("scroll-element").html(html[type]).appendTo(this.wrapper); } - if(this.options.showArrows){ + if (this.options.showArrows) { scrollbar.addClass("scroll-element_arrows_visible"); } return scrollbar.addClass("scroll-" + d); }, - - - init: function(options){ + init: function (options) { // init variables var S = this; @@ -219,31 +189,31 @@ // do not init if in ignorable browser if ((browser.mobile && o.ignoreMobile) - || (browser.overlay && o.ignoreOverlay) - || (browser.macosx && !browser.webkit) // still required to ignore nonWebKit browsers on Mac - ) { + || (browser.overlay && o.ignoreOverlay) + || (browser.macosx && !browser.webkit) // still required to ignore nonWebKit browsers on Mac + ) { return false; } // init scroll container - if(!w){ + if (!w) { this.wrapper = w = $('
').addClass('scroll-wrapper').addClass(c.attr('class')) - .css('position', c.css('position') == 'absolute' ? 'absolute' : 'relative') - .insertBefore(c).append(c); + .css('position', c.css('position') == 'absolute' ? 'absolute' : 'relative') + .insertBefore(c).append(c); - if(c.is('textarea')){ + if (c.is('textarea')) { this.containerWrapper = cw = $('
').insertBefore(c).append(c); w.addClass('scroll-textarea'); } cw.addClass("scroll-content").css({ - "height":"", "margin-bottom": browser.scroll.height * -1 + px, - "margin-right": browser.scroll.width * -1 + px + "margin-right": browser.scroll.width * -1 + px, + "max-height": "" }); - c.on("scroll.scrollbar", function(event){ - if($.isFunction(o.onScroll)){ + c.on("scroll.scrollbar", function (event) { + if ($.isFunction(o.onScroll)) { o.onScroll.call(S, { "maxScroll": s.y.maxScrollOffset, "scroll": c.scrollTop(), @@ -257,27 +227,27 @@ }); } s.x.isVisible && s.x.scroller.css("left", c.scrollLeft() * s.x.kx + px); - s.y.isVisible && s.y.scroller.css("top", c.scrollTop() * s.y.kx + px); + s.y.isVisible && s.y.scroller.css("top", c.scrollTop() * s.y.kx + px); }); /* prevent native scrollbars to be visible on #anchor click */ - w.on("scroll", function(){ + w.on("scroll", function () { w.scrollTop(0).scrollLeft(0); }); - if(o.disableBodyScroll){ - var handleMouseScroll = function(event){ + if (o.disableBodyScroll) { + var handleMouseScroll = function (event) { isVerticalScroll(event) ? - s.y.isVisible && s.y.mousewheel(event) : - s.x.isVisible && s.x.mousewheel(event); + s.y.isVisible && s.y.mousewheel(event) : + s.x.isVisible && s.x.mousewheel(event); }; w.on({ "MozMousePixelScroll.scrollbar": handleMouseScroll, "mousewheel.scrollbar": handleMouseScroll }); - if(browser.mobile){ - w.on("touchstart.scrollbar", function(event){ + if (browser.mobile) { + w.on("touchstart.scrollbar", function (event) { var touch = event.originalEvent.touches && event.originalEvent.touches[0] || event; var originalTouch = { "pageX": touch.pageX, @@ -287,61 +257,61 @@ "left": c.scrollLeft(), "top": c.scrollTop() }; - $(doc).on({ - "touchmove.scrollbar": function(event){ + $(document).on({ + "touchmove.scrollbar": function (event) { var touch = event.originalEvent.targetTouches && event.originalEvent.targetTouches[0] || event; c.scrollLeft(originalScroll.left + originalTouch.pageX - touch.pageX); c.scrollTop(originalScroll.top + originalTouch.pageY - touch.pageY); event.preventDefault(); }, - "touchend.scrollbar": function(){ - $(doc).off(".scrollbar"); + "touchend.scrollbar": function () { + $(document).off(".scrollbar"); } }); }); } } - if($.isFunction(o.onInit)) + if ($.isFunction(o.onInit)) o.onInit.apply(this, [c]); } else { cw.css({ - "height":"", "margin-bottom": browser.scroll.height * -1 + px, - "margin-right": browser.scroll.width * -1 + px + "margin-right": browser.scroll.width * -1 + px, + "max-height": "" }); } // init scrollbars & recalculate sizes - $.each(s, function(d, scrollx){ + $.each(s, function (d, scrollx) { var scrollCallback = null; var scrollForward = 1; var scrollOffset = (d == "x") ? "scrollLeft" : "scrollTop"; var scrollStep = o.scrollStep; - var scrollTo = function(){ + var scrollTo = function () { var currentOffset = c[scrollOffset](); c[scrollOffset](currentOffset + scrollStep); - if(scrollForward == 1 && (currentOffset + scrollStep) >= scrollToValue) + if (scrollForward == 1 && (currentOffset + scrollStep) >= scrollToValue) currentOffset = c[scrollOffset](); - if(scrollForward == -1 && (currentOffset + scrollStep) <= scrollToValue) + if (scrollForward == -1 && (currentOffset + scrollStep) <= scrollToValue) currentOffset = c[scrollOffset](); - if(c[scrollOffset]() == currentOffset && scrollCallback){ + if (c[scrollOffset]() == currentOffset && scrollCallback) { scrollCallback(); } } var scrollToValue = 0; - if(!scrollx.scrollbar){ + if (!scrollx.scrollbar) { scrollx.scrollbar = S.getScrollbar(d); scrollx.scroller = scrollx.scrollbar.find(".scroll-bar"); - scrollx.mousewheel = function(event){ + scrollx.mousewheel = function (event) { - if(!scrollx.isVisible || (d == 'x' && isVerticalScroll(event))){ + if (!scrollx.isVisible || (d == 'x' && isVerticalScroll(event))) { return true; } - if(d == 'y' && !isVerticalScroll(event)){ + if (d == 'y' && !isVerticalScroll(event)) { s.x.mousewheel(event); return true; } @@ -349,18 +319,18 @@ var delta = event.originalEvent.wheelDelta * -1 || event.originalEvent.detail; var maxScrollValue = scrollx.size - scrollx.visible - scrollx.offset; - if(!((scrollToValue <= 0 && delta < 0) || (scrollToValue >= maxScrollValue && delta > 0))){ + if (!((scrollToValue <= 0 && delta < 0) || (scrollToValue >= maxScrollValue && delta > 0))) { scrollToValue = scrollToValue + delta; - if(scrollToValue < 0) + if (scrollToValue < 0) scrollToValue = 0; - if(scrollToValue > maxScrollValue) + if (scrollToValue > maxScrollValue) scrollToValue = maxScrollValue; S.scrollTo = S.scrollTo || {}; S.scrollTo[scrollOffset] = scrollToValue; - setTimeout(function(){ - if(S.scrollTo){ - c.stop().animate(S.scrollTo, 240, 'linear', function(){ + setTimeout(function () { + if (S.scrollTo) { + c.stop().animate(S.scrollTo, 240, 'linear', function () { scrollToValue = c[scrollOffset](); }); S.scrollTo = null; @@ -375,85 +345,85 @@ scrollx.scrollbar.on({ "MozMousePixelScroll.scrollbar": scrollx.mousewheel, "mousewheel.scrollbar": scrollx.mousewheel, - "mouseenter.scrollbar": function(){ + "mouseenter.scrollbar": function () { scrollToValue = c[scrollOffset](); } }); // handle arrows & scroll inner mousedown event scrollx.scrollbar.find(".scroll-arrow, .scroll-element_track") - .on("mousedown.scrollbar", function(event){ + .on("mousedown.scrollbar", function (event) { - if(event.which != lmb) - return true; - - scrollForward = 1; - - var data = { - "eventOffset": event[(d == "x") ? "pageX" : "pageY"], - "maxScrollValue": scrollx.size - scrollx.visible - scrollx.offset, - "scrollbarOffset": scrollx.scroller.offset()[(d == "x") ? "left" : "top"], - "scrollbarSize": scrollx.scroller[(d == "x") ? "outerWidth" : "outerHeight"]() - }; - var timeout = 0, timer = 0; - - if($(this).hasClass('scroll-arrow')){ - scrollForward = $(this).hasClass("scroll-arrow_more") ? 1 : -1; - scrollStep = o.scrollStep * scrollForward; - scrollToValue = scrollForward > 0 ? data.maxScrollValue : 0; - } else { - scrollForward = (data.eventOffset > (data.scrollbarOffset + data.scrollbarSize) ? 1 - : (data.eventOffset < data.scrollbarOffset ? -1 : 0)); - scrollStep = Math.round(scrollx.visible * 0.75) * scrollForward; - scrollToValue = (data.eventOffset - data.scrollbarOffset - - (o.stepScrolling ? (scrollForward == 1 ? data.scrollbarSize : 0) - : Math.round(data.scrollbarSize / 2))); - scrollToValue = c[scrollOffset]() + (scrollToValue / scrollx.kx); - } + if (event.which != lmb) + return true; - S.scrollTo = S.scrollTo || {}; - S.scrollTo[scrollOffset] = o.stepScrolling ? c[scrollOffset]() + scrollStep : scrollToValue; + scrollForward = 1; - if(o.stepScrolling){ - scrollCallback = function(){ - scrollToValue = c[scrollOffset](); - clearInterval(timer); - clearTimeout(timeout); - timeout = 0; - timer = 0; + var data = { + "eventOffset": event[(d == "x") ? "pageX" : "pageY"], + "maxScrollValue": scrollx.size - scrollx.visible - scrollx.offset, + "scrollbarOffset": scrollx.scroller.offset()[(d == "x") ? "left" : "top"], + "scrollbarSize": scrollx.scroller[(d == "x") ? "outerWidth" : "outerHeight"]() }; - timeout = setTimeout(function(){ - timer = setInterval(scrollTo, 40); - }, o.duration + 100); - } + var timeout = 0, timer = 0; + + if ($(this).hasClass('scroll-arrow')) { + scrollForward = $(this).hasClass("scroll-arrow_more") ? 1 : -1; + scrollStep = o.scrollStep * scrollForward; + scrollToValue = scrollForward > 0 ? data.maxScrollValue : 0; + } else { + scrollForward = (data.eventOffset > (data.scrollbarOffset + data.scrollbarSize) ? 1 + : (data.eventOffset < data.scrollbarOffset ? -1 : 0)); + scrollStep = Math.round(scrollx.visible * 0.75) * scrollForward; + scrollToValue = (data.eventOffset - data.scrollbarOffset - + (o.stepScrolling ? (scrollForward == 1 ? data.scrollbarSize : 0) + : Math.round(data.scrollbarSize / 2))); + scrollToValue = c[scrollOffset]() + (scrollToValue / scrollx.kx); + } - setTimeout(function(){ - if(S.scrollTo){ - c.animate(S.scrollTo, o.duration); - S.scrollTo = null; + S.scrollTo = S.scrollTo || {}; + S.scrollTo[scrollOffset] = o.stepScrolling ? c[scrollOffset]() + scrollStep : scrollToValue; + + if (o.stepScrolling) { + scrollCallback = function () { + scrollToValue = c[scrollOffset](); + clearInterval(timer); + clearTimeout(timeout); + timeout = 0; + timer = 0; + }; + timeout = setTimeout(function () { + timer = setInterval(scrollTo, 40); + }, o.duration + 100); } - }, 1); - return handleMouseDown(scrollCallback, event); - }); + setTimeout(function () { + if (S.scrollTo) { + c.animate(S.scrollTo, o.duration); + S.scrollTo = null; + } + }, 1); + + return handleMouseDown(scrollCallback, event); + }); // handle scrollbar drag'n'drop - scrollx.scroller.on("mousedown.scrollbar", function(event){ + scrollx.scroller.on("mousedown.scrollbar", function (event) { - if(event.which != lmb) + if (event.which != lmb) return true; - var eventPosition = event[(d == "x")? "pageX" : "pageY"]; + var eventPosition = event[(d == "x") ? "pageX" : "pageY"]; var initOffset = c[scrollOffset](); scrollx.scrollbar.addClass("scroll-draggable"); - $(doc).on("mousemove.scrollbar", function(event){ - var diff = parseInt((event[(d == "x")? "pageX" : "pageY"] - eventPosition) / scrollx.kx, 10); + $(document).on("mousemove.scrollbar", function (event) { + var diff = parseInt((event[(d == "x") ? "pageX" : "pageY"] - eventPosition) / scrollx.kx, 10); c[scrollOffset](initOffset + diff); }); - return handleMouseDown(function(){ + return handleMouseDown(function () { scrollx.scrollbar.removeClass("scroll-draggable"); scrollToValue = c[scrollOffset](); }, event); @@ -462,7 +432,7 @@ }); // remove classes & reset applied styles - $.each(s, function(d, scrollx){ + $.each(s, function (d, scrollx) { var scrollClass = "scroll-scroll" + d + "_visible"; var scrolly = (d == "x") ? s.y : s.x; @@ -472,7 +442,7 @@ }); // calculate init sizes - $.each(s, function(d, scrollx){ + $.each(s, function (d, scrollx) { $.extend(scrollx, (d == "x") ? { "offset": parseInt(c.css("left"), 10) || 0, "size": c.prop("scrollWidth"), @@ -485,7 +455,7 @@ }); - var updateScroll = function(d, scrollx){ + var updateScroll = function (d, scrollx) { var scrollClass = "scroll-scroll" + d + "_visible"; var scrolly = (d == "x") ? s.y : s.x; @@ -495,7 +465,7 @@ var AreaVisible = scrollx.visible + offset; scrollx.isVisible = (AreaSize - AreaVisible) > 1; // bug in IE9/11 with 1px diff - if(scrollx.isVisible){ + if (scrollx.isVisible) { scrollx.scrollbar.addClass(scrollClass); scrolly.scrollbar.addClass(scrollClass); cw.addClass(scrollClass); @@ -505,18 +475,18 @@ cw.removeClass(scrollClass); } - if(d == "y" && (scrollx.isVisible || scrollx.size < scrollx.visible)){ - cw.css("height", (AreaVisible + browser.scroll.height) + px); + if (d == "y" && (scrollx.isVisible || scrollx.size < scrollx.visible)) { + cw.css("max-height", (AreaVisible + browser.scroll.height) + px); } - if(s.x.size != c.prop("scrollWidth") + if (s.x.size != c.prop("scrollWidth") || s.y.size != c.prop("scrollHeight") || s.x.visible != w.width() || s.y.visible != w.height() - || s.x.offset != (parseInt(c.css("left"), 10) || 0) - || s.y.offset != (parseInt(c.css("top"), 10) || 0) - ){ - $.each(s, function(d, scrollx){ + || s.x.offset != (parseInt(c.css("left"), 10) || 0) + || s.y.offset != (parseInt(c.css("top"), 10) || 0) + ) { + $.each(s, function (d, scrollx) { $.extend(scrollx, (d == "x") ? { "offset": parseInt(c.css("left"), 10) || 0, "size": c.prop("scrollWidth"), @@ -532,11 +502,11 @@ }; $.each(s, updateScroll); - if($.isFunction(o.onUpdate)) + if ($.isFunction(o.onUpdate)) o.onUpdate.apply(this, [c]); // calculate scroll size - $.each(s, function(d, scrollx){ + $.each(s, function (d, scrollx) { var cssOffset = (d == "x") ? "left" : "top"; var cssFullSize = (d == "x") ? "outerWidth" : "outerHeight"; @@ -549,7 +519,7 @@ var scrollSize = scrollx.scrollbar.find(".scroll-element_size"); scrollSize = scrollSize[cssFullSize]() + (parseInt(scrollSize.css(cssOffset), 10) || 0); - if(o.autoScrollSize){ + if (o.autoScrollSize) { scrollx.scrollbarSize = parseInt(scrollSize * AreaVisible / AreaSize, 10); scrollx.scroller.css(cssSize, scrollx.scrollbarSize + px); } @@ -569,25 +539,25 @@ * @param {object|string} options or command to execute * @param {object|array} args additional arguments as array [] */ - $.fn.scrollbar = function(options, args){ + $.fn.scrollbar = function (options, args) { var toReturn = this; - if(options === "get") + if (options === "get") toReturn = null; - this.each(function() { + this.each(function () { var container = $(this); - if(container.hasClass("scroll-wrapper") - || container.get(0).nodeName == "body"){ + if (container.hasClass("scroll-wrapper") + || container.get(0).nodeName == "body") { return true; } var instance = container.data("scrollbar"); - if(instance){ - if(options === "get"){ + if (instance) { + if (options === "get") { toReturn = instance; return false; } @@ -595,13 +565,13 @@ var func = (typeof options == "string" && instance[options]) ? options : "init"; instance[func].apply(instance, $.isArray(args) ? args : []); - if(options === "destroy"){ + if (options === "destroy") { container.removeData("scrollbar"); - while($.inArray(instance, browser.scrolls) >= 0) + while ($.inArray(instance, browser.scrolls) >= 0) browser.scrolls.splice($.inArray(instance, browser.scrolls), 1); } } else { - if(typeof options != "string"){ + if (typeof options != "string") { instance = new customScrollbar(container, options); container.data("scrollbar", instance); browser.scrolls.push(instance); @@ -623,37 +593,37 @@ * Check if scroll content/container size is changed */ - var updateScrollbars = (function(){ - var timer = 0, + var updateScrollbars = (function () { + var timer = 0, timerCounter = 0; - return function(force){ + return function (force) { var i, container, options, scroll, wrapper, scrollx, scrolly; - for (i = 0; i < browser.scrolls.length; i++){ - scroll = browser.scrolls[i]; + for (i = 0; i < browser.scrolls.length; i++) { + scroll = browser.scrolls[i]; container = scroll.container; - options = scroll.options; - wrapper = scroll.wrapper; - scrollx = scroll.scrollx; - scrolly = scroll.scrolly; - if(force || (options.autoUpdate && wrapper && wrapper.is(":visible") && - (container.prop("scrollWidth") != scrollx.size || container.prop("scrollHeight") != scrolly.size || wrapper.width() != scrollx.visible || wrapper.height() != scrolly.visible))){ + options = scroll.options; + wrapper = scroll.wrapper; + scrollx = scroll.scrollx; + scrolly = scroll.scrolly; + if (force || (options.autoUpdate && wrapper && wrapper.is(":visible") && + (container.prop("scrollWidth") != scrollx.size || container.prop("scrollHeight") != scrolly.size || wrapper.width() != scrollx.visible || wrapper.height() != scrolly.visible))) { scroll.init(); - if(debug){ - browser.log({ - "scrollHeight": container.prop("scrollHeight") + ":" + scroll.scrolly.size, - "scrollWidth": container.prop("scrollWidth") + ":" + scroll.scrollx.size, + if (debug) { + window.console && console.log({ + "scrollHeight": container.prop("scrollHeight") + ":" + scroll.scrolly.size, + "scrollWidth": container.prop("scrollWidth") + ":" + scroll.scrollx.size, "visibleHeight": wrapper.height() + ":" + scroll.scrolly.visible, - "visibleWidth": wrapper.width() + ":" + scroll.scrollx.visible + "visibleWidth": wrapper.width() + ":" + scroll.scrollx.visible }, true); timerCounter++; } } } - if(debug && timerCounter > 10){ - browser.log("Scroll updates exceed 10"); - updateScrollbars = function(){ + if (debug && timerCounter > 10) { + window.console && console.log("Scroll updates exceed 10"); + updateScrollbars = function () { }; } else { clearTimeout(timer); @@ -669,30 +639,30 @@ * @param {Boolean} actual size or CSS size, default - CSS size * @returns {Object} with height, width */ - function getBrowserScrollSize(actualSize){ + function getBrowserScrollSize(actualSize) { - if(browser.webkit && !actualSize){ + if (browser.webkit && !actualSize) { return { "height": 0, "width": 0 }; } - if(!browser.data.outer){ + if (!browser.data.outer) { var css = { - "border": "none", + "border": "none", "box-sizing": "content-box", - "height": "200px", - "margin": "0", + "height": "200px", + "margin": "0", "padding": "0", - "width": "200px" + "width": "200px" }; browser.data.inner = $("
").css($.extend({}, css)); browser.data.outer = $("
").css($.extend({ - "left": "-1000px", - "overflow": "scroll", - "position": "absolute", - "top": "-1000px" + "left": "-1000px", + "overflow": "scroll", + "position": "absolute", + "top": "-1000px" }, css)).append(browser.data.inner).appendTo("body"); } @@ -704,23 +674,23 @@ }; } - function handleMouseDown(callback, event){ - $(doc).on({ - "blur.scrollbar": function(){ - $(doc).add('body').off('.scrollbar'); + function handleMouseDown(callback, event) { + $(document).on({ + "blur.scrollbar": function () { + $(document).add('body').off('.scrollbar'); callback && callback(); }, - "dragstart.scrollbar": function(event){ + "dragstart.scrollbar": function (event) { event.preventDefault(); return false; }, - "mouseup.scrollbar": function(){ - $(doc).add('body').off('.scrollbar'); + "mouseup.scrollbar": function () { + $(document).add('body').off('.scrollbar'); callback && callback(); } }); $("body").on({ - "selectstart.scrollbar": function(event){ + "selectstart.scrollbar": function (event) { event.preventDefault(); return false; } @@ -734,16 +704,16 @@ * * @returns {Boolean} */ - function isScrollOverlaysContent(){ + function isScrollOverlaysContent() { var scrollSize = getBrowserScrollSize(true); return !(scrollSize.height || scrollSize.width); } - function isVerticalScroll(event){ + function isVerticalScroll(event) { var e = event.originalEvent; - if(e.axis && e.axis === e.HORIZONTAL_AXIS) + if (e.axis && e.axis === e.HORIZONTAL_AXIS) return false; - if(e.wheelDeltaX) + if (e.wheelDeltaX) return false; return true; } @@ -754,39 +724,38 @@ * and expose a provider for override default config * */ - if(win.angular){ - (function(angular){ + if (window.angular) { + (function (angular) { angular.module('jQueryScrollbar', []) - .provider('jQueryScrollbar', function(){ - var defaultOptions = defaults; - - return { - setOptions: function(options){ - angular.extend(defaultOptions, options); - }, - $get: function(){ - return { - options: angular.copy(defaultOptions) - }; - } - }; - }) - .directive('jqueryScrollbar', function(jQueryScrollbar, $parse){ - return { - "restrict": "AC", - "link": function(scope, element, attrs){ - - var model = $parse(attrs.jqueryScrollbar), - options = model(scope); - - element.scrollbar(options || jQueryScrollbar.options) - .on('$destroy', function(){ - element.scrollbar('destroy'); - }); - } - }; - }); - })(win.angular) + .provider('jQueryScrollbar', function () { + var defaultOptions = defaults; + + return { + setOptions: function (options) { + angular.extend(defaultOptions, options); + }, + $get: function () { + return { + options: angular.copy(defaultOptions) + }; + } + }; + }) + .directive('jqueryScrollbar', function (jQueryScrollbar, $parse) { + return { + "restrict": "AC", + "link": function (scope, element, attrs) { + + var model = $parse(attrs.jqueryScrollbar), + options = model(scope); + + element.scrollbar(options || jQueryScrollbar.options) + .on('$destroy', function () { + element.scrollbar('destroy'); + }); + } + }; + }); + })(window.angular); } - })); \ No newline at end of file diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 5d1d89e..134bdb4 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -1,14 +1,16 @@ /** * jQuery CSS Customizable Scrollbar * - * Copyright 2014, Yuriy Khabarov + * Copyright 2015, Yuriy Khabarov * Dual licensed under the MIT or GPL Version 2 licenses. * * If you found bug, please contact me via email <13real008@gmail.com> * + * Compressed by http://jscompress.com/ + * * @author Yuriy Khabarov aka Gromo - * @version 0.2.6 + * @version 0.2.8 * @url https://github.com/gromo/jquery.scrollbar/ * */ -(function(e,t,n){"use strict";function h(t){if(o.webkit&&!t){return{height:0,width:0}}if(!o.data.outer){var n={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};o.data.inner=e("
").css(e.extend({},n));o.data.outer=e("
").css(e.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},n)).append(o.data.inner).appendTo("body")}o.data.outer.scrollLeft(1e3).scrollTop(1e3);return{height:Math.ceil(o.data.outer.offset().top-o.data.inner.offset().top||0),width:Math.ceil(o.data.outer.offset().left-o.data.inner.offset().left||0)}}function p(n,r){e(t).on({"blur.scrollbar":function(){e(t).add("body").off(".scrollbar");n&&n()},"dragstart.scrollbar":function(e){e.preventDefault();return false},"mouseup.scrollbar":function(){e(t).add("body").off(".scrollbar");n&&n()}});e("body").on({"selectstart.scrollbar":function(e){e.preventDefault();return false}});r&&r.preventDefault();return false}function d(){var e=h(true);return!(e.height||e.width)}function v(e){var t=e.originalEvent;if(t.axis&&t.axis===t.HORIZONTAL_AXIS)return false;if(t.wheelDeltaX)return false;return true}var r=false;var i=1,s="px";var o={data:{},macosx:n.navigator.platform.toLowerCase().indexOf("mac")!==-1,mobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(n.navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/WebKit/.test(n.navigator.userAgent),log:r?function(t,r){var i=t;if(r&&typeof t!="string"){i=[];e.each(t,function(e,t){i.push('"'+e+'": '+t)});i=i.join(", ")}if(n.console&&n.console.log){n.console.log(i)}else{alert(i)}}:function(){}};var u={autoScrollSize:true,autoUpdate:true,debug:false,disableBodyScroll:false,duration:200,ignoreMobile:true,ignoreOverlay:true,scrollStep:30,showArrows:false,stepScrolling:true,type:"simple",scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null};var a=function(t,r){if(!o.scroll){o.log("Init jQuery Scrollbar v0.2.6");o.overlay=d();o.scroll=h();c();e(n).resize(function(){var e=false;if(o.scroll&&(o.scroll.height||o.scroll.width)){var t=h();if(t.height!=o.scroll.height||t.width!=o.scroll.width){o.scroll=t;e=true}}c(e)})}this.container=t;this.options=e.extend({},u,n.jQueryScrollbarOptions||{});this.scrollTo=null;this.scrollx={};this.scrolly={};this.init(r)};a.prototype={destroy:function(){if(!this.wrapper){return}var n=this.container.scrollLeft();var r=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:""}).removeClass("scroll-content").removeClass("scroll-scrollx_visible").removeClass("scroll-scrolly_visible").off(".scrollbar").scrollLeft(n).scrollTop(r);this.scrollx.scrollbar.removeClass("scroll-scrollx_visible").find("div").andSelf().off(".scrollbar");this.scrolly.scrollbar.removeClass("scroll-scrolly_visible").find("div").andSelf().off(".scrollbar");this.wrapper.remove();e(t).add("body").off(".scrollbar");if(e.isFunction(this.options.onDestroy))this.options.onDestroy.apply(this,[this.container])},getScrollbar:function(t){var n=this.options["scroll"+t];var r={advanced:'
'+'
'+'
'+'
'+'
'+'
'+'
'+'
'+"
"+"
"+'
'+'
'+'
'+"
"+'
'+'
'+"
"+"
",simple:'
'+'
'+'
'+'
'+"
"};var i=r[this.options.type]?this.options.type:"advanced";if(n){if(typeof n=="string"){n=e(n).appendTo(this.wrapper)}else{n=e(n)}}else{n=e("
").addClass("scroll-element").html(r[i]).appendTo(this.wrapper)}if(this.options.showArrows){n.addClass("scroll-element_arrows_visible")}return n.addClass("scroll-"+t)},init:function(n){var r=this;var u=this.container;var a=this.containerWrapper||u;var f=e.extend(this.options,n||{});var l={x:this.scrollx,y:this.scrolly};var c=this.wrapper;var h={scrollLeft:u.scrollLeft(),scrollTop:u.scrollTop()};if(o.mobile&&f.ignoreMobile||o.overlay&&f.ignoreOverlay||o.macosx&&!o.webkit){return false}if(!c){this.wrapper=c=e("
").addClass("scroll-wrapper").addClass(u.attr("class")).css("position",u.css("position")=="absolute"?"absolute":"relative").insertBefore(u).append(u);if(u.is("textarea")){this.containerWrapper=a=e("
").insertBefore(u).append(u);c.addClass("scroll-textarea")}a.addClass("scroll-content").css({height:"","margin-bottom":o.scroll.height*-1+s,"margin-right":o.scroll.width*-1+s});u.on("scroll.scrollbar",function(t){if(e.isFunction(f.onScroll)){f.onScroll.call(r,{maxScroll:l.y.maxScrollOffset,scroll:u.scrollTop(),size:l.y.size,visible:l.y.visible},{maxScroll:l.x.maxScrollOffset,scroll:u.scrollLeft(),size:l.x.size,visible:l.x.visible})}l.x.isVisible&&l.x.scroller.css("left",u.scrollLeft()*l.x.kx+s);l.y.isVisible&&l.y.scroller.css("top",u.scrollTop()*l.y.kx+s)});c.on("scroll",function(){c.scrollTop(0).scrollLeft(0)});if(f.disableBodyScroll){var d=function(e){v(e)?l.y.isVisible&&l.y.mousewheel(e):l.x.isVisible&&l.x.mousewheel(e)};c.on({"MozMousePixelScroll.scrollbar":d,"mousewheel.scrollbar":d});if(o.mobile){c.on("touchstart.scrollbar",function(n){var r=n.originalEvent.touches&&n.originalEvent.touches[0]||n;var i={pageX:r.pageX,pageY:r.pageY};var s={left:u.scrollLeft(),top:u.scrollTop()};e(t).on({"touchmove.scrollbar":function(e){var t=e.originalEvent.targetTouches&&e.originalEvent.targetTouches[0]||e;u.scrollLeft(s.left+i.pageX-t.pageX);u.scrollTop(s.top+i.pageY-t.pageY);e.preventDefault()},"touchend.scrollbar":function(){e(t).off(".scrollbar")}})})}}if(e.isFunction(f.onInit))f.onInit.apply(this,[u])}else{a.css({height:"","margin-bottom":o.scroll.height*-1+s,"margin-right":o.scroll.width*-1+s})}e.each(l,function(n,s){var o=null;var a=1;var c=n=="x"?"scrollLeft":"scrollTop";var h=f.scrollStep;var d=function(){var e=u[c]();u[c](e+h);if(a==1&&e+h>=m)e=u[c]();if(a==-1&&e+h<=m)e=u[c]();if(u[c]()==e&&o){o()}};var m=0;if(!s.scrollbar){s.scrollbar=r.getScrollbar(n);s.scroller=s.scrollbar.find(".scroll-bar");s.mousewheel=function(e){if(!s.isVisible||n=="x"&&v(e)){return true}if(n=="y"&&!v(e)){l.x.mousewheel(e);return true}var t=e.originalEvent.wheelDelta*-1||e.originalEvent.detail;var i=s.size-s.visible-s.offset;if(!(m<=0&&t<0||m>=i&&t>0)){m=m+t;if(m<0)m=0;if(m>i)m=i;r.scrollTo=r.scrollTo||{};r.scrollTo[c]=m;setTimeout(function(){if(r.scrollTo){u.stop().animate(r.scrollTo,240,"linear",function(){m=u[c]()});r.scrollTo=null}},1)}e.preventDefault();return false};s.scrollbar.on({"MozMousePixelScroll.scrollbar":s.mousewheel,"mousewheel.scrollbar":s.mousewheel,"mouseenter.scrollbar":function(){m=u[c]()}});s.scrollbar.find(".scroll-arrow, .scroll-element_track").on("mousedown.scrollbar",function(t){if(t.which!=i)return true;a=1;var l={eventOffset:t[n=="x"?"pageX":"pageY"],maxScrollValue:s.size-s.visible-s.offset,scrollbarOffset:s.scroller.offset()[n=="x"?"left":"top"],scrollbarSize:s.scroller[n=="x"?"outerWidth":"outerHeight"]()};var v=0,g=0;if(e(this).hasClass("scroll-arrow")){a=e(this).hasClass("scroll-arrow_more")?1:-1;h=f.scrollStep*a;m=a>0?l.maxScrollValue:0}else{a=l.eventOffset>l.scrollbarOffset+l.scrollbarSize?1:l.eventOffset1;if(n.isVisible){n.scrollbar.addClass(r);i.scrollbar.addClass(r);a.addClass(r)}else{n.scrollbar.removeClass(r);i.scrollbar.removeClass(r);a.removeClass(r)}if(t=="y"&&(n.isVisible||n.size=0)o.scrolls.splice(e.inArray(s,o.scrolls),1)}}else{if(typeof t!="string"){s=new a(i,t);i.data("scrollbar",s);o.scrolls.push(s)}}return true});return r};e.fn.scrollbar.options=u;if(n.angular){(function(e){var t=e.module("jQueryScrollbar",[]);t.directive("jqueryScrollbar",function(){return{link:function(e,t){t.scrollbar(e.options).on("$destroy",function(){t.scrollbar("destroy")})},restring:"AC",scope:{options:"=jqueryScrollbar"}}})})(n.angular)}var f=0,l=0;var c=function(e){var t,n,i,s,u,a,h;for(t=0;t10){o.log("Scroll updates exceed 10");c=function(){}}else{clearTimeout(f);f=setTimeout(c,300)}}})(jQuery,document,window); \ No newline at end of file +!function(l,r){"function"==typeof define&&define.amd?define(["jquery"],r):r(l.jQuery)}(this,function(l){"use strict";function r(r){if(n.webkit&&!r)return{height:0,width:0};if(!n.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};n.data.inner=l("
").css(l.extend({},o)),n.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(n.data.inner).appendTo("body")}return n.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(n.data.outer.offset().top-n.data.inner.offset().top||0),width:Math.ceil(n.data.outer.offset().left-n.data.inner.offset().left||0)}}function o(r,o){return l(document).on({"blur.scrollbar":function(){l(document).add("body").off(".scrollbar"),r&&r()},"dragstart.scrollbar":function(l){return l.preventDefault(),!1},"mouseup.scrollbar":function(){l(document).add("body").off(".scrollbar"),r&&r()}}),l("body").on({"selectstart.scrollbar":function(l){return l.preventDefault(),!1}}),o&&o.preventDefault(),!1}function e(){var l=r(!0);return!(l.height||l.width)}function s(l){var r=l.originalEvent;return r.axis&&r.axis===r.HORIZONTAL_AXIS?!1:r.wheelDeltaX?!1:!0}var t=!1,i=1,c="px",n={data:{},macosx:-1!==navigator.platform.toLowerCase().indexOf("mac"),mobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/WebKit/.test(navigator.userAgent)},a={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!0,ignoreOverlay:!0,scrollStep:30,showArrows:!1,stepScrolling:!0,type:"simple",scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},d=function(o,s){n.scroll||(n.overlay=e(),n.scroll=r(),f(),l(window).resize(function(){var l=!1;if(n.scroll&&(n.scroll.height||n.scroll.width)){var o=r();(o.height!=n.scroll.height||o.width!=n.scroll.width)&&(n.scroll=o,l=!0)}f(l)})),this.container=o,this.options=l.extend({},a,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},this.init(s)};d.prototype={destroy:function(){if(this.wrapper){var r=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({margin:"","max-height":""}).removeClass("scroll-content").removeClass("scroll-scrollx_visible").removeClass("scroll-scrolly_visible").off(".scrollbar").scrollLeft(r).scrollTop(o),this.scrollx.scrollbar.removeClass("scroll-scrollx_visible").find("div").andSelf().off(".scrollbar"),this.scrolly.scrollbar.removeClass("scroll-scrolly_visible").find("div").andSelf().off(".scrollbar"),this.wrapper.remove(),l(document).add("body").off(".scrollbar"),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},getScrollbar:function(r){var o=this.options["scroll"+r],e={advanced:'
',simple:'
'},s=e[this.options.type]?this.options.type:"advanced";return o=o?"string"==typeof o?l(o).appendTo(this.wrapper):l(o):l("
").addClass("scroll-element").html(e[s]).appendTo(this.wrapper),this.options.showArrows&&o.addClass("scroll-element_arrows_visible"),o.addClass("scroll-"+r)},init:function(r){var e=this,t=this.container,a=this.containerWrapper||t,d=l.extend(this.options,r||{}),f={x:this.scrollx,y:this.scrolly},u=this.wrapper,p={scrollLeft:t.scrollLeft(),scrollTop:t.scrollTop()};if(n.mobile&&d.ignoreMobile||n.overlay&&d.ignoreOverlay||n.macosx&&!n.webkit)return!1;if(u)a.css({"margin-bottom":-1*n.scroll.height+c,"margin-right":-1*n.scroll.width+c,"max-height":""});else{if(this.wrapper=u=l("
").addClass("scroll-wrapper").addClass(t.attr("class")).css("position","absolute"==t.css("position")?"absolute":"relative").insertBefore(t).append(t),t.is("textarea")&&(this.containerWrapper=a=l("
").insertBefore(t).append(t),u.addClass("scroll-textarea")),a.addClass("scroll-content").css({"margin-bottom":-1*n.scroll.height+c,"margin-right":-1*n.scroll.width+c,"max-height":""}),t.on("scroll.scrollbar",function(){l.isFunction(d.onScroll)&&d.onScroll.call(e,{maxScroll:f.y.maxScrollOffset,scroll:t.scrollTop(),size:f.y.size,visible:f.y.visible},{maxScroll:f.x.maxScrollOffset,scroll:t.scrollLeft(),size:f.x.size,visible:f.x.visible}),f.x.isVisible&&f.x.scroller.css("left",t.scrollLeft()*f.x.kx+c),f.y.isVisible&&f.y.scroller.css("top",t.scrollTop()*f.y.kx+c)}),u.on("scroll",function(){u.scrollTop(0).scrollLeft(0)}),d.disableBodyScroll){var h=function(l){s(l)?f.y.isVisible&&f.y.mousewheel(l):f.x.isVisible&&f.x.mousewheel(l)};u.on({"MozMousePixelScroll.scrollbar":h,"mousewheel.scrollbar":h}),n.mobile&&u.on("touchstart.scrollbar",function(r){var o=r.originalEvent.touches&&r.originalEvent.touches[0]||r,e={pageX:o.pageX,pageY:o.pageY},s={left:t.scrollLeft(),top:t.scrollTop()};l(document).on({"touchmove.scrollbar":function(l){var r=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;t.scrollLeft(s.left+e.pageX-r.pageX),t.scrollTop(s.top+e.pageY-r.pageY),l.preventDefault()},"touchend.scrollbar":function(){l(document).off(".scrollbar")}})})}l.isFunction(d.onInit)&&d.onInit.apply(this,[t])}l.each(f,function(r,c){var n=null,a=1,u="x"==r?"scrollLeft":"scrollTop",p=d.scrollStep,h=function(){var l=t[u]();t[u](l+p),1==a&&l+p>=v&&(l=t[u]()),-1==a&&v>=l+p&&(l=t[u]()),t[u]()==l&&n&&n()},v=0;c.scrollbar||(c.scrollbar=e.getScrollbar(r),c.scroller=c.scrollbar.find(".scroll-bar"),c.mousewheel=function(l){if(!c.isVisible||"x"==r&&s(l))return!0;if("y"==r&&!s(l))return f.x.mousewheel(l),!0;var o=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,i=c.size-c.visible-c.offset;return 0>=v&&0>o||v>=i&&o>0||(v+=o,0>v&&(v=0),v>i&&(v=i),e.scrollTo=e.scrollTo||{},e.scrollTo[u]=v,setTimeout(function(){e.scrollTo&&(t.stop().animate(e.scrollTo,240,"linear",function(){v=t[u]()}),e.scrollTo=null)},1)),l.preventDefault(),!1},c.scrollbar.on({"MozMousePixelScroll.scrollbar":c.mousewheel,"mousewheel.scrollbar":c.mousewheel,"mouseenter.scrollbar":function(){v=t[u]()}}),c.scrollbar.find(".scroll-arrow, .scroll-element_track").on("mousedown.scrollbar",function(s){if(s.which!=i)return!0;a=1;var f={eventOffset:s["x"==r?"pageX":"pageY"],maxScrollValue:c.size-c.visible-c.offset,scrollbarOffset:c.scroller.offset()["x"==r?"left":"top"],scrollbarSize:c.scroller["x"==r?"outerWidth":"outerHeight"]()},b=0,g=0;return l(this).hasClass("scroll-arrow")?(a=l(this).hasClass("scroll-arrow_more")?1:-1,p=d.scrollStep*a,v=a>0?f.maxScrollValue:0):(a=f.eventOffset>f.scrollbarOffset+f.scrollbarSize?1:f.eventOffset1,o.isVisible?(o.scrollbar.addClass(e),s.scrollbar.addClass(e),a.addClass(e)):(o.scrollbar.removeClass(e),s.scrollbar.removeClass(e),a.removeClass(e)),"y"==r&&(o.isVisible||o.size=0;)n.scrolls.splice(l.inArray(t,n.scrolls),1)}else"string"!=typeof r&&(t=new d(s,r),s.data("scrollbar",t),n.scrolls.push(t));return!0}),e},l.fn.scrollbar.options=a;var f=function(){var l=0,r=0;return function(o){var e,s,i,c,a,d,u;for(e=0;e10?(window.console&&console.log("Scroll updates exceed 10"),f=function(){}):(clearTimeout(l),l=setTimeout(f,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var r=a;return{setOptions:function(o){l.extend(r,o)},$get:function(){return{options:l.copy(r)}}}}).directive("jqueryScrollbar",function(l,r){return{restrict:"AC",link:function(o,e,s){var t=r(s.jqueryScrollbar),i=t(o);e.scrollbar(i||l.options).on("$destroy",function(){e.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file From 17eaa790c115c4844db2873411078abec872509b Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Wed, 22 Jul 2015 19:47:29 +0500 Subject: [PATCH 07/32] update version to 0.2.8 --- bower.json | 2 +- index.js | 2 +- package.json | 2 +- scrollbar.jquery.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bower.json b/bower.json index 90e48c5..61388ff 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.7", + "version": "0.2.8", "main": [ "./jquery.scrollbar.js", "./jquery.scrollbar.css" diff --git a/index.js b/index.js index 68e57d8..adbe1d9 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,3 @@ require('./jquery.scrollbar'); -module.exports = 'jQueryScrollbar'); +module.exports = 'jQueryScrollbar'; diff --git a/package.json b/package.json index be36cc2..592d713 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.7", + "version": "0.2.8", "description": "Cross-browser CSS customizable scrollbar", "main": "jquery.scrollbar.min.js", "scripts": { diff --git a/scrollbar.jquery.json b/scrollbar.jquery.json index baa4884..1da2dd2 100644 --- a/scrollbar.jquery.json +++ b/scrollbar.jquery.json @@ -6,7 +6,7 @@ "scroll", "scrollbar" ], - "version": "0.2.7", + "version": "0.2.8", "author": { "name": "Yuriy Khabarov", "email": "13real008@gmail.com" From 89ac4da31799f5e025c1a8427d53bfd197bf46bd Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Thu, 23 Jul 2015 18:47:24 +0500 Subject: [PATCH 08/32] fix bug with textarea; js refactoring --- jquery.scrollbar.css | 2 +- jquery.scrollbar.js | 496 ++++++++++++++++++++-------------------- jquery.scrollbar.min.js | 2 +- 3 files changed, 252 insertions(+), 248 deletions(-) diff --git a/jquery.scrollbar.css b/jquery.scrollbar.css index 492c2e3..9f4e5ba 100644 --- a/jquery.scrollbar.css +++ b/jquery.scrollbar.css @@ -9,7 +9,7 @@ .scroll-wrapper > .scroll-content { border: none !important; box-sizing: content-box !important; - height: auto !important; + height: auto; left: 0; margin: 0; max-height: none; diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index eacd382..77a2807 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -11,7 +11,6 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ - ; (function (root, factory) { if (typeof define === 'function' && define.amd) { @@ -24,16 +23,28 @@ // init flags & variables var debug = false; - var lmb = 1, px = "px"; var browser = { - "data": {}, - "macosx": navigator.platform.toLowerCase().indexOf('mac') !== -1, - "mobile": /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent), - "overlay": null, - "scroll": null, - "scrolls": [], - "webkit": /WebKit/.test(navigator.userAgent) + data: { + index: 0, + name: 'scrollbar' + }, + macosx: navigator.platform.toLowerCase().indexOf('mac') !== -1, + mobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent), + overlay: null, + scroll: null, + scrolls: [], + webkit: /WebKit/.test(navigator.userAgent) + }; + + browser.scrolls.add = function (instance) { + this.remove(instance).push(instance); + }; + browser.scrolls.remove = function (instance) { + while ($.inArray(instance, this) >= 0) { + this.splice($.inArray(instance, this), 1); + } + return this; }; var defaults = { @@ -42,12 +53,11 @@ "debug": false, // debug mode "disableBodyScroll": false, // disable body scroll if mouse over container "duration": 200, // scroll animate duration in ms - "ignoreMobile": true, // ignore mobile devices - "ignoreOverlay": true, // ignore browsers with overlay scrollbars (mobile, MacOS) + "ignoreMobile": false, // ignore mobile devices + "ignoreOverlay": false, // ignore browsers with overlay scrollbars (mobile, MacOS) "scrollStep": 30, // scroll step for scrollbar arrows "showArrows": false, // add class to show arrows "stepScrolling": true, // when scrolling to scrollbar mousedown position - "type": "simple", // [advanced|simple] scrollbar html type "scrollx": null, // horizontal scroll element "scrolly": null, // vertical scroll element @@ -59,7 +69,7 @@ }; - var customScrollbar = function (container, options) { + var CustomScrollbar = function (container) { if (!browser.scroll) { browser.overlay = isScrollOverlaysContent(); @@ -70,7 +80,7 @@ var forceUpdate = false; if (browser.scroll && (browser.scroll.height || browser.scroll.width)) { var scroll = getBrowserScrollSize(); - if (scroll.height != browser.scroll.height || scroll.width != browser.scroll.width) { + if (scroll.height !== browser.scroll.height || scroll.width !== browser.scroll.width) { browser.scroll = scroll; forceUpdate = true; // handle page zoom } @@ -80,107 +90,62 @@ } this.container = container; + this.namespace = '.scrollbar_' + browser.data.index++; this.options = $.extend({}, defaults, window.jQueryScrollbarOptions || {}); this.scrollTo = null; this.scrollx = {}; this.scrolly = {}; - this.init(options); + container.data(browser.data.name, this); + browser.scrolls.add(this); }; - customScrollbar.prototype = { + CustomScrollbar.prototype = { + destroy: function () { if (!this.wrapper) { return; } + this.container.removeData(browser.data.name); + browser.scrolls.remove(this); + // init variables var scrollLeft = this.container.scrollLeft(); var scrollTop = this.container.scrollTop(); this.container.insertBefore(this.wrapper).css({ + "height": "", "margin": "", "max-height": "" }) - .removeClass("scroll-content") - .removeClass("scroll-scrollx_visible") - .removeClass("scroll-scrolly_visible") - .off(".scrollbar") + .removeClass('scroll-content scroll-scrollx_visible scroll-scrolly_visible') + .off(this.namespace) .scrollLeft(scrollLeft) .scrollTop(scrollTop); - this.scrollx.scrollbar.removeClass("scroll-scrollx_visible").find("div").andSelf().off(".scrollbar"); - this.scrolly.scrollbar.removeClass("scroll-scrolly_visible").find("div").andSelf().off(".scrollbar"); + this.scrollx.scroll.removeClass('scroll-scrollx_visible').find('div').andSelf().off(this.namespace); + this.scrolly.scroll.removeClass('scroll-scrolly_visible').find('div').andSelf().off(this.namespace); this.wrapper.remove(); - $(document).add("body").off(".scrollbar"); + $(document).add('body').off(this.namespace); - if ($.isFunction(this.options.onDestroy)) + if ($.isFunction(this.options.onDestroy)){ this.options.onDestroy.apply(this, [this.container]); - }, - getScrollbar: function (d) { - - var scrollbar = this.options["scroll" + d]; - var html = { - "advanced": - '
' + - '
' + - '
' + - '
' + - '
' + // required! used for scrollbar size calculation! - '
' + - '
' + // used for handling scrollbar click - '
' + - '
' + - '
' + - '
' + // required - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
', - "simple": - '
' + - '
' + // required! used for scrollbar size calculation! - '
' + // used for handling scrollbar click - '
' + // required - '
' - }; - var type = html[this.options.type] ? this.options.type : "advanced"; - - if (scrollbar) { - if (typeof (scrollbar) == "string") { - scrollbar = $(scrollbar).appendTo(this.wrapper); - } else { - scrollbar = $(scrollbar); - } - } else { - scrollbar = $("
").addClass("scroll-element").html(html[type]).appendTo(this.wrapper); - } - - if (this.options.showArrows) { - scrollbar.addClass("scroll-element_arrows_visible"); } - - return scrollbar.addClass("scroll-" + d); }, init: function (options) { // init variables - var S = this; - - var c = this.container; - var cw = this.containerWrapper || c; - var o = $.extend(this.options, options || {}); - var s = { - "x": this.scrollx, - "y": this.scrolly - }; - var w = this.wrapper; + var S = this, + c = this.container, + cw = this.containerWrapper || c, + namespace = this.namespace, + o = $.extend(this.options, options || {}), + s = {x: this.scrollx, y: this.scrolly}, + w = this.wrapper; var initScroll = { "scrollLeft": c.scrollLeft(), @@ -206,13 +171,14 @@ w.addClass('scroll-textarea'); } - cw.addClass("scroll-content").css({ - "margin-bottom": browser.scroll.height * -1 + px, - "margin-right": browser.scroll.width * -1 + px, + cw.addClass('scroll-content').css({ + "height": "auto", + "margin-bottom": browser.scroll.height * -1 + 'px', + "margin-right": browser.scroll.width * -1 + 'px', "max-height": "" }); - c.on("scroll.scrollbar", function (event) { + c.on('scroll' + namespace, function (event) { if ($.isFunction(o.onScroll)) { o.onScroll.call(S, { "maxScroll": s.y.maxScrollOffset, @@ -226,12 +192,12 @@ "visible": s.x.visible }); } - s.x.isVisible && s.x.scroller.css("left", c.scrollLeft() * s.x.kx + px); - s.y.isVisible && s.y.scroller.css("top", c.scrollTop() * s.y.kx + px); + s.x.isVisible && s.x.scroll.bar.css('left', c.scrollLeft() * s.x.kx + 'px'); + s.y.isVisible && s.y.scroll.bar.css('top', c.scrollTop() * s.y.kx + 'px'); }); /* prevent native scrollbars to be visible on #anchor click */ - w.on("scroll", function () { + w.on('scroll' + namespace, function () { w.scrollTop(0).scrollLeft(0); }); @@ -241,13 +207,11 @@ s.y.isVisible && s.y.mousewheel(event) : s.x.isVisible && s.x.mousewheel(event); }; - w.on({ - "MozMousePixelScroll.scrollbar": handleMouseScroll, - "mousewheel.scrollbar": handleMouseScroll - }); + w.on('MozMousePixelScroll' + namespace, handleMouseScroll); + w.on('mousewheel' + namespace, handleMouseScroll); if (browser.mobile) { - w.on("touchstart.scrollbar", function (event) { + w.on('touchstart' + namespace, function (event) { var touch = event.originalEvent.touches && event.originalEvent.touches[0] || event; var originalTouch = { "pageX": touch.pageX, @@ -257,26 +221,26 @@ "left": c.scrollLeft(), "top": c.scrollTop() }; - $(document).on({ - "touchmove.scrollbar": function (event) { - var touch = event.originalEvent.targetTouches && event.originalEvent.targetTouches[0] || event; - c.scrollLeft(originalScroll.left + originalTouch.pageX - touch.pageX); - c.scrollTop(originalScroll.top + originalTouch.pageY - touch.pageY); - event.preventDefault(); - }, - "touchend.scrollbar": function () { - $(document).off(".scrollbar"); - } + $(document).on('touchmove' + namespace, function (event) { + var touch = event.originalEvent.targetTouches && event.originalEvent.targetTouches[0] || event; + c.scrollLeft(originalScroll.left + originalTouch.pageX - touch.pageX); + c.scrollTop(originalScroll.top + originalTouch.pageY - touch.pageY); + event.preventDefault(); + }); + $(document).on('touchend' + namespace, function () { + $(document).off(namespace); }); }); } } - if ($.isFunction(o.onInit)) + if ($.isFunction(o.onInit)){ o.onInit.apply(this, [c]); + } } else { cw.css({ - "margin-bottom": browser.scroll.height * -1 + px, - "margin-right": browser.scroll.width * -1 + px, + "height": "auto", + "margin-bottom": browser.scroll.height * -1 + 'px', + "margin-right": browser.scroll.width * -1 + 'px', "max-height": "" }); } @@ -286,7 +250,7 @@ var scrollCallback = null; var scrollForward = 1; - var scrollOffset = (d == "x") ? "scrollLeft" : "scrollTop"; + var scrollOffset = (d === 'x') ? 'scrollLeft' : 'scrollTop'; var scrollStep = o.scrollStep; var scrollTo = function () { var currentOffset = c[scrollOffset](); @@ -301,17 +265,20 @@ } var scrollToValue = 0; - if (!scrollx.scrollbar) { + if (!scrollx.scroll) { + + scrollx.scroll = S._getScroll(o['scroll' + d]).addClass('scroll-' + d); - scrollx.scrollbar = S.getScrollbar(d); - scrollx.scroller = scrollx.scrollbar.find(".scroll-bar"); + if(o.showArrows){ + scrollx.scroll.addClass('scroll-element_arrows_visible'); + } scrollx.mousewheel = function (event) { - if (!scrollx.isVisible || (d == 'x' && isVerticalScroll(event))) { + if (!scrollx.isVisible || (d === 'x' && isVerticalScroll(event))) { return true; } - if (d == 'y' && !isVerticalScroll(event)) { + if (d === 'y' && !isVerticalScroll(event)) { s.x.mousewheel(event); return true; } @@ -319,7 +286,7 @@ var delta = event.originalEvent.wheelDelta * -1 || event.originalEvent.detail; var maxScrollValue = scrollx.size - scrollx.visible - scrollx.offset; - if (!((scrollToValue <= 0 && delta < 0) || (scrollToValue >= maxScrollValue && delta > 0))) { + if ((delta > 0 && scrollToValue < maxScrollValue) || (delta < 0 && scrollToValue > 0)) { scrollToValue = scrollToValue + delta; if (scrollToValue < 0) scrollToValue = 0; @@ -342,28 +309,27 @@ return false; }; - scrollx.scrollbar.on({ - "MozMousePixelScroll.scrollbar": scrollx.mousewheel, - "mousewheel.scrollbar": scrollx.mousewheel, - "mouseenter.scrollbar": function () { + scrollx.scroll + .on('MozMousePixelScroll' + namespace, scrollx.mousewheel) + .on('mousewheel' + namespace, scrollx.mousewheel) + .on('mouseenter' + namespace, function () { scrollToValue = c[scrollOffset](); - } - }); + }); // handle arrows & scroll inner mousedown event - scrollx.scrollbar.find(".scroll-arrow, .scroll-element_track") - .on("mousedown.scrollbar", function (event) { + scrollx.scroll.find('.scroll-arrow, .scroll-element_track') + .on('mousedown' + namespace, function (event) { - if (event.which != lmb) + if (event.which != 1) // lmb return true; scrollForward = 1; var data = { - "eventOffset": event[(d == "x") ? "pageX" : "pageY"], + "eventOffset": event[(d === 'x') ? 'pageX' : 'pageY'], "maxScrollValue": scrollx.size - scrollx.visible - scrollx.offset, - "scrollbarOffset": scrollx.scroller.offset()[(d == "x") ? "left" : "top"], - "scrollbarSize": scrollx.scroller[(d == "x") ? "outerWidth" : "outerHeight"]() + "scrollbarOffset": scrollx.scroll.bar.offset()[(d === 'x') ? 'left' : 'top'], + "scrollbarSize": scrollx.scroll.bar[(d === 'x') ? 'outerWidth' : 'outerHeight']() }; var timeout = 0, timer = 0; @@ -404,27 +370,27 @@ } }, 1); - return handleMouseDown(scrollCallback, event); + return S._handleMouseDown(scrollCallback, event); }); // handle scrollbar drag'n'drop - scrollx.scroller.on("mousedown.scrollbar", function (event) { + scrollx.scroll.bar.on('mousedown' + namespace, function (event) { - if (event.which != lmb) + if (event.which != 1) // lmb return true; - var eventPosition = event[(d == "x") ? "pageX" : "pageY"]; + var eventPosition = event[(d === 'x') ? 'pageX' : 'pageY']; var initOffset = c[scrollOffset](); - scrollx.scrollbar.addClass("scroll-draggable"); + scrollx.scroll.addClass('scroll-draggable'); - $(document).on("mousemove.scrollbar", function (event) { - var diff = parseInt((event[(d == "x") ? "pageX" : "pageY"] - eventPosition) / scrollx.kx, 10); + $(document).on('mousemove' + namespace, function (event) { + var diff = parseInt((event[(d === 'x') ? 'pageX' : 'pageY'] - eventPosition) / scrollx.kx, 10); c[scrollOffset](initOffset + diff); }); - return handleMouseDown(function () { - scrollx.scrollbar.removeClass("scroll-draggable"); + return S._handleMouseDown(function () { + scrollx.scroll.removeClass('scroll-draggable'); scrollToValue = c[scrollOffset](); }, event); }); @@ -433,23 +399,23 @@ // remove classes & reset applied styles $.each(s, function (d, scrollx) { - var scrollClass = "scroll-scroll" + d + "_visible"; + var scrollClass = 'scroll-scroll' + d + '_visible'; var scrolly = (d == "x") ? s.y : s.x; - scrollx.scrollbar.removeClass(scrollClass); - scrolly.scrollbar.removeClass(scrollClass); + scrollx.scroll.removeClass(scrollClass); + scrolly.scroll.removeClass(scrollClass); cw.removeClass(scrollClass); }); // calculate init sizes $.each(s, function (d, scrollx) { $.extend(scrollx, (d == "x") ? { - "offset": parseInt(c.css("left"), 10) || 0, - "size": c.prop("scrollWidth"), + "offset": parseInt(c.css('left'), 10) || 0, + "size": c.prop('scrollWidth'), "visible": w.width() } : { - "offset": parseInt(c.css("top"), 10) || 0, - "size": c.prop("scrollHeight"), + "offset": parseInt(c.css('top'), 10) || 0, + "size": c.prop('scrollHeight'), "visible": w.height() }); }); @@ -457,47 +423,48 @@ var updateScroll = function (d, scrollx) { - var scrollClass = "scroll-scroll" + d + "_visible"; - var scrolly = (d == "x") ? s.y : s.x; - var offset = parseInt(c.css((d == "x") ? "left" : "top"), 10) || 0; + var scrollClass = 'scroll-scroll' + d + '_visible'; + var scrolly = (d === 'x') ? s.y : s.x; + var offset = parseInt(c.css((d === 'x') ? 'left' : 'top'), 10) || 0; var AreaSize = scrollx.size; var AreaVisible = scrollx.visible + offset; scrollx.isVisible = (AreaSize - AreaVisible) > 1; // bug in IE9/11 with 1px diff if (scrollx.isVisible) { - scrollx.scrollbar.addClass(scrollClass); - scrolly.scrollbar.addClass(scrollClass); + scrollx.scroll.addClass(scrollClass); + scrolly.scroll.addClass(scrollClass); cw.addClass(scrollClass); } else { - scrollx.scrollbar.removeClass(scrollClass); - scrolly.scrollbar.removeClass(scrollClass); + scrollx.scroll.removeClass(scrollClass); + scrolly.scroll.removeClass(scrollClass); cw.removeClass(scrollClass); } - if (d == "y" && (scrollx.isVisible || scrollx.size < scrollx.visible)) { - cw.css("max-height", (AreaVisible + browser.scroll.height) + px); + if (d === 'y' && (scrollx.isVisible || scrollx.size < scrollx.visible)) { + cw.css('max-height', (AreaVisible + browser.scroll.height) + 'px'); + c.is('textarea') && cw.css('height', cw.css('max-height')); } - if (s.x.size != c.prop("scrollWidth") - || s.y.size != c.prop("scrollHeight") + if (s.x.size != c.prop('scrollWidth') + || s.y.size != c.prop('scrollHeight') || s.x.visible != w.width() || s.y.visible != w.height() - || s.x.offset != (parseInt(c.css("left"), 10) || 0) - || s.y.offset != (parseInt(c.css("top"), 10) || 0) + || s.x.offset != (parseInt(c.css('left'), 10) || 0) + || s.y.offset != (parseInt(c.css('top'), 10) || 0) ) { $.each(s, function (d, scrollx) { - $.extend(scrollx, (d == "x") ? { - "offset": parseInt(c.css("left"), 10) || 0, - "size": c.prop("scrollWidth"), + $.extend(scrollx, (d === 'x') ? { + "offset": parseInt(c.css('left'), 10) || 0, + "size": c.prop('scrollWidth'), "visible": w.width() } : { - "offset": parseInt(c.css("top"), 10) || 0, - "size": c.prop("scrollHeight"), + "offset": parseInt(c.css('top'), 10) || 0, + "size": c.prop('scrollHeight'), "visible": w.height() }); }); - updateScroll(d == "x" ? "y" : "x", scrolly); + updateScroll(d === 'x' ? 'y' : 'x', scrolly); } }; $.each(s, updateScroll); @@ -508,79 +475,145 @@ // calculate scroll size $.each(s, function (d, scrollx) { - var cssOffset = (d == "x") ? "left" : "top"; - var cssFullSize = (d == "x") ? "outerWidth" : "outerHeight"; - var cssSize = (d == "x") ? "width" : "height"; + var cssOffset = (d === 'x') ? 'left' : 'top'; + var cssFullSize = (d === 'x') ? 'outerWidth' : 'outerHeight'; + var cssSize = (d === 'x') ? 'width' : 'height'; var offset = parseInt(c.css(cssOffset), 10) || 0; var AreaSize = scrollx.size; var AreaVisible = scrollx.visible + offset; - var scrollSize = scrollx.scrollbar.find(".scroll-element_size"); - scrollSize = scrollSize[cssFullSize]() + (parseInt(scrollSize.css(cssOffset), 10) || 0); + var scrollSize = scrollx.scroll.size[cssFullSize]() + (parseInt(scrollx.scroll.size.css(cssOffset), 10) || 0); if (o.autoScrollSize) { scrollx.scrollbarSize = parseInt(scrollSize * AreaVisible / AreaSize, 10); - scrollx.scroller.css(cssSize, scrollx.scrollbarSize + px); + scrollx.scroll.bar.css(cssSize, scrollx.scrollbarSize + 'px'); } - scrollx.scrollbarSize = scrollx.scroller[cssFullSize](); + scrollx.scrollbarSize = scrollx.scroll.bar[cssFullSize](); scrollx.kx = ((scrollSize - scrollx.scrollbarSize) / (AreaSize - AreaVisible)) || 1; scrollx.maxScrollOffset = AreaSize - AreaVisible; }); - c.scrollLeft(initScroll.scrollLeft).scrollTop(initScroll.scrollTop).trigger("scroll"); + c.scrollLeft(initScroll.scrollLeft).scrollTop(initScroll.scrollTop).trigger('scroll'); + }, + + /** + * Get scrollx/scrolly object + * + * @param {Mixed} scroll + * @returns {jQuery} scroll object + */ + _getScroll: function (scroll) { + var types = { + advanced: [ + '
', + '
', + '
', + '
', + '
', + '
', // required! used for scrollbar size calculation ! + '
', + '
', // used for handling scrollbar click + '
', + '
', + '
', + '
', // required + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
' + ].join(''), + simple: [ + '
', + '
', + '
', // required! used for scrollbar size calculation ! + '
', // used for handling scrollbar click + '
', // required + '
', + '
' + ].join('') + }; + if (types[scroll]) { + scroll = types[scroll]; + } + if (!scroll) { + scroll = types['simple']; + } + if (typeof (scroll) == 'string') { + scroll = $(scroll).appendTo(this.wrapper); + } else { + scroll = $(scroll); + } + $.extend(scroll, { + bar: scroll.find('.scroll-bar'), + size: scroll.find('.scroll-element_size'), + track: scroll.find('.scroll-element_track') + }); + return scroll; + }, + + _handleMouseDown: function(callback, event) { + + var namespace = this.namespace; + + $(document).on('blur' + namespace, function () { + $(document).add('body').off(namespace); + callback && callback(); + }); + $(document).on('dragstart' + namespace, function (event) { + event.preventDefault(); + return false; + }); + $(document).on('mouseup' + namespace, function () { + $(document).add('body').off(namespace); + callback && callback(); + }); + $('body').on('selectstart' + namespace, function (event) { + event.preventDefault(); + return false; + }); + + event && event.preventDefault(); + return false; } }; /* * Extend jQuery as plugin * - * @param {object|string} options or command to execute - * @param {object|array} args additional arguments as array [] + * @param {Mixed} command to execute + * @param {Mixed} arguments as Array + * @return {jQuery} */ - $.fn.scrollbar = function (options, args) { - - var toReturn = this; - - if (options === "get") - toReturn = null; - - this.each(function () { - - var container = $(this); - - if (container.hasClass("scroll-wrapper") - || container.get(0).nodeName == "body") { - return true; - } - - var instance = container.data("scrollbar"); - if (instance) { - if (options === "get") { - toReturn = instance; - return false; - } - - var func = (typeof options == "string" && instance[options]) ? options : "init"; - instance[func].apply(instance, $.isArray(args) ? args : []); - - if (options === "destroy") { - container.removeData("scrollbar"); - while ($.inArray(instance, browser.scrolls) >= 0) - browser.scrolls.splice($.inArray(instance, browser.scrolls), 1); + $.fn.scrollbar = function (command, args) { + if (typeof command !== 'string') { + args = command; + command = 'init'; + } + if (typeof args === 'undefined') { + args = []; + } + if (!$.isArray(args)) { + args = [args]; + } + this.not('body, .scroll-wrapper').each(function () { + var element = $(this), + instance = element.data(browser.data.name); + if (instance || command === 'init') { + if (!instance) { + instance = new CustomScrollbar(element); } - } else { - if (typeof options != "string") { - instance = new customScrollbar(container, options); - container.data("scrollbar", instance); - browser.scrolls.push(instance); + if (instance[command]) { + instance[command].apply(instance, args); } } - return true; }); - - return toReturn; + return this; }; /** @@ -606,25 +639,24 @@ wrapper = scroll.wrapper; scrollx = scroll.scrollx; scrolly = scroll.scrolly; - if (force || (options.autoUpdate && wrapper && wrapper.is(":visible") && - (container.prop("scrollWidth") != scrollx.size || container.prop("scrollHeight") != scrolly.size || wrapper.width() != scrollx.visible || wrapper.height() != scrolly.visible))) { + if (force || (options.autoUpdate && wrapper && wrapper.is(':visible') && + (container.prop('scrollWidth') != scrollx.size || container.prop('scrollHeight') != scrolly.size || wrapper.width() != scrollx.visible || wrapper.height() != scrolly.visible))) { scroll.init(); - if (debug) { + if (options.debug) { window.console && console.log({ - "scrollHeight": container.prop("scrollHeight") + ":" + scroll.scrolly.size, - "scrollWidth": container.prop("scrollWidth") + ":" + scroll.scrollx.size, - "visibleHeight": wrapper.height() + ":" + scroll.scrolly.visible, - "visibleWidth": wrapper.width() + ":" + scroll.scrollx.visible + scrollHeight: container.prop('scrollHeight') + ':' + scroll.scrolly.size, + scrollWidth: container.prop('scrollWidth') + ':' + scroll.scrollx.size, + visibleHeight: wrapper.height() + ':' + scroll.scrolly.visible, + visibleWidth: wrapper.width() + ':' + scroll.scrollx.visible }, true); timerCounter++; } } } if (debug && timerCounter > 10) { - window.console && console.log("Scroll updates exceed 10"); - updateScrollbars = function () { - }; + window.console && console.log('Scroll updates exceed 10'); + updateScrollbars = function () {}; } else { clearTimeout(timer); timer = setTimeout(updateScrollbars, 300); @@ -674,31 +706,6 @@ }; } - function handleMouseDown(callback, event) { - $(document).on({ - "blur.scrollbar": function () { - $(document).add('body').off('.scrollbar'); - callback && callback(); - }, - "dragstart.scrollbar": function (event) { - event.preventDefault(); - return false; - }, - "mouseup.scrollbar": function () { - $(document).add('body').off('.scrollbar'); - callback && callback(); - } - }); - $("body").on({ - "selectstart.scrollbar": function (event) { - event.preventDefault(); - return false; - } - }); - event && event.preventDefault(); - return false; - } - /** * Check if native browser scrollbars overlay content * @@ -729,7 +736,6 @@ angular.module('jQueryScrollbar', []) .provider('jQueryScrollbar', function () { var defaultOptions = defaults; - return { setOptions: function (options) { angular.extend(defaultOptions, options); @@ -745,10 +751,8 @@ return { "restrict": "AC", "link": function (scope, element, attrs) { - var model = $parse(attrs.jqueryScrollbar), options = model(scope); - element.scrollbar(options || jQueryScrollbar.options) .on('$destroy', function () { element.scrollbar('destroy'); diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 134bdb4..552f6ff 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -13,4 +13,4 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(l,r){"function"==typeof define&&define.amd?define(["jquery"],r):r(l.jQuery)}(this,function(l){"use strict";function r(r){if(n.webkit&&!r)return{height:0,width:0};if(!n.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};n.data.inner=l("
").css(l.extend({},o)),n.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(n.data.inner).appendTo("body")}return n.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(n.data.outer.offset().top-n.data.inner.offset().top||0),width:Math.ceil(n.data.outer.offset().left-n.data.inner.offset().left||0)}}function o(r,o){return l(document).on({"blur.scrollbar":function(){l(document).add("body").off(".scrollbar"),r&&r()},"dragstart.scrollbar":function(l){return l.preventDefault(),!1},"mouseup.scrollbar":function(){l(document).add("body").off(".scrollbar"),r&&r()}}),l("body").on({"selectstart.scrollbar":function(l){return l.preventDefault(),!1}}),o&&o.preventDefault(),!1}function e(){var l=r(!0);return!(l.height||l.width)}function s(l){var r=l.originalEvent;return r.axis&&r.axis===r.HORIZONTAL_AXIS?!1:r.wheelDeltaX?!1:!0}var t=!1,i=1,c="px",n={data:{},macosx:-1!==navigator.platform.toLowerCase().indexOf("mac"),mobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/WebKit/.test(navigator.userAgent)},a={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!0,ignoreOverlay:!0,scrollStep:30,showArrows:!1,stepScrolling:!0,type:"simple",scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},d=function(o,s){n.scroll||(n.overlay=e(),n.scroll=r(),f(),l(window).resize(function(){var l=!1;if(n.scroll&&(n.scroll.height||n.scroll.width)){var o=r();(o.height!=n.scroll.height||o.width!=n.scroll.width)&&(n.scroll=o,l=!0)}f(l)})),this.container=o,this.options=l.extend({},a,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},this.init(s)};d.prototype={destroy:function(){if(this.wrapper){var r=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({margin:"","max-height":""}).removeClass("scroll-content").removeClass("scroll-scrollx_visible").removeClass("scroll-scrolly_visible").off(".scrollbar").scrollLeft(r).scrollTop(o),this.scrollx.scrollbar.removeClass("scroll-scrollx_visible").find("div").andSelf().off(".scrollbar"),this.scrolly.scrollbar.removeClass("scroll-scrolly_visible").find("div").andSelf().off(".scrollbar"),this.wrapper.remove(),l(document).add("body").off(".scrollbar"),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},getScrollbar:function(r){var o=this.options["scroll"+r],e={advanced:'
',simple:'
'},s=e[this.options.type]?this.options.type:"advanced";return o=o?"string"==typeof o?l(o).appendTo(this.wrapper):l(o):l("
").addClass("scroll-element").html(e[s]).appendTo(this.wrapper),this.options.showArrows&&o.addClass("scroll-element_arrows_visible"),o.addClass("scroll-"+r)},init:function(r){var e=this,t=this.container,a=this.containerWrapper||t,d=l.extend(this.options,r||{}),f={x:this.scrollx,y:this.scrolly},u=this.wrapper,p={scrollLeft:t.scrollLeft(),scrollTop:t.scrollTop()};if(n.mobile&&d.ignoreMobile||n.overlay&&d.ignoreOverlay||n.macosx&&!n.webkit)return!1;if(u)a.css({"margin-bottom":-1*n.scroll.height+c,"margin-right":-1*n.scroll.width+c,"max-height":""});else{if(this.wrapper=u=l("
").addClass("scroll-wrapper").addClass(t.attr("class")).css("position","absolute"==t.css("position")?"absolute":"relative").insertBefore(t).append(t),t.is("textarea")&&(this.containerWrapper=a=l("
").insertBefore(t).append(t),u.addClass("scroll-textarea")),a.addClass("scroll-content").css({"margin-bottom":-1*n.scroll.height+c,"margin-right":-1*n.scroll.width+c,"max-height":""}),t.on("scroll.scrollbar",function(){l.isFunction(d.onScroll)&&d.onScroll.call(e,{maxScroll:f.y.maxScrollOffset,scroll:t.scrollTop(),size:f.y.size,visible:f.y.visible},{maxScroll:f.x.maxScrollOffset,scroll:t.scrollLeft(),size:f.x.size,visible:f.x.visible}),f.x.isVisible&&f.x.scroller.css("left",t.scrollLeft()*f.x.kx+c),f.y.isVisible&&f.y.scroller.css("top",t.scrollTop()*f.y.kx+c)}),u.on("scroll",function(){u.scrollTop(0).scrollLeft(0)}),d.disableBodyScroll){var h=function(l){s(l)?f.y.isVisible&&f.y.mousewheel(l):f.x.isVisible&&f.x.mousewheel(l)};u.on({"MozMousePixelScroll.scrollbar":h,"mousewheel.scrollbar":h}),n.mobile&&u.on("touchstart.scrollbar",function(r){var o=r.originalEvent.touches&&r.originalEvent.touches[0]||r,e={pageX:o.pageX,pageY:o.pageY},s={left:t.scrollLeft(),top:t.scrollTop()};l(document).on({"touchmove.scrollbar":function(l){var r=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;t.scrollLeft(s.left+e.pageX-r.pageX),t.scrollTop(s.top+e.pageY-r.pageY),l.preventDefault()},"touchend.scrollbar":function(){l(document).off(".scrollbar")}})})}l.isFunction(d.onInit)&&d.onInit.apply(this,[t])}l.each(f,function(r,c){var n=null,a=1,u="x"==r?"scrollLeft":"scrollTop",p=d.scrollStep,h=function(){var l=t[u]();t[u](l+p),1==a&&l+p>=v&&(l=t[u]()),-1==a&&v>=l+p&&(l=t[u]()),t[u]()==l&&n&&n()},v=0;c.scrollbar||(c.scrollbar=e.getScrollbar(r),c.scroller=c.scrollbar.find(".scroll-bar"),c.mousewheel=function(l){if(!c.isVisible||"x"==r&&s(l))return!0;if("y"==r&&!s(l))return f.x.mousewheel(l),!0;var o=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,i=c.size-c.visible-c.offset;return 0>=v&&0>o||v>=i&&o>0||(v+=o,0>v&&(v=0),v>i&&(v=i),e.scrollTo=e.scrollTo||{},e.scrollTo[u]=v,setTimeout(function(){e.scrollTo&&(t.stop().animate(e.scrollTo,240,"linear",function(){v=t[u]()}),e.scrollTo=null)},1)),l.preventDefault(),!1},c.scrollbar.on({"MozMousePixelScroll.scrollbar":c.mousewheel,"mousewheel.scrollbar":c.mousewheel,"mouseenter.scrollbar":function(){v=t[u]()}}),c.scrollbar.find(".scroll-arrow, .scroll-element_track").on("mousedown.scrollbar",function(s){if(s.which!=i)return!0;a=1;var f={eventOffset:s["x"==r?"pageX":"pageY"],maxScrollValue:c.size-c.visible-c.offset,scrollbarOffset:c.scroller.offset()["x"==r?"left":"top"],scrollbarSize:c.scroller["x"==r?"outerWidth":"outerHeight"]()},b=0,g=0;return l(this).hasClass("scroll-arrow")?(a=l(this).hasClass("scroll-arrow_more")?1:-1,p=d.scrollStep*a,v=a>0?f.maxScrollValue:0):(a=f.eventOffset>f.scrollbarOffset+f.scrollbarSize?1:f.eventOffset1,o.isVisible?(o.scrollbar.addClass(e),s.scrollbar.addClass(e),a.addClass(e)):(o.scrollbar.removeClass(e),s.scrollbar.removeClass(e),a.removeClass(e)),"y"==r&&(o.isVisible||o.size=0;)n.scrolls.splice(l.inArray(t,n.scrolls),1)}else"string"!=typeof r&&(t=new d(s,r),s.data("scrollbar",t),n.scrolls.push(t));return!0}),e},l.fn.scrollbar.options=a;var f=function(){var l=0,r=0;return function(o){var e,s,i,c,a,d,u;for(e=0;e10?(window.console&&console.log("Scroll updates exceed 10"),f=function(){}):(clearTimeout(l),l=setTimeout(f,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var r=a;return{setOptions:function(o){l.extend(r,o)},$get:function(){return{options:l.copy(r)}}}}).directive("jqueryScrollbar",function(l,r){return{restrict:"AC",link:function(o,e,s){var t=r(s.jqueryScrollbar),i=t(o);e.scrollbar(i||l.options).on("$destroy",function(){e.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file +!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
").css(l.extend({},o)),t.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:-1!==navigator.platform.toLowerCase().indexOf("mac"),mobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/WebKit/.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),c(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}c(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,u={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"==r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var f=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,f),d.on("mousewheel"+n,f),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,u="x"===e?"scrollLeft":"scrollTop",f=c.scrollStep,h=function(){var l=r[u]();r[u](l+f),1==d&&l+f>=p&&(l=r[u]()),-1==d&&p>=l+f&&(l=r[u]()),r[u]()==l&&i&&i()},p=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>p||0>i&&p>0)&&(p+=i,0>p&&(p=0),p>n&&(p=n),o.scrollTo=o.scrollTo||{},o.scrollTo[u]=p,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){p=r[u]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){p=r[u]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,f=c.scrollStep*d,p=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset1,o.isVisible?(o.scroll.addClass(s),n.scroll.addClass(s),i.addClass(s)):(o.scroll.removeClass(s),n.scroll.removeClass(s),i.removeClass(s)),"y"===e&&(o.isVisible||o.size','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1}},l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new n(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var c=function(){var l=0,e=0;return function(o){var s,i,n,a,d,u,f;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),c=function(){}):(clearTimeout(l),l=setTimeout(c,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file From 11ab30f7ab202e7704ad5df9b72f942ca66167b6 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Fri, 24 Jul 2015 12:28:56 +0500 Subject: [PATCH 09/32] add note about changes in CSS --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 3c88d05..44c0da5 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,6 @@ Cross-browser CSS customizable scrollbar with advanced features:

Documentation

Download

+ +Please note that CSS was updated in version 0.2.8. +Please update section /*************** SCROLLBAR BASE CSS ***************/ in your CSS file. From 8f0213bee00118acd92caa855383906c03d24f15 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Fri, 24 Jul 2015 15:52:55 +0500 Subject: [PATCH 10/32] fix bug with visible native scrollbar when height:100% --- jquery.scrollbar.js | 118 +++++++++++++++++++++++----------------- jquery.scrollbar.min.js | 2 +- 2 files changed, 68 insertions(+), 52 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 77a2807..c97419a 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -69,7 +69,7 @@ }; - var CustomScrollbar = function (container) { + var BaseScrollbar = function (container) { if (!browser.scroll) { browser.overlay = isScrollOverlaysContent(); @@ -100,7 +100,7 @@ browser.scrolls.add(this); }; - CustomScrollbar.prototype = { + BaseScrollbar.prototype = { destroy: function () { @@ -420,57 +420,13 @@ }); }); + // update scrollbar visibility/dimensions + this._updateScroll('x', this.scrollx); + this._updateScroll('y', this.scrolly); - var updateScroll = function (d, scrollx) { - - var scrollClass = 'scroll-scroll' + d + '_visible'; - var scrolly = (d === 'x') ? s.y : s.x; - var offset = parseInt(c.css((d === 'x') ? 'left' : 'top'), 10) || 0; - - var AreaSize = scrollx.size; - var AreaVisible = scrollx.visible + offset; - - scrollx.isVisible = (AreaSize - AreaVisible) > 1; // bug in IE9/11 with 1px diff - if (scrollx.isVisible) { - scrollx.scroll.addClass(scrollClass); - scrolly.scroll.addClass(scrollClass); - cw.addClass(scrollClass); - } else { - scrollx.scroll.removeClass(scrollClass); - scrolly.scroll.removeClass(scrollClass); - cw.removeClass(scrollClass); - } - - if (d === 'y' && (scrollx.isVisible || scrollx.size < scrollx.visible)) { - cw.css('max-height', (AreaVisible + browser.scroll.height) + 'px'); - c.is('textarea') && cw.css('height', cw.css('max-height')); - } - - if (s.x.size != c.prop('scrollWidth') - || s.y.size != c.prop('scrollHeight') - || s.x.visible != w.width() - || s.y.visible != w.height() - || s.x.offset != (parseInt(c.css('left'), 10) || 0) - || s.y.offset != (parseInt(c.css('top'), 10) || 0) - ) { - $.each(s, function (d, scrollx) { - $.extend(scrollx, (d === 'x') ? { - "offset": parseInt(c.css('left'), 10) || 0, - "size": c.prop('scrollWidth'), - "visible": w.width() - } : { - "offset": parseInt(c.css('top'), 10) || 0, - "size": c.prop('scrollHeight'), - "visible": w.height() - }); - }); - updateScroll(d === 'x' ? 'y' : 'x', scrolly); - } - }; - $.each(s, updateScroll); - - if ($.isFunction(o.onUpdate)) + if ($.isFunction(o.onUpdate)){ o.onUpdate.apply(this, [c]); + } // calculate scroll size $.each(s, function (d, scrollx) { @@ -580,9 +536,69 @@ event && event.preventDefault(); return false; + }, + + _updateScroll: function (d, scrollx) { + + var container = this.container, + containerWrapper = this.containerWrapper || container, + scrollClass = 'scroll-scroll' + d + '_visible', + scrolly = (d === 'x') ? this.scrolly : this.scrollx, + offset = parseInt(this.container.css((d === 'x') ? 'left' : 'top'), 10) || 0, + wrapper = this.wrapper; + + var AreaSize = scrollx.size; + var AreaVisible = scrollx.visible + offset; + + scrollx.isVisible = (AreaSize - AreaVisible) > 1; // bug in IE9/11 with 1px diff + if (scrollx.isVisible) { + scrollx.scroll.addClass(scrollClass); + scrolly.scroll.addClass(scrollClass); + containerWrapper.addClass(scrollClass); + } else { + scrollx.scroll.removeClass(scrollClass); + scrolly.scroll.removeClass(scrollClass); + containerWrapper.removeClass(scrollClass); + } + + if (d === 'y') { + if(container.is('textarea') || AreaSize < AreaVisible){ + containerWrapper.css({ + "height": (AreaVisible + browser.scroll.height) + 'px', + "max-height": "none" + }); + } else { + containerWrapper.css({ + //"height": "auto", // do not reset height value: issue with height:100%! + "max-height": (AreaVisible + browser.scroll.height) + 'px' + }); + } + } + + if (scrollx.size != container.prop('scrollWidth') + || scrolly.size != container.prop('scrollHeight') + || scrollx.visible != wrapper.width() + || scrolly.visible != wrapper.height() + || scrollx.offset != (parseInt(container.css('left'), 10) || 0) + || scrolly.offset != (parseInt(container.css('top'), 10) || 0) + ) { + $.extend(this.scrollx, { + "offset": parseInt(container.css('left'), 10) || 0, + "size": container.prop('scrollWidth'), + "visible": wrapper.width() + }); + $.extend(this.scrolly, { + "offset": parseInt(container.css('top'), 10) || 0, + "size": this.container.prop('scrollHeight'), + "visible": wrapper.height() + }); + this._updateScroll(d === 'x' ? 'y' : 'x', scrolly); + } } }; + var CustomScrollbar = BaseScrollbar; + /* * Extend jQuery as plugin * diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 552f6ff..8b84c15 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -13,4 +13,4 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
").css(l.extend({},o)),t.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:-1!==navigator.platform.toLowerCase().indexOf("mac"),mobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/WebKit/.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),c(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}c(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,u={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"==r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var f=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,f),d.on("mousewheel"+n,f),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,u="x"===e?"scrollLeft":"scrollTop",f=c.scrollStep,h=function(){var l=r[u]();r[u](l+f),1==d&&l+f>=p&&(l=r[u]()),-1==d&&p>=l+f&&(l=r[u]()),r[u]()==l&&i&&i()},p=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>p||0>i&&p>0)&&(p+=i,0>p&&(p=0),p>n&&(p=n),o.scrollTo=o.scrollTo||{},o.scrollTo[u]=p,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){p=r[u]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){p=r[u]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,f=c.scrollStep*d,p=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset1,o.isVisible?(o.scroll.addClass(s),n.scroll.addClass(s),i.addClass(s)):(o.scroll.removeClass(s),n.scroll.removeClass(s),i.removeClass(s)),"y"===e&&(o.isVisible||o.size','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1}},l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new n(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var c=function(){var l=0,e=0;return function(o){var s,i,n,a,d,u,f;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),c=function(){}):(clearTimeout(l),l=setTimeout(c,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file +!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
").css(l.extend({},o)),t.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:-1!==navigator.platform.toLowerCase().indexOf("mac"),mobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/WebKit/.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"==r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var u=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,u),d.on("mousewheel"+n,u),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",u=c.scrollStep,p=function(){var l=r[h]();r[h](l+u),1==d&&l+u>=f&&(l=r[h]()),-1==d&&f>=l+u&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>f||0>i&&f>0)&&(f+=i,0>f&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,u=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&r.css(s.is("textarea")||h>d?{height:h+t.scroll.height+"px","max-height":"none"}:{"max-height":h+t.scroll.height+"px"}),(o.size!=s.prop("scrollWidth")||n.size!=s.prop("scrollHeight")||o.visible!=a.width()||n.visible!=a.height()||o.offset!=(parseInt(s.css("left"),10)||0)||n.offset!=(parseInt(s.css("top"),10)||0))&&(l.extend(this.scrollx,{offset:parseInt(s.css("left"),10)||0,size:s.prop("scrollWidth"),visible:a.width()}),l.extend(this.scrolly,{offset:parseInt(s.css("top"),10)||0,size:this.container.prop("scrollHeight"),visible:a.height()}),this._updateScroll("x"===e?"y":"x",n))}};var c=n;l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new c(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var a=function(){var l=0,e=0;return function(o){var s,i,n,c,d,h,u;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file From 033816379571ab2c112b4f561351ad0752ba34bd Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Mon, 27 Jul 2015 13:37:29 +0500 Subject: [PATCH 11/32] refactore code to 0.3.0 beta --- jquery.scrollbar.js | 469 +++++++++++++++++++++----------------------- 1 file changed, 223 insertions(+), 246 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index c97419a..f4098b4 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -7,7 +7,7 @@ * If you found bug, please contact me via email <13real008@gmail.com> * * @author Yuriy Khabarov aka Gromo - * @version 0.2.8 + * @version 0.3.0 beta * @url https://github.com/gromo/jquery.scrollbar/ * */ @@ -21,20 +21,18 @@ }(this, function ($) { 'use strict'; - // init flags & variables - var debug = false; - var browser = { data: { index: 0, - name: 'scrollbar' + name: 'scrollbar', + updateTimer: 0 }, - macosx: navigator.platform.toLowerCase().indexOf('mac') !== -1, - mobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent), - overlay: null, + isWebkit: /WebKit/.test(navigator.userAgent), + isMac: navigator.platform.toLowerCase().indexOf('mac') !== -1, + isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent), + isOverlay: null, scroll: null, - scrolls: [], - webkit: /WebKit/.test(navigator.userAgent) + scrolls: [] }; browser.scrolls.add = function (instance) { @@ -46,52 +44,49 @@ } return this; }; + browser.scrolls.update = function(force){ + for (var i = 0; i < browser.scrolls.length; i++) { + browser.scrolls[i].update(force); + } + clearTimeout(browser.data.updateTimer); + browser.data.updateTimer = setTimeout(browser.scrolls.update, 300); + }; - var defaults = { - "autoScrollSize": true, // automatically calculate scrollsize - "autoUpdate": true, // update scrollbar if content/container size changed - "debug": false, // debug mode - "disableBodyScroll": false, // disable body scroll if mouse over container - "duration": 200, // scroll animate duration in ms - "ignoreMobile": false, // ignore mobile devices - "ignoreOverlay": false, // ignore browsers with overlay scrollbars (mobile, MacOS) - "scrollStep": 30, // scroll step for scrollbar arrows - "showArrows": false, // add class to show arrows - "stepScrolling": true, // when scrolling to scrollbar mousedown position - - "scrollx": null, // horizontal scroll element - "scrolly": null, // vertical scroll element - - "onDestroy": null, // callback function on destroy, - "onInit": null, // callback function on first initialization - "onScroll": null, // callback function on content scrolling - "onUpdate": null // callback function on init/resize (before scrollbar size calculation) + var defaultOptions = { + autoScrollSize: true, // automatically calculate scrollsize + autoUpdate: true, // update scrollbar if content/container size changed + debug: false, // debug mode + disableBodyScroll: false, // disable body scroll if mouse over container + duration: 200, // scroll animate duration in ms + ignoreMobile: false, // ignore mobile devices + ignoreOverlay: false, // ignore browsers with overlay scrollbars (mobile, MacOS) + scrollStep: 30, // scroll step for scrollbar arrows + showArrows: false, // add class to show arrows + stepScrolling: true, // when scrolling to scrollbar mousedown position + + scrollx: null, // horizontal scroll element + scrolly: null, // vertical scroll element + + onDestroy: null, // callback function on destroy, + onInit: null, // callback function on first initialization + onScroll: null, // callback function on content scrolling + onUpdate: null // callback function on init/resize (before scrollbar size calculation) }; var BaseScrollbar = function (container) { if (!browser.scroll) { - browser.overlay = isScrollOverlaysContent(); - browser.scroll = getBrowserScrollSize(); - updateScrollbars(); - - $(window).resize(function () { - var forceUpdate = false; - if (browser.scroll && (browser.scroll.height || browser.scroll.width)) { - var scroll = getBrowserScrollSize(); - if (scroll.height !== browser.scroll.height || scroll.width !== browser.scroll.width) { - browser.scroll = scroll; - forceUpdate = true; // handle page zoom - } - } - updateScrollbars(forceUpdate); - }); + browser.scroll = this._getBrowserScrollSize(); + browser.isOverlay = (browser.scroll.height === 0 && browser.scroll.width === 0); + browser.scrolls.update(); // run interval check } this.container = container; + this.dimensions = {}; + this.isRtl = container.css('direction') === 'rtl'; this.namespace = '.scrollbar_' + browser.data.index++; - this.options = $.extend({}, defaults, window.jQueryScrollbarOptions || {}); + this.options = $.extend({}, defaultOptions, window.jQueryScrollbarOptions || {}); this.scrollTo = null; this.scrollx = {}; this.scrolly = {}; @@ -108,12 +103,15 @@ return; } + // unregister scroll instance this.container.removeData(browser.data.name); browser.scrolls.remove(this); // init variables - var scrollLeft = this.container.scrollLeft(); - var scrollTop = this.container.scrollTop(); + var currentScroll = { + "left": this.container.scrollLeft(), + "top": this.container.scrollTop() + }; this.container.insertBefore(this.wrapper).css({ "height": "", @@ -122,8 +120,8 @@ }) .removeClass('scroll-content scroll-scrollx_visible scroll-scrolly_visible') .off(this.namespace) - .scrollLeft(scrollLeft) - .scrollTop(scrollTop); + .scrollLeft(currentScroll.left) + .scrollTop(currentScroll.top); this.scrollx.scroll.removeClass('scroll-scrollx_visible').find('div').andSelf().off(this.namespace); this.scrolly.scroll.removeClass('scroll-scrolly_visible').find('div').andSelf().off(this.namespace); @@ -153,9 +151,9 @@ }; // do not init if in ignorable browser - if ((browser.mobile && o.ignoreMobile) - || (browser.overlay && o.ignoreOverlay) - || (browser.macosx && !browser.webkit) // still required to ignore nonWebKit browsers on Mac + if ((browser.isMobile && o.ignoreMobile) + || (browser.isOverlay && o.ignoreOverlay) + || (browser.isMac && !browser.isWebkit) // still required to ignore nonWebKit browsers on Mac ) { return false; } @@ -171,30 +169,23 @@ w.addClass('scroll-textarea'); } - cw.addClass('scroll-content').css({ - "height": "auto", - "margin-bottom": browser.scroll.height * -1 + 'px', - "margin-right": browser.scroll.width * -1 + 'px', - "max-height": "" - }); + cw.addClass('scroll-content'); - c.on('scroll' + namespace, function (event) { - if ($.isFunction(o.onScroll)) { - o.onScroll.call(S, { - "maxScroll": s.y.maxScrollOffset, - "scroll": c.scrollTop(), - "size": s.y.size, - "visible": s.y.visible + c.on('scroll' + namespace, $.proxy(function () { + if ($.isFunction(this.options.onScroll)) { + this.options.onScroll.call(this, { + scroll: this.container.scrollTop(), + size: this.dimensions.scrollHeight, + visible: this.dimensions.visibleHeight }, { - "maxScroll": s.x.maxScrollOffset, - "scroll": c.scrollLeft(), - "size": s.x.size, - "visible": s.x.visible + scroll: this.container.scrollLeft(), + size: this.dimensions.scrollWidth, + visible: this.dimensions.visibleWidth }); } - s.x.isVisible && s.x.scroll.bar.css('left', c.scrollLeft() * s.x.kx + 'px'); - s.y.isVisible && s.y.scroll.bar.css('top', c.scrollTop() * s.y.kx + 'px'); - }); + this.scrollx.isVisible && this.scrollx.scroll.bar.css('left', c.scrollLeft() * this.scrollx.kx + 'px'); + this.scrolly.isVisible && this.scrolly.scroll.bar.css('top', c.scrollTop() * this.scrolly.kx + 'px'); + }, this)); /* prevent native scrollbars to be visible on #anchor click */ w.on('scroll' + namespace, function () { @@ -210,12 +201,12 @@ w.on('MozMousePixelScroll' + namespace, handleMouseScroll); w.on('mousewheel' + namespace, handleMouseScroll); - if (browser.mobile) { + if (browser.isMobile) { w.on('touchstart' + namespace, function (event) { var touch = event.originalEvent.touches && event.originalEvent.touches[0] || event; var originalTouch = { - "pageX": touch.pageX, - "pageY": touch.pageY + pageX: touch.pageX, + pageY: touch.pageY }; var originalScroll = { "left": c.scrollLeft(), @@ -236,15 +227,15 @@ if ($.isFunction(o.onInit)){ o.onInit.apply(this, [c]); } - } else { - cw.css({ - "height": "auto", - "margin-bottom": browser.scroll.height * -1 + 'px', - "margin-right": browser.scroll.width * -1 + 'px', - "max-height": "" - }); } + cw.css({ + "height": "auto", + "margin-bottom": browser.scroll.height * -1 + 'px', + "margin-right": browser.scroll.width * -1 + 'px', + "max-height": "" + }); + // init scrollbars & recalculate sizes $.each(s, function (d, scrollx) { @@ -398,27 +389,10 @@ }); // remove classes & reset applied styles - $.each(s, function (d, scrollx) { - var scrollClass = 'scroll-scroll' + d + '_visible'; - var scrolly = (d == "x") ? s.y : s.x; - - scrollx.scroll.removeClass(scrollClass); - scrolly.scroll.removeClass(scrollClass); - cw.removeClass(scrollClass); - }); + cw.add(this.scrollx.scroll).add(this.scrolly.scroll).removeClass('scroll-scrollx_visible scroll-scrolly_visible'); // calculate init sizes - $.each(s, function (d, scrollx) { - $.extend(scrollx, (d == "x") ? { - "offset": parseInt(c.css('left'), 10) || 0, - "size": c.prop('scrollWidth'), - "visible": w.width() - } : { - "offset": parseInt(c.css('top'), 10) || 0, - "size": c.prop('scrollHeight'), - "visible": w.height() - }); - }); + this.dimensions = this._getDimensions(); // update scrollbar visibility/dimensions this._updateScroll('x', this.scrollx); @@ -429,29 +403,50 @@ } // calculate scroll size - $.each(s, function (d, scrollx) { - - var cssOffset = (d === 'x') ? 'left' : 'top'; - var cssFullSize = (d === 'x') ? 'outerWidth' : 'outerHeight'; - var cssSize = (d === 'x') ? 'width' : 'height'; - var offset = parseInt(c.css(cssOffset), 10) || 0; - - var AreaSize = scrollx.size; - var AreaVisible = scrollx.visible + offset; + this._updateScrollSize('x', this.scrollx); + this._updateScrollSize('y', this.scrolly); - var scrollSize = scrollx.scroll.size[cssFullSize]() + (parseInt(scrollx.scroll.size.css(cssOffset), 10) || 0); + c.scrollLeft(initScroll.scrollLeft).scrollTop(initScroll.scrollTop).trigger('scroll'); + }, - if (o.autoScrollSize) { - scrollx.scrollbarSize = parseInt(scrollSize * AreaVisible / AreaSize, 10); - scrollx.scroll.bar.css(cssSize, scrollx.scrollbarSize + 'px'); - } + update: function(force){ + if (force || (this.options.autoUpdate && this.wrapper && this.wrapper.is(':visible') && this._isChanged())) { + this.init(); + } + }, - scrollx.scrollbarSize = scrollx.scroll.bar[cssFullSize](); - scrollx.kx = ((scrollSize - scrollx.scrollbarSize) / (AreaSize - AreaVisible)) || 1; - scrollx.maxScrollOffset = AreaSize - AreaVisible; - }); + /** + * Calculate browser native scrollbar height/width + * + * @returns {Object} {"height", "width"} + */ + _getBrowserScrollSize: function () { + if (!browser.data.outer) { + browser.data.outer = $('
').prependTo('body') + .attr('style', 'border:none;margin:0;padding:0;height:100px;width:100px;position:absolute;overflow:scroll;left:-1000px;top:-1000px;'); + browser.data.inner = $('
').appendTo(browser.data.outer) + .attr('style', 'border:none;margin:0;padding:0;height:100%;width:100%;position:absolute;'); + } + return { + height: browser.data.outer.height() - browser.data.inner.height(), + width: browser.data.outer.width() - browser.data.inner.width() + }; + }, - c.scrollLeft(initScroll.scrollLeft).scrollTop(initScroll.scrollTop).trigger('scroll'); + /** + * Get element's dimensions: scrollHeight, scrollWidth, visibleHeight, visibleWidth + * + * @returns {Object} element dimensions + */ + _getDimensions: function () { + var element = this.container, + wrapper = this.wrapper; + return { + scrollHeight: element.prop('scrollHeight'), + scrollWidth: element.prop('scrollWidth'), + visibleHeight: wrapper.height() + (parseInt(element.css('top'), 10) || 0), + visibleWidth: wrapper.width() + (parseInt(element.css('left'), 10) || 0) + }; }, /** @@ -538,28 +533,44 @@ return false; }, + /** + * Check if element dimensions were changed + * + update current dimensions + * + * @returns {Boolean} is changed + */ + _isChanged: function () { + var isChanged = false, + newDimensions = this._getDimensions(), + oldDimensions = this.dimensions; + $.each(newDimensions, function (key, newValue) { + if (oldDimensions[key] !== newValue) { + isChanged = true; + return false; + } + }); + this.dimensions = newDimensions; + + if (isChanged && this.options.debug) { + window.console && console.log(this.dimensions); + } + + return isChanged; + }, + _updateScroll: function (d, scrollx) { var container = this.container, containerWrapper = this.containerWrapper || container, scrollClass = 'scroll-scroll' + d + '_visible', scrolly = (d === 'x') ? this.scrolly : this.scrollx, - offset = parseInt(this.container.css((d === 'x') ? 'left' : 'top'), 10) || 0, wrapper = this.wrapper; - var AreaSize = scrollx.size; - var AreaVisible = scrollx.visible + offset; + var AreaSize = this.dimensions[d === 'x' ? 'scrollWidth' : 'scrollHeight'], + AreaVisible = this.dimensions[d === 'x' ? 'visibleWidth' : 'visibleHeight']; scrollx.isVisible = (AreaSize - AreaVisible) > 1; // bug in IE9/11 with 1px diff - if (scrollx.isVisible) { - scrollx.scroll.addClass(scrollClass); - scrolly.scroll.addClass(scrollClass); - containerWrapper.addClass(scrollClass); - } else { - scrollx.scroll.removeClass(scrollClass); - scrolly.scroll.removeClass(scrollClass); - containerWrapper.removeClass(scrollClass); - } + containerWrapper.add(scrollx.scroll).add(scrolly.scroll)[scrollx.isVisible ? 'addClass' : 'removeClass'](scrollClass); if (d === 'y') { if(container.is('textarea') || AreaSize < AreaVisible){ @@ -575,34 +586,94 @@ } } - if (scrollx.size != container.prop('scrollWidth') - || scrolly.size != container.prop('scrollHeight') - || scrollx.visible != wrapper.width() - || scrolly.visible != wrapper.height() - || scrollx.offset != (parseInt(container.css('left'), 10) || 0) - || scrolly.offset != (parseInt(container.css('top'), 10) || 0) - ) { - $.extend(this.scrollx, { - "offset": parseInt(container.css('left'), 10) || 0, - "size": container.prop('scrollWidth'), - "visible": wrapper.width() - }); - $.extend(this.scrolly, { - "offset": parseInt(container.css('top'), 10) || 0, - "size": this.container.prop('scrollHeight'), - "visible": wrapper.height() - }); + if(this._isChanged()){ this._updateScroll(d === 'x' ? 'y' : 'x', scrolly); } + }, + + _updateScrollSize: function (d, scrollx) { + + var cssOffset = (d === 'x') ? 'left' : 'top', + cssFullSize = (d === 'x') ? 'outerWidth' : 'outerHeight', + cssSize = (d === 'x') ? 'width' : 'height'; + + var AreaSize = this.dimensions[d === 'x' ? 'scrollWidth' : 'scrollHeight'], + AreaVisible = this.dimensions[d === 'x' ? 'visibleWidth' : 'visibleHeight']; + + var scrollSize = scrollx.scroll.size[cssFullSize]() + (parseInt(scrollx.scroll.size.css(cssOffset), 10) || 0); + + if (this.options.autoScrollSize) { + scrollx.scrollbarSize = parseInt(scrollSize * AreaVisible / AreaSize, 10); + scrollx.scroll.bar.css(cssSize, scrollx.scrollbarSize + 'px'); + } + + scrollx.scrollbarSize = scrollx.scroll.bar[cssFullSize](); + scrollx.kx = ((scrollSize - scrollx.scrollbarSize) / (AreaSize - AreaVisible)) || 1; + } + }; + + var BaseVisibleScrollbar = function(){ + + // handle page zoom & scrollbars resizing + if(!browser.scroll){ + $(window).resize($.proxy(function () { + var forceUpdate = false; + if (browser.scroll && !browser.isOverlay) { + var scroll = this._getBrowserScrollSize(); + if (scroll.height !== browser.scroll.height || scroll.width !== browser.scroll.width) { + browser.scroll = scroll; + forceUpdate = true; // handle page zoom + } + } + browser.scrolls.update(forceUpdate); + }, this)); } + + BaseScrollbar.apply(this, arguments); + }; + + BaseVisibleScrollbar.prototype = $.extend({}, BaseScrollbar.prototype, { + + }); + + var FirefoxScrollbar = function () { + BaseVisibleScrollbar.apply(this, arguments); + }; + + FirefoxScrollbar.prototype = $.extend({}, BaseVisibleScrollbar.prototype, { + }); + + var MsieScrollbar = function () { + BaseVisibleScrollbar.apply(this, arguments); + }; + + MsieScrollbar.prototype = $.extend({}, BaseVisibleScrollbar.prototype, { + }); + + var WebkitScrollbar = function () { + BaseScrollbar.apply(this, arguments); }; - var CustomScrollbar = BaseScrollbar; + WebkitScrollbar.prototype = $.extend({}, BaseScrollbar.prototype, { + }); + + var CustomScrollbar = BaseVisibleScrollbar; + switch (true) { + case browser.isFF: + CustomScrollbar = FirefoxScrollbar; + break; + case browser.isIE: + CustomScrollbar = MsieScrollbar; + break; + case browser.isWebkit: + CustomScrollbar = WebkitScrollbar; + break; + } /* * Extend jQuery as plugin * - * @param {Mixed} command to execute + * @param {Mixed} command to execute or options to init * @param {Mixed} arguments as Array * @return {jQuery} */ @@ -635,103 +706,10 @@ /** * Connect default options to global object */ - $.fn.scrollbar.options = defaults; + $.fn.scrollbar.options = defaultOptions; - /** - * Check if scroll content/container size is changed - */ - - var updateScrollbars = (function () { - var timer = 0, - timerCounter = 0; - - return function (force) { - var i, container, options, scroll, wrapper, scrollx, scrolly; - for (i = 0; i < browser.scrolls.length; i++) { - scroll = browser.scrolls[i]; - container = scroll.container; - options = scroll.options; - wrapper = scroll.wrapper; - scrollx = scroll.scrollx; - scrolly = scroll.scrolly; - if (force || (options.autoUpdate && wrapper && wrapper.is(':visible') && - (container.prop('scrollWidth') != scrollx.size || container.prop('scrollHeight') != scrolly.size || wrapper.width() != scrollx.visible || wrapper.height() != scrolly.visible))) { - scroll.init(); - - if (options.debug) { - window.console && console.log({ - scrollHeight: container.prop('scrollHeight') + ':' + scroll.scrolly.size, - scrollWidth: container.prop('scrollWidth') + ':' + scroll.scrollx.size, - visibleHeight: wrapper.height() + ':' + scroll.scrolly.visible, - visibleWidth: wrapper.width() + ':' + scroll.scrollx.visible - }, true); - timerCounter++; - } - } - } - if (debug && timerCounter > 10) { - window.console && console.log('Scroll updates exceed 10'); - updateScrollbars = function () {}; - } else { - clearTimeout(timer); - timer = setTimeout(updateScrollbars, 300); - } - }; - })(); - /* ADDITIONAL FUNCTIONS */ - /** - * Get native browser scrollbar size (height/width) - * - * @param {Boolean} actual size or CSS size, default - CSS size - * @returns {Object} with height, width - */ - function getBrowserScrollSize(actualSize) { - - if (browser.webkit && !actualSize) { - return { - "height": 0, - "width": 0 - }; - } - - if (!browser.data.outer) { - var css = { - "border": "none", - "box-sizing": "content-box", - "height": "200px", - "margin": "0", - "padding": "0", - "width": "200px" - }; - browser.data.inner = $("
").css($.extend({}, css)); - browser.data.outer = $("
").css($.extend({ - "left": "-1000px", - "overflow": "scroll", - "position": "absolute", - "top": "-1000px" - }, css)).append(browser.data.inner).appendTo("body"); - } - - browser.data.outer.scrollLeft(1000).scrollTop(1000); - - return { - "height": Math.ceil((browser.data.outer.offset().top - browser.data.inner.offset().top) || 0), - "width": Math.ceil((browser.data.outer.offset().left - browser.data.inner.offset().left) || 0) - }; - } - - /** - * Check if native browser scrollbars overlay content - * - * @returns {Boolean} - */ - function isScrollOverlaysContent() { - var scrollSize = getBrowserScrollSize(true); - return !(scrollSize.height || scrollSize.width); - } - function isVerticalScroll(event) { var e = event.originalEvent; if (e.axis && e.axis === e.HORIZONTAL_AXIS) @@ -751,7 +729,6 @@ (function (angular) { angular.module('jQueryScrollbar', []) .provider('jQueryScrollbar', function () { - var defaultOptions = defaults; return { setOptions: function (options) { angular.extend(defaultOptions, options); From e05c6044343c7361241f41f8a36aa57ee5498683 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Fri, 31 Jul 2015 15:38:53 +0500 Subject: [PATCH 12/32] update webkit browser detectin --- jquery.scrollbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index f4098b4..7ff3c85 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -27,7 +27,7 @@ name: 'scrollbar', updateTimer: 0 }, - isWebkit: /WebKit/.test(navigator.userAgent), + isWebkit: 'WebkitAppearance' in document.documentElement.style, isMac: navigator.platform.toLowerCase().indexOf('mac') !== -1, isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent), isOverlay: null, From ba106c8048fa98017aee5a98e155d5db030c2c62 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Fri, 31 Jul 2015 16:44:28 +0500 Subject: [PATCH 13/32] ignore MS Edge browser --- jquery.scrollbar.js | 6 +++--- jquery.scrollbar.min.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 7ff3c85..b384169 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -27,9 +27,9 @@ name: 'scrollbar', updateTimer: 0 }, - isWebkit: 'WebkitAppearance' in document.documentElement.style, - isMac: navigator.platform.toLowerCase().indexOf('mac') !== -1, - isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent), + isWebkit: /webkit/i.test(navigator.userAgent) && !/edge\/\d+/i.test(navigator.userAgent), + isMac: /mac/i.test(navigator.platform), + isMobile: /android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent), isOverlay: null, scroll: null, scrolls: [] diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 8b84c15..3adce6e 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -9,8 +9,8 @@ * Compressed by http://jscompress.com/ * * @author Yuriy Khabarov aka Gromo - * @version 0.2.8 + * @version 0.3.0 beta * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
").css(l.extend({},o)),t.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:-1!==navigator.platform.toLowerCase().indexOf("mac"),mobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/WebKit/.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"==r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var u=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,u),d.on("mousewheel"+n,u),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",u=c.scrollStep,p=function(){var l=r[h]();r[h](l+u),1==d&&l+u>=f&&(l=r[h]()),-1==d&&f>=l+u&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>f||0>i&&f>0)&&(f+=i,0>f&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,u=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&r.css(s.is("textarea")||h>d?{height:h+t.scroll.height+"px","max-height":"none"}:{"max-height":h+t.scroll.height+"px"}),(o.size!=s.prop("scrollWidth")||n.size!=s.prop("scrollHeight")||o.visible!=a.width()||n.visible!=a.height()||o.offset!=(parseInt(s.css("left"),10)||0)||n.offset!=(parseInt(s.css("top"),10)||0))&&(l.extend(this.scrollx,{offset:parseInt(s.css("left"),10)||0,size:s.prop("scrollWidth"),visible:a.width()}),l.extend(this.scrolly,{offset:parseInt(s.css("top"),10)||0,size:this.container.prop("scrollHeight"),visible:a.height()}),this._updateScroll("x"===e?"y":"x",n))}};var c=n;l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new c(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var a=function(){var l=0,e=0;return function(o){var s,i,n,c,d,h,u;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file +!function(l,s){"function"==typeof define&&define.amd?define(["jquery"],s):s(l.jQuery)}(this,function(l){"use strict";function s(l){var s=l.originalEvent;return s.axis&&s.axis===s.HORIZONTAL_AXIS?!1:s.wheelDeltaX?!1:!0}var e={data:{index:0,name:"scrollbar",updateTimer:0},isWebkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent),isMac:/mac/i.test(navigator.platform),isMobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),isOverlay:null,scroll:null,scrolls:[]};e.scrolls.add=function(l){this.remove(l).push(l)},e.scrolls.remove=function(s){for(;l.inArray(s,this)>=0;)this.splice(l.inArray(s,this),1);return this},e.scrolls.update=function(l){for(var s=0;s").addClass("scroll-wrapper").addClass(i.attr("class")).css("position","absolute"==i.css("position")?"absolute":"relative").insertBefore(i).append(i),i.is("textarea")&&(this.containerWrapper=r=l("
").insertBefore(i).append(i),d.addClass("scroll-textarea")),r.addClass("scroll-content"),i.on("scroll"+n,l.proxy(function(){l.isFunction(this.options.onScroll)&&this.options.onScroll.call(this,{scroll:this.container.scrollTop(),size:this.dimensions.scrollHeight,visible:this.dimensions.visibleHeight},{scroll:this.container.scrollLeft(),size:this.dimensions.scrollWidth,visible:this.dimensions.visibleWidth}),this.scrollx.isVisible&&this.scrollx.scroll.bar.css("left",i.scrollLeft()*this.scrollx.kx+"px"),this.scrolly.isVisible&&this.scrolly.scroll.bar.css("top",i.scrollTop()*this.scrolly.kx+"px")},this)),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),a.disableBodyScroll){var p=function(l){s(l)?c.y.isVisible&&c.y.mousewheel(l):c.x.isVisible&&c.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),e.isMobile&&d.on("touchstart"+n,function(s){var e=s.originalEvent.touches&&s.originalEvent.touches[0]||s,o={pageX:e.pageX,pageY:e.pageY},t={left:i.scrollLeft(),top:i.scrollTop()};l(document).on("touchmove"+n,function(l){var s=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;i.scrollLeft(t.left+o.pageX-s.pageX),i.scrollTop(t.top+o.pageY-s.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(a.onInit)&&a.onInit.apply(this,[i])}r.css({height:"auto","margin-bottom":-1*e.scroll.height+"px","margin-right":-1*e.scroll.width+"px","max-height":""}),l.each(c,function(e,o){var r=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=a.scrollStep,u=function(){var l=i[h]();i[h](l+p),1==d&&l+p>=f&&(l=i[h]()),-1==d&&f>=l+p&&(l=i[h]()),i[h]()==l&&r&&r()},f=0;o.scroll||(o.scroll=t._getScroll(a["scroll"+e]).addClass("scroll-"+e),a.showArrows&&o.scroll.addClass("scroll-element_arrows_visible"),o.mousewheel=function(l){if(!o.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return c.x.mousewheel(l),!0;var r=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=o.size-o.visible-o.offset;return(r>0&&n>f||0>r&&f>0)&&(f+=r,0>f&&(f=0),f>n&&(f=n),t.scrollTo=t.scrollTo||{},t.scrollTo[h]=f,setTimeout(function(){t.scrollTo&&(i.stop().animate(t.scrollTo,240,"linear",function(){f=i[h]()}),t.scrollTo=null)},1)),l.preventDefault(),!1},o.scroll.on("MozMousePixelScroll"+n,o.mousewheel).on("mousewheel"+n,o.mousewheel).on("mouseenter"+n,function(){f=i[h]()}),o.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:o.size-o.visible-o.offset,scrollbarOffset:o.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:o.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},c=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=a.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset").prependTo("body").attr("style","border:none;margin:0;padding:0;height:100px;width:100px;position:absolute;overflow:scroll;left:-1000px;top:-1000px;"),e.data.inner=l("
").appendTo(e.data.outer).attr("style","border:none;margin:0;padding:0;height:100%;width:100%;position:absolute;")),{height:e.data.outer.height()-e.data.inner.height(),width:e.data.outer.width()-e.data.inner.width()}},_getDimensions:function(){var l=this.container,s=this.wrapper;return{scrollHeight:l.prop("scrollHeight"),scrollWidth:l.prop("scrollWidth"),visibleHeight:s.height()+(parseInt(l.css("top"),10)||0),visibleWidth:s.width()+(parseInt(l.css("left"),10)||0)}},_getScroll:function(s){var e={advanced:['
','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return e[s]&&(s=e[s]),s||(s=e.simple),s="string"==typeof s?l(s).appendTo(this.wrapper):l(s),l.extend(s,{bar:s.find(".scroll-bar"),size:s.find(".scroll-element_size"),track:s.find(".scroll-element_track")}),s},_handleMouseDown:function(s,e){var o=this.namespace;return l(document).on("blur"+o,function(){l(document).add("body").off(o),s&&s()}),l(document).on("dragstart"+o,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+o,function(){l(document).add("body").off(o),s&&s()}),l("body").on("selectstart"+o,function(l){return l.preventDefault(),!1}),e&&e.preventDefault(),!1},_isChanged:function(){var s=!1,e=this._getDimensions(),o=this.dimensions;return l.each(e,function(l,e){return o[l]!==e?(s=!0,!1):void 0}),this.dimensions=e,s&&this.options.debug&&window.console&&console.log(this.dimensions),s},_updateScroll:function(l,s){var o=this.container,t=this.containerWrapper||o,i="scroll-scroll"+l+"_visible",r="x"===l?this.scrolly:this.scrollx,n=(this.wrapper,this.dimensions["x"===l?"scrollWidth":"scrollHeight"]),a=this.dimensions["x"===l?"visibleWidth":"visibleHeight"];s.isVisible=n-a>1,t.add(s.scroll).add(r.scroll)[s.isVisible?"addClass":"removeClass"](i),"y"===l&&t.css(o.is("textarea")||a>n?{height:a+e.scroll.height+"px","max-height":"none"}:{"max-height":a+e.scroll.height+"px"}),this._isChanged()&&this._updateScroll("x"===l?"y":"x",r)},_updateScrollSize:function(l,s){var e="x"===l?"left":"top",o="x"===l?"outerWidth":"outerHeight",t="x"===l?"width":"height",i=this.dimensions["x"===l?"scrollWidth":"scrollHeight"],r=this.dimensions["x"===l?"visibleWidth":"visibleHeight"],n=s.scroll.size[o]()+(parseInt(s.scroll.size.css(e),10)||0);this.options.autoScrollSize&&(s.scrollbarSize=parseInt(n*r/i,10),s.scroll.bar.css(t,s.scrollbarSize+"px")),s.scrollbarSize=s.scroll.bar[o](),s.kx=(n-s.scrollbarSize)/(i-r)||1}};var i=function(){e.scroll||l(window).resize(l.proxy(function(){var l=!1;if(e.scroll&&!e.isOverlay){var s=this._getBrowserScrollSize();(s.height!==e.scroll.height||s.width!==e.scroll.width)&&(e.scroll=s,l=!0)}e.scrolls.update(l)},this)),t.apply(this,arguments)};i.prototype=l.extend({},t.prototype,{});var r=function(){i.apply(this,arguments)};r.prototype=l.extend({},i.prototype,{});var n=function(){i.apply(this,arguments)};n.prototype=l.extend({},i.prototype,{});var a=function(){t.apply(this,arguments)};a.prototype=l.extend({},t.prototype,{});var c=i;switch(!0){case e.isFF:c=r;break;case e.isIE:c=n;break;case e.isWebkit:c=a}l.fn.scrollbar=function(s,o){return"string"!=typeof s&&(o=s,s="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var t=l(this),i=t.data(e.data.name);(i||"init"===s)&&(i||(i=new c(t)),i[s]&&i[s].apply(i,o))}),this},l.fn.scrollbar.options=o,window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){return{setOptions:function(s){l.extend(o,s)},$get:function(){return{options:l.copy(o)}}}}).directive("jqueryScrollbar",function(l,s){return{restrict:"AC",link:function(e,o,t){var i=s(t.jqueryScrollbar),r=i(e);o.scrollbar(r||l.options).on("$destroy",function(){o.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file From 44f79ea56ea867ec2bf104cf78e41f265f2a41b1 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Mon, 3 Aug 2015 13:51:37 +0500 Subject: [PATCH 14/32] add changelog --- CHANGELOG.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ea4f463 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,66 @@ +v0.3.0 beta +Code refactoring to support class-based structure + +v0.2.8 (20150723) +Add Meteor/Node modules support +Fix bug when removed content does not update element's height +Fix bug with textarea in non-webkit browsers +Update webkit-based browser detection to ignore Microsoft Edge browser + +v0.2.7 (20150122) +Small fixes + +v0.2.6 (20141124) +Re-register plugin in jQuery plugins repository + +v0.2.5 (20141119) +Add option ignoreOverlay +Fix webkit-based browser detection +Ignore Firefox in Mac OS (cannot hide native scrollbars) + +v0.2.4 (20140715) +Add textarea support + +v0.2.3 (20140703) +Default options can be overwritten via default global object +Fix bug with visible native scrollbars when page is zoomed +Add onScroll callback +Add Angular.JS directive + +v0.2.2 (20140411) +Fix default options issue with multiple scrollbars initialization + +v0.2.1 (20140323) +Update CSS classes for custom scroll elements +Set option ignoreMobile to true by default +Small CSS/JS fixes + +v0.2.0 (20140312) +Add onUpdate callback +Manage scrollbar visibility via CSS classes + +v0.1.9 (20140310) +Fix bug with inner div height 100% +Add option autoUpdate + +v0.1.8 (20140308) +Fix bug with visible horizontal scrollbar if content height is less than container height + +v0.1.7 (20140307) +Add hack for IE9-11 with 1px diff between visible and scrollable height +Fix bug with second-time plugin initialization +Remove warnings from IDE + +v0.1.4 (20130430) +Add horizontal scrollbar handler +Add option disableBodyScroll + +v0.1.3 (20130423) +Improve scroll simulation +Fix webkit bug with text selection + +v0.1.2 (20130422) +Handle mousedown instead of click on scrollbar track/arrows + +v0.0.2 (20130413) +First beta version \ No newline at end of file From 53d017dac39d5e709943f8f613dea594c053fc8a Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Mon, 3 Aug 2015 13:57:21 +0500 Subject: [PATCH 15/32] add tags to changelog.md --- CHANGELOG.md | 100 +++++++++++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea4f463..b6ae630 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,66 +1,66 @@ -v0.3.0 beta -Code refactoring to support class-based structure +

v0.3.0 beta

+Code refactoring to support class-based structure
-v0.2.8 (20150723) -Add Meteor/Node modules support -Fix bug when removed content does not update element's height -Fix bug with textarea in non-webkit browsers -Update webkit-based browser detection to ignore Microsoft Edge browser +

v0.2.8 (20150723)

+Add Meteor/Node modules support
+Fix bug when removed content does not update element's height
+Fix bug with textarea in non-webkit browsers
+Update webkit-based browser detection to ignore Microsoft Edge browser
-v0.2.7 (20150122) -Small fixes +

v0.2.7 (20150122)

+Small fixes
-v0.2.6 (20141124) -Re-register plugin in jQuery plugins repository +

v0.2.6 (20141124)

+Re-register plugin in jQuery plugins repository
-v0.2.5 (20141119) -Add option ignoreOverlay -Fix webkit-based browser detection -Ignore Firefox in Mac OS (cannot hide native scrollbars) +

v0.2.5 (20141119)

+Add option ignoreOverlay
+Fix webkit-based browser detection
+Ignore Firefox in Mac OS (cannot hide native scrollbars)
-v0.2.4 (20140715) -Add textarea support +

v0.2.4 (20140715)

+Add textarea support
-v0.2.3 (20140703) -Default options can be overwritten via default global object -Fix bug with visible native scrollbars when page is zoomed -Add onScroll callback -Add Angular.JS directive +

v0.2.3 (20140703)

+Default options can be overwritten via default global object
+Fix bug with visible native scrollbars when page is zoomed
+Add onScroll callback
+Add Angular.JS directive
-v0.2.2 (20140411) -Fix default options issue with multiple scrollbars initialization +

v0.2.2 (20140411)

+Fix default options issue with multiple scrollbars initialization
-v0.2.1 (20140323) -Update CSS classes for custom scroll elements -Set option ignoreMobile to true by default -Small CSS/JS fixes +

v0.2.1 (20140323)

+Update CSS classes for custom scroll elements
+Set option ignoreMobile to true by default
+Small CSS/JS fixes
-v0.2.0 (20140312) -Add onUpdate callback -Manage scrollbar visibility via CSS classes +

v0.2.0 (20140312)

+Add onUpdate callback
+Manage scrollbar visibility via CSS classes
-v0.1.9 (20140310) -Fix bug with inner div height 100% -Add option autoUpdate +

v0.1.9 (20140310)

+Fix bug with inner div height 100%
+Add option autoUpdate
-v0.1.8 (20140308) -Fix bug with visible horizontal scrollbar if content height is less than container height +

v0.1.8 (20140308)

+Fix bug with visible horizontal scrollbar if content height is less than container height
-v0.1.7 (20140307) -Add hack for IE9-11 with 1px diff between visible and scrollable height -Fix bug with second-time plugin initialization -Remove warnings from IDE +

v0.1.7 (20140307)

+Add hack for IE9-11 with 1px diff between visible and scrollable height
+Fix bug with second-time plugin initialization
+Remove warnings from IDE
-v0.1.4 (20130430) -Add horizontal scrollbar handler -Add option disableBodyScroll +

v0.1.4 (20130430)

+Add horizontal scrollbar handler
+Add option disableBodyScroll
-v0.1.3 (20130423) -Improve scroll simulation -Fix webkit bug with text selection +

v0.1.3 (20130423)

+Improve scroll simulation
+Fix webkit bug with text selection
-v0.1.2 (20130422) -Handle mousedown instead of click on scrollbar track/arrows +

v0.1.2 (20130422)

+Handle mousedown instead of click on scrollbar track/arrows
-v0.0.2 (20130413) -First beta version \ No newline at end of file +

v0.0.2 (20130413)

+First version
\ No newline at end of file From c7326aaaa664a4e4468e856dcc3283901674a984 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Mon, 3 Aug 2015 14:00:29 +0500 Subject: [PATCH 16/32] update documentation --- CHANGELOG.md | 2 +- README.md | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6ae630..e252025 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -

v0.3.0 beta

+

v0.3.0 beta (not stable)

Code refactoring to support class-based structure

v0.2.8 (20150723)

diff --git a/README.md b/README.md index 44c0da5..fac3633 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ Cross-browser CSS customizable scrollbar with advanced features:

jQuery Scrollbar as Angular.JS directive

Documentation

+

Changelog

Download

-Please note that CSS was updated in version 0.2.8. -Please update section /*************** SCROLLBAR BASE CSS ***************/ in your CSS file. + +Please download stable version from link above. Current version 0.3.0 is not stable. From 41bd50780c91da012556d79778b44993b0ec4fbe Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Fri, 21 Aug 2015 16:21:06 +0500 Subject: [PATCH 17/32] move current development verstion to new branch --- CHANGELOG.md | 3 - README.md | 3 - jquery.scrollbar.js | 469 +++++++++++++++++++++------------------- jquery.scrollbar.min.js | 4 +- 4 files changed, 248 insertions(+), 231 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e252025..7880512 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,3 @@ -

v0.3.0 beta (not stable)

-Code refactoring to support class-based structure
-

v0.2.8 (20150723)

Add Meteor/Node modules support
Fix bug when removed content does not update element's height
diff --git a/README.md b/README.md index fac3633..09b2cfd 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,3 @@ Cross-browser CSS customizable scrollbar with advanced features:

Documentation

Changelog

Download

- - -Please download stable version from link above. Current version 0.3.0 is not stable. diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index b384169..f78962b 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -7,7 +7,7 @@ * If you found bug, please contact me via email <13real008@gmail.com> * * @author Yuriy Khabarov aka Gromo - * @version 0.3.0 beta + * @version 0.2.8 * @url https://github.com/gromo/jquery.scrollbar/ * */ @@ -21,18 +21,20 @@ }(this, function ($) { 'use strict'; + // init flags & variables + var debug = false; + var browser = { data: { index: 0, - name: 'scrollbar', - updateTimer: 0 + name: 'scrollbar' }, - isWebkit: /webkit/i.test(navigator.userAgent) && !/edge\/\d+/i.test(navigator.userAgent), - isMac: /mac/i.test(navigator.platform), - isMobile: /android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent), - isOverlay: null, + macosx: /mac/i.test(navigator.platform), + mobile: /android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent), + overlay: null, scroll: null, - scrolls: [] + scrolls: [], + webkit: /webkit/i.test(navigator.userAgent) && !/edge\/\d+/i.test(navigator.userAgent) }; browser.scrolls.add = function (instance) { @@ -44,49 +46,52 @@ } return this; }; - browser.scrolls.update = function(force){ - for (var i = 0; i < browser.scrolls.length; i++) { - browser.scrolls[i].update(force); - } - clearTimeout(browser.data.updateTimer); - browser.data.updateTimer = setTimeout(browser.scrolls.update, 300); - }; - var defaultOptions = { - autoScrollSize: true, // automatically calculate scrollsize - autoUpdate: true, // update scrollbar if content/container size changed - debug: false, // debug mode - disableBodyScroll: false, // disable body scroll if mouse over container - duration: 200, // scroll animate duration in ms - ignoreMobile: false, // ignore mobile devices - ignoreOverlay: false, // ignore browsers with overlay scrollbars (mobile, MacOS) - scrollStep: 30, // scroll step for scrollbar arrows - showArrows: false, // add class to show arrows - stepScrolling: true, // when scrolling to scrollbar mousedown position - - scrollx: null, // horizontal scroll element - scrolly: null, // vertical scroll element - - onDestroy: null, // callback function on destroy, - onInit: null, // callback function on first initialization - onScroll: null, // callback function on content scrolling - onUpdate: null // callback function on init/resize (before scrollbar size calculation) + var defaults = { + "autoScrollSize": true, // automatically calculate scrollsize + "autoUpdate": true, // update scrollbar if content/container size changed + "debug": false, // debug mode + "disableBodyScroll": false, // disable body scroll if mouse over container + "duration": 200, // scroll animate duration in ms + "ignoreMobile": false, // ignore mobile devices + "ignoreOverlay": false, // ignore browsers with overlay scrollbars (mobile, MacOS) + "scrollStep": 30, // scroll step for scrollbar arrows + "showArrows": false, // add class to show arrows + "stepScrolling": true, // when scrolling to scrollbar mousedown position + + "scrollx": null, // horizontal scroll element + "scrolly": null, // vertical scroll element + + "onDestroy": null, // callback function on destroy, + "onInit": null, // callback function on first initialization + "onScroll": null, // callback function on content scrolling + "onUpdate": null // callback function on init/resize (before scrollbar size calculation) }; var BaseScrollbar = function (container) { if (!browser.scroll) { - browser.scroll = this._getBrowserScrollSize(); - browser.isOverlay = (browser.scroll.height === 0 && browser.scroll.width === 0); - browser.scrolls.update(); // run interval check + browser.overlay = isScrollOverlaysContent(); + browser.scroll = getBrowserScrollSize(); + updateScrollbars(); + + $(window).resize(function () { + var forceUpdate = false; + if (browser.scroll && (browser.scroll.height || browser.scroll.width)) { + var scroll = getBrowserScrollSize(); + if (scroll.height !== browser.scroll.height || scroll.width !== browser.scroll.width) { + browser.scroll = scroll; + forceUpdate = true; // handle page zoom + } + } + updateScrollbars(forceUpdate); + }); } this.container = container; - this.dimensions = {}; - this.isRtl = container.css('direction') === 'rtl'; this.namespace = '.scrollbar_' + browser.data.index++; - this.options = $.extend({}, defaultOptions, window.jQueryScrollbarOptions || {}); + this.options = $.extend({}, defaults, window.jQueryScrollbarOptions || {}); this.scrollTo = null; this.scrollx = {}; this.scrolly = {}; @@ -103,15 +108,12 @@ return; } - // unregister scroll instance this.container.removeData(browser.data.name); browser.scrolls.remove(this); // init variables - var currentScroll = { - "left": this.container.scrollLeft(), - "top": this.container.scrollTop() - }; + var scrollLeft = this.container.scrollLeft(); + var scrollTop = this.container.scrollTop(); this.container.insertBefore(this.wrapper).css({ "height": "", @@ -120,8 +122,8 @@ }) .removeClass('scroll-content scroll-scrollx_visible scroll-scrolly_visible') .off(this.namespace) - .scrollLeft(currentScroll.left) - .scrollTop(currentScroll.top); + .scrollLeft(scrollLeft) + .scrollTop(scrollTop); this.scrollx.scroll.removeClass('scroll-scrollx_visible').find('div').andSelf().off(this.namespace); this.scrolly.scroll.removeClass('scroll-scrolly_visible').find('div').andSelf().off(this.namespace); @@ -151,9 +153,9 @@ }; // do not init if in ignorable browser - if ((browser.isMobile && o.ignoreMobile) - || (browser.isOverlay && o.ignoreOverlay) - || (browser.isMac && !browser.isWebkit) // still required to ignore nonWebKit browsers on Mac + if ((browser.mobile && o.ignoreMobile) + || (browser.overlay && o.ignoreOverlay) + || (browser.macosx && !browser.webkit) // still required to ignore nonWebKit browsers on Mac ) { return false; } @@ -169,23 +171,30 @@ w.addClass('scroll-textarea'); } - cw.addClass('scroll-content'); + cw.addClass('scroll-content').css({ + "height": "auto", + "margin-bottom": browser.scroll.height * -1 + 'px', + "margin-right": browser.scroll.width * -1 + 'px', + "max-height": "" + }); - c.on('scroll' + namespace, $.proxy(function () { - if ($.isFunction(this.options.onScroll)) { - this.options.onScroll.call(this, { - scroll: this.container.scrollTop(), - size: this.dimensions.scrollHeight, - visible: this.dimensions.visibleHeight + c.on('scroll' + namespace, function (event) { + if ($.isFunction(o.onScroll)) { + o.onScroll.call(S, { + "maxScroll": s.y.maxScrollOffset, + "scroll": c.scrollTop(), + "size": s.y.size, + "visible": s.y.visible }, { - scroll: this.container.scrollLeft(), - size: this.dimensions.scrollWidth, - visible: this.dimensions.visibleWidth + "maxScroll": s.x.maxScrollOffset, + "scroll": c.scrollLeft(), + "size": s.x.size, + "visible": s.x.visible }); } - this.scrollx.isVisible && this.scrollx.scroll.bar.css('left', c.scrollLeft() * this.scrollx.kx + 'px'); - this.scrolly.isVisible && this.scrolly.scroll.bar.css('top', c.scrollTop() * this.scrolly.kx + 'px'); - }, this)); + s.x.isVisible && s.x.scroll.bar.css('left', c.scrollLeft() * s.x.kx + 'px'); + s.y.isVisible && s.y.scroll.bar.css('top', c.scrollTop() * s.y.kx + 'px'); + }); /* prevent native scrollbars to be visible on #anchor click */ w.on('scroll' + namespace, function () { @@ -201,12 +210,12 @@ w.on('MozMousePixelScroll' + namespace, handleMouseScroll); w.on('mousewheel' + namespace, handleMouseScroll); - if (browser.isMobile) { + if (browser.mobile) { w.on('touchstart' + namespace, function (event) { var touch = event.originalEvent.touches && event.originalEvent.touches[0] || event; var originalTouch = { - pageX: touch.pageX, - pageY: touch.pageY + "pageX": touch.pageX, + "pageY": touch.pageY }; var originalScroll = { "left": c.scrollLeft(), @@ -227,15 +236,15 @@ if ($.isFunction(o.onInit)){ o.onInit.apply(this, [c]); } + } else { + cw.css({ + "height": "auto", + "margin-bottom": browser.scroll.height * -1 + 'px', + "margin-right": browser.scroll.width * -1 + 'px', + "max-height": "" + }); } - cw.css({ - "height": "auto", - "margin-bottom": browser.scroll.height * -1 + 'px', - "margin-right": browser.scroll.width * -1 + 'px', - "max-height": "" - }); - // init scrollbars & recalculate sizes $.each(s, function (d, scrollx) { @@ -389,10 +398,27 @@ }); // remove classes & reset applied styles - cw.add(this.scrollx.scroll).add(this.scrolly.scroll).removeClass('scroll-scrollx_visible scroll-scrolly_visible'); + $.each(s, function (d, scrollx) { + var scrollClass = 'scroll-scroll' + d + '_visible'; + var scrolly = (d == "x") ? s.y : s.x; + + scrollx.scroll.removeClass(scrollClass); + scrolly.scroll.removeClass(scrollClass); + cw.removeClass(scrollClass); + }); // calculate init sizes - this.dimensions = this._getDimensions(); + $.each(s, function (d, scrollx) { + $.extend(scrollx, (d == "x") ? { + "offset": parseInt(c.css('left'), 10) || 0, + "size": c.prop('scrollWidth'), + "visible": w.width() + } : { + "offset": parseInt(c.css('top'), 10) || 0, + "size": c.prop('scrollHeight'), + "visible": w.height() + }); + }); // update scrollbar visibility/dimensions this._updateScroll('x', this.scrollx); @@ -403,50 +429,29 @@ } // calculate scroll size - this._updateScrollSize('x', this.scrollx); - this._updateScrollSize('y', this.scrolly); + $.each(s, function (d, scrollx) { - c.scrollLeft(initScroll.scrollLeft).scrollTop(initScroll.scrollTop).trigger('scroll'); - }, + var cssOffset = (d === 'x') ? 'left' : 'top'; + var cssFullSize = (d === 'x') ? 'outerWidth' : 'outerHeight'; + var cssSize = (d === 'x') ? 'width' : 'height'; + var offset = parseInt(c.css(cssOffset), 10) || 0; - update: function(force){ - if (force || (this.options.autoUpdate && this.wrapper && this.wrapper.is(':visible') && this._isChanged())) { - this.init(); - } - }, + var AreaSize = scrollx.size; + var AreaVisible = scrollx.visible + offset; - /** - * Calculate browser native scrollbar height/width - * - * @returns {Object} {"height", "width"} - */ - _getBrowserScrollSize: function () { - if (!browser.data.outer) { - browser.data.outer = $('
').prependTo('body') - .attr('style', 'border:none;margin:0;padding:0;height:100px;width:100px;position:absolute;overflow:scroll;left:-1000px;top:-1000px;'); - browser.data.inner = $('
').appendTo(browser.data.outer) - .attr('style', 'border:none;margin:0;padding:0;height:100%;width:100%;position:absolute;'); - } - return { - height: browser.data.outer.height() - browser.data.inner.height(), - width: browser.data.outer.width() - browser.data.inner.width() - }; - }, + var scrollSize = scrollx.scroll.size[cssFullSize]() + (parseInt(scrollx.scroll.size.css(cssOffset), 10) || 0); - /** - * Get element's dimensions: scrollHeight, scrollWidth, visibleHeight, visibleWidth - * - * @returns {Object} element dimensions - */ - _getDimensions: function () { - var element = this.container, - wrapper = this.wrapper; - return { - scrollHeight: element.prop('scrollHeight'), - scrollWidth: element.prop('scrollWidth'), - visibleHeight: wrapper.height() + (parseInt(element.css('top'), 10) || 0), - visibleWidth: wrapper.width() + (parseInt(element.css('left'), 10) || 0) - }; + if (o.autoScrollSize) { + scrollx.scrollbarSize = parseInt(scrollSize * AreaVisible / AreaSize, 10); + scrollx.scroll.bar.css(cssSize, scrollx.scrollbarSize + 'px'); + } + + scrollx.scrollbarSize = scrollx.scroll.bar[cssFullSize](); + scrollx.kx = ((scrollSize - scrollx.scrollbarSize) / (AreaSize - AreaVisible)) || 1; + scrollx.maxScrollOffset = AreaSize - AreaVisible; + }); + + c.scrollLeft(initScroll.scrollLeft).scrollTop(initScroll.scrollTop).trigger('scroll'); }, /** @@ -533,44 +538,28 @@ return false; }, - /** - * Check if element dimensions were changed - * + update current dimensions - * - * @returns {Boolean} is changed - */ - _isChanged: function () { - var isChanged = false, - newDimensions = this._getDimensions(), - oldDimensions = this.dimensions; - $.each(newDimensions, function (key, newValue) { - if (oldDimensions[key] !== newValue) { - isChanged = true; - return false; - } - }); - this.dimensions = newDimensions; - - if (isChanged && this.options.debug) { - window.console && console.log(this.dimensions); - } - - return isChanged; - }, - _updateScroll: function (d, scrollx) { var container = this.container, containerWrapper = this.containerWrapper || container, scrollClass = 'scroll-scroll' + d + '_visible', scrolly = (d === 'x') ? this.scrolly : this.scrollx, + offset = parseInt(this.container.css((d === 'x') ? 'left' : 'top'), 10) || 0, wrapper = this.wrapper; - var AreaSize = this.dimensions[d === 'x' ? 'scrollWidth' : 'scrollHeight'], - AreaVisible = this.dimensions[d === 'x' ? 'visibleWidth' : 'visibleHeight']; + var AreaSize = scrollx.size; + var AreaVisible = scrollx.visible + offset; scrollx.isVisible = (AreaSize - AreaVisible) > 1; // bug in IE9/11 with 1px diff - containerWrapper.add(scrollx.scroll).add(scrolly.scroll)[scrollx.isVisible ? 'addClass' : 'removeClass'](scrollClass); + if (scrollx.isVisible) { + scrollx.scroll.addClass(scrollClass); + scrolly.scroll.addClass(scrollClass); + containerWrapper.addClass(scrollClass); + } else { + scrollx.scroll.removeClass(scrollClass); + scrolly.scroll.removeClass(scrollClass); + containerWrapper.removeClass(scrollClass); + } if (d === 'y') { if(container.is('textarea') || AreaSize < AreaVisible){ @@ -586,94 +575,34 @@ } } - if(this._isChanged()){ + if (scrollx.size != container.prop('scrollWidth') + || scrolly.size != container.prop('scrollHeight') + || scrollx.visible != wrapper.width() + || scrolly.visible != wrapper.height() + || scrollx.offset != (parseInt(container.css('left'), 10) || 0) + || scrolly.offset != (parseInt(container.css('top'), 10) || 0) + ) { + $.extend(this.scrollx, { + "offset": parseInt(container.css('left'), 10) || 0, + "size": container.prop('scrollWidth'), + "visible": wrapper.width() + }); + $.extend(this.scrolly, { + "offset": parseInt(container.css('top'), 10) || 0, + "size": this.container.prop('scrollHeight'), + "visible": wrapper.height() + }); this._updateScroll(d === 'x' ? 'y' : 'x', scrolly); } - }, - - _updateScrollSize: function (d, scrollx) { - - var cssOffset = (d === 'x') ? 'left' : 'top', - cssFullSize = (d === 'x') ? 'outerWidth' : 'outerHeight', - cssSize = (d === 'x') ? 'width' : 'height'; - - var AreaSize = this.dimensions[d === 'x' ? 'scrollWidth' : 'scrollHeight'], - AreaVisible = this.dimensions[d === 'x' ? 'visibleWidth' : 'visibleHeight']; - - var scrollSize = scrollx.scroll.size[cssFullSize]() + (parseInt(scrollx.scroll.size.css(cssOffset), 10) || 0); - - if (this.options.autoScrollSize) { - scrollx.scrollbarSize = parseInt(scrollSize * AreaVisible / AreaSize, 10); - scrollx.scroll.bar.css(cssSize, scrollx.scrollbarSize + 'px'); - } - - scrollx.scrollbarSize = scrollx.scroll.bar[cssFullSize](); - scrollx.kx = ((scrollSize - scrollx.scrollbarSize) / (AreaSize - AreaVisible)) || 1; - } - }; - - var BaseVisibleScrollbar = function(){ - - // handle page zoom & scrollbars resizing - if(!browser.scroll){ - $(window).resize($.proxy(function () { - var forceUpdate = false; - if (browser.scroll && !browser.isOverlay) { - var scroll = this._getBrowserScrollSize(); - if (scroll.height !== browser.scroll.height || scroll.width !== browser.scroll.width) { - browser.scroll = scroll; - forceUpdate = true; // handle page zoom - } - } - browser.scrolls.update(forceUpdate); - }, this)); } - - BaseScrollbar.apply(this, arguments); - }; - - BaseVisibleScrollbar.prototype = $.extend({}, BaseScrollbar.prototype, { - - }); - - var FirefoxScrollbar = function () { - BaseVisibleScrollbar.apply(this, arguments); - }; - - FirefoxScrollbar.prototype = $.extend({}, BaseVisibleScrollbar.prototype, { - }); - - var MsieScrollbar = function () { - BaseVisibleScrollbar.apply(this, arguments); - }; - - MsieScrollbar.prototype = $.extend({}, BaseVisibleScrollbar.prototype, { - }); - - var WebkitScrollbar = function () { - BaseScrollbar.apply(this, arguments); }; - WebkitScrollbar.prototype = $.extend({}, BaseScrollbar.prototype, { - }); - - var CustomScrollbar = BaseVisibleScrollbar; - switch (true) { - case browser.isFF: - CustomScrollbar = FirefoxScrollbar; - break; - case browser.isIE: - CustomScrollbar = MsieScrollbar; - break; - case browser.isWebkit: - CustomScrollbar = WebkitScrollbar; - break; - } + var CustomScrollbar = BaseScrollbar; /* * Extend jQuery as plugin * - * @param {Mixed} command to execute or options to init + * @param {Mixed} command to execute * @param {Mixed} arguments as Array * @return {jQuery} */ @@ -706,10 +635,103 @@ /** * Connect default options to global object */ - $.fn.scrollbar.options = defaultOptions; + $.fn.scrollbar.options = defaults; + /** + * Check if scroll content/container size is changed + */ + + var updateScrollbars = (function () { + var timer = 0, + timerCounter = 0; + + return function (force) { + var i, container, options, scroll, wrapper, scrollx, scrolly; + for (i = 0; i < browser.scrolls.length; i++) { + scroll = browser.scrolls[i]; + container = scroll.container; + options = scroll.options; + wrapper = scroll.wrapper; + scrollx = scroll.scrollx; + scrolly = scroll.scrolly; + if (force || (options.autoUpdate && wrapper && wrapper.is(':visible') && + (container.prop('scrollWidth') != scrollx.size || container.prop('scrollHeight') != scrolly.size || wrapper.width() != scrollx.visible || wrapper.height() != scrolly.visible))) { + scroll.init(); + + if (options.debug) { + window.console && console.log({ + scrollHeight: container.prop('scrollHeight') + ':' + scroll.scrolly.size, + scrollWidth: container.prop('scrollWidth') + ':' + scroll.scrollx.size, + visibleHeight: wrapper.height() + ':' + scroll.scrolly.visible, + visibleWidth: wrapper.width() + ':' + scroll.scrollx.visible + }, true); + timerCounter++; + } + } + } + if (debug && timerCounter > 10) { + window.console && console.log('Scroll updates exceed 10'); + updateScrollbars = function () {}; + } else { + clearTimeout(timer); + timer = setTimeout(updateScrollbars, 300); + } + }; + })(); + /* ADDITIONAL FUNCTIONS */ + /** + * Get native browser scrollbar size (height/width) + * + * @param {Boolean} actual size or CSS size, default - CSS size + * @returns {Object} with height, width + */ + function getBrowserScrollSize(actualSize) { + + if (browser.webkit && !actualSize) { + return { + "height": 0, + "width": 0 + }; + } + + if (!browser.data.outer) { + var css = { + "border": "none", + "box-sizing": "content-box", + "height": "200px", + "margin": "0", + "padding": "0", + "width": "200px" + }; + browser.data.inner = $("
").css($.extend({}, css)); + browser.data.outer = $("
").css($.extend({ + "left": "-1000px", + "overflow": "scroll", + "position": "absolute", + "top": "-1000px" + }, css)).append(browser.data.inner).appendTo("body"); + } + + browser.data.outer.scrollLeft(1000).scrollTop(1000); + + return { + "height": Math.ceil((browser.data.outer.offset().top - browser.data.inner.offset().top) || 0), + "width": Math.ceil((browser.data.outer.offset().left - browser.data.inner.offset().left) || 0) + }; + } + + /** + * Check if native browser scrollbars overlay content + * + * @returns {Boolean} + */ + function isScrollOverlaysContent() { + var scrollSize = getBrowserScrollSize(true); + return !(scrollSize.height || scrollSize.width); + } + function isVerticalScroll(event) { var e = event.originalEvent; if (e.axis && e.axis === e.HORIZONTAL_AXIS) @@ -729,6 +751,7 @@ (function (angular) { angular.module('jQueryScrollbar', []) .provider('jQueryScrollbar', function () { + var defaultOptions = defaults; return { setOptions: function (options) { angular.extend(defaultOptions, options); diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 3adce6e..9e81163 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -9,8 +9,8 @@ * Compressed by http://jscompress.com/ * * @author Yuriy Khabarov aka Gromo - * @version 0.3.0 beta + * @version 0.2.8 * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(l,s){"function"==typeof define&&define.amd?define(["jquery"],s):s(l.jQuery)}(this,function(l){"use strict";function s(l){var s=l.originalEvent;return s.axis&&s.axis===s.HORIZONTAL_AXIS?!1:s.wheelDeltaX?!1:!0}var e={data:{index:0,name:"scrollbar",updateTimer:0},isWebkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent),isMac:/mac/i.test(navigator.platform),isMobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),isOverlay:null,scroll:null,scrolls:[]};e.scrolls.add=function(l){this.remove(l).push(l)},e.scrolls.remove=function(s){for(;l.inArray(s,this)>=0;)this.splice(l.inArray(s,this),1);return this},e.scrolls.update=function(l){for(var s=0;s").addClass("scroll-wrapper").addClass(i.attr("class")).css("position","absolute"==i.css("position")?"absolute":"relative").insertBefore(i).append(i),i.is("textarea")&&(this.containerWrapper=r=l("
").insertBefore(i).append(i),d.addClass("scroll-textarea")),r.addClass("scroll-content"),i.on("scroll"+n,l.proxy(function(){l.isFunction(this.options.onScroll)&&this.options.onScroll.call(this,{scroll:this.container.scrollTop(),size:this.dimensions.scrollHeight,visible:this.dimensions.visibleHeight},{scroll:this.container.scrollLeft(),size:this.dimensions.scrollWidth,visible:this.dimensions.visibleWidth}),this.scrollx.isVisible&&this.scrollx.scroll.bar.css("left",i.scrollLeft()*this.scrollx.kx+"px"),this.scrolly.isVisible&&this.scrolly.scroll.bar.css("top",i.scrollTop()*this.scrolly.kx+"px")},this)),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),a.disableBodyScroll){var p=function(l){s(l)?c.y.isVisible&&c.y.mousewheel(l):c.x.isVisible&&c.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),e.isMobile&&d.on("touchstart"+n,function(s){var e=s.originalEvent.touches&&s.originalEvent.touches[0]||s,o={pageX:e.pageX,pageY:e.pageY},t={left:i.scrollLeft(),top:i.scrollTop()};l(document).on("touchmove"+n,function(l){var s=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;i.scrollLeft(t.left+o.pageX-s.pageX),i.scrollTop(t.top+o.pageY-s.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(a.onInit)&&a.onInit.apply(this,[i])}r.css({height:"auto","margin-bottom":-1*e.scroll.height+"px","margin-right":-1*e.scroll.width+"px","max-height":""}),l.each(c,function(e,o){var r=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=a.scrollStep,u=function(){var l=i[h]();i[h](l+p),1==d&&l+p>=f&&(l=i[h]()),-1==d&&f>=l+p&&(l=i[h]()),i[h]()==l&&r&&r()},f=0;o.scroll||(o.scroll=t._getScroll(a["scroll"+e]).addClass("scroll-"+e),a.showArrows&&o.scroll.addClass("scroll-element_arrows_visible"),o.mousewheel=function(l){if(!o.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return c.x.mousewheel(l),!0;var r=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=o.size-o.visible-o.offset;return(r>0&&n>f||0>r&&f>0)&&(f+=r,0>f&&(f=0),f>n&&(f=n),t.scrollTo=t.scrollTo||{},t.scrollTo[h]=f,setTimeout(function(){t.scrollTo&&(i.stop().animate(t.scrollTo,240,"linear",function(){f=i[h]()}),t.scrollTo=null)},1)),l.preventDefault(),!1},o.scroll.on("MozMousePixelScroll"+n,o.mousewheel).on("mousewheel"+n,o.mousewheel).on("mouseenter"+n,function(){f=i[h]()}),o.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:o.size-o.visible-o.offset,scrollbarOffset:o.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:o.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},c=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=a.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset").prependTo("body").attr("style","border:none;margin:0;padding:0;height:100px;width:100px;position:absolute;overflow:scroll;left:-1000px;top:-1000px;"),e.data.inner=l("
").appendTo(e.data.outer).attr("style","border:none;margin:0;padding:0;height:100%;width:100%;position:absolute;")),{height:e.data.outer.height()-e.data.inner.height(),width:e.data.outer.width()-e.data.inner.width()}},_getDimensions:function(){var l=this.container,s=this.wrapper;return{scrollHeight:l.prop("scrollHeight"),scrollWidth:l.prop("scrollWidth"),visibleHeight:s.height()+(parseInt(l.css("top"),10)||0),visibleWidth:s.width()+(parseInt(l.css("left"),10)||0)}},_getScroll:function(s){var e={advanced:['
','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return e[s]&&(s=e[s]),s||(s=e.simple),s="string"==typeof s?l(s).appendTo(this.wrapper):l(s),l.extend(s,{bar:s.find(".scroll-bar"),size:s.find(".scroll-element_size"),track:s.find(".scroll-element_track")}),s},_handleMouseDown:function(s,e){var o=this.namespace;return l(document).on("blur"+o,function(){l(document).add("body").off(o),s&&s()}),l(document).on("dragstart"+o,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+o,function(){l(document).add("body").off(o),s&&s()}),l("body").on("selectstart"+o,function(l){return l.preventDefault(),!1}),e&&e.preventDefault(),!1},_isChanged:function(){var s=!1,e=this._getDimensions(),o=this.dimensions;return l.each(e,function(l,e){return o[l]!==e?(s=!0,!1):void 0}),this.dimensions=e,s&&this.options.debug&&window.console&&console.log(this.dimensions),s},_updateScroll:function(l,s){var o=this.container,t=this.containerWrapper||o,i="scroll-scroll"+l+"_visible",r="x"===l?this.scrolly:this.scrollx,n=(this.wrapper,this.dimensions["x"===l?"scrollWidth":"scrollHeight"]),a=this.dimensions["x"===l?"visibleWidth":"visibleHeight"];s.isVisible=n-a>1,t.add(s.scroll).add(r.scroll)[s.isVisible?"addClass":"removeClass"](i),"y"===l&&t.css(o.is("textarea")||a>n?{height:a+e.scroll.height+"px","max-height":"none"}:{"max-height":a+e.scroll.height+"px"}),this._isChanged()&&this._updateScroll("x"===l?"y":"x",r)},_updateScrollSize:function(l,s){var e="x"===l?"left":"top",o="x"===l?"outerWidth":"outerHeight",t="x"===l?"width":"height",i=this.dimensions["x"===l?"scrollWidth":"scrollHeight"],r=this.dimensions["x"===l?"visibleWidth":"visibleHeight"],n=s.scroll.size[o]()+(parseInt(s.scroll.size.css(e),10)||0);this.options.autoScrollSize&&(s.scrollbarSize=parseInt(n*r/i,10),s.scroll.bar.css(t,s.scrollbarSize+"px")),s.scrollbarSize=s.scroll.bar[o](),s.kx=(n-s.scrollbarSize)/(i-r)||1}};var i=function(){e.scroll||l(window).resize(l.proxy(function(){var l=!1;if(e.scroll&&!e.isOverlay){var s=this._getBrowserScrollSize();(s.height!==e.scroll.height||s.width!==e.scroll.width)&&(e.scroll=s,l=!0)}e.scrolls.update(l)},this)),t.apply(this,arguments)};i.prototype=l.extend({},t.prototype,{});var r=function(){i.apply(this,arguments)};r.prototype=l.extend({},i.prototype,{});var n=function(){i.apply(this,arguments)};n.prototype=l.extend({},i.prototype,{});var a=function(){t.apply(this,arguments)};a.prototype=l.extend({},t.prototype,{});var c=i;switch(!0){case e.isFF:c=r;break;case e.isIE:c=n;break;case e.isWebkit:c=a}l.fn.scrollbar=function(s,o){return"string"!=typeof s&&(o=s,s="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var t=l(this),i=t.data(e.data.name);(i||"init"===s)&&(i||(i=new c(t)),i[s]&&i[s].apply(i,o))}),this},l.fn.scrollbar.options=o,window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){return{setOptions:function(s){l.extend(o,s)},$get:function(){return{options:l.copy(o)}}}}).directive("jqueryScrollbar",function(l,s){return{restrict:"AC",link:function(e,o,t){var i=s(t.jqueryScrollbar),r=i(e);o.scrollbar(r||l.options).on("$destroy",function(){o.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file +!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
").css(l.extend({},o)),t.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:/mac/i.test(navigator.platform),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"==r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var p=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=c.scrollStep,u=function(){var l=r[h]();r[h](l+p),1==d&&l+p>=f&&(l=r[h]()),-1==d&&f>=l+p&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>f||0>i&&f>0)&&(f+=i,0>f&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&r.css(s.is("textarea")||h>d?{height:h+t.scroll.height+"px","max-height":"none"}:{"max-height":h+t.scroll.height+"px"}),(o.size!=s.prop("scrollWidth")||n.size!=s.prop("scrollHeight")||o.visible!=a.width()||n.visible!=a.height()||o.offset!=(parseInt(s.css("left"),10)||0)||n.offset!=(parseInt(s.css("top"),10)||0))&&(l.extend(this.scrollx,{offset:parseInt(s.css("left"),10)||0,size:s.prop("scrollWidth"),visible:a.width()}),l.extend(this.scrolly,{offset:parseInt(s.css("top"),10)||0,size:this.container.prop("scrollHeight"),visible:a.height()}),this._updateScroll("x"===e?"y":"x",n))}};var c=n;l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new c(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var a=function(){var l=0,e=0;return function(o){var s,i,n,c,d,h,p;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file From 1330b66b0393ef114895b3ea49695c91db5c281c Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Tue, 8 Sep 2015 23:08:31 +0500 Subject: [PATCH 18/32] update changelog: note changes in default values --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7880512..ee3cf48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Add Meteor/Node modules support
Fix bug when removed content does not update element's height
Fix bug with textarea in non-webkit browsers
Update webkit-based browser detection to ignore Microsoft Edge browser
+Change default values for ignoreMobile/ignoreOverlay to false

v0.2.7 (20150122)

Small fixes
@@ -11,7 +12,7 @@ Small fixes
Re-register plugin in jQuery plugins repository

v0.2.5 (20141119)

-Add option ignoreOverlay
+Add option ignoreOverlay with default value true
Fix webkit-based browser detection
Ignore Firefox in Mac OS (cannot hide native scrollbars)
From 7babd29085f85e53a570f8554156dee0138b1c93 Mon Sep 17 00:00:00 2001 From: Leonidas Arvanitis Date: Fri, 9 Oct 2015 14:15:27 +0300 Subject: [PATCH 19/32] Fix minification of angular directive Explicitly set injectables in `jqueryScrollbar` directive so that it survives after variable mangling minification (uglify etc.). --- jquery.scrollbar.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index f78962b..bd82315 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -763,7 +763,7 @@ } }; }) - .directive('jqueryScrollbar', function (jQueryScrollbar, $parse) { + .directive('jqueryScrollbar', ['jQueryScrollbar', '$parse', function (jQueryScrollbar, $parse) { return { "restrict": "AC", "link": function (scope, element, attrs) { @@ -775,7 +775,7 @@ }); } }; - }); + }]); })(window.angular); } -})); \ No newline at end of file +})); From 8cbc3af60a494878337684a6f1f4a1cd14c4fd36 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Thu, 22 Oct 2015 08:32:18 +0500 Subject: [PATCH 20/32] increase version to update bower repository --- CHANGELOG.md | 3 +++ bower.json | 2 +- jquery.scrollbar.js | 2 +- jquery.scrollbar.min.js | 2 +- package.json | 2 +- scrollbar.jquery.json | 2 +- 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee3cf48..5eb365c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +

v0.2.9 (20151022)

+Increase version to update bower repository +

v0.2.8 (20150723)

Add Meteor/Node modules support
Fix bug when removed content does not update element's height
diff --git a/bower.json b/bower.json index 61388ff..f49d292 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.8", + "version": "0.2.9", "main": [ "./jquery.scrollbar.js", "./jquery.scrollbar.css" diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index f78962b..a877a3f 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -7,7 +7,7 @@ * If you found bug, please contact me via email <13real008@gmail.com> * * @author Yuriy Khabarov aka Gromo - * @version 0.2.8 + * @version 0.2.9 * @url https://github.com/gromo/jquery.scrollbar/ * */ diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 9e81163..f778396 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -9,7 +9,7 @@ * Compressed by http://jscompress.com/ * * @author Yuriy Khabarov aka Gromo - * @version 0.2.8 + * @version 0.2.9 * @url https://github.com/gromo/jquery.scrollbar/ * */ diff --git a/package.json b/package.json index 34dd50b..563d2cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.8", + "version": "0.2.9", "description": "Cross-browser CSS customizable scrollbar", "main": "index.js", "scripts": { diff --git a/scrollbar.jquery.json b/scrollbar.jquery.json index 1da2dd2..50473b8 100644 --- a/scrollbar.jquery.json +++ b/scrollbar.jquery.json @@ -6,7 +6,7 @@ "scroll", "scrollbar" ], - "version": "0.2.8", + "version": "0.2.9", "author": { "name": "Yuriy Khabarov", "email": "13real008@gmail.com" From 4dfb0701a9b23bad9d07df4af425d7f9f575f5e5 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Fri, 11 Dec 2015 09:24:32 +0500 Subject: [PATCH 21/32] add Angular directive dependencies as string to minified version --- jquery.scrollbar.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index f778396..464abbb 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -13,4 +13,4 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
").css(l.extend({},o)),t.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:/mac/i.test(navigator.platform),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"==r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var p=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=c.scrollStep,u=function(){var l=r[h]();r[h](l+p),1==d&&l+p>=f&&(l=r[h]()),-1==d&&f>=l+p&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>f||0>i&&f>0)&&(f+=i,0>f&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&r.css(s.is("textarea")||h>d?{height:h+t.scroll.height+"px","max-height":"none"}:{"max-height":h+t.scroll.height+"px"}),(o.size!=s.prop("scrollWidth")||n.size!=s.prop("scrollHeight")||o.visible!=a.width()||n.visible!=a.height()||o.offset!=(parseInt(s.css("left"),10)||0)||n.offset!=(parseInt(s.css("top"),10)||0))&&(l.extend(this.scrollx,{offset:parseInt(s.css("left"),10)||0,size:s.prop("scrollWidth"),visible:a.width()}),l.extend(this.scrolly,{offset:parseInt(s.css("top"),10)||0,size:this.container.prop("scrollHeight"),visible:a.height()}),this._updateScroll("x"===e?"y":"x",n))}};var c=n;l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new c(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var a=function(){var l=0,e=0;return function(o){var s,i,n,c,d,h,p;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}})}(window.angular)}); \ No newline at end of file +!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
").css(l.extend({},o)),t.data.outer=l("
").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:/mac/i.test(navigator.platform),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"==r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(e){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var p=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=c.scrollStep,u=function(){var l=r[h]();r[h](l+p),1==d&&l+p>=f&&(l=r[h]()),-1==d&&f>=l+p&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>f||0>i&&f>0)&&(f+=i,0>f&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
','
','
','
','
','
','
','
',"
","
",'
','
','
',"
",'
','
',"
","
","
"].join(""),simple:['
','
','
','
','
',"
","
"].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&(s.is("textarea")||h>d?r.css({height:h+t.scroll.height+"px","max-height":"none"}):r.css({"max-height":h+t.scroll.height+"px"})),(o.size!=s.prop("scrollWidth")||n.size!=s.prop("scrollHeight")||o.visible!=a.width()||n.visible!=a.height()||o.offset!=(parseInt(s.css("left"),10)||0)||n.offset!=(parseInt(s.css("top"),10)||0))&&(l.extend(this.scrollx,{offset:parseInt(s.css("left"),10)||0,size:s.prop("scrollWidth"),visible:a.width()}),l.extend(this.scrolly,{offset:parseInt(s.css("top"),10)||0,size:this.container.prop("scrollHeight"),visible:a.height()}),this._updateScroll("x"===e?"y":"x",n))}};var c=n;l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new c(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var a=function(){var l=0,e=0;return function(o){var s,i,n,c,d,h,p;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file From 058c143d6623f8d39cd45becc1205b9aee325246 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Wed, 16 Dec 2015 09:54:27 +0500 Subject: [PATCH 22/32] increase version to update bower repository --- CHANGELOG.md | 3 +++ bower.json | 2 +- jquery.scrollbar.js | 2 +- jquery.scrollbar.min.js | 2 +- package.js | 2 +- package.json | 2 +- scrollbar.jquery.json | 2 +- 7 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5eb365c..8cad711 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +

v0.2.10 (20151216)

+Increase version to update bower repository +

v0.2.9 (20151022)

Increase version to update bower repository diff --git a/bower.json b/bower.json index f49d292..5acf670 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.9", + "version": "0.2.10", "main": [ "./jquery.scrollbar.js", "./jquery.scrollbar.css" diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 87e95b2..0f7e3d9 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -7,7 +7,7 @@ * If you found bug, please contact me via email <13real008@gmail.com> * * @author Yuriy Khabarov aka Gromo - * @version 0.2.9 + * @version 0.2.10 * @url https://github.com/gromo/jquery.scrollbar/ * */ diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 464abbb..14031fd 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -9,7 +9,7 @@ * Compressed by http://jscompress.com/ * * @author Yuriy Khabarov aka Gromo - * @version 0.2.9 + * @version 0.2.10 * @url https://github.com/gromo/jquery.scrollbar/ * */ diff --git a/package.js b/package.js index dc31481..f5d26cf 100644 --- a/package.js +++ b/package.js @@ -6,7 +6,7 @@ var where = 'client'; // where to install: 'client' or 'server'. For both, pass Package.describe({ name: packageName, - version: '0.0.1', + version: '0.2.10', // Brief, one-line summary of the package. summary: 'Cross-browser CSS customizable scrollbar with advanced features.', // URL to the Git repository containing the source code for this package. diff --git a/package.json b/package.json index 563d2cc..6ac22cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.9", + "version": "0.2.10", "description": "Cross-browser CSS customizable scrollbar", "main": "index.js", "scripts": { diff --git a/scrollbar.jquery.json b/scrollbar.jquery.json index 50473b8..01e3941 100644 --- a/scrollbar.jquery.json +++ b/scrollbar.jquery.json @@ -6,7 +6,7 @@ "scroll", "scrollbar" ], - "version": "0.2.9", + "version": "0.2.10", "author": { "name": "Yuriy Khabarov", "email": "13real008@gmail.com" From 03646e85728f3c2c1eef6acdcf070c485545b923 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Wed, 10 Feb 2016 00:34:47 +0500 Subject: [PATCH 23/32] Add note about ignoring FF on Apple --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 09b2cfd..c4b58f5 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Cross-browser CSS customizable scrollbar with advanced features:
  • Vertical, horizontal or both scrollbars
  • Automatically reinitialize scrollbar
  • External scrollbars support
  • -
  • Browser support: IE7+, Firefox, Opera, Chrome, Safari
  • +
  • Browser support: IE7+, Firefox1, Opera, Chrome, Safari
  • jQuery Scrollbar as Angular.JS directive
  • Textarea scrollbar
  • @@ -22,3 +22,5 @@ Cross-browser CSS customizable scrollbar with advanced features:

    Documentation

    Changelog

    Download

    + +1 There is known issue that native browser scrollbar cannot be hidden in Firefox on Apple devices, so this plugin is not initialized and you will see native scrollbars. From 5ddddd860b07f72aa95690df1f885181ec9ae877 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Wed, 17 Feb 2016 09:11:08 +0500 Subject: [PATCH 24/32] Update download link in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c4b58f5..dd18a9b 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,6 @@ Cross-browser CSS customizable scrollbar with advanced features:

    Documentation

    Changelog

    -

    Download

    +

    Download

    1 There is known issue that native browser scrollbar cannot be hidden in Firefox on Apple devices, so this plugin is not initialized and you will see native scrollbars. From a4d6310150945ded43c839140df637a07ea12305 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Thu, 7 Apr 2016 09:36:26 +0500 Subject: [PATCH 25/32] add onFallback callback --- jquery.scrollbar.js | 6 +++++- jquery.scrollbar.min.js | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 0f7e3d9..5e13f6f 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -63,6 +63,7 @@ "scrolly": null, // vertical scroll element "onDestroy": null, // callback function on destroy, + "onFallback": null, // callback function if scrollbar is not initialized "onInit": null, // callback function on first initialization "onScroll": null, // callback function on content scrolling "onUpdate": null // callback function on init/resize (before scrollbar size calculation) @@ -157,13 +158,16 @@ || (browser.overlay && o.ignoreOverlay) || (browser.macosx && !browser.webkit) // still required to ignore nonWebKit browsers on Mac ) { + if ($.isFunction(o.onFallback)){ + o.onFallback.apply(this, [c]); + } return false; } // init scroll container if (!w) { this.wrapper = w = $('
    ').addClass('scroll-wrapper').addClass(c.attr('class')) - .css('position', c.css('position') == 'absolute' ? 'absolute' : 'relative') + .css('position', c.css('position') === 'absolute' ? 'absolute' : 'relative') .insertBefore(c).append(c); if (c.is('textarea')) { diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 14031fd..2bc8ab0 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -13,4 +13,4 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
    ").css(l.extend({},o)),t.data.outer=l("
    ").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:/mac/i.test(navigator.platform),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
    ").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"==r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
    ").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(e){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var p=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=c.scrollStep,u=function(){var l=r[h]();r[h](l+p),1==d&&l+p>=f&&(l=r[h]()),-1==d&&f>=l+p&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>f||0>i&&f>0)&&(f+=i,0>f&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&(s.is("textarea")||h>d?r.css({height:h+t.scroll.height+"px","max-height":"none"}):r.css({"max-height":h+t.scroll.height+"px"})),(o.size!=s.prop("scrollWidth")||n.size!=s.prop("scrollHeight")||o.visible!=a.width()||n.visible!=a.height()||o.offset!=(parseInt(s.css("left"),10)||0)||n.offset!=(parseInt(s.css("top"),10)||0))&&(l.extend(this.scrollx,{offset:parseInt(s.css("left"),10)||0,size:s.prop("scrollWidth"),visible:a.width()}),l.extend(this.scrolly,{offset:parseInt(s.css("top"),10)||0,size:this.container.prop("scrollHeight"),visible:a.height()}),this._updateScroll("x"===e?"y":"x",n))}};var c=n;l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new c(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var a=function(){var l=0,e=0;return function(o){var s,i,n,c,d,h,p;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file +!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
    ").css(l.extend({},o)),t.data.outer=l("
    ").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:/mac/i.test(navigator.platform),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return l.isFunction(c.onFallback)&&c.onFallback.apply(this,[r]),!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
    ").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"===r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
    ").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(e){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var p=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=c.scrollStep,u=function(){var l=r[h]();r[h](l+p),1==d&&l+p>=f&&(l=r[h]()),-1==d&&f>=l+p&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>f||0>i&&f>0)&&(f+=i,0>f&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&(s.is("textarea")||h>d?r.css({height:h+t.scroll.height+"px","max-height":"none"}):r.css({"max-height":h+t.scroll.height+"px"})),(o.size!=s.prop("scrollWidth")||n.size!=s.prop("scrollHeight")||o.visible!=a.width()||n.visible!=a.height()||o.offset!=(parseInt(s.css("left"),10)||0)||n.offset!=(parseInt(s.css("top"),10)||0))&&(l.extend(this.scrollx,{offset:parseInt(s.css("left"),10)||0,size:s.prop("scrollWidth"),visible:a.width()}),l.extend(this.scrolly,{offset:parseInt(s.css("top"),10)||0,size:this.container.prop("scrollHeight"),visible:a.height()}),this._updateScroll("x"===e?"y":"x",n))}};var c=n;l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new c(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var a=function(){var l=0,e=0;return function(o){var s,i,n,c,d,h,p;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file From dc6939f772d1f1c00a04e4b4c4eab97fddf6b098 Mon Sep 17 00:00:00 2001 From: Serhii P Date: Wed, 3 Aug 2016 18:26:40 +0300 Subject: [PATCH 26/32] fix mozilla FF with disableBodyScroll --- jquery.scrollbar.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 5e13f6f..d0fef7d 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -290,6 +290,15 @@ var delta = event.originalEvent.wheelDelta * -1 || event.originalEvent.detail; var maxScrollValue = scrollx.size - scrollx.visible - scrollx.offset; + // fix new mozilla + if (!delta) { + if (d === 'x' && !!event.originalEvent.deltaX) { + delta = event.originalEvent.deltaX * 40; + } else if (d === 'y' && !!event.originalEvent.deltaY) { + delta = event.originalEvent.deltaY * 40; + } + } + if ((delta > 0 && scrollToValue < maxScrollValue) || (delta < 0 && scrollToValue > 0)) { scrollToValue = scrollToValue + delta; if (scrollToValue < 0) From bb79b8bd905e8e95cbb66164cfe11136ec66b6c6 Mon Sep 17 00:00:00 2001 From: Serhii P Date: Wed, 3 Aug 2016 18:34:22 +0300 Subject: [PATCH 27/32] update version --- CHANGELOG.md | 5 ++++- bower.json | 2 +- jquery.scrollbar.js | 2 +- jquery.scrollbar.min.js | 4 ++-- package.js | 2 +- package.json | 2 +- scrollbar.jquery.json | 2 +- 7 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cad711..c0a6748 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +

    v0.2.11 (20160803)

    +Fix bug with Mozilla FireFox +

    v0.2.10 (20151216)

    Increase version to update bower repository @@ -67,4 +70,4 @@ Fix webkit bug with text selection
    Handle mousedown instead of click on scrollbar track/arrows

    v0.0.2 (20130413)

    -First version
    \ No newline at end of file +First version
    diff --git a/bower.json b/bower.json index 5acf670..36deb3a 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.10", + "version": "0.2.11", "main": [ "./jquery.scrollbar.js", "./jquery.scrollbar.css" diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index d0fef7d..c8cfb72 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -7,7 +7,7 @@ * If you found bug, please contact me via email <13real008@gmail.com> * * @author Yuriy Khabarov aka Gromo - * @version 0.2.10 + * @version 0.2.11 * @url https://github.com/gromo/jquery.scrollbar/ * */ diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 2bc8ab0..9187107 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -9,8 +9,8 @@ * Compressed by http://jscompress.com/ * * @author Yuriy Khabarov aka Gromo - * @version 0.2.10 + * @version 0.2.11 * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
    ").css(l.extend({},o)),t.data.outer=l("
    ").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return e.axis&&e.axis===e.HORIZONTAL_AXIS?!1:e.wheelDeltaX?!1:!0}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:/mac/i.test(navigator.platform),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();(o.height!==t.scroll.height||o.width!==t.scroll.width)&&(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return l.isFunction(c.onFallback)&&c.onFallback.apply(this,[r]),!1;if(d)i.css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""});else{if(this.wrapper=d=l("
    ").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"===r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
    ").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":-1*t.scroll.height+"px","margin-right":-1*t.scroll.width+"px","max-height":""}),r.on("scroll"+n,function(e){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var p=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=c.scrollStep,u=function(){var l=r[h]();r[h](l+p),1==d&&l+p>=f&&(l=r[h]()),-1==d&&f>=l+p&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=-1*l.originalEvent.wheelDelta||l.originalEvent.detail,n=t.size-t.visible-t.offset;return(i>0&&n>f||0>i&&f>0)&&(f+=i,0>f&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&(s.is("textarea")||h>d?r.css({height:h+t.scroll.height+"px","max-height":"none"}):r.css({"max-height":h+t.scroll.height+"px"})),(o.size!=s.prop("scrollWidth")||n.size!=s.prop("scrollHeight")||o.visible!=a.width()||n.visible!=a.height()||o.offset!=(parseInt(s.css("left"),10)||0)||n.offset!=(parseInt(s.css("top"),10)||0))&&(l.extend(this.scrollx,{offset:parseInt(s.css("left"),10)||0,size:s.prop("scrollWidth"),visible:a.width()}),l.extend(this.scrolly,{offset:parseInt(s.css("top"),10)||0,size:this.container.prop("scrollHeight"),visible:a.height()}),this._updateScroll("x"===e?"y":"x",n))}};var c=n;l.fn.scrollbar=function(e,o){return"string"!=typeof e&&(o=e,e="init"),"undefined"==typeof o&&(o=[]),l.isArray(o)||(o=[o]),this.not("body, .scroll-wrapper").each(function(){var s=l(this),r=s.data(t.data.name);(r||"init"===e)&&(r||(r=new c(s)),r[e]&&r[e].apply(r,o))}),this},l.fn.scrollbar.options=i;var a=function(){var l=0,e=0;return function(o){var s,i,n,c,d,h,p;for(s=0;s10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file +!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
    ").css(l.extend({},o)),t.data.outer=l("
    ").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return(!e.axis||e.axis!==e.HORIZONTAL_AXIS)&&!e.wheelDeltaX}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:/mac/i.test(navigator.platform),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();o.height===t.scroll.height&&o.width===t.scroll.width||(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return l.isFunction(c.onFallback)&&c.onFallback.apply(this,[r]),!1;if(d)i.css({height:"auto","margin-bottom":t.scroll.height*-1+"px","margin-right":t.scroll.width*-1+"px","max-height":""});else{if(this.wrapper=d=l("
    ").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"===r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
    ").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":t.scroll.height*-1+"px","margin-right":t.scroll.width*-1+"px","max-height":""}),r.on("scroll"+n,function(e){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var p=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=c.scrollStep,u=function(){var l=r[h]();r[h](l+p),1==d&&l+p>=f&&(l=r[h]()),d==-1&&l+p<=f&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=l.originalEvent.wheelDelta*-1||l.originalEvent.detail,n=t.size-t.visible-t.offset;return i||("x"===e&&l.originalEvent.deltaX?i=40*l.originalEvent.deltaX:"y"===e&&l.originalEvent.deltaY&&(i=40*l.originalEvent.deltaY)),(i>0&&f<0&&f>0)&&(f+=i,f<0&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&(s.is("textarea")||d10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file diff --git a/package.js b/package.js index f5d26cf..6a5ad53 100644 --- a/package.js +++ b/package.js @@ -6,7 +6,7 @@ var where = 'client'; // where to install: 'client' or 'server'. For both, pass Package.describe({ name: packageName, - version: '0.2.10', + version: '0.2.11', // Brief, one-line summary of the package. summary: 'Cross-browser CSS customizable scrollbar with advanced features.', // URL to the Git repository containing the source code for this package. diff --git a/package.json b/package.json index 6ac22cf..3d7ba2a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.10", + "version": "0.2.11", "description": "Cross-browser CSS customizable scrollbar", "main": "index.js", "scripts": { diff --git a/scrollbar.jquery.json b/scrollbar.jquery.json index 01e3941..fa0156b 100644 --- a/scrollbar.jquery.json +++ b/scrollbar.jquery.json @@ -6,7 +6,7 @@ "scroll", "scrollbar" ], - "version": "0.2.10", + "version": "0.2.11", "author": { "name": "Yuriy Khabarov", "email": "13real008@gmail.com" From 5c31cf9b418ec361fee9ad8c07917f7f7119946f Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Sun, 14 Aug 2016 23:36:45 +0500 Subject: [PATCH 28/32] add isRtl support: step 1 --- .gitignore | 4 + jquery.scrollbar.css | 1099 ++++++++++++++++++++---------------- jquery.scrollbar.js | 190 ++++--- sass/Gruntfile.js | 22 + sass/config.rb | 2 + sass/jquery.scrollbar.scss | 793 ++++++++++++++++++++++++++ sass/package.json | 9 + 7 files changed, 1541 insertions(+), 578 deletions(-) create mode 100644 .gitignore create mode 100644 sass/Gruntfile.js create mode 100644 sass/config.rb create mode 100644 sass/jquery.scrollbar.scss create mode 100644 sass/package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5818f63 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.netbeans.xml +.sass-cache +node_modules +nbproject \ No newline at end of file diff --git a/jquery.scrollbar.css b/jquery.scrollbar.css index 9f4e5ba..e0a7df5 100644 --- a/jquery.scrollbar.css +++ b/jquery.scrollbar.css @@ -1,791 +1,904 @@ /*************** SCROLLBAR BASE CSS ***************/ - .scroll-wrapper { - overflow: hidden !important; - padding: 0 !important; - position: relative; + overflow: hidden !important; + padding: 0 !important; + position: relative; } - .scroll-wrapper > .scroll-content { - border: none !important; - box-sizing: content-box !important; - height: auto; - left: 0; - margin: 0; - max-height: none; - max-width: none !important; - overflow: scroll !important; - padding: 0; - position: relative !important; - top: 0; - width: auto !important; + border: none !important; + box-sizing: content-box !important; + height: auto; + left: 0; + margin: 0; + max-height: none; + max-width: none !important; + overflow: scroll !important; + padding: 0; + position: relative !important; + top: 0; + width: auto !important; } - .scroll-wrapper > .scroll-content::-webkit-scrollbar { - height: 0; - width: 0; + height: 0; + width: 0; +} +.scroll-wrapper.scroll--rtl { + direction: rtl; } .scroll-element { - display: none; -} -.scroll-element, .scroll-element div { - box-sizing: content-box; + box-sizing: content-box; + display: none; } - -.scroll-element.scroll-x.scroll-scrollx_visible, -.scroll-element.scroll-y.scroll-scrolly_visible { - display: block; +.scroll-element div { + box-sizing: content-box; } - .scroll-element .scroll-bar, .scroll-element .scroll-arrow { - cursor: default; + cursor: default; +} +.scroll-element.scroll-x.scroll-scrollx_visible, .scroll-element.scroll-y.scroll-scrolly_visible { + display: block; } .scroll-textarea { - border: 1px solid #cccccc; - border-top-color: #999999; + border: 1px solid #cccccc; + border-top-color: #999999; } .scroll-textarea > .scroll-content { - overflow: hidden !important; + overflow: hidden !important; } .scroll-textarea > .scroll-content > textarea { - border: none !important; - box-sizing: border-box; - height: 100% !important; - margin: 0; - max-height: none !important; - max-width: none !important; - overflow: scroll !important; - outline: none; - padding: 2px; - position: relative !important; - top: 0; - width: 100% !important; + border: none !important; + box-sizing: border-box; + height: 100% !important; + margin: 0; + max-height: none !important; + max-width: none !important; + overflow: scroll !important; + outline: none; + padding: 2px; + position: relative !important; + top: 0; + width: 100% !important; } .scroll-textarea > .scroll-content > textarea::-webkit-scrollbar { - height: 0; - width: 0; + height: 0; + width: 0; } - - - - - - - - /*************** SIMPLE INNER SCROLLBAR ***************/ - .scrollbar-inner > .scroll-element, -.scrollbar-inner > .scroll-element div -{ - border: none; - margin: 0; - padding: 0; - position: absolute; - z-index: 10; +.scrollbar-inner > .scroll-element div { + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; } .scrollbar-inner > .scroll-element div { - display: block; - height: 100%; - left: 0; - top: 0; - width: 100%; + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; } .scrollbar-inner > .scroll-element.scroll-x { - bottom: 2px; - height: 8px; - left: 0; - width: 100%; + bottom: 2px; + height: 8px; + left: 0; + width: 100%; } .scrollbar-inner > .scroll-element.scroll-y { - height: 100%; - right: 2px; - top: 0; - width: 8px; + height: 100%; + right: 2px; + top: 0; + width: 8px; } .scrollbar-inner > .scroll-element .scroll-element_outer { - overflow: hidden; + overflow: hidden; } .scrollbar-inner > .scroll-element .scroll-element_outer, .scrollbar-inner > .scroll-element .scroll-element_track, .scrollbar-inner > .scroll-element .scroll-bar { - -webkit-border-radius: 8px; - -moz-border-radius: 8px; - border-radius: 8px; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; } .scrollbar-inner > .scroll-element .scroll-element_track, .scrollbar-inner > .scroll-element .scroll-bar { - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; - filter: alpha(opacity=40); - opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + opacity: 0.4; } -.scrollbar-inner > .scroll-element .scroll-element_track { background-color: #e0e0e0; } -.scrollbar-inner > .scroll-element .scroll-bar { background-color: #c2c2c2; } -.scrollbar-inner > .scroll-element:hover .scroll-bar { background-color: #919191; } -.scrollbar-inner > .scroll-element.scroll-draggable .scroll-bar { background-color: #919191; } - - -/* update scrollbar offset if both scrolls are visible */ - -.scrollbar-inner > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -12px; } -.scrollbar-inner > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -12px; } - - -.scrollbar-inner > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -12px; } -.scrollbar-inner > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -12px; } - - +.scrollbar-inner > .scroll-element .scroll-element_track { + background-color: #e0e0e0; +} +.scrollbar-inner > .scroll-element .scroll-bar { + background-color: #c2c2c2; +} +.scrollbar-inner > .scroll-element:hover .scroll-bar { + background-color: #919191; +} +.scrollbar-inner > .scroll-element.scroll-draggable .scroll-bar { + background-color: #919191; +} +/* update scrollbar offset if both scrolls are visible */ +.scrollbar-inner > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { + left: -12px; +} +.scrollbar-inner > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { + top: -12px; +} +.scrollbar-inner > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { + left: -12px; +} +.scrollbar-inner > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { + top: -12px; +} /*************** SIMPLE OUTER SCROLLBAR ***************/ - .scrollbar-outer > .scroll-element, -.scrollbar-outer > .scroll-element div -{ - border: none; - margin: 0; - padding: 0; - position: absolute; - z-index: 10; +.scrollbar-outer > .scroll-element div { + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; } .scrollbar-outer > .scroll-element { - background-color: #ffffff; + background-color: #ffffff; } .scrollbar-outer > .scroll-element div { - display: block; - height: 100%; - left: 0; - top: 0; - width: 100%; + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; } .scrollbar-outer > .scroll-element.scroll-x { - bottom: 0; - height: 12px; - left: 0; - width: 100%; + bottom: 0; + height: 12px; + left: 0; + width: 100%; } .scrollbar-outer > .scroll-element.scroll-y { - height: 100%; - right: 0; - top: 0; - width: 12px; + height: 100%; + right: 0; + top: 0; + width: 12px; +} + +.scrollbar-outer > .scroll-element.scroll-x .scroll-element_outer { + height: 8px; + top: 2px; } -.scrollbar-outer > .scroll-element.scroll-x .scroll-element_outer { height: 8px; top: 2px; } -.scrollbar-outer > .scroll-element.scroll-y .scroll-element_outer { left: 2px; width: 8px; } +.scrollbar-outer > .scroll-element.scroll-y .scroll-element_outer { + left: 2px; + width: 8px; +} -.scrollbar-outer > .scroll-element .scroll-element_outer { overflow: hidden; } -.scrollbar-outer > .scroll-element .scroll-element_track { background-color: #eeeeee; } +.scrollbar-outer > .scroll-element .scroll-element_outer { + overflow: hidden; +} + +.scrollbar-outer > .scroll-element .scroll-element_track { + background-color: #eeeeee; +} .scrollbar-outer > .scroll-element .scroll-element_outer, .scrollbar-outer > .scroll-element .scroll-element_track, .scrollbar-outer > .scroll-element .scroll-bar { - -webkit-border-radius: 8px; - -moz-border-radius: 8px; - border-radius: 8px; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; } -.scrollbar-outer > .scroll-element .scroll-bar { background-color: #d9d9d9; } -.scrollbar-outer > .scroll-element .scroll-bar:hover { background-color: #c2c2c2; } -.scrollbar-outer > .scroll-element.scroll-draggable .scroll-bar { background-color: #919191; } +.scrollbar-outer > .scroll-element .scroll-bar { + background-color: #d9d9d9; +} +.scrollbar-outer > .scroll-element .scroll-bar:hover { + background-color: #c2c2c2; +} + +.scrollbar-outer > .scroll-element.scroll-draggable .scroll-bar { + background-color: #919191; +} /* scrollbar height/width & offset from container borders */ +.scrollbar-outer > .scroll-content.scroll-scrolly_visible { + left: -12px; + margin-left: 12px; +} -.scrollbar-outer > .scroll-content.scroll-scrolly_visible { left: -12px; margin-left: 12px; } -.scrollbar-outer > .scroll-content.scroll-scrollx_visible { top: -12px; margin-top: 12px; } +.scrollbar-outer > .scroll-content.scroll-scrollx_visible { + top: -12px; + margin-top: 12px; +} -.scrollbar-outer > .scroll-element.scroll-x .scroll-bar { min-width: 10px; } -.scrollbar-outer > .scroll-element.scroll-y .scroll-bar { min-height: 10px; } +.scrollbar-outer > .scroll-element.scroll-x .scroll-bar { + min-width: 10px; +} +.scrollbar-outer > .scroll-element.scroll-y .scroll-bar { + min-height: 10px; +} /* update scrollbar offset if both scrolls are visible */ +.scrollbar-outer > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { + left: -14px; +} -.scrollbar-outer > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -14px; } -.scrollbar-outer > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -14px; } - -.scrollbar-outer > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -14px; } -.scrollbar-outer > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -14px; } - - - - - - - +.scrollbar-outer > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { + top: -14px; +} +.scrollbar-outer > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { + left: -14px; +} +.scrollbar-outer > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { + top: -14px; +} /*************** SCROLLBAR MAC OS X ***************/ - .scrollbar-macosx > .scroll-element, -.scrollbar-macosx > .scroll-element div -{ - background: none; - border: none; - margin: 0; - padding: 0; - position: absolute; - z-index: 10; +.scrollbar-macosx > .scroll-element div { + background: none; + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; } .scrollbar-macosx > .scroll-element div { - display: block; - height: 100%; - left: 0; - top: 0; - width: 100%; + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; } -.scrollbar-macosx > .scroll-element .scroll-element_track { display: none; } -.scrollbar-macosx > .scroll-element .scroll-bar { - background-color: #6C6E71; - display: block; - - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: alpha(opacity=0); - opacity: 0; - - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - border-radius: 7px; +.scrollbar-macosx > .scroll-element .scroll-element_track { + display: none; +} - -webkit-transition: opacity 0.2s linear; - -moz-transition: opacity 0.2s linear; - -o-transition: opacity 0.2s linear; - -ms-transition: opacity 0.2s linear; - transition: opacity 0.2s linear; +.scrollbar-macosx > .scroll-element .scroll-bar { + background-color: #6C6E71; + display: block; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + -ms-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; } + .scrollbar-macosx:hover > .scroll-element .scroll-bar, .scrollbar-macosx > .scroll-element.scroll-draggable .scroll-bar { - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; - filter: alpha(opacity=70); - opacity: 0.7; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); + opacity: 0.7; } - .scrollbar-macosx > .scroll-element.scroll-x { - bottom: 0px; - height: 0px; - left: 0; - min-width: 100%; - overflow: visible; - width: 100%; + bottom: 0px; + height: 0px; + left: 0; + min-width: 100%; + overflow: visible; + width: 100%; } .scrollbar-macosx > .scroll-element.scroll-y { - height: 100%; - min-height: 100%; - right: 0px; - top: 0; - width: 0px; + height: 100%; + min-height: 100%; + right: 0px; + top: 0; + width: 0px; } /* scrollbar height/width & offset from container borders */ -.scrollbar-macosx > .scroll-element.scroll-x .scroll-bar { height: 7px; min-width: 10px; top: -9px; } -.scrollbar-macosx > .scroll-element.scroll-y .scroll-bar { left: -9px; min-height: 10px; width: 7px; } - -.scrollbar-macosx > .scroll-element.scroll-x .scroll-element_outer { left: 2px; } -.scrollbar-macosx > .scroll-element.scroll-x .scroll-element_size { left: -4px; } - -.scrollbar-macosx > .scroll-element.scroll-y .scroll-element_outer { top: 2px; } -.scrollbar-macosx > .scroll-element.scroll-y .scroll-element_size { top: -4px; } - -/* update scrollbar offset if both scrolls are visible */ -.scrollbar-macosx > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -11px; } -.scrollbar-macosx > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -11px; } - - +.scrollbar-macosx > .scroll-element.scroll-x .scroll-bar { + height: 7px; + min-width: 10px; + top: -9px; +} +.scrollbar-macosx > .scroll-element.scroll-y .scroll-bar { + left: -9px; + min-height: 10px; + width: 7px; +} +.scrollbar-macosx > .scroll-element.scroll-x .scroll-element_outer { + left: 2px; +} +.scrollbar-macosx > .scroll-element.scroll-x .scroll-element_size { + left: -4px; +} +.scrollbar-macosx > .scroll-element.scroll-y .scroll-element_outer { + top: 2px; +} +.scrollbar-macosx > .scroll-element.scroll-y .scroll-element_size { + top: -4px; +} +/* update scrollbar offset if both scrolls are visible */ +.scrollbar-macosx > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { + left: -11px; +} +.scrollbar-macosx > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { + top: -11px; +} /*************** SCROLLBAR LIGHT ***************/ - .scrollbar-light > .scroll-element, .scrollbar-light > .scroll-element div { - border: none; - margin: 0; - overflow: hidden; - padding: 0; - position: absolute; - z-index: 10; + border: none; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + z-index: 10; } .scrollbar-light > .scroll-element { - background-color: #ffffff; + background-color: #ffffff; } .scrollbar-light > .scroll-element div { - display: block; - height: 100%; - left: 0; - top: 0; - width: 100%; + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; } .scrollbar-light > .scroll-element .scroll-element_outer { - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; } .scrollbar-light > .scroll-element .scroll-element_size { - background: #dbdbdb; - background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2RiZGJkYiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlOGU4ZTgiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+'); - background: -moz-linear-gradient(left, #dbdbdb 0%, #e8e8e8 100%); - background: -webkit-gradient(linear, left top, right top, color-stop(0%,#dbdbdb), color-stop(100%,#e8e8e8)); - background: -webkit-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%); - background: -o-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%); - background: -ms-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%); - background: linear-gradient(to right, #dbdbdb 0%,#e8e8e8 100%); - - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; + background: #dbdbdb; + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2RiZGJkYiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlOGU4ZTgiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+"); + background: -moz-linear-gradient(left, #dbdbdb 0%, #e8e8e8 100%); + background: -webkit-gradient(linear, left top, right top, color-stop(0%, #dbdbdb), color-stop(100%, #e8e8e8)); + background: -webkit-linear-gradient(left, #dbdbdb 0%, #e8e8e8 100%); + background: -o-linear-gradient(left, #dbdbdb 0%, #e8e8e8 100%); + background: -ms-linear-gradient(left, #dbdbdb 0%, #e8e8e8 100%); + background: linear-gradient(to right, #dbdbdb 0%, #e8e8e8 100%); + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; } .scrollbar-light > .scroll-element.scroll-x { - bottom: 0; - height: 17px; - left: 0; - min-width: 100%; - width: 100%; + bottom: 0; + height: 17px; + left: 0; + min-width: 100%; + width: 100%; } .scrollbar-light > .scroll-element.scroll-y { - height: 100%; - min-height: 100%; - right: 0; - top: 0; - width: 17px; + height: 100%; + min-height: 100%; + right: 0; + top: 0; + width: 17px; } .scrollbar-light > .scroll-element .scroll-bar { - background: #fefefe; - background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZlZmVmZSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNWY1ZjUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+'); - background: -moz-linear-gradient(left, #fefefe 0%, #f5f5f5 100%); - background: -webkit-gradient(linear, left top, right top, color-stop(0%,#fefefe), color-stop(100%,#f5f5f5)); - background: -webkit-linear-gradient(left, #fefefe 0%,#f5f5f5 100%); - background: -o-linear-gradient(left, #fefefe 0%,#f5f5f5 100%); - background: -ms-linear-gradient(left, #fefefe 0%,#f5f5f5 100%); - background: linear-gradient(to right, #fefefe 0%,#f5f5f5 100%); - - border: 1px solid #dbdbdb; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; + background: #fefefe; + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZlZmVmZSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNWY1ZjUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+"); + background: -moz-linear-gradient(left, #fefefe 0%, #f5f5f5 100%); + background: -webkit-gradient(linear, left top, right top, color-stop(0%, #fefefe), color-stop(100%, #f5f5f5)); + background: -webkit-linear-gradient(left, #fefefe 0%, #f5f5f5 100%); + background: -o-linear-gradient(left, #fefefe 0%, #f5f5f5 100%); + background: -ms-linear-gradient(left, #fefefe 0%, #f5f5f5 100%); + background: linear-gradient(to right, #fefefe 0%, #f5f5f5 100%); + border: 1px solid #dbdbdb; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; } /* scrollbar height/width & offset from container borders */ +.scrollbar-light > .scroll-content.scroll-scrolly_visible { + left: -17px; + margin-left: 17px; +} -.scrollbar-light > .scroll-content.scroll-scrolly_visible { left: -17px; margin-left: 17px; } -.scrollbar-light > .scroll-content.scroll-scrollx_visible { top: -17px; margin-top: 17px; } - -.scrollbar-light > .scroll-element.scroll-x .scroll-bar { height: 10px; min-width: 10px; top: 0px; } -.scrollbar-light > .scroll-element.scroll-y .scroll-bar { left: 0px; min-height: 10px; width: 10px; } - -.scrollbar-light > .scroll-element.scroll-x .scroll-element_outer { height: 12px; left: 2px; top: 2px; } -.scrollbar-light > .scroll-element.scroll-x .scroll-element_size { left: -4px; } - -.scrollbar-light > .scroll-element.scroll-y .scroll-element_outer { left: 2px; top: 2px; width: 12px; } -.scrollbar-light > .scroll-element.scroll-y .scroll-element_size { top: -4px; } - -/* update scrollbar offset if both scrolls are visible */ - -.scrollbar-light > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -19px; } -.scrollbar-light > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -19px; } +.scrollbar-light > .scroll-content.scroll-scrollx_visible { + top: -17px; + margin-top: 17px; +} -.scrollbar-light > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -19px; } -.scrollbar-light > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -19px; } +.scrollbar-light > .scroll-element.scroll-x .scroll-bar { + height: 10px; + min-width: 10px; + top: 0px; +} +.scrollbar-light > .scroll-element.scroll-y .scroll-bar { + left: 0px; + min-height: 10px; + width: 10px; +} +.scrollbar-light > .scroll-element.scroll-x .scroll-element_outer { + height: 12px; + left: 2px; + top: 2px; +} +.scrollbar-light > .scroll-element.scroll-x .scroll-element_size { + left: -4px; +} +.scrollbar-light > .scroll-element.scroll-y .scroll-element_outer { + left: 2px; + top: 2px; + width: 12px; +} +.scrollbar-light > .scroll-element.scroll-y .scroll-element_size { + top: -4px; +} +/* update scrollbar offset if both scrolls are visible */ +.scrollbar-light > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { + left: -19px; +} +.scrollbar-light > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { + top: -19px; +} +.scrollbar-light > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { + left: -19px; +} +.scrollbar-light > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { + top: -19px; +} /*************** SCROLLBAR RAIL ***************/ - .scrollbar-rail > .scroll-element, -.scrollbar-rail > .scroll-element div -{ - border: none; - margin: 0; - overflow: hidden; - padding: 0; - position: absolute; - z-index: 10; +.scrollbar-rail > .scroll-element div { + border: none; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + z-index: 10; } .scrollbar-rail > .scroll-element { - background-color: #ffffff; + background-color: #ffffff; } .scrollbar-rail > .scroll-element div { - display: block; - height: 100%; - left: 0; - top: 0; - width: 100%; + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; } .scrollbar-rail > .scroll-element .scroll-element_size { - background-color: #999; - background-color: rgba(0, 0, 0, 0.3); + background-color: #999; + background-color: rgba(0, 0, 0, 0.3); } .scrollbar-rail > .scroll-element .scroll-element_outer:hover .scroll-element_size { - background-color: #666; - background-color: rgba(0, 0, 0, 0.5); + background-color: #666; + background-color: rgba(0, 0, 0, 0.5); } .scrollbar-rail > .scroll-element.scroll-x { - bottom: 0; - height: 12px; - left: 0; - min-width: 100%; - padding: 3px 0 2px; - width: 100%; + bottom: 0; + height: 12px; + left: 0; + min-width: 100%; + padding: 3px 0 2px; + width: 100%; } .scrollbar-rail > .scroll-element.scroll-y { - height: 100%; - min-height: 100%; - padding: 0 2px 0 3px; - right: 0; - top: 0; - width: 12px; + height: 100%; + min-height: 100%; + padding: 0 2px 0 3px; + right: 0; + top: 0; + width: 12px; } .scrollbar-rail > .scroll-element .scroll-bar { - background-color: #d0b9a0; - - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - - box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5); + background-color: #d0b9a0; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5); } .scrollbar-rail > .scroll-element .scroll-element_outer:hover .scroll-bar { - box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6); + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6); } /* scrollbar height/width & offset from container borders */ +.scrollbar-rail > .scroll-content.scroll-scrolly_visible { + left: -17px; + margin-left: 17px; +} -.scrollbar-rail > .scroll-content.scroll-scrolly_visible { left: -17px; margin-left: 17px; } -.scrollbar-rail > .scroll-content.scroll-scrollx_visible { margin-top: 17px; top: -17px; } - -.scrollbar-rail > .scroll-element.scroll-x .scroll-bar { height: 10px; min-width: 10px; top: 1px; } -.scrollbar-rail > .scroll-element.scroll-y .scroll-bar { left: 1px; min-height: 10px; width: 10px; } - -.scrollbar-rail > .scroll-element.scroll-x .scroll-element_outer { height: 15px; left: 5px; } -.scrollbar-rail > .scroll-element.scroll-x .scroll-element_size { height: 2px; left: -10px; top: 5px; } - -.scrollbar-rail > .scroll-element.scroll-y .scroll-element_outer { top: 5px; width: 15px; } -.scrollbar-rail > .scroll-element.scroll-y .scroll-element_size { left: 5px; top: -10px; width: 2px; } - -/* update scrollbar offset if both scrolls are visible */ - -.scrollbar-rail > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -25px; } -.scrollbar-rail > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -25px; } +.scrollbar-rail > .scroll-content.scroll-scrollx_visible { + margin-top: 17px; + top: -17px; +} -.scrollbar-rail > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -25px; } -.scrollbar-rail > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -25px; } +.scrollbar-rail > .scroll-element.scroll-x .scroll-bar { + height: 10px; + min-width: 10px; + top: 1px; +} +.scrollbar-rail > .scroll-element.scroll-y .scroll-bar { + left: 1px; + min-height: 10px; + width: 10px; +} +.scrollbar-rail > .scroll-element.scroll-x .scroll-element_outer { + height: 15px; + left: 5px; +} +.scrollbar-rail > .scroll-element.scroll-x .scroll-element_size { + height: 2px; + left: -10px; + top: 5px; +} +.scrollbar-rail > .scroll-element.scroll-y .scroll-element_outer { + top: 5px; + width: 15px; +} +.scrollbar-rail > .scroll-element.scroll-y .scroll-element_size { + left: 5px; + top: -10px; + width: 2px; +} +/* update scrollbar offset if both scrolls are visible */ +.scrollbar-rail > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { + left: -25px; +} +.scrollbar-rail > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { + top: -25px; +} +.scrollbar-rail > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { + left: -25px; +} +.scrollbar-rail > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { + top: -25px; +} /*************** SCROLLBAR DYNAMIC ***************/ - .scrollbar-dynamic > .scroll-element, -.scrollbar-dynamic > .scroll-element div -{ - background: none; - border: none; - margin: 0; - padding: 0; - position: absolute; - z-index: 10; +.scrollbar-dynamic > .scroll-element div { + background: none; + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; } .scrollbar-dynamic > .scroll-element div { - display: block; - height: 100%; - left: 0; - top: 0; - width: 100%; + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; } .scrollbar-dynamic > .scroll-element.scroll-x { - bottom: 2px; - height: 7px; - left: 0; - min-width: 100%; - width: 100%; + bottom: 2px; + height: 7px; + left: 0; + min-width: 100%; + width: 100%; } .scrollbar-dynamic > .scroll-element.scroll-y { - height: 100%; - min-height: 100%; - right: 2px; - top: 0; - width: 7px; + height: 100%; + min-height: 100%; + right: 2px; + top: 0; + width: 7px; } .scrollbar-dynamic > .scroll-element .scroll-element_outer { - opacity: 0.3; - - -webkit-border-radius: 12px; - -moz-border-radius: 12px; - border-radius: 12px; + opacity: 0.3; + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + border-radius: 12px; } -.scrollbar-dynamic > .scroll-element .scroll-element_size { - background-color: #cccccc; - opacity: 0; - -webkit-border-radius: 12px; - -moz-border-radius: 12px; - border-radius: 12px; - - -webkit-transition: opacity 0.2s; - -moz-transition: opacity 0.2s; - -o-transition: opacity 0.2s; - -ms-transition: opacity 0.2s; - transition: opacity 0.2s; +.scrollbar-dynamic > .scroll-element .scroll-element_size { + background-color: #cccccc; + opacity: 0; + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + border-radius: 12px; + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + -ms-transition: opacity 0.2s; + transition: opacity 0.2s; } .scrollbar-dynamic > .scroll-element .scroll-bar { - background-color: #6c6e71; - - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - border-radius: 7px; + background-color: #6c6e71; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; } /* scrollbar height/width & offset from container borders */ - .scrollbar-dynamic > .scroll-element.scroll-x .scroll-bar { - bottom: 0; - height: 7px; - min-width: 24px; - top: auto; + bottom: 0; + height: 7px; + min-width: 24px; + top: auto; } + .scrollbar-dynamic > .scroll-element.scroll-y .scroll-bar { - left: auto; - min-height: 24px; - right: 0; - width: 7px; + left: auto; + min-height: 24px; + right: 0; + width: 7px; } .scrollbar-dynamic > .scroll-element.scroll-x .scroll-element_outer { - bottom: 0; - top: auto; - left: 2px; - - -webkit-transition: height 0.2s; - -moz-transition: height 0.2s; - -o-transition: height 0.2s; - -ms-transition: height 0.2s; - transition: height 0.2s; + bottom: 0; + top: auto; + left: 2px; + -webkit-transition: height 0.2s; + -moz-transition: height 0.2s; + -o-transition: height 0.2s; + -ms-transition: height 0.2s; + transition: height 0.2s; } .scrollbar-dynamic > .scroll-element.scroll-y .scroll-element_outer { - left: auto; - right: 0; - top: 2px; - - -webkit-transition: width 0.2s; - -moz-transition: width 0.2s; - -o-transition: width 0.2s; - -ms-transition: width 0.2s; - transition: width 0.2s; + left: auto; + right: 0; + top: 2px; + -webkit-transition: width 0.2s; + -moz-transition: width 0.2s; + -o-transition: width 0.2s; + -ms-transition: width 0.2s; + transition: width 0.2s; } -.scrollbar-dynamic > .scroll-element.scroll-x .scroll-element_size { left: -4px; } -.scrollbar-dynamic > .scroll-element.scroll-y .scroll-element_size { top: -4px; } +.scrollbar-dynamic > .scroll-element.scroll-x .scroll-element_size { + left: -4px; +} +.scrollbar-dynamic > .scroll-element.scroll-y .scroll-element_size { + top: -4px; +} /* update scrollbar offset if both scrolls are visible */ +.scrollbar-dynamic > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { + left: -11px; +} -.scrollbar-dynamic > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -11px; } -.scrollbar-dynamic > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -11px; } - +.scrollbar-dynamic > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { + top: -11px; +} /* hover & drag */ - .scrollbar-dynamic > .scroll-element:hover .scroll-element_outer, .scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer { - overflow: hidden; - - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; - filter: alpha(opacity=70); - opacity: 0.7; + overflow: hidden; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); + opacity: 0.7; } + .scrollbar-dynamic > .scroll-element:hover .scroll-element_outer .scroll-element_size, .scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer .scroll-element_size { - opacity: 1; + opacity: 1; } + .scrollbar-dynamic > .scroll-element:hover .scroll-element_outer .scroll-bar, .scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer .scroll-bar { - height: 100%; - width: 100%; - - -webkit-border-radius: 12px; - -moz-border-radius: 12px; - border-radius: 12px; + height: 100%; + width: 100%; + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + border-radius: 12px; } .scrollbar-dynamic > .scroll-element.scroll-x:hover .scroll-element_outer, .scrollbar-dynamic > .scroll-element.scroll-x.scroll-draggable .scroll-element_outer { - height: 20px; - min-height: 7px; + height: 20px; + min-height: 7px; } + .scrollbar-dynamic > .scroll-element.scroll-y:hover .scroll-element_outer, .scrollbar-dynamic > .scroll-element.scroll-y.scroll-draggable .scroll-element_outer { - min-width: 7px; - width: 20px; + min-width: 7px; + width: 20px; } - - - - - - - - - /*************** SCROLLBAR GOOGLE CHROME ***************/ - .scrollbar-chrome > .scroll-element, -.scrollbar-chrome > .scroll-element div -{ - border: none; - margin: 0; - overflow: hidden; - padding: 0; - position: absolute; - z-index: 10; +.scrollbar-chrome > .scroll-element div { + border: none; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + z-index: 10; } .scrollbar-chrome > .scroll-element { - background-color: #ffffff; + background-color: #ffffff; } .scrollbar-chrome > .scroll-element div { - display: block; - height: 100%; - left: 0; - top: 0; - width: 100%; + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; } -.scrollbar-chrome > .scroll-element .scroll-element_outer {} - .scrollbar-chrome > .scroll-element .scroll-element_track { - background: #f1f1f1; - border: 1px solid #dbdbdb; + background: #f1f1f1; + border: 1px solid #dbdbdb; } .scrollbar-chrome > .scroll-element.scroll-x { - bottom: 0; - height: 16px; - left: 0; - min-width: 100%; - width: 100%; + bottom: 0; + height: 16px; + left: 0; + min-width: 100%; + width: 100%; } .scrollbar-chrome > .scroll-element.scroll-y { - height: 100%; - min-height: 100%; - right: 0; - top: 0; - width: 16px; + height: 100%; + min-height: 100%; + right: 0; + top: 0; + width: 16px; } .scrollbar-chrome > .scroll-element .scroll-bar { - background-color: #d9d9d9; - border: 1px solid #bdbdbd; - cursor: default; - - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; + background-color: #d9d9d9; + border: 1px solid #bdbdbd; + cursor: default; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; } .scrollbar-chrome > .scroll-element .scroll-bar:hover { - background-color: #c2c2c2; - border-color: #a9a9a9; + background-color: #c2c2c2; + border-color: #a9a9a9; } .scrollbar-chrome > .scroll-element.scroll-draggable .scroll-bar { - background-color: #919191; - border-color: #7e7e7e; + background-color: #919191; + border-color: #7e7e7e; } /* scrollbar height/width & offset from container borders */ +.scrollbar-chrome > .scroll-content.scroll-scrolly_visible { + left: -16px; + margin-left: 16px; +} -.scrollbar-chrome > .scroll-content.scroll-scrolly_visible { left: -16px; margin-left: 16px; } -.scrollbar-chrome > .scroll-content.scroll-scrollx_visible { top: -16px; margin-top: 16px; } - -.scrollbar-chrome > .scroll-element.scroll-x .scroll-bar { height: 8px; min-width: 10px; top: 3px; } -.scrollbar-chrome > .scroll-element.scroll-y .scroll-bar { left: 3px; min-height: 10px; width: 8px; } +.scrollbar-chrome > .scroll-content.scroll-scrollx_visible { + top: -16px; + margin-top: 16px; +} -.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_outer { border-left: 1px solid #dbdbdb; } -.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_track { height: 14px; left: -3px; } -.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_size { height: 14px; left: -4px; } +.scrollbar-chrome > .scroll-element.scroll-x .scroll-bar { + height: 8px; + min-width: 10px; + top: 3px; +} -.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_outer { border-top: 1px solid #dbdbdb; } -.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_track { top: -3px; width: 14px; } -.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_size { top: -4px; width: 14px; } +.scrollbar-chrome > .scroll-element.scroll-y .scroll-bar { + left: 3px; + min-height: 10px; + width: 8px; +} -/* update scrollbar offset if both scrolls are visible */ +.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_outer { + border-left: 1px solid #dbdbdb; +} -.scrollbar-chrome > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -19px; } -.scrollbar-chrome > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -19px; } +.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_track { + height: 14px; + left: -3px; +} -.scrollbar-chrome > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -19px; } -.scrollbar-chrome > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -19px; } +.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_size { + height: 14px; + left: -4px; +} +.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_outer { + border-top: 1px solid #dbdbdb; +} +.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_track { + top: -3px; + width: 14px; +} +.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_size { + top: -4px; + width: 14px; +} +/* update scrollbar offset if both scrolls are visible */ +.scrollbar-chrome > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { + left: -19px; +} +.scrollbar-chrome > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { + top: -19px; +} +.scrollbar-chrome > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { + left: -19px; +} +.scrollbar-chrome > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { + top: -19px; +} diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index c8cfb72..754f03a 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -29,7 +29,9 @@ index: 0, name: 'scrollbar' }, + firefox: /firefox/i.test(navigator.userAgent), macosx: /mac/i.test(navigator.platform), + msie: /(msie|trident)/i.test(navigator.userAgent), mobile: /android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent), overlay: null, scroll: null, @@ -48,25 +50,26 @@ }; var defaults = { - "autoScrollSize": true, // automatically calculate scrollsize - "autoUpdate": true, // update scrollbar if content/container size changed - "debug": false, // debug mode - "disableBodyScroll": false, // disable body scroll if mouse over container - "duration": 200, // scroll animate duration in ms - "ignoreMobile": false, // ignore mobile devices - "ignoreOverlay": false, // ignore browsers with overlay scrollbars (mobile, MacOS) - "scrollStep": 30, // scroll step for scrollbar arrows - "showArrows": false, // add class to show arrows - "stepScrolling": true, // when scrolling to scrollbar mousedown position - - "scrollx": null, // horizontal scroll element - "scrolly": null, // vertical scroll element - - "onDestroy": null, // callback function on destroy, - "onFallback": null, // callback function if scrollbar is not initialized - "onInit": null, // callback function on first initialization - "onScroll": null, // callback function on content scrolling - "onUpdate": null // callback function on init/resize (before scrollbar size calculation) + autoScrollSize: true, // automatically calculate scrollsize + autoUpdate: true, // update scrollbar if content/container size changed + debug: false, // debug mode + disableBodyScroll: false, // disable body scroll if mouse over container + duration: 200, // scroll animate duration in ms + ignoreMobile: false, // ignore mobile devices + ignoreOverlay: false, // ignore browsers with overlay scrollbars (mobile, MacOS) + isRtl: false, // is RTL + scrollStep: 30, // scroll step for scrollbar arrows + showArrows: false, // add class to show arrows + stepScrolling: true, // when scrolling to scrollbar mousedown position + + scrollx: null, // horizontal scroll element + scrolly: null, // vertical scroll element + + onDestroy: null, // callback function on destroy, + onFallback: null, // callback function if scrollbar is not initialized + onInit: null, // callback function on first initialization + onScroll: null, // callback function on content scrolling + onUpdate: null // callback function on init/resize (before scrollbar size calculation) }; @@ -102,7 +105,6 @@ }; BaseScrollbar.prototype = { - destroy: function () { if (!this.wrapper) { @@ -133,7 +135,7 @@ $(document).add('body').off(this.namespace); - if ($.isFunction(this.options.onDestroy)){ + if ($.isFunction(this.options.onDestroy)) { this.options.onDestroy.apply(this, [this.container]); } }, @@ -146,11 +148,12 @@ namespace = this.namespace, o = $.extend(this.options, options || {}), s = {x: this.scrollx, y: this.scrolly}, - w = this.wrapper; + w = this.wrapper, + cssOptions = {}; var initScroll = { - "scrollLeft": c.scrollLeft(), - "scrollTop": c.scrollTop() + scrollLeft: c.scrollLeft(), + scrollTop: c.scrollTop() }; // do not init if in ignorable browser @@ -158,7 +161,7 @@ || (browser.overlay && o.ignoreOverlay) || (browser.macosx && !browser.webkit) // still required to ignore nonWebKit browsers on Mac ) { - if ($.isFunction(o.onFallback)){ + if ($.isFunction(o.onFallback)) { o.onFallback.apply(this, [c]); } return false; @@ -170,34 +173,51 @@ .css('position', c.css('position') === 'absolute' ? 'absolute' : 'relative') .insertBefore(c).append(c); + if (o.isRtl) { + w.addClass('scroll--rtl'); + } + if (c.is('textarea')) { this.containerWrapper = cw = $('
    ').insertBefore(c).append(c); w.addClass('scroll-textarea'); } - cw.addClass('scroll-content').css({ + cssOptions = { "height": "auto", "margin-bottom": browser.scroll.height * -1 + 'px', - "margin-right": browser.scroll.width * -1 + 'px', "max-height": "" - }); + }; + cssOptions[o.isRtl ? 'margin-left' : 'margin-right'] = browser.scroll.width * -1 + 'px'; + + cw.addClass('scroll-content').css(cssOptions); c.on('scroll' + namespace, function (event) { + var scrollLeft = c.scrollLeft(); + var scrollTop = c.scrollTop(); + if (o.isRtl) { + switch (true) { + case browser.firefox: + scrollLeft = Math.abs(scrollLeft); + case browser.msie: + scrollLeft = c[0].scrollWidth - c[0].clientWidth - scrollLeft; + break; + } + } if ($.isFunction(o.onScroll)) { o.onScroll.call(S, { - "maxScroll": s.y.maxScrollOffset, - "scroll": c.scrollTop(), - "size": s.y.size, - "visible": s.y.visible + maxScroll: s.y.maxScrollOffset, + scroll: scrollTop, + size: s.y.size, + visible: s.y.visible }, { - "maxScroll": s.x.maxScrollOffset, - "scroll": c.scrollLeft(), - "size": s.x.size, - "visible": s.x.visible + maxScroll: s.x.maxScrollOffset, + scroll: scrollLeft, + size: s.x.size, + visible: s.x.visible }); } - s.x.isVisible && s.x.scroll.bar.css('left', c.scrollLeft() * s.x.kx + 'px'); - s.y.isVisible && s.y.scroll.bar.css('top', c.scrollTop() * s.y.kx + 'px'); + s.x.isVisible && s.x.scroll.bar.css('left', scrollLeft * s.x.kx + 'px'); + s.y.isVisible && s.y.scroll.bar.css('top', scrollTop * s.y.kx + 'px'); }); /* prevent native scrollbars to be visible on #anchor click */ @@ -218,12 +238,12 @@ w.on('touchstart' + namespace, function (event) { var touch = event.originalEvent.touches && event.originalEvent.touches[0] || event; var originalTouch = { - "pageX": touch.pageX, - "pageY": touch.pageY + pageX: touch.pageX, + pageY: touch.pageY }; var originalScroll = { - "left": c.scrollLeft(), - "top": c.scrollTop() + left: c.scrollLeft(), + top: c.scrollTop() }; $(document).on('touchmove' + namespace, function (event) { var touch = event.originalEvent.targetTouches && event.originalEvent.targetTouches[0] || event; @@ -237,16 +257,17 @@ }); } } - if ($.isFunction(o.onInit)){ + if ($.isFunction(o.onInit)) { o.onInit.apply(this, [c]); } } else { - cw.css({ + cssOptions = { "height": "auto", "margin-bottom": browser.scroll.height * -1 + 'px', - "margin-right": browser.scroll.width * -1 + 'px', "max-height": "" - }); + }; + cssOptions[o.isRtl ? 'margin-left' : 'margin-right'] = browser.scroll.width * -1 + 'px'; + cw.css(cssOptions); } // init scrollbars & recalculate sizes @@ -273,7 +294,7 @@ scrollx.scroll = S._getScroll(o['scroll' + d]).addClass('scroll-' + d); - if(o.showArrows){ + if (o.showArrows) { scrollx.scroll.addClass('scroll-element_arrows_visible'); } @@ -339,10 +360,10 @@ scrollForward = 1; var data = { - "eventOffset": event[(d === 'x') ? 'pageX' : 'pageY'], - "maxScrollValue": scrollx.size - scrollx.visible - scrollx.offset, - "scrollbarOffset": scrollx.scroll.bar.offset()[(d === 'x') ? 'left' : 'top'], - "scrollbarSize": scrollx.scroll.bar[(d === 'x') ? 'outerWidth' : 'outerHeight']() + eventOffset: event[(d === 'x') ? 'pageX' : 'pageY'], + maxScrollValue: scrollx.size - scrollx.visible - scrollx.offset, + scrollbarOffset: scrollx.scroll.bar.offset()[(d === 'x') ? 'left' : 'top'], + scrollbarSize: scrollx.scroll.bar[(d === 'x') ? 'outerWidth' : 'outerHeight']() }; var timeout = 0, timer = 0; @@ -399,6 +420,8 @@ $(document).on('mousemove' + namespace, function (event) { var diff = parseInt((event[(d === 'x') ? 'pageX' : 'pageY'] - eventPosition) / scrollx.kx, 10); + if (d === 'x' && o.isRtl && browser.msie) + diff = diff * -1; c[scrollOffset](initOffset + diff); }); @@ -423,13 +446,13 @@ // calculate init sizes $.each(s, function (d, scrollx) { $.extend(scrollx, (d == "x") ? { - "offset": parseInt(c.css('left'), 10) || 0, - "size": c.prop('scrollWidth'), - "visible": w.width() + offset: parseInt(c.css('left'), 10) || 0, + size: c.prop('scrollWidth'), + visible: w.width() } : { - "offset": parseInt(c.css('top'), 10) || 0, - "size": c.prop('scrollHeight'), - "visible": w.height() + offset: parseInt(c.css('top'), 10) || 0, + size: c.prop('scrollHeight'), + visible: w.height() }); }); @@ -437,7 +460,7 @@ this._updateScroll('x', this.scrollx); this._updateScroll('y', this.scrolly); - if ($.isFunction(o.onUpdate)){ + if ($.isFunction(o.onUpdate)) { o.onUpdate.apply(this, [c]); } @@ -466,7 +489,6 @@ c.scrollLeft(initScroll.scrollLeft).scrollTop(initScroll.scrollTop).trigger('scroll'); }, - /** * Get scrollx/scrolly object * @@ -525,8 +547,7 @@ }); return scroll; }, - - _handleMouseDown: function(callback, event) { + _handleMouseDown: function (callback, event) { var namespace = this.namespace; @@ -550,7 +571,6 @@ event && event.preventDefault(); return false; }, - _updateScroll: function (d, scrollx) { var container = this.container, @@ -575,7 +595,7 @@ } if (d === 'y') { - if(container.is('textarea') || AreaSize < AreaVisible){ + if (container.is('textarea') || AreaSize < AreaVisible) { containerWrapper.css({ "height": (AreaVisible + browser.scroll.height) + 'px', "max-height": "none" @@ -596,14 +616,14 @@ || scrolly.offset != (parseInt(container.css('top'), 10) || 0) ) { $.extend(this.scrollx, { - "offset": parseInt(container.css('left'), 10) || 0, - "size": container.prop('scrollWidth'), - "visible": wrapper.width() + offset: parseInt(container.css('left'), 10) || 0, + size: container.prop('scrollWidth'), + visible: wrapper.width() }); $.extend(this.scrolly, { - "offset": parseInt(container.css('top'), 10) || 0, - "size": this.container.prop('scrollHeight'), - "visible": wrapper.height() + offset: parseInt(container.css('top'), 10) || 0, + size: this.container.prop('scrollHeight'), + visible: wrapper.height() }); this._updateScroll(d === 'x' ? 'y' : 'x', scrolly); } @@ -704,8 +724,8 @@ if (browser.webkit && !actualSize) { return { - "height": 0, - "width": 0 + height: 0, + width: 0 }; } @@ -730,8 +750,8 @@ browser.data.outer.scrollLeft(1000).scrollTop(1000); return { - "height": Math.ceil((browser.data.outer.offset().top - browser.data.inner.offset().top) || 0), - "width": Math.ceil((browser.data.outer.offset().left - browser.data.inner.offset().left) || 0) + height: Math.ceil((browser.data.outer.offset().top - browser.data.inner.offset().top) || 0), + width: Math.ceil((browser.data.outer.offset().left - browser.data.inner.offset().left) || 0) }; } @@ -777,18 +797,18 @@ }; }) .directive('jqueryScrollbar', ['jQueryScrollbar', '$parse', function (jQueryScrollbar, $parse) { - return { - "restrict": "AC", - "link": function (scope, element, attrs) { - var model = $parse(attrs.jqueryScrollbar), - options = model(scope); - element.scrollbar(options || jQueryScrollbar.options) - .on('$destroy', function () { - element.scrollbar('destroy'); - }); - } - }; - }]); + return { + restrict: "AC", + link: function (scope, element, attrs) { + var model = $parse(attrs.jqueryScrollbar), + options = model(scope); + element.scrollbar(options || jQueryScrollbar.options) + .on('$destroy', function () { + element.scrollbar('destroy'); + }); + } + }; + }]); })(window.angular); } })); diff --git a/sass/Gruntfile.js b/sass/Gruntfile.js new file mode 100644 index 0000000..a983423 --- /dev/null +++ b/sass/Gruntfile.js @@ -0,0 +1,22 @@ +module.exports = function (grunt) { + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + compass: { + auto: { + options: { + sassDir: './', + cssDir: '../' + } + } + }, + watch: { + scss: { + files: ['./**/*.scss'], + tasks: ['compass'] + } + } + }); + grunt.loadNpmTasks('grunt-contrib-compass'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.registerTask('default', ['watch']); +}; \ No newline at end of file diff --git a/sass/config.rb b/sass/config.rb new file mode 100644 index 0000000..eb6e6e4 --- /dev/null +++ b/sass/config.rb @@ -0,0 +1,2 @@ +require 'compass/import-once/activate' +line_comments = false diff --git a/sass/jquery.scrollbar.scss b/sass/jquery.scrollbar.scss new file mode 100644 index 0000000..118d29a --- /dev/null +++ b/sass/jquery.scrollbar.scss @@ -0,0 +1,793 @@ +/*************** SCROLLBAR BASE CSS ***************/ + +.scroll-wrapper { + overflow: hidden !important; + padding: 0 !important; + position: relative; + + & > .scroll-content { + border: none !important; + box-sizing: content-box !important; + height: auto; + left: 0; + margin: 0; + max-height: none; + max-width: none !important; + overflow: scroll !important; + padding: 0; + position: relative !important; + top: 0; + width: auto !important; + + &::-webkit-scrollbar { + height: 0; + width: 0; + } + } + &.scroll--rtl { + direction: rtl; + } +} + +.scroll-element { + box-sizing: content-box; + display: none; + + div { + box-sizing: content-box; + } + .scroll-bar, + .scroll-arrow { + cursor: default; + } + + &.scroll-x.scroll-scrollx_visible, + &.scroll-y.scroll-scrolly_visible { + display: block; + } +} + +.scroll-textarea { + border: 1px solid #cccccc; + border-top-color: #999999; + + & > .scroll-content { + overflow: hidden !important; + + & > textarea { + border: none !important; + box-sizing: border-box; + height: 100% !important; + margin: 0; + max-height: none !important; + max-width: none !important; + overflow: scroll !important; + outline: none; + padding: 2px; + position: relative !important; + top: 0; + width: 100% !important; + + &::-webkit-scrollbar { + height: 0; + width: 0; + } + } + } +} + + + + +/*************** SIMPLE INNER SCROLLBAR ***************/ + +.scrollbar-inner > .scroll-element, +.scrollbar-inner > .scroll-element div +{ + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; +} + +.scrollbar-inner > .scroll-element div { + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; +} + +.scrollbar-inner > .scroll-element.scroll-x { + bottom: 2px; + height: 8px; + left: 0; + width: 100%; +} + +.scrollbar-inner > .scroll-element.scroll-y { + height: 100%; + right: 2px; + top: 0; + width: 8px; +} + +.scrollbar-inner > .scroll-element .scroll-element_outer { + overflow: hidden; +} + +.scrollbar-inner > .scroll-element .scroll-element_outer, +.scrollbar-inner > .scroll-element .scroll-element_track, +.scrollbar-inner > .scroll-element .scroll-bar { + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; +} + +.scrollbar-inner > .scroll-element .scroll-element_track, +.scrollbar-inner > .scroll-element .scroll-bar { + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + opacity: 0.4; +} + +.scrollbar-inner > .scroll-element .scroll-element_track { background-color: #e0e0e0; } +.scrollbar-inner > .scroll-element .scroll-bar { background-color: #c2c2c2; } +.scrollbar-inner > .scroll-element:hover .scroll-bar { background-color: #919191; } +.scrollbar-inner > .scroll-element.scroll-draggable .scroll-bar { background-color: #919191; } + + +/* update scrollbar offset if both scrolls are visible */ + +.scrollbar-inner > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -12px; } +.scrollbar-inner > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -12px; } + + +.scrollbar-inner > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -12px; } +.scrollbar-inner > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -12px; } + + + + + + + + + + +/*************** SIMPLE OUTER SCROLLBAR ***************/ + +.scrollbar-outer > .scroll-element, +.scrollbar-outer > .scroll-element div +{ + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; +} + +.scrollbar-outer > .scroll-element { + background-color: #ffffff; +} + +.scrollbar-outer > .scroll-element div { + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; +} + +.scrollbar-outer > .scroll-element.scroll-x { + bottom: 0; + height: 12px; + left: 0; + width: 100%; +} + +.scrollbar-outer > .scroll-element.scroll-y { + height: 100%; + right: 0; + top: 0; + width: 12px; +} + +.scrollbar-outer > .scroll-element.scroll-x .scroll-element_outer { height: 8px; top: 2px; } +.scrollbar-outer > .scroll-element.scroll-y .scroll-element_outer { left: 2px; width: 8px; } + +.scrollbar-outer > .scroll-element .scroll-element_outer { overflow: hidden; } +.scrollbar-outer > .scroll-element .scroll-element_track { background-color: #eeeeee; } + +.scrollbar-outer > .scroll-element .scroll-element_outer, +.scrollbar-outer > .scroll-element .scroll-element_track, +.scrollbar-outer > .scroll-element .scroll-bar { + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; +} + +.scrollbar-outer > .scroll-element .scroll-bar { background-color: #d9d9d9; } +.scrollbar-outer > .scroll-element .scroll-bar:hover { background-color: #c2c2c2; } +.scrollbar-outer > .scroll-element.scroll-draggable .scroll-bar { background-color: #919191; } + + +/* scrollbar height/width & offset from container borders */ + +.scrollbar-outer > .scroll-content.scroll-scrolly_visible { left: -12px; margin-left: 12px; } +.scrollbar-outer > .scroll-content.scroll-scrollx_visible { top: -12px; margin-top: 12px; } + +.scrollbar-outer > .scroll-element.scroll-x .scroll-bar { min-width: 10px; } +.scrollbar-outer > .scroll-element.scroll-y .scroll-bar { min-height: 10px; } + + +/* update scrollbar offset if both scrolls are visible */ + +.scrollbar-outer > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -14px; } +.scrollbar-outer > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -14px; } + +.scrollbar-outer > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -14px; } +.scrollbar-outer > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -14px; } + + + + + + + + + + +/*************** SCROLLBAR MAC OS X ***************/ + +.scrollbar-macosx > .scroll-element, +.scrollbar-macosx > .scroll-element div +{ + background: none; + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; +} + +.scrollbar-macosx > .scroll-element div { + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; +} + +.scrollbar-macosx > .scroll-element .scroll-element_track { display: none; } +.scrollbar-macosx > .scroll-element .scroll-bar { + background-color: #6C6E71; + display: block; + + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; + + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; + + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + -ms-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} +.scrollbar-macosx:hover > .scroll-element .scroll-bar, +.scrollbar-macosx > .scroll-element.scroll-draggable .scroll-bar { + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); + opacity: 0.7; +} + + +.scrollbar-macosx > .scroll-element.scroll-x { + bottom: 0px; + height: 0px; + left: 0; + min-width: 100%; + overflow: visible; + width: 100%; +} + +.scrollbar-macosx > .scroll-element.scroll-y { + height: 100%; + min-height: 100%; + right: 0px; + top: 0; + width: 0px; +} + +/* scrollbar height/width & offset from container borders */ +.scrollbar-macosx > .scroll-element.scroll-x .scroll-bar { height: 7px; min-width: 10px; top: -9px; } +.scrollbar-macosx > .scroll-element.scroll-y .scroll-bar { left: -9px; min-height: 10px; width: 7px; } + +.scrollbar-macosx > .scroll-element.scroll-x .scroll-element_outer { left: 2px; } +.scrollbar-macosx > .scroll-element.scroll-x .scroll-element_size { left: -4px; } + +.scrollbar-macosx > .scroll-element.scroll-y .scroll-element_outer { top: 2px; } +.scrollbar-macosx > .scroll-element.scroll-y .scroll-element_size { top: -4px; } + +/* update scrollbar offset if both scrolls are visible */ +.scrollbar-macosx > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -11px; } +.scrollbar-macosx > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -11px; } + + + + + + + + + + +/*************** SCROLLBAR LIGHT ***************/ + +.scrollbar-light > .scroll-element, +.scrollbar-light > .scroll-element div { + border: none; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + z-index: 10; +} + +.scrollbar-light > .scroll-element { + background-color: #ffffff; +} + +.scrollbar-light > .scroll-element div { + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; +} + +.scrollbar-light > .scroll-element .scroll-element_outer { + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; +} + +.scrollbar-light > .scroll-element .scroll-element_size { + background: #dbdbdb; + background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2RiZGJkYiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlOGU4ZTgiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+'); + background: -moz-linear-gradient(left, #dbdbdb 0%, #e8e8e8 100%); + background: -webkit-gradient(linear, left top, right top, color-stop(0%,#dbdbdb), color-stop(100%,#e8e8e8)); + background: -webkit-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%); + background: -o-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%); + background: -ms-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%); + background: linear-gradient(to right, #dbdbdb 0%,#e8e8e8 100%); + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; +} + +.scrollbar-light > .scroll-element.scroll-x { + bottom: 0; + height: 17px; + left: 0; + min-width: 100%; + width: 100%; +} + +.scrollbar-light > .scroll-element.scroll-y { + height: 100%; + min-height: 100%; + right: 0; + top: 0; + width: 17px; +} + +.scrollbar-light > .scroll-element .scroll-bar { + background: #fefefe; + background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZlZmVmZSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNWY1ZjUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+'); + background: -moz-linear-gradient(left, #fefefe 0%, #f5f5f5 100%); + background: -webkit-gradient(linear, left top, right top, color-stop(0%,#fefefe), color-stop(100%,#f5f5f5)); + background: -webkit-linear-gradient(left, #fefefe 0%,#f5f5f5 100%); + background: -o-linear-gradient(left, #fefefe 0%,#f5f5f5 100%); + background: -ms-linear-gradient(left, #fefefe 0%,#f5f5f5 100%); + background: linear-gradient(to right, #fefefe 0%,#f5f5f5 100%); + + border: 1px solid #dbdbdb; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; +} + +/* scrollbar height/width & offset from container borders */ + +.scrollbar-light > .scroll-content.scroll-scrolly_visible { left: -17px; margin-left: 17px; } +.scrollbar-light > .scroll-content.scroll-scrollx_visible { top: -17px; margin-top: 17px; } + +.scrollbar-light > .scroll-element.scroll-x .scroll-bar { height: 10px; min-width: 10px; top: 0px; } +.scrollbar-light > .scroll-element.scroll-y .scroll-bar { left: 0px; min-height: 10px; width: 10px; } + +.scrollbar-light > .scroll-element.scroll-x .scroll-element_outer { height: 12px; left: 2px; top: 2px; } +.scrollbar-light > .scroll-element.scroll-x .scroll-element_size { left: -4px; } + +.scrollbar-light > .scroll-element.scroll-y .scroll-element_outer { left: 2px; top: 2px; width: 12px; } +.scrollbar-light > .scroll-element.scroll-y .scroll-element_size { top: -4px; } + +/* update scrollbar offset if both scrolls are visible */ + +.scrollbar-light > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -19px; } +.scrollbar-light > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -19px; } + +.scrollbar-light > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -19px; } +.scrollbar-light > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -19px; } + + + + + + + + + + +/*************** SCROLLBAR RAIL ***************/ + +.scrollbar-rail > .scroll-element, +.scrollbar-rail > .scroll-element div +{ + border: none; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + z-index: 10; +} + +.scrollbar-rail > .scroll-element { + background-color: #ffffff; +} + +.scrollbar-rail > .scroll-element div { + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; +} + +.scrollbar-rail > .scroll-element .scroll-element_size { + background-color: #999; + background-color: rgba(0, 0, 0, 0.3); +} + +.scrollbar-rail > .scroll-element .scroll-element_outer:hover .scroll-element_size { + background-color: #666; + background-color: rgba(0, 0, 0, 0.5); +} + +.scrollbar-rail > .scroll-element.scroll-x { + bottom: 0; + height: 12px; + left: 0; + min-width: 100%; + padding: 3px 0 2px; + width: 100%; +} + +.scrollbar-rail > .scroll-element.scroll-y { + height: 100%; + min-height: 100%; + padding: 0 2px 0 3px; + right: 0; + top: 0; + width: 12px; +} + +.scrollbar-rail > .scroll-element .scroll-bar { + background-color: #d0b9a0; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5); +} + +.scrollbar-rail > .scroll-element .scroll-element_outer:hover .scroll-bar { + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6); +} + +/* scrollbar height/width & offset from container borders */ + +.scrollbar-rail > .scroll-content.scroll-scrolly_visible { left: -17px; margin-left: 17px; } +.scrollbar-rail > .scroll-content.scroll-scrollx_visible { margin-top: 17px; top: -17px; } + +.scrollbar-rail > .scroll-element.scroll-x .scroll-bar { height: 10px; min-width: 10px; top: 1px; } +.scrollbar-rail > .scroll-element.scroll-y .scroll-bar { left: 1px; min-height: 10px; width: 10px; } + +.scrollbar-rail > .scroll-element.scroll-x .scroll-element_outer { height: 15px; left: 5px; } +.scrollbar-rail > .scroll-element.scroll-x .scroll-element_size { height: 2px; left: -10px; top: 5px; } + +.scrollbar-rail > .scroll-element.scroll-y .scroll-element_outer { top: 5px; width: 15px; } +.scrollbar-rail > .scroll-element.scroll-y .scroll-element_size { left: 5px; top: -10px; width: 2px; } + +/* update scrollbar offset if both scrolls are visible */ + +.scrollbar-rail > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -25px; } +.scrollbar-rail > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -25px; } + +.scrollbar-rail > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -25px; } +.scrollbar-rail > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -25px; } + + + + + + + + + + +/*************** SCROLLBAR DYNAMIC ***************/ + +.scrollbar-dynamic > .scroll-element, +.scrollbar-dynamic > .scroll-element div +{ + background: none; + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; +} + +.scrollbar-dynamic > .scroll-element div { + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; +} + +.scrollbar-dynamic > .scroll-element.scroll-x { + bottom: 2px; + height: 7px; + left: 0; + min-width: 100%; + width: 100%; +} + +.scrollbar-dynamic > .scroll-element.scroll-y { + height: 100%; + min-height: 100%; + right: 2px; + top: 0; + width: 7px; +} + +.scrollbar-dynamic > .scroll-element .scroll-element_outer { + opacity: 0.3; + + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + border-radius: 12px; +} +.scrollbar-dynamic > .scroll-element .scroll-element_size { + background-color: #cccccc; + opacity: 0; + + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + border-radius: 12px; + + -webkit-transition: opacity 0.2s; + -moz-transition: opacity 0.2s; + -o-transition: opacity 0.2s; + -ms-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.scrollbar-dynamic > .scroll-element .scroll-bar { + background-color: #6c6e71; + + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; +} + +/* scrollbar height/width & offset from container borders */ + +.scrollbar-dynamic > .scroll-element.scroll-x .scroll-bar { + bottom: 0; + height: 7px; + min-width: 24px; + top: auto; +} +.scrollbar-dynamic > .scroll-element.scroll-y .scroll-bar { + left: auto; + min-height: 24px; + right: 0; + width: 7px; +} + +.scrollbar-dynamic > .scroll-element.scroll-x .scroll-element_outer { + bottom: 0; + top: auto; + left: 2px; + + -webkit-transition: height 0.2s; + -moz-transition: height 0.2s; + -o-transition: height 0.2s; + -ms-transition: height 0.2s; + transition: height 0.2s; +} + +.scrollbar-dynamic > .scroll-element.scroll-y .scroll-element_outer { + left: auto; + right: 0; + top: 2px; + + -webkit-transition: width 0.2s; + -moz-transition: width 0.2s; + -o-transition: width 0.2s; + -ms-transition: width 0.2s; + transition: width 0.2s; +} + +.scrollbar-dynamic > .scroll-element.scroll-x .scroll-element_size { left: -4px; } +.scrollbar-dynamic > .scroll-element.scroll-y .scroll-element_size { top: -4px; } + + +/* update scrollbar offset if both scrolls are visible */ + +.scrollbar-dynamic > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -11px; } +.scrollbar-dynamic > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -11px; } + + +/* hover & drag */ + +.scrollbar-dynamic > .scroll-element:hover .scroll-element_outer, +.scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer { + overflow: hidden; + + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); + opacity: 0.7; +} +.scrollbar-dynamic > .scroll-element:hover .scroll-element_outer .scroll-element_size, +.scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer .scroll-element_size { + opacity: 1; +} +.scrollbar-dynamic > .scroll-element:hover .scroll-element_outer .scroll-bar, +.scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer .scroll-bar { + height: 100%; + width: 100%; + + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + border-radius: 12px; +} + +.scrollbar-dynamic > .scroll-element.scroll-x:hover .scroll-element_outer, +.scrollbar-dynamic > .scroll-element.scroll-x.scroll-draggable .scroll-element_outer { + height: 20px; + min-height: 7px; +} +.scrollbar-dynamic > .scroll-element.scroll-y:hover .scroll-element_outer, +.scrollbar-dynamic > .scroll-element.scroll-y.scroll-draggable .scroll-element_outer { + min-width: 7px; + width: 20px; +} + + + + + + + + + + +/*************** SCROLLBAR GOOGLE CHROME ***************/ + +.scrollbar-chrome > .scroll-element, +.scrollbar-chrome > .scroll-element div +{ + border: none; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + z-index: 10; +} + +.scrollbar-chrome > .scroll-element { + background-color: #ffffff; +} + +.scrollbar-chrome > .scroll-element div { + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; +} + +.scrollbar-chrome > .scroll-element .scroll-element_outer {} + +.scrollbar-chrome > .scroll-element .scroll-element_track { + background: #f1f1f1; + border: 1px solid #dbdbdb; +} + +.scrollbar-chrome > .scroll-element.scroll-x { + bottom: 0; + height: 16px; + left: 0; + min-width: 100%; + width: 100%; +} + +.scrollbar-chrome > .scroll-element.scroll-y { + height: 100%; + min-height: 100%; + right: 0; + top: 0; + width: 16px; +} + +.scrollbar-chrome > .scroll-element .scroll-bar { + background-color: #d9d9d9; + border: 1px solid #bdbdbd; + cursor: default; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.scrollbar-chrome > .scroll-element .scroll-bar:hover { + background-color: #c2c2c2; + border-color: #a9a9a9; +} + +.scrollbar-chrome > .scroll-element.scroll-draggable .scroll-bar { + background-color: #919191; + border-color: #7e7e7e; +} + +/* scrollbar height/width & offset from container borders */ + +.scrollbar-chrome > .scroll-content.scroll-scrolly_visible { left: -16px; margin-left: 16px; } +.scrollbar-chrome > .scroll-content.scroll-scrollx_visible { top: -16px; margin-top: 16px; } + +.scrollbar-chrome > .scroll-element.scroll-x .scroll-bar { height: 8px; min-width: 10px; top: 3px; } +.scrollbar-chrome > .scroll-element.scroll-y .scroll-bar { left: 3px; min-height: 10px; width: 8px; } + +.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_outer { border-left: 1px solid #dbdbdb; } +.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_track { height: 14px; left: -3px; } +.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_size { height: 14px; left: -4px; } + +.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_outer { border-top: 1px solid #dbdbdb; } +.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_track { top: -3px; width: 14px; } +.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_size { top: -4px; width: 14px; } + +/* update scrollbar offset if both scrolls are visible */ + +.scrollbar-chrome > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -19px; } +.scrollbar-chrome > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -19px; } + +.scrollbar-chrome > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -19px; } +.scrollbar-chrome > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -19px; } + + + + + + + diff --git a/sass/package.json b/sass/package.json new file mode 100644 index 0000000..cf2ff61 --- /dev/null +++ b/sass/package.json @@ -0,0 +1,9 @@ +{ + "name": "jquery.scrollbar", + "version": "0.2.10", + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-compass": "^1.0.4", + "grunt-contrib-watch": "~0.6.1" + } +} From 9b51ea405f6d634db1c85510db7b4a62c9be8a38 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Mon, 15 Aug 2016 22:36:07 +0500 Subject: [PATCH 29/32] RTL support: step 2 - js hacky support --- README.md | 2 ++ jquery.scrollbar.js | 19 +++++++++++++++++-- jquery.scrollbar.min.js | 2 +- sass/package.json | 2 +- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dd18a9b..e0c576d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Cross-browser CSS customizable scrollbar with advanced features:
  • Browser support: IE7+, Firefox1, Opera, Chrome, Safari
  • jQuery Scrollbar as Angular.JS directive
  • Textarea scrollbar
  • +
  • RTL support2
  • Basic Scrollbars Demo

    @@ -24,3 +25,4 @@ Cross-browser CSS customizable scrollbar with advanced features:

    Download

    1 There is known issue that native browser scrollbar cannot be hidden in Firefox on Apple devices, so this plugin is not initialized and you will see native scrollbars. +2 Experimental support in master branch, styles for scrollbars are not updated diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 754f03a..cf9ccc1 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -31,6 +31,7 @@ }, firefox: /firefox/i.test(navigator.userAgent), macosx: /mac/i.test(navigator.platform), + msedge: /edge\/\d+/i.test(navigator.userAgent), msie: /(msie|trident)/i.test(navigator.userAgent), mobile: /android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent), overlay: null, @@ -195,10 +196,13 @@ var scrollLeft = c.scrollLeft(); var scrollTop = c.scrollTop(); if (o.isRtl) { + // webkit 0:100 + // ie/edge 100:0 + // firefox -100:0 switch (true) { case browser.firefox: scrollLeft = Math.abs(scrollLeft); - case browser.msie: + case browser.msedge || browser.msie: scrollLeft = c[0].scrollWidth - c[0].clientWidth - scrollLeft; break; } @@ -371,9 +375,20 @@ scrollForward = $(this).hasClass("scroll-arrow_more") ? 1 : -1; scrollStep = o.scrollStep * scrollForward; scrollToValue = scrollForward > 0 ? data.maxScrollValue : 0; + if (o.isRtl) { + switch(true){ + case browser.firefox: + scrollToValue = scrollForward > 0 ? 0: data.maxScrollValue * -1; + break; + case browser.msie || browser.msedge: + break; + } + } } else { scrollForward = (data.eventOffset > (data.scrollbarOffset + data.scrollbarSize) ? 1 : (data.eventOffset < data.scrollbarOffset ? -1 : 0)); + if(d === 'x' && o.isRtl && (browser.msie || browser.msedge)) + scrollForward = scrollForward * -1; scrollStep = Math.round(scrollx.visible * 0.75) * scrollForward; scrollToValue = (data.eventOffset - data.scrollbarOffset - (o.stepScrolling ? (scrollForward == 1 ? data.scrollbarSize : 0) @@ -420,7 +435,7 @@ $(document).on('mousemove' + namespace, function (event) { var diff = parseInt((event[(d === 'x') ? 'pageX' : 'pageY'] - eventPosition) / scrollx.kx, 10); - if (d === 'x' && o.isRtl && browser.msie) + if (d === 'x' && o.isRtl && (browser.msie || browser.msedge)) diff = diff * -1; c[scrollOffset](initOffset + diff); }); diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index 9187107..b07c087 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -13,4 +13,4 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(l,e){"function"==typeof define&&define.amd?define(["jquery"],e):e(l.jQuery)}(this,function(l){"use strict";function e(e){if(t.webkit&&!e)return{height:0,width:0};if(!t.data.outer){var o={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};t.data.inner=l("
    ").css(l.extend({},o)),t.data.outer=l("
    ").css(l.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},o)).append(t.data.inner).appendTo("body")}return t.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(t.data.outer.offset().top-t.data.inner.offset().top||0),width:Math.ceil(t.data.outer.offset().left-t.data.inner.offset().left||0)}}function o(){var l=e(!0);return!(l.height||l.width)}function s(l){var e=l.originalEvent;return(!e.axis||e.axis!==e.HORIZONTAL_AXIS)&&!e.wheelDeltaX}var r=!1,t={data:{index:0,name:"scrollbar"},macosx:/mac/i.test(navigator.platform),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};t.scrolls.add=function(l){this.remove(l).push(l)},t.scrolls.remove=function(e){for(;l.inArray(e,this)>=0;)this.splice(l.inArray(e,this),1);return this};var i={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},n=function(s){t.scroll||(t.overlay=o(),t.scroll=e(),a(),l(window).resize(function(){var l=!1;if(t.scroll&&(t.scroll.height||t.scroll.width)){var o=e();o.height===t.scroll.height&&o.width===t.scroll.width||(t.scroll=o,l=!0)}a(l)})),this.container=s,this.namespace=".scrollbar_"+t.data.index++,this.options=l.extend({},i,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},s.data(t.data.name,this),t.scrolls.add(this)};n.prototype={destroy:function(){if(this.wrapper){this.container.removeData(t.data.name),t.scrolls.remove(this);var e=this.container.scrollLeft(),o=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(e).scrollTop(o),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),l(document).add("body").off(this.namespace),l.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(e){var o=this,r=this.container,i=this.containerWrapper||r,n=this.namespace,c=l.extend(this.options,e||{}),a={x:this.scrollx,y:this.scrolly},d=this.wrapper,h={scrollLeft:r.scrollLeft(),scrollTop:r.scrollTop()};if(t.mobile&&c.ignoreMobile||t.overlay&&c.ignoreOverlay||t.macosx&&!t.webkit)return l.isFunction(c.onFallback)&&c.onFallback.apply(this,[r]),!1;if(d)i.css({height:"auto","margin-bottom":t.scroll.height*-1+"px","margin-right":t.scroll.width*-1+"px","max-height":""});else{if(this.wrapper=d=l("
    ").addClass("scroll-wrapper").addClass(r.attr("class")).css("position","absolute"===r.css("position")?"absolute":"relative").insertBefore(r).append(r),r.is("textarea")&&(this.containerWrapper=i=l("
    ").insertBefore(r).append(r),d.addClass("scroll-textarea")),i.addClass("scroll-content").css({height:"auto","margin-bottom":t.scroll.height*-1+"px","margin-right":t.scroll.width*-1+"px","max-height":""}),r.on("scroll"+n,function(e){l.isFunction(c.onScroll)&&c.onScroll.call(o,{maxScroll:a.y.maxScrollOffset,scroll:r.scrollTop(),size:a.y.size,visible:a.y.visible},{maxScroll:a.x.maxScrollOffset,scroll:r.scrollLeft(),size:a.x.size,visible:a.x.visible}),a.x.isVisible&&a.x.scroll.bar.css("left",r.scrollLeft()*a.x.kx+"px"),a.y.isVisible&&a.y.scroll.bar.css("top",r.scrollTop()*a.y.kx+"px")}),d.on("scroll"+n,function(){d.scrollTop(0).scrollLeft(0)}),c.disableBodyScroll){var p=function(l){s(l)?a.y.isVisible&&a.y.mousewheel(l):a.x.isVisible&&a.x.mousewheel(l)};d.on("MozMousePixelScroll"+n,p),d.on("mousewheel"+n,p),t.mobile&&d.on("touchstart"+n,function(e){var o=e.originalEvent.touches&&e.originalEvent.touches[0]||e,s={pageX:o.pageX,pageY:o.pageY},t={left:r.scrollLeft(),top:r.scrollTop()};l(document).on("touchmove"+n,function(l){var e=l.originalEvent.targetTouches&&l.originalEvent.targetTouches[0]||l;r.scrollLeft(t.left+s.pageX-e.pageX),r.scrollTop(t.top+s.pageY-e.pageY),l.preventDefault()}),l(document).on("touchend"+n,function(){l(document).off(n)})})}l.isFunction(c.onInit)&&c.onInit.apply(this,[r])}l.each(a,function(e,t){var i=null,d=1,h="x"===e?"scrollLeft":"scrollTop",p=c.scrollStep,u=function(){var l=r[h]();r[h](l+p),1==d&&l+p>=f&&(l=r[h]()),d==-1&&l+p<=f&&(l=r[h]()),r[h]()==l&&i&&i()},f=0;t.scroll||(t.scroll=o._getScroll(c["scroll"+e]).addClass("scroll-"+e),c.showArrows&&t.scroll.addClass("scroll-element_arrows_visible"),t.mousewheel=function(l){if(!t.isVisible||"x"===e&&s(l))return!0;if("y"===e&&!s(l))return a.x.mousewheel(l),!0;var i=l.originalEvent.wheelDelta*-1||l.originalEvent.detail,n=t.size-t.visible-t.offset;return i||("x"===e&&l.originalEvent.deltaX?i=40*l.originalEvent.deltaX:"y"===e&&l.originalEvent.deltaY&&(i=40*l.originalEvent.deltaY)),(i>0&&f<0&&f>0)&&(f+=i,f<0&&(f=0),f>n&&(f=n),o.scrollTo=o.scrollTo||{},o.scrollTo[h]=f,setTimeout(function(){o.scrollTo&&(r.stop().animate(o.scrollTo,240,"linear",function(){f=r[h]()}),o.scrollTo=null)},1)),l.preventDefault(),!1},t.scroll.on("MozMousePixelScroll"+n,t.mousewheel).on("mousewheel"+n,t.mousewheel).on("mouseenter"+n,function(){f=r[h]()}),t.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+n,function(s){if(1!=s.which)return!0;d=1;var n={eventOffset:s["x"===e?"pageX":"pageY"],maxScrollValue:t.size-t.visible-t.offset,scrollbarOffset:t.scroll.bar.offset()["x"===e?"left":"top"],scrollbarSize:t.scroll.bar["x"===e?"outerWidth":"outerHeight"]()},a=0,v=0;return l(this).hasClass("scroll-arrow")?(d=l(this).hasClass("scroll-arrow_more")?1:-1,p=c.scrollStep*d,f=d>0?n.maxScrollValue:0):(d=n.eventOffset>n.scrollbarOffset+n.scrollbarSize?1:n.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return o[e]&&(e=o[e]),e||(e=o.simple),e="string"==typeof e?l(e).appendTo(this.wrapper):l(e),l.extend(e,{bar:e.find(".scroll-bar"),size:e.find(".scroll-element_size"),track:e.find(".scroll-element_track")}),e},_handleMouseDown:function(e,o){var s=this.namespace;return l(document).on("blur"+s,function(){l(document).add("body").off(s),e&&e()}),l(document).on("dragstart"+s,function(l){return l.preventDefault(),!1}),l(document).on("mouseup"+s,function(){l(document).add("body").off(s),e&&e()}),l("body").on("selectstart"+s,function(l){return l.preventDefault(),!1}),o&&o.preventDefault(),!1},_updateScroll:function(e,o){var s=this.container,r=this.containerWrapper||s,i="scroll-scroll"+e+"_visible",n="x"===e?this.scrolly:this.scrollx,c=parseInt(this.container.css("x"===e?"left":"top"),10)||0,a=this.wrapper,d=o.size,h=o.visible+c;o.isVisible=d-h>1,o.isVisible?(o.scroll.addClass(i),n.scroll.addClass(i),r.addClass(i)):(o.scroll.removeClass(i),n.scroll.removeClass(i),r.removeClass(i)),"y"===e&&(s.is("textarea")||d10?(window.console&&console.log("Scroll updates exceed 10"),a=function(){}):(clearTimeout(l),l=setTimeout(a,300))}}();window.angular&&!function(l){l.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var e=i;return{setOptions:function(o){l.extend(e,o)},$get:function(){return{options:l.copy(e)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(l,e){return{restrict:"AC",link:function(o,s,r){var t=e(r.jqueryScrollbar),i=t(o);s.scrollbar(i||l.options).on("$destroy",function(){s.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b(a.jQuery)}(this,function(a){"use strict";function h(b){if(c.webkit&&!b)return{height:0,width:0};if(!c.data.outer){var d={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};c.data.inner=a("
    ").css(a.extend({},d)),c.data.outer=a("
    ").css(a.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},d)).append(c.data.inner).appendTo("body")}return c.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(c.data.outer.offset().top-c.data.inner.offset().top||0),width:Math.ceil(c.data.outer.offset().left-c.data.inner.offset().left||0)}}function i(){var a=h(!0);return!(a.height||a.width)}function j(a){var b=a.originalEvent;return(!b.axis||b.axis!==b.HORIZONTAL_AXIS)&&!b.wheelDeltaX}var b=!1,c={data:{index:0,name:"scrollbar"},firefox:/firefox/i.test(navigator.userAgent),macosx:/mac/i.test(navigator.platform),msedge:/edge\/\d+/i.test(navigator.userAgent),msie:/(msie|trident)/i.test(navigator.userAgent),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};c.scrolls.add=function(a){this.remove(a).push(a)},c.scrolls.remove=function(b){for(;a.inArray(b,this)>=0;)this.splice(a.inArray(b,this),1);return this};var d={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,isRtl:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},e=function(b){c.scroll||(c.overlay=i(),c.scroll=h(),g(),a(window).resize(function(){var a=!1;if(c.scroll&&(c.scroll.height||c.scroll.width)){var b=h();b.height===c.scroll.height&&b.width===c.scroll.width||(c.scroll=b,a=!0)}g(a)})),this.container=b,this.namespace=".scrollbar_"+c.data.index++,this.options=a.extend({},d,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},b.data(c.data.name,this),c.scrolls.add(this)};e.prototype={destroy:function(){if(this.wrapper){this.container.removeData(c.data.name),c.scrolls.remove(this);var b=this.container.scrollLeft(),d=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(b).scrollTop(d),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),a(document).add("body").off(this.namespace),a.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(b){var d=this,e=this.container,f=this.containerWrapper||e,g=this.namespace,h=a.extend(this.options,b||{}),i={x:this.scrollx,y:this.scrolly},k=this.wrapper,l={},m={scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop()};if(c.mobile&&h.ignoreMobile||c.overlay&&h.ignoreOverlay||c.macosx&&!c.webkit)return a.isFunction(h.onFallback)&&h.onFallback.apply(this,[e]),!1;if(k)l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.css(l);else{if(this.wrapper=k=a("
    ").addClass("scroll-wrapper").addClass(e.attr("class")).css("position","absolute"===e.css("position")?"absolute":"relative").insertBefore(e).append(e),h.isRtl&&k.addClass("scroll--rtl"),e.is("textarea")&&(this.containerWrapper=f=a("
    ").insertBefore(e).append(e),k.addClass("scroll-textarea")),l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.addClass("scroll-content").css(l),e.on("scroll"+g,function(b){var f=e.scrollLeft(),g=e.scrollTop();if(h.isRtl)switch(!0){case c.firefox:f=Math.abs(f);case c.msedge||c.msie:f=e[0].scrollWidth-e[0].clientWidth-f}a.isFunction(h.onScroll)&&h.onScroll.call(d,{maxScroll:i.y.maxScrollOffset,scroll:g,size:i.y.size,visible:i.y.visible},{maxScroll:i.x.maxScrollOffset,scroll:f,size:i.x.size,visible:i.x.visible}),i.x.isVisible&&i.x.scroll.bar.css("left",f*i.x.kx+"px"),i.y.isVisible&&i.y.scroll.bar.css("top",g*i.y.kx+"px")}),k.on("scroll"+g,function(){k.scrollTop(0).scrollLeft(0)}),h.disableBodyScroll){var n=function(a){j(a)?i.y.isVisible&&i.y.mousewheel(a):i.x.isVisible&&i.x.mousewheel(a)};k.on("MozMousePixelScroll"+g,n),k.on("mousewheel"+g,n),c.mobile&&k.on("touchstart"+g,function(b){var c=b.originalEvent.touches&&b.originalEvent.touches[0]||b,d={pageX:c.pageX,pageY:c.pageY},f={left:e.scrollLeft(),top:e.scrollTop()};a(document).on("touchmove"+g,function(a){var b=a.originalEvent.targetTouches&&a.originalEvent.targetTouches[0]||a;e.scrollLeft(f.left+d.pageX-b.pageX),e.scrollTop(f.top+d.pageY-b.pageY),a.preventDefault()}),a(document).on("touchend"+g,function(){a(document).off(g)})})}a.isFunction(h.onInit)&&h.onInit.apply(this,[e])}a.each(i,function(b,f){var k=null,l=1,m="x"===b?"scrollLeft":"scrollTop",n=h.scrollStep,o=function(){var a=e[m]();e[m](a+n),1==l&&a+n>=p&&(a=e[m]()),l==-1&&a+n<=p&&(a=e[m]()),e[m]()==a&&k&&k()},p=0;f.scroll||(f.scroll=d._getScroll(h["scroll"+b]).addClass("scroll-"+b),h.showArrows&&f.scroll.addClass("scroll-element_arrows_visible"),f.mousewheel=function(a){if(!f.isVisible||"x"===b&&j(a))return!0;if("y"===b&&!j(a))return i.x.mousewheel(a),!0;var c=a.originalEvent.wheelDelta*-1||a.originalEvent.detail,g=f.size-f.visible-f.offset;return c||("x"===b&&a.originalEvent.deltaX?c=40*a.originalEvent.deltaX:"y"===b&&a.originalEvent.deltaY&&(c=40*a.originalEvent.deltaY)),(c>0&&p<0&&p>0)&&(p+=c,p<0&&(p=0),p>g&&(p=g),d.scrollTo=d.scrollTo||{},d.scrollTo[m]=p,setTimeout(function(){d.scrollTo&&(e.stop().animate(d.scrollTo,240,"linear",function(){p=e[m]()}),d.scrollTo=null)},1)),a.preventDefault(),!1},f.scroll.on("MozMousePixelScroll"+g,f.mousewheel).on("mousewheel"+g,f.mousewheel).on("mouseenter"+g,function(){p=e[m]()}),f.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+g,function(g){if(1!=g.which)return!0;l=1;var i={eventOffset:g["x"===b?"pageX":"pageY"],maxScrollValue:f.size-f.visible-f.offset,scrollbarOffset:f.scroll.bar.offset()["x"===b?"left":"top"],scrollbarSize:f.scroll.bar["x"===b?"outerWidth":"outerHeight"]()},j=0,q=0;if(a(this).hasClass("scroll-arrow")){if(l=a(this).hasClass("scroll-arrow_more")?1:-1,n=h.scrollStep*l,p=l>0?i.maxScrollValue:0,h.isRtl)switch(!0){case c.firefox:p=l>0?0:i.maxScrollValue*-1;break;case c.msie||c.msedge:}}else l=i.eventOffset>i.scrollbarOffset+i.scrollbarSize?1:i.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return c[b]&&(b=c[b]),b||(b=c.simple),b="string"==typeof b?a(b).appendTo(this.wrapper):a(b),a.extend(b,{bar:b.find(".scroll-bar"),size:b.find(".scroll-element_size"),track:b.find(".scroll-element_track")}),b},_handleMouseDown:function(b,c){var d=this.namespace;return a(document).on("blur"+d,function(){a(document).add("body").off(d),b&&b()}),a(document).on("dragstart"+d,function(a){return a.preventDefault(),!1}),a(document).on("mouseup"+d,function(){a(document).add("body").off(d),b&&b()}),a("body").on("selectstart"+d,function(a){return a.preventDefault(),!1}),c&&c.preventDefault(),!1},_updateScroll:function(b,d){var e=this.container,f=this.containerWrapper||e,g="scroll-scroll"+b+"_visible",h="x"===b?this.scrolly:this.scrollx,i=parseInt(this.container.css("x"===b?"left":"top"),10)||0,j=this.wrapper,k=d.size,l=d.visible+i;d.isVisible=k-l>1,d.isVisible?(d.scroll.addClass(g),h.scroll.addClass(g),f.addClass(g)):(d.scroll.removeClass(g),h.scroll.removeClass(g),f.removeClass(g)),"y"===b&&(e.is("textarea")||k10?(window.console&&console.log("Scroll updates exceed 10"),g=function(){}):(clearTimeout(a),a=setTimeout(g,300))}}();window.angular&&!function(a){a.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var b=d;return{setOptions:function(c){a.extend(b,c)},$get:function(){return{options:a.copy(b)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(a,b){return{restrict:"AC",link:function(c,d,e){var f=b(e.jqueryScrollbar),g=f(c);d.scrollbar(g||a.options).on("$destroy",function(){d.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file diff --git a/sass/package.json b/sass/package.json index cf2ff61..fd871d6 100644 --- a/sass/package.json +++ b/sass/package.json @@ -1,6 +1,6 @@ { "name": "jquery.scrollbar", - "version": "0.2.10", + "version": "0.2.11", "devDependencies": { "grunt": "~0.4.1", "grunt-contrib-compass": "^1.0.4", From 74b62cc9a77045381e235d76af75d28e3610e302 Mon Sep 17 00:00:00 2001 From: Yuriy Khabarov <13real008@gmail.com> Date: Tue, 30 Aug 2016 00:00:53 +0500 Subject: [PATCH 30/32] fix destroy: andSelf => addBack --- jquery.scrollbar.js | 4 ++-- jquery.scrollbar.min.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index cf9ccc1..454219b 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -129,8 +129,8 @@ .scrollLeft(scrollLeft) .scrollTop(scrollTop); - this.scrollx.scroll.removeClass('scroll-scrollx_visible').find('div').andSelf().off(this.namespace); - this.scrolly.scroll.removeClass('scroll-scrolly_visible').find('div').andSelf().off(this.namespace); + this.scrollx.scroll.removeClass('scroll-scrollx_visible').find('div').addBack().off(this.namespace); + this.scrolly.scroll.removeClass('scroll-scrolly_visible').find('div').addBack().off(this.namespace); this.wrapper.remove(); diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index b07c087..cb557ee 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -13,4 +13,4 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b(a.jQuery)}(this,function(a){"use strict";function h(b){if(c.webkit&&!b)return{height:0,width:0};if(!c.data.outer){var d={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};c.data.inner=a("
    ").css(a.extend({},d)),c.data.outer=a("
    ").css(a.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},d)).append(c.data.inner).appendTo("body")}return c.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(c.data.outer.offset().top-c.data.inner.offset().top||0),width:Math.ceil(c.data.outer.offset().left-c.data.inner.offset().left||0)}}function i(){var a=h(!0);return!(a.height||a.width)}function j(a){var b=a.originalEvent;return(!b.axis||b.axis!==b.HORIZONTAL_AXIS)&&!b.wheelDeltaX}var b=!1,c={data:{index:0,name:"scrollbar"},firefox:/firefox/i.test(navigator.userAgent),macosx:/mac/i.test(navigator.platform),msedge:/edge\/\d+/i.test(navigator.userAgent),msie:/(msie|trident)/i.test(navigator.userAgent),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};c.scrolls.add=function(a){this.remove(a).push(a)},c.scrolls.remove=function(b){for(;a.inArray(b,this)>=0;)this.splice(a.inArray(b,this),1);return this};var d={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,isRtl:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},e=function(b){c.scroll||(c.overlay=i(),c.scroll=h(),g(),a(window).resize(function(){var a=!1;if(c.scroll&&(c.scroll.height||c.scroll.width)){var b=h();b.height===c.scroll.height&&b.width===c.scroll.width||(c.scroll=b,a=!0)}g(a)})),this.container=b,this.namespace=".scrollbar_"+c.data.index++,this.options=a.extend({},d,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},b.data(c.data.name,this),c.scrolls.add(this)};e.prototype={destroy:function(){if(this.wrapper){this.container.removeData(c.data.name),c.scrolls.remove(this);var b=this.container.scrollLeft(),d=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(b).scrollTop(d),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").andSelf().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").andSelf().off(this.namespace),this.wrapper.remove(),a(document).add("body").off(this.namespace),a.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(b){var d=this,e=this.container,f=this.containerWrapper||e,g=this.namespace,h=a.extend(this.options,b||{}),i={x:this.scrollx,y:this.scrolly},k=this.wrapper,l={},m={scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop()};if(c.mobile&&h.ignoreMobile||c.overlay&&h.ignoreOverlay||c.macosx&&!c.webkit)return a.isFunction(h.onFallback)&&h.onFallback.apply(this,[e]),!1;if(k)l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.css(l);else{if(this.wrapper=k=a("
    ").addClass("scroll-wrapper").addClass(e.attr("class")).css("position","absolute"===e.css("position")?"absolute":"relative").insertBefore(e).append(e),h.isRtl&&k.addClass("scroll--rtl"),e.is("textarea")&&(this.containerWrapper=f=a("
    ").insertBefore(e).append(e),k.addClass("scroll-textarea")),l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.addClass("scroll-content").css(l),e.on("scroll"+g,function(b){var f=e.scrollLeft(),g=e.scrollTop();if(h.isRtl)switch(!0){case c.firefox:f=Math.abs(f);case c.msedge||c.msie:f=e[0].scrollWidth-e[0].clientWidth-f}a.isFunction(h.onScroll)&&h.onScroll.call(d,{maxScroll:i.y.maxScrollOffset,scroll:g,size:i.y.size,visible:i.y.visible},{maxScroll:i.x.maxScrollOffset,scroll:f,size:i.x.size,visible:i.x.visible}),i.x.isVisible&&i.x.scroll.bar.css("left",f*i.x.kx+"px"),i.y.isVisible&&i.y.scroll.bar.css("top",g*i.y.kx+"px")}),k.on("scroll"+g,function(){k.scrollTop(0).scrollLeft(0)}),h.disableBodyScroll){var n=function(a){j(a)?i.y.isVisible&&i.y.mousewheel(a):i.x.isVisible&&i.x.mousewheel(a)};k.on("MozMousePixelScroll"+g,n),k.on("mousewheel"+g,n),c.mobile&&k.on("touchstart"+g,function(b){var c=b.originalEvent.touches&&b.originalEvent.touches[0]||b,d={pageX:c.pageX,pageY:c.pageY},f={left:e.scrollLeft(),top:e.scrollTop()};a(document).on("touchmove"+g,function(a){var b=a.originalEvent.targetTouches&&a.originalEvent.targetTouches[0]||a;e.scrollLeft(f.left+d.pageX-b.pageX),e.scrollTop(f.top+d.pageY-b.pageY),a.preventDefault()}),a(document).on("touchend"+g,function(){a(document).off(g)})})}a.isFunction(h.onInit)&&h.onInit.apply(this,[e])}a.each(i,function(b,f){var k=null,l=1,m="x"===b?"scrollLeft":"scrollTop",n=h.scrollStep,o=function(){var a=e[m]();e[m](a+n),1==l&&a+n>=p&&(a=e[m]()),l==-1&&a+n<=p&&(a=e[m]()),e[m]()==a&&k&&k()},p=0;f.scroll||(f.scroll=d._getScroll(h["scroll"+b]).addClass("scroll-"+b),h.showArrows&&f.scroll.addClass("scroll-element_arrows_visible"),f.mousewheel=function(a){if(!f.isVisible||"x"===b&&j(a))return!0;if("y"===b&&!j(a))return i.x.mousewheel(a),!0;var c=a.originalEvent.wheelDelta*-1||a.originalEvent.detail,g=f.size-f.visible-f.offset;return c||("x"===b&&a.originalEvent.deltaX?c=40*a.originalEvent.deltaX:"y"===b&&a.originalEvent.deltaY&&(c=40*a.originalEvent.deltaY)),(c>0&&p<0&&p>0)&&(p+=c,p<0&&(p=0),p>g&&(p=g),d.scrollTo=d.scrollTo||{},d.scrollTo[m]=p,setTimeout(function(){d.scrollTo&&(e.stop().animate(d.scrollTo,240,"linear",function(){p=e[m]()}),d.scrollTo=null)},1)),a.preventDefault(),!1},f.scroll.on("MozMousePixelScroll"+g,f.mousewheel).on("mousewheel"+g,f.mousewheel).on("mouseenter"+g,function(){p=e[m]()}),f.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+g,function(g){if(1!=g.which)return!0;l=1;var i={eventOffset:g["x"===b?"pageX":"pageY"],maxScrollValue:f.size-f.visible-f.offset,scrollbarOffset:f.scroll.bar.offset()["x"===b?"left":"top"],scrollbarSize:f.scroll.bar["x"===b?"outerWidth":"outerHeight"]()},j=0,q=0;if(a(this).hasClass("scroll-arrow")){if(l=a(this).hasClass("scroll-arrow_more")?1:-1,n=h.scrollStep*l,p=l>0?i.maxScrollValue:0,h.isRtl)switch(!0){case c.firefox:p=l>0?0:i.maxScrollValue*-1;break;case c.msie||c.msedge:}}else l=i.eventOffset>i.scrollbarOffset+i.scrollbarSize?1:i.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return c[b]&&(b=c[b]),b||(b=c.simple),b="string"==typeof b?a(b).appendTo(this.wrapper):a(b),a.extend(b,{bar:b.find(".scroll-bar"),size:b.find(".scroll-element_size"),track:b.find(".scroll-element_track")}),b},_handleMouseDown:function(b,c){var d=this.namespace;return a(document).on("blur"+d,function(){a(document).add("body").off(d),b&&b()}),a(document).on("dragstart"+d,function(a){return a.preventDefault(),!1}),a(document).on("mouseup"+d,function(){a(document).add("body").off(d),b&&b()}),a("body").on("selectstart"+d,function(a){return a.preventDefault(),!1}),c&&c.preventDefault(),!1},_updateScroll:function(b,d){var e=this.container,f=this.containerWrapper||e,g="scroll-scroll"+b+"_visible",h="x"===b?this.scrolly:this.scrollx,i=parseInt(this.container.css("x"===b?"left":"top"),10)||0,j=this.wrapper,k=d.size,l=d.visible+i;d.isVisible=k-l>1,d.isVisible?(d.scroll.addClass(g),h.scroll.addClass(g),f.addClass(g)):(d.scroll.removeClass(g),h.scroll.removeClass(g),f.removeClass(g)),"y"===b&&(e.is("textarea")||k10?(window.console&&console.log("Scroll updates exceed 10"),g=function(){}):(clearTimeout(a),a=setTimeout(g,300))}}();window.angular&&!function(a){a.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var b=d;return{setOptions:function(c){a.extend(b,c)},$get:function(){return{options:a.copy(b)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(a,b){return{restrict:"AC",link:function(c,d,e){var f=b(e.jqueryScrollbar),g=f(c);d.scrollbar(g||a.options).on("$destroy",function(){d.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b(a.jQuery)}(this,function(a){"use strict";function h(b){if(c.webkit&&!b)return{height:0,width:0};if(!c.data.outer){var d={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};c.data.inner=a("
    ").css(a.extend({},d)),c.data.outer=a("
    ").css(a.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},d)).append(c.data.inner).appendTo("body")}return c.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(c.data.outer.offset().top-c.data.inner.offset().top||0),width:Math.ceil(c.data.outer.offset().left-c.data.inner.offset().left||0)}}function i(){var a=h(!0);return!(a.height||a.width)}function j(a){var b=a.originalEvent;return(!b.axis||b.axis!==b.HORIZONTAL_AXIS)&&!b.wheelDeltaX}var b=!1,c={data:{index:0,name:"scrollbar"},firefox:/firefox/i.test(navigator.userAgent),macosx:/mac/i.test(navigator.platform),msedge:/edge\/\d+/i.test(navigator.userAgent),msie:/(msie|trident)/i.test(navigator.userAgent),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};c.scrolls.add=function(a){this.remove(a).push(a)},c.scrolls.remove=function(b){for(;a.inArray(b,this)>=0;)this.splice(a.inArray(b,this),1);return this};var d={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,isRtl:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},e=function(b){c.scroll||(c.overlay=i(),c.scroll=h(),g(),a(window).resize(function(){var a=!1;if(c.scroll&&(c.scroll.height||c.scroll.width)){var b=h();b.height===c.scroll.height&&b.width===c.scroll.width||(c.scroll=b,a=!0)}g(a)})),this.container=b,this.namespace=".scrollbar_"+c.data.index++,this.options=a.extend({},d,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},b.data(c.data.name,this),c.scrolls.add(this)};e.prototype={destroy:function(){if(this.wrapper){this.container.removeData(c.data.name),c.scrolls.remove(this);var b=this.container.scrollLeft(),d=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(b).scrollTop(d),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").addBack().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").addBack().off(this.namespace),this.wrapper.remove(),a(document).add("body").off(this.namespace),a.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(b){var d=this,e=this.container,f=this.containerWrapper||e,g=this.namespace,h=a.extend(this.options,b||{}),i={x:this.scrollx,y:this.scrolly},k=this.wrapper,l={},m={scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop()};if(c.mobile&&h.ignoreMobile||c.overlay&&h.ignoreOverlay||c.macosx&&!c.webkit)return a.isFunction(h.onFallback)&&h.onFallback.apply(this,[e]),!1;if(k)l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.css(l);else{if(this.wrapper=k=a("
    ").addClass("scroll-wrapper").addClass(e.attr("class")).css("position","absolute"===e.css("position")?"absolute":"relative").insertBefore(e).append(e),h.isRtl&&k.addClass("scroll--rtl"),e.is("textarea")&&(this.containerWrapper=f=a("
    ").insertBefore(e).append(e),k.addClass("scroll-textarea")),l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.addClass("scroll-content").css(l),e.on("scroll"+g,function(b){var f=e.scrollLeft(),g=e.scrollTop();if(h.isRtl)switch(!0){case c.firefox:f=Math.abs(f);case c.msedge||c.msie:f=e[0].scrollWidth-e[0].clientWidth-f}a.isFunction(h.onScroll)&&h.onScroll.call(d,{maxScroll:i.y.maxScrollOffset,scroll:g,size:i.y.size,visible:i.y.visible},{maxScroll:i.x.maxScrollOffset,scroll:f,size:i.x.size,visible:i.x.visible}),i.x.isVisible&&i.x.scroll.bar.css("left",f*i.x.kx+"px"),i.y.isVisible&&i.y.scroll.bar.css("top",g*i.y.kx+"px")}),k.on("scroll"+g,function(){k.scrollTop(0).scrollLeft(0)}),h.disableBodyScroll){var n=function(a){j(a)?i.y.isVisible&&i.y.mousewheel(a):i.x.isVisible&&i.x.mousewheel(a)};k.on("MozMousePixelScroll"+g,n),k.on("mousewheel"+g,n),c.mobile&&k.on("touchstart"+g,function(b){var c=b.originalEvent.touches&&b.originalEvent.touches[0]||b,d={pageX:c.pageX,pageY:c.pageY},f={left:e.scrollLeft(),top:e.scrollTop()};a(document).on("touchmove"+g,function(a){var b=a.originalEvent.targetTouches&&a.originalEvent.targetTouches[0]||a;e.scrollLeft(f.left+d.pageX-b.pageX),e.scrollTop(f.top+d.pageY-b.pageY),a.preventDefault()}),a(document).on("touchend"+g,function(){a(document).off(g)})})}a.isFunction(h.onInit)&&h.onInit.apply(this,[e])}a.each(i,function(b,f){var k=null,l=1,m="x"===b?"scrollLeft":"scrollTop",n=h.scrollStep,o=function(){var a=e[m]();e[m](a+n),1==l&&a+n>=p&&(a=e[m]()),l==-1&&a+n<=p&&(a=e[m]()),e[m]()==a&&k&&k()},p=0;f.scroll||(f.scroll=d._getScroll(h["scroll"+b]).addClass("scroll-"+b),h.showArrows&&f.scroll.addClass("scroll-element_arrows_visible"),f.mousewheel=function(a){if(!f.isVisible||"x"===b&&j(a))return!0;if("y"===b&&!j(a))return i.x.mousewheel(a),!0;var c=a.originalEvent.wheelDelta*-1||a.originalEvent.detail,g=f.size-f.visible-f.offset;return c||("x"===b&&a.originalEvent.deltaX?c=40*a.originalEvent.deltaX:"y"===b&&a.originalEvent.deltaY&&(c=40*a.originalEvent.deltaY)),(c>0&&p<0&&p>0)&&(p+=c,p<0&&(p=0),p>g&&(p=g),d.scrollTo=d.scrollTo||{},d.scrollTo[m]=p,setTimeout(function(){d.scrollTo&&(e.stop().animate(d.scrollTo,240,"linear",function(){p=e[m]()}),d.scrollTo=null)},1)),a.preventDefault(),!1},f.scroll.on("MozMousePixelScroll"+g,f.mousewheel).on("mousewheel"+g,f.mousewheel).on("mouseenter"+g,function(){p=e[m]()}),f.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+g,function(g){if(1!=g.which)return!0;l=1;var i={eventOffset:g["x"===b?"pageX":"pageY"],maxScrollValue:f.size-f.visible-f.offset,scrollbarOffset:f.scroll.bar.offset()["x"===b?"left":"top"],scrollbarSize:f.scroll.bar["x"===b?"outerWidth":"outerHeight"]()},j=0,q=0;if(a(this).hasClass("scroll-arrow")){if(l=a(this).hasClass("scroll-arrow_more")?1:-1,n=h.scrollStep*l,p=l>0?i.maxScrollValue:0,h.isRtl)switch(!0){case c.firefox:p=l>0?0:i.maxScrollValue*-1;break;case c.msie||c.msedge:}}else l=i.eventOffset>i.scrollbarOffset+i.scrollbarSize?1:i.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return c[b]&&(b=c[b]),b||(b=c.simple),b="string"==typeof b?a(b).appendTo(this.wrapper):a(b),a.extend(b,{bar:b.find(".scroll-bar"),size:b.find(".scroll-element_size"),track:b.find(".scroll-element_track")}),b},_handleMouseDown:function(b,c){var d=this.namespace;return a(document).on("blur"+d,function(){a(document).add("body").off(d),b&&b()}),a(document).on("dragstart"+d,function(a){return a.preventDefault(),!1}),a(document).on("mouseup"+d,function(){a(document).add("body").off(d),b&&b()}),a("body").on("selectstart"+d,function(a){return a.preventDefault(),!1}),c&&c.preventDefault(),!1},_updateScroll:function(b,d){var e=this.container,f=this.containerWrapper||e,g="scroll-scroll"+b+"_visible",h="x"===b?this.scrolly:this.scrollx,i=parseInt(this.container.css("x"===b?"left":"top"),10)||0,j=this.wrapper,k=d.size,l=d.visible+i;d.isVisible=k-l>1,d.isVisible?(d.scroll.addClass(g),h.scroll.addClass(g),f.addClass(g)):(d.scroll.removeClass(g),h.scroll.removeClass(g),f.removeClass(g)),"y"===b&&(e.is("textarea")||k10?(window.console&&console.log("Scroll updates exceed 10"),g=function(){}):(clearTimeout(a),a=setTimeout(g,300))}}();window.angular&&!function(a){a.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var b=d;return{setOptions:function(c){a.extend(b,c)},$get:function(){return{options:a.copy(b)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(a,b){return{restrict:"AC",link:function(c,d,e){var f=b(e.jqueryScrollbar),g=f(c);d.scrollbar(g||a.options).on("$destroy",function(){d.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file From 143ae43ca329d8b38ac1c33a0a8ebc817806e509 Mon Sep 17 00:00:00 2001 From: Chris Parton Date: Tue, 6 Sep 2016 10:42:41 +1000 Subject: [PATCH 31/32] Add require() support --- jquery.scrollbar.js | 2 ++ jquery.scrollbar.min.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 454219b..0883fd3 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -15,6 +15,8 @@ (function (root, factory) { if (typeof define === 'function' && define.amd) { define(['jquery'], factory); + } else if (typeof exports !== "undefined") { + factory(require('jquery')); } else { factory(root.jQuery); } diff --git a/jquery.scrollbar.min.js b/jquery.scrollbar.min.js index cb557ee..5a86f9a 100644 --- a/jquery.scrollbar.min.js +++ b/jquery.scrollbar.min.js @@ -13,4 +13,4 @@ * @url https://github.com/gromo/jquery.scrollbar/ * */ -!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b(a.jQuery)}(this,function(a){"use strict";function h(b){if(c.webkit&&!b)return{height:0,width:0};if(!c.data.outer){var d={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};c.data.inner=a("
    ").css(a.extend({},d)),c.data.outer=a("
    ").css(a.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},d)).append(c.data.inner).appendTo("body")}return c.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(c.data.outer.offset().top-c.data.inner.offset().top||0),width:Math.ceil(c.data.outer.offset().left-c.data.inner.offset().left||0)}}function i(){var a=h(!0);return!(a.height||a.width)}function j(a){var b=a.originalEvent;return(!b.axis||b.axis!==b.HORIZONTAL_AXIS)&&!b.wheelDeltaX}var b=!1,c={data:{index:0,name:"scrollbar"},firefox:/firefox/i.test(navigator.userAgent),macosx:/mac/i.test(navigator.platform),msedge:/edge\/\d+/i.test(navigator.userAgent),msie:/(msie|trident)/i.test(navigator.userAgent),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};c.scrolls.add=function(a){this.remove(a).push(a)},c.scrolls.remove=function(b){for(;a.inArray(b,this)>=0;)this.splice(a.inArray(b,this),1);return this};var d={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,isRtl:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},e=function(b){c.scroll||(c.overlay=i(),c.scroll=h(),g(),a(window).resize(function(){var a=!1;if(c.scroll&&(c.scroll.height||c.scroll.width)){var b=h();b.height===c.scroll.height&&b.width===c.scroll.width||(c.scroll=b,a=!0)}g(a)})),this.container=b,this.namespace=".scrollbar_"+c.data.index++,this.options=a.extend({},d,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},b.data(c.data.name,this),c.scrolls.add(this)};e.prototype={destroy:function(){if(this.wrapper){this.container.removeData(c.data.name),c.scrolls.remove(this);var b=this.container.scrollLeft(),d=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(b).scrollTop(d),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").addBack().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").addBack().off(this.namespace),this.wrapper.remove(),a(document).add("body").off(this.namespace),a.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(b){var d=this,e=this.container,f=this.containerWrapper||e,g=this.namespace,h=a.extend(this.options,b||{}),i={x:this.scrollx,y:this.scrolly},k=this.wrapper,l={},m={scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop()};if(c.mobile&&h.ignoreMobile||c.overlay&&h.ignoreOverlay||c.macosx&&!c.webkit)return a.isFunction(h.onFallback)&&h.onFallback.apply(this,[e]),!1;if(k)l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.css(l);else{if(this.wrapper=k=a("
    ").addClass("scroll-wrapper").addClass(e.attr("class")).css("position","absolute"===e.css("position")?"absolute":"relative").insertBefore(e).append(e),h.isRtl&&k.addClass("scroll--rtl"),e.is("textarea")&&(this.containerWrapper=f=a("
    ").insertBefore(e).append(e),k.addClass("scroll-textarea")),l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.addClass("scroll-content").css(l),e.on("scroll"+g,function(b){var f=e.scrollLeft(),g=e.scrollTop();if(h.isRtl)switch(!0){case c.firefox:f=Math.abs(f);case c.msedge||c.msie:f=e[0].scrollWidth-e[0].clientWidth-f}a.isFunction(h.onScroll)&&h.onScroll.call(d,{maxScroll:i.y.maxScrollOffset,scroll:g,size:i.y.size,visible:i.y.visible},{maxScroll:i.x.maxScrollOffset,scroll:f,size:i.x.size,visible:i.x.visible}),i.x.isVisible&&i.x.scroll.bar.css("left",f*i.x.kx+"px"),i.y.isVisible&&i.y.scroll.bar.css("top",g*i.y.kx+"px")}),k.on("scroll"+g,function(){k.scrollTop(0).scrollLeft(0)}),h.disableBodyScroll){var n=function(a){j(a)?i.y.isVisible&&i.y.mousewheel(a):i.x.isVisible&&i.x.mousewheel(a)};k.on("MozMousePixelScroll"+g,n),k.on("mousewheel"+g,n),c.mobile&&k.on("touchstart"+g,function(b){var c=b.originalEvent.touches&&b.originalEvent.touches[0]||b,d={pageX:c.pageX,pageY:c.pageY},f={left:e.scrollLeft(),top:e.scrollTop()};a(document).on("touchmove"+g,function(a){var b=a.originalEvent.targetTouches&&a.originalEvent.targetTouches[0]||a;e.scrollLeft(f.left+d.pageX-b.pageX),e.scrollTop(f.top+d.pageY-b.pageY),a.preventDefault()}),a(document).on("touchend"+g,function(){a(document).off(g)})})}a.isFunction(h.onInit)&&h.onInit.apply(this,[e])}a.each(i,function(b,f){var k=null,l=1,m="x"===b?"scrollLeft":"scrollTop",n=h.scrollStep,o=function(){var a=e[m]();e[m](a+n),1==l&&a+n>=p&&(a=e[m]()),l==-1&&a+n<=p&&(a=e[m]()),e[m]()==a&&k&&k()},p=0;f.scroll||(f.scroll=d._getScroll(h["scroll"+b]).addClass("scroll-"+b),h.showArrows&&f.scroll.addClass("scroll-element_arrows_visible"),f.mousewheel=function(a){if(!f.isVisible||"x"===b&&j(a))return!0;if("y"===b&&!j(a))return i.x.mousewheel(a),!0;var c=a.originalEvent.wheelDelta*-1||a.originalEvent.detail,g=f.size-f.visible-f.offset;return c||("x"===b&&a.originalEvent.deltaX?c=40*a.originalEvent.deltaX:"y"===b&&a.originalEvent.deltaY&&(c=40*a.originalEvent.deltaY)),(c>0&&p<0&&p>0)&&(p+=c,p<0&&(p=0),p>g&&(p=g),d.scrollTo=d.scrollTo||{},d.scrollTo[m]=p,setTimeout(function(){d.scrollTo&&(e.stop().animate(d.scrollTo,240,"linear",function(){p=e[m]()}),d.scrollTo=null)},1)),a.preventDefault(),!1},f.scroll.on("MozMousePixelScroll"+g,f.mousewheel).on("mousewheel"+g,f.mousewheel).on("mouseenter"+g,function(){p=e[m]()}),f.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+g,function(g){if(1!=g.which)return!0;l=1;var i={eventOffset:g["x"===b?"pageX":"pageY"],maxScrollValue:f.size-f.visible-f.offset,scrollbarOffset:f.scroll.bar.offset()["x"===b?"left":"top"],scrollbarSize:f.scroll.bar["x"===b?"outerWidth":"outerHeight"]()},j=0,q=0;if(a(this).hasClass("scroll-arrow")){if(l=a(this).hasClass("scroll-arrow_more")?1:-1,n=h.scrollStep*l,p=l>0?i.maxScrollValue:0,h.isRtl)switch(!0){case c.firefox:p=l>0?0:i.maxScrollValue*-1;break;case c.msie||c.msedge:}}else l=i.eventOffset>i.scrollbarOffset+i.scrollbarSize?1:i.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return c[b]&&(b=c[b]),b||(b=c.simple),b="string"==typeof b?a(b).appendTo(this.wrapper):a(b),a.extend(b,{bar:b.find(".scroll-bar"),size:b.find(".scroll-element_size"),track:b.find(".scroll-element_track")}),b},_handleMouseDown:function(b,c){var d=this.namespace;return a(document).on("blur"+d,function(){a(document).add("body").off(d),b&&b()}),a(document).on("dragstart"+d,function(a){return a.preventDefault(),!1}),a(document).on("mouseup"+d,function(){a(document).add("body").off(d),b&&b()}),a("body").on("selectstart"+d,function(a){return a.preventDefault(),!1}),c&&c.preventDefault(),!1},_updateScroll:function(b,d){var e=this.container,f=this.containerWrapper||e,g="scroll-scroll"+b+"_visible",h="x"===b?this.scrolly:this.scrollx,i=parseInt(this.container.css("x"===b?"left":"top"),10)||0,j=this.wrapper,k=d.size,l=d.visible+i;d.isVisible=k-l>1,d.isVisible?(d.scroll.addClass(g),h.scroll.addClass(g),f.addClass(g)):(d.scroll.removeClass(g),h.scroll.removeClass(g),f.removeClass(g)),"y"===b&&(e.is("textarea")||k10?(window.console&&console.log("Scroll updates exceed 10"),g=function(){}):(clearTimeout(a),a=setTimeout(g,300))}}();window.angular&&!function(a){a.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var b=d;return{setOptions:function(c){a.extend(b,c)},$get:function(){return{options:a.copy(b)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(a,b){return{restrict:"AC",link:function(c,d,e){var f=b(e.jqueryScrollbar),g=f(c);d.scrollbar(g||a.options).on("$destroy",function(){d.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b("undefined"!=typeof exports?require("jquery"):a.jQuery)}(this,function(a){"use strict";function h(b){if(c.webkit&&!b)return{height:0,width:0};if(!c.data.outer){var d={border:"none","box-sizing":"content-box",height:"200px",margin:"0",padding:"0",width:"200px"};c.data.inner=a("
    ").css(a.extend({},d)),c.data.outer=a("
    ").css(a.extend({left:"-1000px",overflow:"scroll",position:"absolute",top:"-1000px"},d)).append(c.data.inner).appendTo("body")}return c.data.outer.scrollLeft(1e3).scrollTop(1e3),{height:Math.ceil(c.data.outer.offset().top-c.data.inner.offset().top||0),width:Math.ceil(c.data.outer.offset().left-c.data.inner.offset().left||0)}}function i(){var a=h(!0);return!(a.height||a.width)}function j(a){var b=a.originalEvent;return(!b.axis||b.axis!==b.HORIZONTAL_AXIS)&&!b.wheelDeltaX}var b=!1,c={data:{index:0,name:"scrollbar"},firefox:/firefox/i.test(navigator.userAgent),macosx:/mac/i.test(navigator.platform),msedge:/edge\/\d+/i.test(navigator.userAgent),msie:/(msie|trident)/i.test(navigator.userAgent),mobile:/android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),overlay:null,scroll:null,scrolls:[],webkit:/webkit/i.test(navigator.userAgent)&&!/edge\/\d+/i.test(navigator.userAgent)};c.scrolls.add=function(a){this.remove(a).push(a)},c.scrolls.remove=function(b){for(;a.inArray(b,this)>=0;)this.splice(a.inArray(b,this),1);return this};var d={autoScrollSize:!0,autoUpdate:!0,debug:!1,disableBodyScroll:!1,duration:200,ignoreMobile:!1,ignoreOverlay:!1,isRtl:!1,scrollStep:30,showArrows:!1,stepScrolling:!0,scrollx:null,scrolly:null,onDestroy:null,onFallback:null,onInit:null,onScroll:null,onUpdate:null},e=function(b){c.scroll||(c.overlay=i(),c.scroll=h(),g(),a(window).resize(function(){var a=!1;if(c.scroll&&(c.scroll.height||c.scroll.width)){var b=h();b.height===c.scroll.height&&b.width===c.scroll.width||(c.scroll=b,a=!0)}g(a)})),this.container=b,this.namespace=".scrollbar_"+c.data.index++,this.options=a.extend({},d,window.jQueryScrollbarOptions||{}),this.scrollTo=null,this.scrollx={},this.scrolly={},b.data(c.data.name,this),c.scrolls.add(this)};e.prototype={destroy:function(){if(this.wrapper){this.container.removeData(c.data.name),c.scrolls.remove(this);var b=this.container.scrollLeft(),d=this.container.scrollTop();this.container.insertBefore(this.wrapper).css({height:"",margin:"","max-height":""}).removeClass("scroll-content scroll-scrollx_visible scroll-scrolly_visible").off(this.namespace).scrollLeft(b).scrollTop(d),this.scrollx.scroll.removeClass("scroll-scrollx_visible").find("div").addBack().off(this.namespace),this.scrolly.scroll.removeClass("scroll-scrolly_visible").find("div").addBack().off(this.namespace),this.wrapper.remove(),a(document).add("body").off(this.namespace),a.isFunction(this.options.onDestroy)&&this.options.onDestroy.apply(this,[this.container])}},init:function(b){var d=this,e=this.container,f=this.containerWrapper||e,g=this.namespace,h=a.extend(this.options,b||{}),i={x:this.scrollx,y:this.scrolly},k=this.wrapper,l={},m={scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop()};if(c.mobile&&h.ignoreMobile||c.overlay&&h.ignoreOverlay||c.macosx&&!c.webkit)return a.isFunction(h.onFallback)&&h.onFallback.apply(this,[e]),!1;if(k)l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.css(l);else{if(this.wrapper=k=a("
    ").addClass("scroll-wrapper").addClass(e.attr("class")).css("position","absolute"===e.css("position")?"absolute":"relative").insertBefore(e).append(e),h.isRtl&&k.addClass("scroll--rtl"),e.is("textarea")&&(this.containerWrapper=f=a("
    ").insertBefore(e).append(e),k.addClass("scroll-textarea")),l={height:"auto","margin-bottom":c.scroll.height*-1+"px","max-height":""},l[h.isRtl?"margin-left":"margin-right"]=c.scroll.width*-1+"px",f.addClass("scroll-content").css(l),e.on("scroll"+g,function(b){var f=e.scrollLeft(),g=e.scrollTop();if(h.isRtl)switch(!0){case c.firefox:f=Math.abs(f);case c.msedge||c.msie:f=e[0].scrollWidth-e[0].clientWidth-f}a.isFunction(h.onScroll)&&h.onScroll.call(d,{maxScroll:i.y.maxScrollOffset,scroll:g,size:i.y.size,visible:i.y.visible},{maxScroll:i.x.maxScrollOffset,scroll:f,size:i.x.size,visible:i.x.visible}),i.x.isVisible&&i.x.scroll.bar.css("left",f*i.x.kx+"px"),i.y.isVisible&&i.y.scroll.bar.css("top",g*i.y.kx+"px")}),k.on("scroll"+g,function(){k.scrollTop(0).scrollLeft(0)}),h.disableBodyScroll){var n=function(a){j(a)?i.y.isVisible&&i.y.mousewheel(a):i.x.isVisible&&i.x.mousewheel(a)};k.on("MozMousePixelScroll"+g,n),k.on("mousewheel"+g,n),c.mobile&&k.on("touchstart"+g,function(b){var c=b.originalEvent.touches&&b.originalEvent.touches[0]||b,d={pageX:c.pageX,pageY:c.pageY},f={left:e.scrollLeft(),top:e.scrollTop()};a(document).on("touchmove"+g,function(a){var b=a.originalEvent.targetTouches&&a.originalEvent.targetTouches[0]||a;e.scrollLeft(f.left+d.pageX-b.pageX),e.scrollTop(f.top+d.pageY-b.pageY),a.preventDefault()}),a(document).on("touchend"+g,function(){a(document).off(g)})})}a.isFunction(h.onInit)&&h.onInit.apply(this,[e])}a.each(i,function(b,f){var k=null,l=1,m="x"===b?"scrollLeft":"scrollTop",n=h.scrollStep,o=function(){var a=e[m]();e[m](a+n),1==l&&a+n>=p&&(a=e[m]()),l==-1&&a+n<=p&&(a=e[m]()),e[m]()==a&&k&&k()},p=0;f.scroll||(f.scroll=d._getScroll(h["scroll"+b]).addClass("scroll-"+b),h.showArrows&&f.scroll.addClass("scroll-element_arrows_visible"),f.mousewheel=function(a){if(!f.isVisible||"x"===b&&j(a))return!0;if("y"===b&&!j(a))return i.x.mousewheel(a),!0;var c=a.originalEvent.wheelDelta*-1||a.originalEvent.detail,g=f.size-f.visible-f.offset;return c||("x"===b&&a.originalEvent.deltaX?c=40*a.originalEvent.deltaX:"y"===b&&a.originalEvent.deltaY&&(c=40*a.originalEvent.deltaY)),(c>0&&p<0&&p>0)&&(p+=c,p<0&&(p=0),p>g&&(p=g),d.scrollTo=d.scrollTo||{},d.scrollTo[m]=p,setTimeout(function(){d.scrollTo&&(e.stop().animate(d.scrollTo,240,"linear",function(){p=e[m]()}),d.scrollTo=null)},1)),a.preventDefault(),!1},f.scroll.on("MozMousePixelScroll"+g,f.mousewheel).on("mousewheel"+g,f.mousewheel).on("mouseenter"+g,function(){p=e[m]()}),f.scroll.find(".scroll-arrow, .scroll-element_track").on("mousedown"+g,function(g){if(1!=g.which)return!0;l=1;var i={eventOffset:g["x"===b?"pageX":"pageY"],maxScrollValue:f.size-f.visible-f.offset,scrollbarOffset:f.scroll.bar.offset()["x"===b?"left":"top"],scrollbarSize:f.scroll.bar["x"===b?"outerWidth":"outerHeight"]()},j=0,q=0;if(a(this).hasClass("scroll-arrow")){if(l=a(this).hasClass("scroll-arrow_more")?1:-1,n=h.scrollStep*l,p=l>0?i.maxScrollValue:0,h.isRtl)switch(!0){case c.firefox:p=l>0?0:i.maxScrollValue*-1;break;case c.msie||c.msedge:}}else l=i.eventOffset>i.scrollbarOffset+i.scrollbarSize?1:i.eventOffset','
    ','
    ','
    ','
    ','
    ','
    ','
    ','
    ',"
    ","
    ",'
    ','
    ','
    ',"
    ",'
    ','
    ',"
    ","
    ","
    "].join(""),simple:['
    ','
    ','
    ','
    ','
    ',"
    ","
    "].join("")};return c[b]&&(b=c[b]),b||(b=c.simple),b="string"==typeof b?a(b).appendTo(this.wrapper):a(b),a.extend(b,{bar:b.find(".scroll-bar"),size:b.find(".scroll-element_size"),track:b.find(".scroll-element_track")}),b},_handleMouseDown:function(b,c){var d=this.namespace;return a(document).on("blur"+d,function(){a(document).add("body").off(d),b&&b()}),a(document).on("dragstart"+d,function(a){return a.preventDefault(),!1}),a(document).on("mouseup"+d,function(){a(document).add("body").off(d),b&&b()}),a("body").on("selectstart"+d,function(a){return a.preventDefault(),!1}),c&&c.preventDefault(),!1},_updateScroll:function(b,d){var e=this.container,f=this.containerWrapper||e,g="scroll-scroll"+b+"_visible",h="x"===b?this.scrolly:this.scrollx,i=parseInt(this.container.css("x"===b?"left":"top"),10)||0,j=this.wrapper,k=d.size,l=d.visible+i;d.isVisible=k-l>1,d.isVisible?(d.scroll.addClass(g),h.scroll.addClass(g),f.addClass(g)):(d.scroll.removeClass(g),h.scroll.removeClass(g),f.removeClass(g)),"y"===b&&(e.is("textarea")||k10?(window.console&&console.log("Scroll updates exceed 10"),g=function(){}):(clearTimeout(a),a=setTimeout(g,300))}}();window.angular&&!function(a){a.module("jQueryScrollbar",[]).provider("jQueryScrollbar",function(){var b=d;return{setOptions:function(c){a.extend(b,c)},$get:function(){return{options:a.copy(b)}}}}).directive("jqueryScrollbar",["jQueryScrollbar","$parse",function(a,b){return{restrict:"AC",link:function(c,d,e){var f=b(e.jqueryScrollbar),g=f(c);d.scrollbar(g||a.options).on("$destroy",function(){d.scrollbar("destroy")})}}}])}(window.angular)}); \ No newline at end of file From c3573421224b0ec7cf47f8335577dc519b1c36ef Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 27 Dec 2017 09:58:39 +0300 Subject: [PATCH 32/32] fix factory jquery --- jquery.scrollbar.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jquery.scrollbar.js b/jquery.scrollbar.js index 0883fd3..c3b8a75 100644 --- a/jquery.scrollbar.js +++ b/jquery.scrollbar.js @@ -13,12 +13,13 @@ */ ; (function (root, factory) { + 'use strict'; if (typeof define === 'function' && define.amd) { define(['jquery'], factory); - } else if (typeof exports !== "undefined") { - factory(require('jquery')); + } else if (typeof exports !== 'undefined') { + module.exports = factory(require('jquery')); } else { - factory(root.jQuery); + factory(jQuery); } }(this, function ($) { 'use strict';