jQuery custom content scroller
Highly customizable custom scrollbar jQuery plugin. Features include vertical and/or horizontal scrollbar(s), adjustable scrolling momentum, mouse-wheel (via jQuery mousewheel plugin), keyboard and touch support, ready-to-use themes and customization via CSS, RTL direction support, option parameters for full control of scrollbar functionality, methods for triggering actions like scroll-to, update, destroy etc., user-defined callbacks and more.
Current version 3.1.5 (Changelog)
Upgrading from version 2
How to use it
Get started by downloading the archive which contains the plugin files (and a large amount of HTML demos and examples). Extract and upload jquery.mCustomScrollbar.concat.min.js, jquery.mCustomScrollbar.css and mCSB_buttons.png to your web server (alternatively you can load plugin files from a CDN).
HTML
Include jquery.mCustomScrollbar.css in the head tag your HTML document (more info)
<link rel="stylesheet" href="/path/to/jquery.mCustomScrollbar.css" />
Include jQuery library (if your project doesn’t use it already) and jquery.mCustomScrollbar.concat.min.js in the head tag or at the very bottom of your document, just before the closing body tag
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script src="/path/to/jquery.mCustomScrollbar.concat.min.js"></script>
CSS
The element(s) you want to add scrollbar(s) should have the typical CSS properties of an overflowed block which are a height (or max-height) value, an overflow value of auto (or hidden) and content long enough to require scrolling. For horizontal scrollbar, the element should have a width (or max-width) value set.
If you prefer to set your element’s height/width via javascript, you can use the setHeight
/setWidth
option parameters.
Initialization
Initialize via javascript
After files inclusion, call mCustomScrollbar function on the element selector you want to add the scrollbar(s)
<script> (function($){ $(window).on("load",function(){ $(".content").mCustomScrollbar(); }); })(jQuery); </script>
Initialize via HTML
Add the class mCustomScrollbar
to any element you want to add custom scrollbar(s) with default options. Optionally, set its axis via the HTML data attribute data-mcs-axis
(e.g. "x"
for horizontal and "y"
for vertical) and its theme via data-mcs-theme
. For example:
<div class="mCustomScrollbar" data-mcs-theme="dark"> <!-- your content --> </div>
Basic configuration & option parameters
axis
By default, the script applies a vertical scrollbar. To add a horizontal or 2-axis scrollbars, invoke mCustomScrollbar function with the axis option set to "x"
or "yx"
respectively
$(".content").mCustomScrollbar({ axis:"x" // horizontal scrollbar });
$(".content").mCustomScrollbar({ axis:"yx" // vertical and horizontal scrollbar });
theme
To quickly change the appearance of the scrollbar, set the theme option parameter to any of the ready-to-use themes available in jquery.mCustomScrollbar.css, for example:
$(".content").mCustomScrollbar({ theme:"dark" });
Configuration
You can configure your scrollbar(s) using the following option parameters on mCustomScrollbar function
Usage $(selector).mCustomScrollbar({ option: value });
setWidth: false
- Set the width of your content (overwrites CSS width), value in pixels (integer) or percentage (string).
setHeight: false
- Set the height of your content (overwrites CSS height), value in pixels (integer) or percentage (string).
setTop: 0
- Set the initial css top property of content, accepts string values (css top position).
Example:setTop: "-100px"
.
setLeft: 0
- Set the initial css left property of content, accepts string values (css left position).
Example:setLeft: "-100px"
.
axis: "string"
- Define content’s scrolling axis (the type of scrollbars added to the element: vertical and/of horizontal).
Available values:"y"
,"x"
,"yx"
.axis: "y"
– vertical scrollbar (default)axis: "x"
– horizontal scrollbaraxis: "yx"
– vertical and horizontal scrollbars
scrollbarPosition: "string"
- Set the position of scrollbar in relation to content.
Available values:"inside"
,"outside"
.
SettingscrollbarPosition: "inside"
(default) makes scrollbar appear inside the element. SettingscrollbarPosition: "outside"
makes scrollbar appear outside the element. Note that setting the value to"outside"
requires your element (or parent elements) to have CSSposition: relative
(otherwise the scrollbar will be positioned in relation to document’s root element).
scrollInertia: integer
- Set the amount of scrolling momentum as animation duration in milliseconds.
Higher value equals greater scrolling momentum which translates to smoother/more progressive animation. Set to0
to disable.
autoDraggerLength: boolean
- Enable or disable auto-adjusting scrollbar dragger length in relation to scrolling amount (same bahavior with browser’s native scrollbar).
SetautoDraggerLength: false
when you want your scrollbar to (always) have a fixed size.
autoHideScrollbar: boolean
- Enable or disable auto-hiding the scrollbar when inactive.
SettingautoHideScrollbar: true
will hide the scrollbar(s) when scrolling is idle and/or cursor is out of the scrolling area.
Please note that some special themes like “minimal” overwrite this option.
autoExpandScrollbar: boolean
- Enable or disable auto-expanding the scrollbar when cursor is over or dragging the scrollbar.
alwaysShowScrollbar: integer
- Always keep scrollbar(s) visible, even when there’s nothing to scroll.
alwaysShowScrollbar: 0
– disable (default)alwaysShowScrollbar: 1
– keep dragger rail visiblealwaysShowScrollbar: 2
– keep all scrollbar components (dragger, rail, buttons etc.) visible
snapAmount: integer
- Make scrolling snap to a multiple of a fixed number of pixels. Useful in cases like scrolling tabular data, image thumbnails or slides and you need to prevent scrolling from stopping half-way your elements. Note that your elements must be of equal width or height in order for this to work properly.
To set different values for vertical and horizontal scrolling, use an array:[y,x]
snapOffset: integer
- Set an offset (in pixels) for the snapAmount option. Useful when for example you need to offset the snap amount of table rows by the table header.
mouseWheel:{ enable: boolean }
- Enable or disable content scrolling via mouse-wheel.
mouseWheel:{ scrollAmount: integer }
- Set the mouse-wheel scrolling amount (in pixels). The default value
"auto"
adjusts scrolling amount according to scrollable content length.
mouseWheel:{ axis: "string" }
- Define the mouse-wheel scrolling axis when both vertical and horizontal scrollbars are present.
Setaxis: "y"
(default) for vertical oraxis: "x"
for horizontal scrolling.
mouseWheel:{ preventDefault: boolean }
- Prevent the default behaviour which automatically scrolls the parent element when end or beginning of scrolling is reached (same bahavior with browser’s native scrollbar).
mouseWheel:{ deltaFactor: integer }
- Set the number of pixels one wheel notch scrolls. The default value “auto” uses the OS/browser value.
mouseWheel:{ normalizeDelta: boolean }
- Enable or disable mouse-wheel (delta) acceleration. Setting
normalizeDelta: true
translates mouse-wheel delta value to -1 or 1.
mouseWheel:{ invert: boolean }
- Invert mouse-wheel scrolling direction. Set to
true
to scroll down or right when mouse-wheel is turned upwards.
mouseWheel:{ disableOver: [array] }
- Set the tags that disable mouse-wheel when cursor is over them.
Default value:["select","option","keygen","datalist","textarea"]
scrollButtons:{ enable: boolean }
- Enable or disable scrollbar buttons.
scrollButtons:{ scrollAmount: integer }
- Set the buttons scrolling amount (in pixels). The default value
"auto"
adjusts scrolling amount according to scrollable content length.
scrollButtons:{ scrollType: "string" }
- Define the buttons scrolling type/behavior.
scrollType: "stepless"
– continuously scroll content while pressing the button (default)scrollType: "stepped"
– each button click scrolls content by a certain amount (defined in scrollAmount option above)
scrollButtons:{ tabindex: integer }
- Set a tabindex value for the buttons.
keyboard:{ enable: boolean }
- Enable or disable content scrolling via the keyboard.
The plugin supports the directional arrows (top, left, right and down), page-up (PgUp), page-down (PgDn), Home and End keys.
keyboard:{ scrollAmount: integer }
- Set the keyboard arrows scrolling amount (in pixels). The default value
"auto"
adjusts scrolling amount according to scrollable content length.
keyboard:{ scrollType: "string" }
- Define the keyboard arrows scrolling type/behavior.
scrollType: "stepless"
– continuously scroll content while pressing the arrow key (default)scrollType: "stepped"
– each key release scrolls content by a certain amount (defined in scrollAmount option above)
contentTouchScroll: integer
- Enable or disable content touch-swipe scrolling for touch-enabled devices.
To completely disable, setcontentTouchScroll: false
.
Integer values define the axis-specific minimum amount required for scrolling momentum (default:25
).
documentTouchScroll: boolean
- Enable or disable document touch-swipe scrolling for touch-enabled devices.
advanced:{ autoExpandHorizontalScroll: boolean }
- Auto-expand content horizontally (for
"x"
or"yx"
axis).
If set totrue
, content will expand horizontally to accommodate any floated/inline-block elements.
Setting its value to2
(integer) forces the non scrollHeight/scrollWidth method. A value of3
forces the scrollHeight/scrollWidth method.
advanced:{ autoScrollOnFocus: "string" }
- Set the list of elements/selectors that will auto-scroll content to their position when focused.
For example, when pressing TAB key to focus input fields, if the field is out of the viewable area the content will scroll to its top/left position (same bahavior with browser’s native scrollbar).
To completely disable this functionality, setautoScrollOnFocus: false
.
Default:"input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']"
advanced:{ updateOnContentResize: boolean }
- Update scrollbar(s) automatically on content, element or viewport resize.
The value should betrue
(default) for fluid layouts/elements, adding/removing content dynamically, hiding/showing elements etc.
advanced:{ updateOnImageLoad: boolean }
- Update scrollbar(s) automatically each time an image inside the element is fully loaded.
Default value isauto
which triggers the function only on"x"
and"yx"
axis (if needed).
The value should betrue
when your content contains images and you need the function to trigger on any axis.
advanced:{ updateOnSelectorChange: "string" }
- Update scrollbar(s) automatically when the amount and size of specific selectors changes.
Useful when you need to update the scrollbar(s) automatically, each time a type of element is added, removed or changes its size.
For example, settingupdateOnSelectorChange: "ul li"
will update scrollbars each time list-items inside the element are changed.
Setting the value totrue
, will update scrollbars each time any element is changed.
To disable (default) set tofalse
.
advanced:{ extraDraggableSelectors: "string" }
- Add extra selector(s) that’ll release scrollbar dragging upon mouseup, pointerup, touchend etc.
Example:extraDraggableSelectors: ".myClass, #myID"
advanced:{ releaseDraggableSelectors: "string" }
- Add extra selector(s) that’ll allow scrollbar dragging upon mousemove/up, pointermove/up, touchend etc.
Example:releaseDraggableSelectors: ".myClass, #myID"
advanced:{ autoUpdateTimeout: integer }
- Set the auto-update timeout in milliseconds.
Default timeout:60
theme: "string"
- Set the scrollbar theme.
View all ready-to-use themes
All themes are contained in plugin’s CSS file (jquery.mCustomScrollbar.css).
Default theme:"light"
callbacks:{ onCreate: function(){} }
- A function to call when plugin markup is created.
Example:
callbacks:{ onCreate:function(){ console.log("Plugin markup generated"); } }
callbacks:{ onInit: function(){} }
- A function to call when scrollbars have initialized (demo).
Example:
callbacks:{ onInit:function(){ console.log("Scrollbars initialized"); } }
callbacks:{ onScrollStart: function(){} }
- A function to call when scrolling starts (demo).
Example:
callbacks:{ onScrollStart:function(){ console.log("Scrolling started..."); } }
callbacks:{ onScroll: function(){} }
- A function to call when scrolling is completed (demo).
Example:
callbacks:{ onScroll:function(){ console.log("Content scrolled..."); } }
callbacks:{ whileScrolling: function(){} }
- A function to call while scrolling is active (demo).
Example:
callbacks:{ whileScrolling:function(){ console.log("Scrolling..."); } }
callbacks:{ onTotalScroll: function(){} }
- A function to call when scrolling is completed and content is scrolled all the way to the end (bottom/right) (demo).
Example:
callbacks:{ onTotalScroll:function(){ console.log("Scrolled to end of content."); } }
callbacks:{ onTotalScrollBack: function(){} }
- A function to call when scrolling is completed and content is scrolled back to the beginning (top/left) (demo).
Example:
callbacks:{ onTotalScrollBack:function(){ console.log("Scrolled back to the beginning of content."); } }
callbacks:{ onTotalScrollOffset: integer }
- Set an offset for the onTotalScroll option.
For example, settingonTotalScrollOffset: 100
will trigger the onTotalScroll callback 100 pixels before the end of scrolling is reached.
callbacks:{ onTotalScrollBackOffset: integer }
- Set an offset for the onTotalScrollBack option.
For example, settingonTotalScrollBackOffset: 100
will trigger the onTotalScrollBack callback 100 pixels before the beginning of scrolling is reached.
callbacks:{ alwaysTriggerOffsets: boolean }
- Set the behavior of calling onTotalScroll and onTotalScrollBack offsets.
By default, callback offsets will trigger repeatedly while content is scrolling within the offsets.
SetalwaysTriggerOffsets: false
when you need to trigger onTotalScroll and onTotalScrollBack callbacks once, each time scroll end or beginning is reached.
callbacks:{ onOverflowY: function(){} }
- A function to call when content becomes long enough and vertical scrollbar is added.
Example:
callbacks:{ onOverflowY:function(){ console.log("Vertical scrolling required"); } }
callbacks:{ onOverflowX: function(){} }
- A function to call when content becomes wide enough and horizontal scrollbar is added.
Example:
callbacks:{ onOverflowX:function(){ console.log("Horizontal scrolling required"); } }
callbacks:{ onOverflowYNone: function(){} }
- A function to call when content becomes short enough and vertical scrollbar is removed.
Example:
callbacks:{ onOverflowYNone:function(){ console.log("Vertical scrolling is not required"); } }
callbacks:{ onOverflowXNone: function(){} }
- A function to call when content becomes narrow enough and horizontal scrollbar is removed.
Example:
callbacks:{ onOverflowXNone:function(){ console.log("Horizontal scrolling is not required"); } }
callbacks:{ onBeforeUpdate: function(){} }
- A function to call right before scrollbar(s) are updated.
Example:
callbacks:{ onBeforeUpdate:function(){ console.log("Scrollbars will update"); } }
callbacks:{ onUpdate: function(){} }
- A function to call when scrollbar(s) are updated.
Example:
callbacks:{ onUpdate:function(){ console.log("Scrollbars updated"); } }
callbacks:{ onImageLoad: function(){} }
- A function to call each time an image inside the element is fully loaded and scrollbar(s) are updated.
Example:
callbacks:{ onImageLoad:function(){ console.log("Image loaded"); } }
callbacks:{ onSelectorChange: function(){} }
- A function to call each time a type of element is added, removed or changes its size and scrollbar(s) are updated.
Example:
callbacks:{ onSelectorChange:function(){ console.log("Scrollbars updated"); } }
live: "string"
- Enable or disable applying scrollbar(s) on all elements matching the current selector, now and in the future.
Setlive: true
when you need to add scrollbar(s) on elements that do not yet exist in the page. These could be elements added by other scripts or plugins after some action by the user takes place (e.g. lightbox markup may not exist untill the user clicks a link).
If you need at any time to disable or enable the live option, setlive: "off"
and"on"
respectively.
You can also tell the script to disable live option after the first invocation by settinglive: "once"
.
liveSelector: "string"
- Set the matching set of elements (instead of the current selector) to add scrollbar(s), now and in the future.
Plugin methods
Ways to execute various plugin actions programmatically from within your script(s).
update
Usage $(selector).mCustomScrollbar("update");
Call the update method to manually update existing scrollbars to accommodate new content or resized element(s). This method is by default called automatically by the script (via updateOnContentResize
option) when the element itself, its content or scrollbar size changes.
scrollTo
Usage $(selector).mCustomScrollbar("scrollTo",position,options);
Call the scrollTo method to programmatically scroll the content to the position parameter (demo).
position parameter
Position parameter can be:
"string"
- e.g. element selector:
"#element-id"
- e.g. special pre-defined position:
"bottom"
- e.g. number of pixels less/more:
"-=100"
/"+=100"
- e.g. element selector:
integer
- e.g. number of pixels:
100
- e.g. number of pixels:
[array]
- e.g. different y/x position:
[100,50]
- e.g. different y/x position:
object/function
- e.g. jQuery object:
$("#element-id")
- e.g. js object:
document.getelementbyid("element-id")
- e.g. function:
function(){ return 100; }
- e.g. jQuery object:
Pre-defined position strings:
"bottom"
– scroll to bottom"top"
– scroll to top"right"
– scroll to right"left"
– scroll to left"first"
– scroll to the position of the first element within content"last"
– scroll to the position of the last element within content
Method options
scrollInertia: integer
- Scroll-to duration, value in milliseconds.
Example:
$(selector).mCustomScrollbar("scrollTo","bottom",{ scrollInertia:3000 });
scrollEasing: "string"
- Scroll-to animation easing, values:
"linear"
,"easeOut"
,"easeInOut"
.
Example:
$(selector).mCustomScrollbar("scrollTo","bottom",{ scrollEasing:"easeOut" });
moveDragger: boolean
- Scroll scrollbar dragger (instead of content).
Example:
$(selector).mCustomScrollbar("scrollTo",80,{ moveDragger:true });
timeout: integer
- Set a timeout for the method (the default timeout is 60 ms in order to work with automatic scrollbar update), value in milliseconds.
Example:
$(selector).mCustomScrollbar("scrollTo","top",{ timeout:1000 });
callbacks: boolean
- Trigger user defined callbacks after scroll-to completes.
Example:
$(selector).mCustomScrollbar("scrollTo","left",{ callbacks:false });
stop
Usage $(selector).mCustomScrollbar("stop");
Stops any running scrolling animations (usefull when you wish to interupt a previously scrollTo method call).
disable
Usage $(selector).mCustomScrollbar("disable");
Calling disable method will temporarily disable the scrollbar (demo). Disabled scrollbars can be re-enable by calling the update method.
To disable the scrollbar and reset its content position, set the method’s reset parameter to true
$(selector).mCustomScrollbar("disable",true);
destroy
Usage $(selector).mCustomScrollbar("destroy");
Calling destroy method will completely remove the custom scrollbar and return the element to its original state (demo).
Scrollbar styling & themes
You can design and visually customize your scrollbars with pure CSS, using jquery.mCustomScrollbar.css which contains the default/basic styling and all scrollbar themes.
The easiest/quickest way is to select a ready-to-use scrollbar theme. For example:
$(selector).mCustomScrollbar({ theme:"dark" });
You can modify the default styling or any theme either directly in jquery.mCustomScrollbar.css or by overwriting the CSS rules in another stylesheet.
Creating a new scrollbar theme
Create a name for your theme (e.g. “my-theme”) and set it as the value of the theme option
$(selector).mCustomScrollbar({ theme:"my-theme" });
Your element will get the class “mCS-my-theme” (your theme-name with “mCS” prefix), so you can create your CSS using the .mCS-my-theme
in your rules. For instance:
.mCS-my-theme.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: red; } .mCS-my-theme.mCSB_scrollTools .mCSB_draggerRail{ background-color: white; } /* and so on... */
In the same manner you can clone any existing theme (e.g. “dark”), change its selector (e.g. .mCS-dark
) to your own theme name (e.g. .mCS-my-theme
) and modify its CSS rules.
Scrollbar markup
The plugin applies specific id (unique) and/or classes to every scrollbar element/component, meaning that you can target and modify any scrollbar in more than one ways.
For example, every element with a scrollbar gets a unique class in the form of _mCS_1
, _mCS_2
etc. Every scrollbar container element gets a unique id in the form of mCSB_1_scrollbar_vertical
, mCSB_2_scrollbar_vertical
etc. Every scrollbar dragger gets a unique id in the form of mCSB_1_dragger_vertical
, mCSB_2_dragger_vertical
etc. in addition to the class mCSB_dragger
. All these mean that you can do stuff like:
._mCS_1 .mCSB_dragger .mCSB_dragger_bar{ background-color: red; } ._mCS_2 .mCSB_dragger .mCSB_dragger_bar{ background-color: green; } #mCSB_3_dragger_vertical .mCSB_dragger_bar{ background-color: blue; } #mCSB_1_scrollbar_vertical .mCSB_dragger{ height: 100px; } #mCSB_1_scrollbar_horizontal .mCSB_dragger{ width: 100px; } .mCSB_1_scrollbar .mCSB_dragger .mCSB_draggerRail{ width: 4px; }
User-defined callbacks
You can trigger your own js function(s) by calling them inside mCustomScrollbar callbacks option parameter
$(".content").mCustomScrollbar({ callbacks:{ onScroll:function(){ myCustomFn(this); } } }); function myCustomFn(el){ console.log(el.mcs.top); }
In the example above, each time a scroll event ends and content has stopped scrolling, the content’s top position will be logged in browser’s console. There are available callbacks for each step of the scrolling event:
onScrollStart
– triggers the moment a scroll event startswhileScrolling
– triggers while scroll event is runningonScroll
– triggers when a scroll event completesonTotalScroll
– triggers when content has scrolled all the way to bottom or rightonTotalScrollBack
– triggers when content has scrolled all the way back to top or left
You can set an offset value (pixels) for both onTotalScroll
and onTotalScrollBack
by setting onTotalScrollOffset
and onTotalScrollBackOffset
respectively (view example).
By default, onTotalScroll
and onTotalScrollBack
callbacks are triggered repeatedly. To prevent multiple calls when content is within their offset, set alwaysTriggerOffsets
option to false
(view example).
Additional callbacks:
onInit
onOverflowY
onOverflowX
onOverflowYNone
onOverflowXNone
onUpdate
onImageLoad
onSelectorChange
Returning values
The script returns a number of values and objects related to scrollbar that you can use in your own functions
this
– the original element containing the scrollbar(s)this.mcs.content
– the original content wrapper as jquery objectthis.mcs.top
– content’s top position (pixels)this.mcs.left
– content’s left position (pixels)this.mcs.draggerTop
– scrollbar dragger’s top position (pixels)this.mcs.draggerLeft
– scrollbar dragger’s left position (pixels)this.mcs.topPct
– content vertical scrolling percentagethis.mcs.leftPct
– content horizontal scrolling percentagethis.mcs.direction
– content’s scrolling direction (y or x)
Plugin-specific jQuery expressions
$("#myID:mcsInView")
- Select element(s) in your content that are within scrollable viewport.
As condition:$("#myID").is(":mcsInView");
$(".content:mcsOverflow")
- Select overflowed element(s) with visible scrollbar.
As condition:$(".content").is(":mcsOverflow");
$("#myID:mcsInSight")
$("#myID:mcsInSight(exact)")
- Select element(s) in your content that are in view of the scrollable viewport. Using the
exact
parameter will include elements that have any part of them (even 1 pixel) in view of the scrollable viewport.
As condition:$("#myID").is(":mcsInSight");
,$("#myID").is(":mcsInSight(exact)");
Plugin dependencies & requirements
- jQuery version 1.6.0 or higher
- Mouse-wheel support
License
This work is released under the MIT License.
You are free to use, study, improve and modify it wherever and however you like.
https://opensource.org/licenses/MIT
Donating helps greatly in developing and updating free software and running this blog 🙂
Hey there,
Great plugin! I’m having a problem with the scrolling though. Since I’m not a great jquery expert I’d be really happy if someone could help on this.
The problem is that on a scroll the scrollbar descends only a little with a slow reaction. I noticed that when I start scrolling immediately after the loading of the page when the mouse is unvisible that the scrolling works perfectly. But if I wait for the page to load completely and the mouse is visible the scrolling is jerky and in too small steps again.
It might have something to do with a conflict of libraries. I loaded multiple ones to get multiple plugins working and also my theme loads an old one that I can’t find the source of. Really getting stuck on this. Hope to launch this site on short notice. Thanks in advance
Some scripts are probably slow down your page. Check your page with firebug (or any other developer tools) and see if you get any console errors.
Hi there,
There don’t seem to be an error right now… In the meantime I figured out that when you scroll whith the mouse hovering the scrolltools area, the scrolling works normally, But when the mouse is hovering the container this problem is occuring. Would you maybe take a look at:
http://www.amuze.org/test-page
Still no luck on this… 🙁 Could this be a css issue? A Z-index problem or something. I’d hate to delete the custom-content-scroller out of my site, but I’m close to launching it. I hope someone can take a look at this.
http://www.amuze.org
Hi, malihu
I found a possibility of bug.
if you apply scroller on div with percentage height (80%)
and paste into this div another divs with percentage heights (45%),
your script remove from those divs attribute percentage height (this 45%).
Example:
.product_list { width: 100%; height: 80%; float: left; overflow: auto; } .product { width: 30%; height: 50%; margin: 3% 1.6%; float:left; }
div with class “product” will be resized (deleted height attr).
Hello and thanks for the feedback!
The issue you describe is not really a “bug” (as the plugin script does not remove or manipulate the height value) but has to do with scrollbars markup and CSS.
Let me explain what happens…
Without applying the plugin, your .product div resides directly inside .product_list. Since both have a height value set, .product gets the “correct” 50% height of its parent (80%).
When plugin is applied, it generates the scrollbar markup and wraps content within .mCSB_container div (so the script can scroll/animate it). This means that your .product div resides now inside .mCSB_container of .product_list. Since .mCSB_container doesn’t have any height value, its children (.product) cannot apply the 50% height (it needs a parent with a height value set, as CSS in percentages are parent-children related).
So for this to work, you must either set .product height in pixels (which will apply properly as the value is not related to its parent height), or give .mCSB_container of .product_list a specific height, for example:
.product_list>.mCustomScrollBox>.mCSB_container{ height: 800px; }
Hope this helps
Hello malihu,
This is awesome plugin. Thanks for this.
I have implemented this plugin successfully and its is working fine in its div area. But it is generating an issue with masonry layout. It is automatically increasing the height of main page. For example height of content data in customscrollbar div is 1000px then it set scrollbar into div in prefect way, but it also automatically set the height of main page to 1000px leaving a lot of blank space in right side.
Please help me
Hello,
I’ll try some tests and let you know. Does this happen on all browsers?
Do you have a link with your implementation so I can check it online?
Edit: Have you tried setting your div(s) to overflow:hidden?
I am a bit against loading the dependencies from CDN without a fallback and also during development time. I had to remove the tweenlite/cssplugin and mousewheel and link them through script tags. I believe this would be less confusing, an option could be good too to let the dev decide himself.
Also is the tweenlite/cssplugin really required? I only see that you’re using it for just easing? Wouldn’t it be better to have the dev decide which easing plugin he wants to use?
Great work on the update though.
Hello and thanks for the feedback,
The download archive contains multiple plugin files so the user is able to select which one to use.
The production-ready plugin file (and the one I suggest using on the “How to use it” guide at the top) is jquery.mCustomScrollbar.concat.min.js. This file contains the plugin script and dependencies, concatenated and minified.
jquery.mCustomScrollbar.js contains the plugin script and auto-loads dependencies via CDN. I kept this file so people that already using the un-minified version can upgrade easily.
Additionally, js directory contains the plugin script and all dependencies separately (minified and uncompressed).
In the loading_each_script_separately.html I’m loading each script separately from CDN with fallback to local.
GSAP TweenLite and CSSPlugin do all the scrolling animations so both are essential for the plugin. I’ve moved from jQuery $.animate to TweenLite because scrolling performance is significantly better (much smoother scrolling with twice the FPS). GSAP tweens also handle the callbacks way more efficiently than $.animate (and with half the code).
Performance is awesome now, but for some TweenLite license could be a problem.
Indeed, although the standard “No Charge” license applies to the vast majority of projects and websites.
create: function(event, ui) { $("#obj").mCustomScrollbar({ advanced:{ updateOnContentResize: true } }); },
Thi is pat of code of autocomplete, with create autocomplete i will try do mCustomScrollbar, but i dont have any result of search
New version (2.7) has a bug, if object dosen`t have height value, scrollbar dosen`t work. Please fix it.
All scrollbars (including browser native scrollbars) require a height value (or at least a max-height) value in order to have a purpose and work. Otherwise the content just expands its container (which the default CSS height:auto does).
I`v tried use max-height it dosen`t work, but in prev version was all right
I’ve made a max-height example here (so you can view its source):
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/max-height_example.html
Might also wanna check your CSS positioning and parent height values.
I believe I have the same issue as Peter.
So I’ve played a little bit with the max-height example and this is what I found. After changing max-height to 100% for div.content, and adding more paragraphs in #content_1 to make sure it will not fit in one window, the scrollbar doesn’t show up when loading the page.
Only if you resize (vertical or horizontal) the window, you’ll get the scrollbar.
Hope this helps you.
I see. I’ll update the script asap.
Thanks for the details and feedback!
Edit: Bug fixed, script updated.
Max-height/width bug fixed. Please re-download script.
Thanks for update.
So far I noticed just one problem.
You are loading plugin dependencies from “http” and if I run my script in Chrome from “https”, dependencies get rejected.
Just change url in code to https and everything works well. =)
Thanks a lot for the feedback.
I’ve updated jquery.mCustomScrollbar.js (which loads dependencies via CDN) to use protocol-relative url.
tell me please how connect this plugin with JqueryUI autocmplete.
I`v tied but i didn`t have any results
Is there any way to put the horizontal and vertical scroll together?
Not at the moment. Probably on the next version.
When?
Can’t really say. Maybe in 2 weeks, maybe in a couple of months…
Is there any way to have an option to enable Page Up/Down/Home/End when the user clicks on a scroll area?
There’s no option, but I’ve made a demo using up/down keyboard keys here:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/keyboard_nav_example.html
You could check its code and bind the keys you want.
Hi
Is there any way to use both up,down and left right arrows to scroll vertically and horizontally. I got vertical scroll working by using your code but cannot figure out horizontal scroll. Please give me a little help
Thanks again for above code
Hi!
Your scrollbar is as beautiful as easy to install and I was thinking of placing it in a photography website I’m making.
However I ecountered a strange bug witch makes a div with text in it malfunction(I’m using your default css and files)!
Just a few lines of text are shown, with a huge ammout of space between them, and the scrollbar doesen’t scroll back !
Thanks for your attention and amazing work!!!
Leo
How can I get the scrolled amount from top or left?
Hi, I love the look and freedom the code allows me to do, however i do have a problem. i can get the silder to show, but not to be able to scroll through the content.
everything seems to be correct (The size of the scrollbar compared to what I want to scroll, 12 pictures)
if anyone can help me, please do.
It is used on the “Team” page on my test website located at http://liamtest.99k.org/
any help would be greatly appreciated.
thanks in advance
BTW, you should show comments ordered by date desc, it doesn’t make much sense to always show the older comments first.
Hello,
Great work, I’m using it on my website.
But I’m having a problem, I have a div where I have some jQuery accordions (http://jqueryui.com/accordion/), they all start closed, and the page doesn’t need a scrool, but when I open one (it contains a long text) it overflows the div and the scroll bar doesn’t show up, making impossible to scroll the page. If I load the page with one accordion open, the scroll bar shows up, but I need to load the page with all them closed.
Can you please give me some support?
Regards,
Shouldn’t set_width and set_height be just width/height or setWidth, setHeight?
Just a nitpick but I think it looks weird for the plugin’s API 😀
Also could you please add an option to show (fadein/out) the scrollbar on mouse hover/swipe overlayed (only if it is needed), like they do on mobile?
I’ve just added such option (autoHideScrollbar) on the latest version 😉
You’re right about set_width and set_height but I don’t really wanna change it as I want the plugin to be backwards compatible. I would definitely change few names if I had the chance hehe
Just tested the scrollbar with preview in Chrome, and it displays correctly, so the issue would appear to be an IE9 compatability problem.
Any fixes for this?
Meant to also add that I tried the scrollbar on a Div with other divisions nested within (scrollbar only on the outer Div), and it didn’t work.
Is this something on my end that I’m doing wrong, or will your scrollbars not work with nested Divs?
New version fully supports nested scrollbars
Thanks.
How about my second question about how the scroll bar symbol is offset from the scrollbar container? This happens only in IE and not Chrome.
Any fixes for this?
Is this a Dreamweaver preview issue?
Added your scrollbar in Dreamweaver, and it looks great in Live View, but when I preview it in IE9, the scroll bar does not display within the container, and it is a simple rectangle and not the nice oval I see in your examples and in Live View. Any thoughts on what the issue might be?
I also want to say that your tutorials and general instructions are first rate; very easy to follow and made everything very easy.
Hi malihu
I implemented the scrollbar and it works great , now i have a requirement that the scrollbar to be working while pressing “up” and “down” arrow keys, is there any way to bind keypress event into the plugin.
Thanks in advance
I haven’t implemented keyboard scrolling into plugin core but I’ve made a demo page with such functionality:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/keyboard_nav_example.html
Hi , First of all it is great plugin and very helpful, but i have only one problem. i am using jquery Accordion inside the scroller and i enabled the option updateOnContentResize:true because i have dynamic content. In according i have 5 items one item is small which does not require scroller so if i click on other items it works fine but when i click on that particular item i hide the few top lines but if i see the in view source data is there.
Any idea or suggest.
Thanking you in advance
works like a butter smooth! i used it in wordpress. thanks for the work and thumbs up! 🙂
Hello.
I try to use it on http://geko.przyprawyswiata.pl but I can’t run it.
Slider looks great but I can’t use it. I can’t move it and mose whele dosn’t work too.
Can some one help me ?
Hi all,
great job! I like your work and I’m going to integrate it in my website.
But I cannot understand the “mouseWheel” property: here in the explanations you say that it could be set to true, false, and “pixels”, the default. If is set to false, the mouse wheel is disabled, but what’s the difference between true and “pixels”?
Hello and thanks for your comments.
On previous version I used to have a different (non-pixels) mousewheel scrolling, so I just left it in order to be backwards compatible.
Tomorrow I’m releasing the new version in which mouseWheel can be either true or false (enable/disable) and its scrolling amount is set in mouseWheelPixels option parameter which by default will be auto (the script calculates the pixels scrolling amount according to content length).
Thank you, now it’s clear.
Tell me please, how can I use mCustomScrollbar, if I have one scrolling div into another scrolling div (nested case) ?
Tomorrow I’ll release the new version which among others, supports nested scrollbars.
tomorrow ? 🙂
lol 🙂
Sorry for the delay. I decided to add some additional features so I’ll publish it in a few hours.
New version (2.7) released (finally!)
Dont know if you’ve caught it, but you’ve got a bug where if you have a scroll with no buttons, and the mCSB_dragger_bar has a border, you can drag the bar off its track… not on the first drag, but once its at its bottom edge, you can grab it and drag it again and it will move down further than the edge of the rail. Looking at your code now as well to put in a fix.
forgot to mention, this can be done in your demo files easy, just grab the multiple_scrollbars_example.html, add a 1 px border to the .mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar class in the css, and drag down multiple times.
For a quick solution, add:
box-sizing:border-box;
to .mCSB_dragger_bar
Thanks – worked like a charm! impressed with your lightning fast response time!!
Great work, makes my clients very happy! One issue maybe you can help with?
I don’t see this happening on my Mac, but for users on PC, on initial page load the ugly scrollbars “flash” for a moment until the style is overridden by your script.
My thought was this is because of the $(window).load vs. $(document).ready (but I’m not an expert with jQuery). We do have dynamic content loading in the container…some WordPress custom post types that are images in a filtering grid.
Any ideas? I know this happens on Windows based systems in Chrome (and I’m sure other browsers) You can see the site here: http://trademarkvisual.com/
Thanks!!!
Since you do load images inside your content, calling the scrollbar on document ready wouldn’t do any good. A quick solution would be to make your content initially overflow:hidden (instead of auto).
Hello,
first of all: GREAT plugin. But I’m having a fuctionality problem. When you have “normal” scrollable divs in your page, the main page will scroll, when you reached the end of the scroll of the div. But I’m not getting it done with the plugin…
Hello,
This will be fixed on the next version (update coming very soon).
Fixed on the latest version (2.7)
Hello,
thanks for this great plugin! I am trying to implement it with jquery-ui tabs, but I am a newby to jQuery. I found “Hiding & showing content blocks with custom scrollbars” in your article, but the example is not exactly the right solution for me:
I have initially two closed (!) content areas, and clicking on one tab the first content appears, clicking on the other, the first content disappears and the second appears.
It all works fine, except the custom content scroller, always showing me the “normal” default scrollbars. I am working in a password protected testing space, so if you need I can give you access to my server.
Thanks!
Regards, Meugel
Broken with latest jQuery.
Next version (available in a couple of days) will be compatible.
jQuery 1.9 has removed $.browser, so mCustomScrollbar doesn’t work with it. Can you fix that?
I upgraded from version 2.3 to 2.7 and 2.7 is soooo laggy scrolling up and down its almost unusable. Any ideas? i have all files that the plugin uses updated.
Can you provide some info or a link to your implementation? Do you get any console errors?
I don’t get any errors at all using firebug. I tested it on my local server so I didnt upload it to my live server. I’ll go ahead and test this again since you are not aware of any lag like this
Never had lag on FF before on version 2.3. Well i think IE9 did run smoother. The lag im talking about now though is really bad though. Its not minor lag. Really choppy. Ok i was the same guy that emailed you about the zoom out bug. Your new version of scrollbar fixes that problem so that problem is gone thank god. I read your release notes probably one of those height bugs you mention you fixed. How about i just give you log in infor so you can see the firefox lag? can send it ot your email [email protected]
because of the lag i had to convert back to the old version. its like crazy lag. It jerks when you scroll up and down majorly. hoping you can fix this. Will keep checking back to see if you have
Do you get lag on the demos I’ve posted as well?
Alright i narrowed down the lag only happening with FF. Your demo’s don’t lag on either IE9 or FF but i did kinda notice it wasnt as smooth in FF as in IE. So probably what ever is causing that slight problem is making the problem larger on my project.
btw im runing Firefox 19 at the moment
Firefox among browsers, has the most lag on javascript animations and IE9, webkit browsers and Opera almost always perform better.
In general, except for the browser’s rendering engine itself, there are certain CSS properties that usually make animations less smooth (e.g. scaled images, shadows, masks etc.).