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 🙂
Hello! Nice plugin! The only problem I have is that when I scroll div to its bottom on mobile devices with touch, the whole page doesnt start scrolling when I keep scrolling this div with touch… the same with the top of the div
Does this happen on the examples/demos included in the archive? I’m testing them in an iPad and they do scroll the page when bottom/top is reached. What device/OS have you used?
It’s not working on any iOS and Android device (for example Lenovo K900 and Gooogle Chrome Mobile).
I initialize in $(document).ready() like this: $(“#myId”).mCustomScrollbar(); (without any additional options). Not on mobile devices it works fine, when I reach the bottom or top of my div with mousewheel scrolling when cursor is inside my div, it starts to scroll the whole page.
I’m using version: 2.8.3 of the plugin.
Ah I see. You need to use a newer version. If I remember correctly this is issue was fixed in version 3.0.0. If you download the latest version and replace the script and css files you should be ok (without needing any other changes).
I can’t check the demos now. 🙂 Will try tomorrow at work.
Hi!
Great plugin 😉
I have only one problem with it…
I want to scroll div’s content including its background.
Is it possible ?
Cheers
Sure. You’ll need to add the background on the .mCSB_container div (which is added by the plugin) that contains your actual content. For example, if you have a CSS like this:
#myElement{ background: #000; }
you should also add this rule:
#myElement .mCSB_container{ background: #000; }
Another way would be to add an additional div to your element that’ll have the background, e.g.:
<div id="#myElement"> <div id="#myBackgroundElement"> <!-- your content... --> </div> </div>
and call mCustomScrollbar function on #myElement as you’d normally do.
Hi ,
Is it possible to make work up/down navigation from external link buttons?
plz answer…
You can do almost anything by using plugin’s scrollTo method (see Plugin methods for info). For example:
$("a.down-button").click(function(e){ e.preventDefault(); $(selector).mCustomScrollbar("scrollTo","-="+100); });
Great plugin. I have a problem though…
I have a list of DIVs, which I made all into your scrollbar by calling
$('div').mCustomScrollbar();
. Each of the DIVs have their own IDs, such as#div1
,#div2
,#div3
, etc.Essentially, I wanted to hide all of the DIVs in one call and show the appropriate one based on user selection.
I’m doing this right now:
$('div').css('display', 'none'); $('#div1').css('display', 'block');
It seems that when hiding the DIVs, the
display: none
property gets propagated to all the mCustomScrollbar elements, but when I try to show them again, thedisplay: block
property does not propagate.Any solutions?
$('div').css('display', 'none');
will hide all divs as the selector is just ‘div’.$('#div1').css('display', 'block');
will show only the div with id: ‘div1’ as the selector is ‘#div1’.Using just ‘div’ as a jQuery selector is generally not good, because the entire document is usually made of divs. You should make your selector(s) more specific, e.g. ‘.container div’.
If you want to use a single selector for hiding/showing divs, a better way is to give them an additional class, e.g.
#div1.myClass
,#div2.myClass
,#div3.myClass
etc. and toggle visibility like this:$('.myClass').css('display', 'none'); $('.myClass').css('display', 'block');
Thanks for the previous answer !
I have an other one
I have a empty div.content at the start, so the scrollBar is hidden automaticly
And when i add some text(with JS) in the .content, the scrollBar don’t appear
How to appear scrollBar OR how to never hide this ?
I tried :
alwaysShowScrollbar: 1
or
autoHideScrollbar: true/false
THANKS YOU !
have you tried:
$(selector).mCustomScrollbar(“update”);
after you added the content via JS?
If mCustomScrollbar function is already called on the element, you should add new content in .mCSB_container which is inside your element (rather than directly inside the element itself). For example:
$(".content").mCustomScrollbar(); $(".content .mCSB_container").append("...");
Okay thanks, it’s work
Hi,
I got problems when I rotate the content including the scrollbar 180 degrees via CSS. The touchgestures react totally weird. It jumps all over the place. I can’t grab the grabber via touch anymore as well.
Any suggestions to solve that issue? I already tried updating and inverting Scrollwheel.
Thanks, Matthias
At the moment there’s no solution for this. CSS transformations like rotate alter completely a number of values (position, offset etc.) which are almost impossible to calculate correctly for all browsers.
Scrollbar dragging could (somewhat) work via a modified script but I don’t know about content touch-swipe scrolling…
My suggestion is to simply disable the scrollbar (e.g.
$(selector).mCustomScrollbar("disable");
) when content is rotated above 90 degrees, as I can’t see a situation where a user would want to scroll content that’s upside-down.Hey, thanks for your reply.
The usecase is a large touchscreen embedded into a customerdesk where the customer stands on the “normal” side and the employee on the other side. Some informations on the site need to be rotated so that the employee can see all the details and scroll through it.
So the buttons still work when rotated. That should be ok then. Do you see a way to disable swipe scrolling and touch in general for that case?
But apart from that, this plugin is really easy to implement and it feels great! And big props for the huge and detailed documentation!
ok contentTouchScroll disables the swipe gestures but the dragger can still be “touched”. This should be disabled as well.
Any ideas?
You could just hide the dragger container in css:
.mCSB_draggerContainer{ display: none; }
and then show it again:
.mCSB_draggerContainer{ display: block; }
Hi,
thanks for this awesome script! Is there a way to include two horizontal, opposite scrollbars (below and above content-div)?
Thanks for a short reply in advance.
Best
David
No, elements cannot have 2 horizontal scrollbars (same as browser’s native scrollbar).
Is there a callback for when the library is initialised or when rerendering is done?
Currently there’s no init callback but you can probably use the onOverflowY/onOverflowX that trigger when content becomes scrollable:
$(selector).mCustomScrollbar({ callbacks:{ onOverflowY:function(){ console.log("done") } } });
I’ll probably add an init callback on the next version though 😉
onInit
callback added in version 3.0.5so hi… great plugin… do love it and it works fine with fancy box which another did not. however, i am having a little problem. i have images in a scrolling div. the div has 100% height and 100% width. the image in the div has max-width and auto height so that when the containing div shrinks with the viewport, the image will size proportionately keeping it’s aspect ratio. the problem occurs when the image is just about small enough to clear the y-overflow and a little beyond that. at that point, the scrollbar starts to flicker in and out and won’t stop until you resize the window.
the site is here: http:www.imagesrising.com/ir2013 go to portfolio and click on a long-thin sample and resize the window horizontally.
i could fix this by having the scrollbars always showing, but i would rather not do that. any suggestions?
thanks so much!
heather…
This happens because by default, the scrollbar position is considered relative to content. This means that the actual content and scrollbar are “separated” by a fixed margin (see CSS line 54), which is removed (see CSS line 56) when scrollbar is not visible.
You can either change the CSS (e.g. remove one of those 2 rules and/or add an opposite margin to center the image), or set the scrollbarPosition option parameter to “outside”:
$(selector).mCustomScrollbar({ scrollbarPosition: "outside" });
Since you’ll still need to somehow visually accommodate the scrollbar (and not just let it overlap the image), I suggest to simply edit plugin’s CSS and remove:
margin-right: 0;
from line 56, and add:
margin-left: 20px;
in line 54.
thank you so much for your prompt reply!!
Hey,
How to change size(height) of draggerBar ?
It’s too big when the content is too small
.mCSB_dragger_bar{height:Xpx;} doesn’t work
Thanks
By default, the scrollbar height changes the same way browser’s native scrollbar does (e.g. when content is too short, the scrollbar height is near 100%).
To disable auto-adjusting scrollbar dragger length (the draggable element is the .mCSB_dragger), you need to set autoDraggerLength to false:
$(selector).mCustomScrollbar({ autoDraggerLength: false });
This will make the scrollbar have a fixed height which you can change in CSS (line 103):
.mCSB_scrollTools .mCSB_dragger{ height: 30px; }
Hi, I want to pass the mousewheel event from an element to the custom scrollbar container.
I tried something like this, but this is not working:
$el.on(‘mousewheel DOMMouseScroll’, function (event) {
var newEvent = $.Event(‘mousewheel’, {
deltaY: event.deltaY,
deltaFactor: event.deltaFactor,
deltaX: event.deltaX,
target: $scrollbox[0]
});
$scrollbox.trigger(newEvent);
});
Using $container.mCustomScrollbar(“scrollTo”, x) is not helping, I want to have a smooth scroll.
Hi,
I have a query on horizontal scroll can I use div blocks instead of image for horizontal scroll.
If you have any example kindly provide me the same.
Because I tried it was not working.
Eagerly waiting for your reply
Mahadevan
A great plugin. thanks for the same :)..
Just a small question. I didnt see any top or bottom arrows in the scroll bar. Tried changing some values in mCSB_buttonUp and buttondown but just couldnt get it. Keeping the scroll in the container with a fixed position has any effects?? Thanks in Advance
I being a newb in a hurry overlooked some properties given above… Going through it in detail again(this time slowly) helped me out here…. Thanks for the detailed explanations dude…… Working like a charm,…. 🙂
Hello, I have a little problem with this, in this site http://optisnte.mx/snte-relaciones-internacionales/
(sorry it´s in Spanish).
If you click ” Comunicación Internacional” you will see 3 tabs, they are set to work with this plugin, but for some reason, depending on the size of the screen it works on different tabs, let me try to explain, in the first tab it works on 15″ and bigger screens, and the second tab doesn´t. If I make the browser smaller then they switch, the first one doesn´t work and the second one does, and I can´t seem to find the issue.
Any help would be greatly appreciated thank you
Hi,
It seems you’re using an older version of the plugin (2.x), meaning that the scrollbar needs to be updated each time you change/click a tab.
This can be done in 2 ways:
1. Call the update method manually in your script where you change the tabs, for example:
$(selector).mCustomScrollbar("update");
2. Enable updateOnContentResize option parameter once when you initialize the scrollbar(s), e.g.:
$(selector).mCustomScrollbar({ advanced:{ updateOnContentResize: true } });
autoHideScrollbar: false
doesn’t work withtheme: "minimal"
Indeed. Some ready-to-use themes are “special” in the sense that they overwrite some options in order to function/appear as they do. “minimal” is such a theme as it’s made to look/feel like mobile OS native scrollbars do.
You can always copy “minimal” theme’s CSS and make your own clone if you want.
Fair enough.
How about being able to set
autoHideScrollbar:true
only after first interaction?I don’t want users to miss the scrollbar when they first see the content but I’d like to hide it after they’ve used it once.
Thank you.
You can use the onScroll callback like this:
$(selector).mCustomScrollbar({ theme:"minimal-dark", callbacks:{ onScroll:function(){ $(this).find(".mCSB_draggerContainer").css("display","none"); } } });
Thanks for the swift reply but that hides the scrollbar as you scroll for the first time!
I’m sorry for not making it clear, I meant that I want the scrollbar behaviour to change to the autoHide behaviour after scrolling once and leaving the scrolling area.
I was hoping there was a way of setting the property
autoHideScrollbar: true
after instantiation of the scrollbar.Note: I’m now using “light-3” as minimal was too subtle for our needs.
Thank you.
In this case you can do:
var once=0; $(selector).mCustomScrollbar({ theme:"light-3", callbacks:{ onScroll:function(){ if(!once){ $(this) .addClass("mCS-autoHide") .data("mCS").opt.autoHideScrollbar=true; once=1; } } } });
That did it, I only to fix a JS error by changing
if(!once){
toif(once == undefined){
Thanks a bunch for your help : )
Btw, In the following setup:
scrollButtons:{ enable: true, scrollAmount: 300, scrollType: "stepped"}
scrollAmount
appears to be ignored andsnapAmount
appears to be used instead for the stepped type of scrollButtons.how can we apply this style to whole body of website…i want apply the same scrollbar style to all scrollbar in my website…how to do that? plz help
Add the class
mCustomScrollbar
to any element you want to add the scrollbar (including the body tag). This will apply the scrollbar with the default options.If you want to customize its settings, call mCustomScrollbar function on the element selector you want to add the scrollbar. For example, give your elements (including the body tag) the class
my-custom-scrollbar
and add/change your options via a script like:<script> (function($){ $(window).load(function(){ $(".my-custom-scrollbar").mCustomScrollbar({ theme:"dark" }); }); })(jQuery); </script>
Hi, i have this on my backbone view and it does not work all the times. It should catch the id of the element and then navigate to that pont. Sometimes it does, but sometimes i doesnt. Could you help me? My PM keep saying its the plugin fault.
//this is the BB event
events: {
‘click ol a’: ‘setScrollHash’,
},
//This are the BB methods
setScrollHash: function (e) {
e.preventDefault();
this.scrollTo(e.target.getAttribute(‘href’));
},
scrollTo: function (hash) {
if(hash) {
this.body.mCustomScrollbar(‘scrollTo’, hash);
} else {
this.body.mCustomScrollbar(‘scrollTo’, ‘top’);
}
}
//This is the HTML
1.- Intro
1.- Intro
My guess is that the script (sometimes) stops the scroll-to action as it hasn’t finish updating the scrollbar according to (new) content.
I don’t know how you load your content or when the scrollbar is applied (on window load? on DOM ready?) but a solution might be to add a small timeout (delay) to your scrollTo method.
If you’re using the latest version (3.0.4) you can change scrollTo method timeout via the
timeout
option, e.g.:$(selector).mCustomScrollbar('scrollTo', hash,{timeout:150});
Hi there,
Congrats for the plugin, you really did a nice job.
I just have a quick question. I used this on a webapp for touch screens, and the scroll works in all the container by sliding fingers up or down (on touch screens), and my question is for non touch screens, which have to click in the scrollbar to scroll the container, is there any way to click and slide in any part of the container and do the same behaviour (scroll) as if you were clicking in the scroll bar?
Many thanks for your time, and hopefully you could help me to sort it out 🙂
Regards,
José
It would need a modified script. This behavior would of course prevent users from selecting text, fill forms etc. On non-touch screens, click’n’drag content with a cursor in order to scroll it would feel counter-productive or just awkward.
I probably have a script modified to do this but I haven’t tested it to see if/how it would work along with actual touch-screens. Let me know if you want to send it to you.
Hi malihu,
Thanks for your reply. Yes I would like if you can send it to me.
Actually, The container always content text but I added the rules in css in order to do not allow to select text, so people can’t copy it.
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
Looking forward to hearing from you,
Regards
Sent 😉
Thanks a lot, It works perfect now 🙂
I am having a similar problem on a Windows computer with a touch monitor that isn’t recognizing touch gestures in the normal sense. Would you be willing to share the script with me?
Amazing plugin!
@Thomas Lowry
Script is here:
http://manos.malihu.gr/repository/custom-scrollbar/tests/jquery.mCustomScrollbar.mod1.js.zip
Can we add previous and next button like this?
or do you have any suggestion?
$(“.previous”).click(function(e) {
$(“#main-deck-box”).mCustomScrollbar(“scrollTo”,”-=”+100);
return false;
});
$(“.next”).click(function(e) {
$(“#main-deck-box”).mCustomScrollbar(“scrollTo”,”+=”+100);
return false;
});
Yes this would work
It’s the greatest plugin that I found!
Congratz!
I did a chat which refreshes every second. I would like to have the position of the scrollbar. If the scrollbar is not on bottom i don’t wanna scroll the scrollbar to bottom. Otherwise i want. Is this possible to get the position?
And do you know how to start at bottom. That means the start position of the scrollbar is the bottom.
😀 thanks for your help
To start at the bottom you can either use the setTop option:
$(selector).mCustomScrollbar({ setTop:"-9999px" });
or the scrollTo right after plugin initialization:
$(selector).mCustomScrollbar("scrollTo","bottom")
malihu could you please help me?
You can get content position via the mcs object by invoking for instance an empty onScroll callback:
$(selector).mCustomScrollbar({ callbacks:{ onScroll:function(){} } });
Then in your script(s) you can get the top position and test if it’s at the bottom like this:
var positionPercentage=$(selector)[0].mcs.topPct; if(positionPercentage===100){ console.log("content scrolled all the way to the bottom"); }else{ console.log("content is not at the bottom"); }
Hey
Thank’s for your help.
If I do not scroll to the bottom in my script, everything works great. But when the script scrolls to the bottom, the console always say you are at the bottom. I think it is because i call the ajax every second to refresh the chat…
I might refresh the chat every 3 second. Then the users would have 3 seconds to scrollup..
Is there any other way to get the scrollbar position..?
Thank you very much!
Lucaraid
When you do the ajax call do you also scroll-to bottom in order to display the last message? For example:
if(positionPercentage===100){ $(selector).mCustomScrollbar("scrollTo","bottom",{scrollInertia:0}); }
Of Course, i will only to scroll to bottom if the user does not scroll . Because it’s dumb if you scroll the user to bottom and he scrolls to top.
And when I scroll to bottom every second with your plugin:
$(selector).mCustomScrollbar("scrollTo","bottom",{scrollInertia:0});
There’s no time for the user to scroll up.
I think i put now a checkbox on my site and when the checkbox is checked the div scrolls to bottom. Otherwise not.
Thank you very much!
Thanks so much for this wonderful scroller!
I have a little problem in the following situation:
I have a and activate the scroller. Then I load via jquery .load new content to that div. After that just have the normal scrollbar. I tried to use .mCustomScrollbar(“update”) and also the live : “on” option with no result or errors. Where is the fault?
When you have already initialize the scrollbar, you must load your new content inside the .mCSB_container div (instead of directly inside your element). For example:
$(".content").mCustomScrollbar(); $(".content .mCSB_container").append( /* your content... */ )
Thank you! Now it works perfect!
Hi Malihu,
thanks for the nice scrollbar:
I hope you can help me with my little problem:
I added the scrollbar in my content in index.php.
The box and container works but i can´t activate the sroll button up or down . is it possible that you can explain me how i have to do this ??
In jquery.mCustumScrollbar.js i already set the button on true….
but i didnt´t work.
Thanks for your answer
You enable scrolling buttons via the scrollButtons option like this:
$(selector).mCustomScrollbar({ scrollButtons:{ enable: true } });
If you already have this option set and the buttons don’t appear, make sure you have mCSB_buttons.png in plugin’s directory.
Hi, great plugin, works great.
Currently I have a problem with this example http://jsfiddle.net/mato75/ztLhpf2g/5/.
I am using it with angularjs and with angular-vs-repeat. This plugin seems to work with scrolling of the browser, so how do I tell the browser that I am scrolling and the position, so that this library will update its values.
You’ll need to use plugin’s callback options and get the scrolling position (among other values) from mcs object, e.g.:
angular.element('#dd').mCustomScrollbar({ callbacks:{ whileScrolling:function(){ console.log(this.mcs.top); /* your function(s) here */ } } });
See “User-defined callbacks” for more info on available callbacks and mcs object
Hi, I am using your plugin and it works great.
I have this problem: I have a ‘container’ div (initialized with the scrollbar plugin) with some content.
I’d like to know if there is a way to know whether a DIV with a given id inside the ‘container’ is visible to the user (that is, inside the viewport) or not (based on the scrolling of the container).
Is there a way to know how much the ‘container’ has been scrolled? I didn’t see it in the documentation, or maybe I missed something. Thank you
Hi,
You can do it by calling a custom function inside a plugin callback option. For example:
$(selector).mCustomScrollbar({ callbacks:{ onScroll:function(){ if(isVisible("#id",this)){ //if #id is visible console.log("#id is visible"); //run your code } } } }); function isVisible(id,container){ var elem=$(id), scrollable=$(container).find(".mCSB_container"), pos=container.mcs.top+(elem.offset().top-scrollable.offset().top); return pos>=0 && pos<scrollable.parent().height()-elem.outerHeight(false); }
The isVisible function above will return true only when #id is fully visible. To make it return true when #id is partially visible, change:
return pos>=0 && pos<scrollable.parent().height()-elem.outerHeight(false);
to:
return pos>=-elem.outerHeight(false) && pos<scrollable.parent().height();
Cool works great thx 🙂
Hi,
Awesome scroller – thanks for the effort you have put in!
I have a problem – I am using the scroller around an ASPxCheckBoxList – When someone ticks an item I am calling an OnSelectedIndexChanged function in the code behind.
This causes the scrollbar to return to the top of the list. Is there any way to stop this happening?
Thank you.
Hello again.
While I was trying to implement the showing of the dragger rail only when the mouse is over it and when the user drags the dragger bar with the mouse (not when the user scrolls the content with the mouse wheel so onScrollStart and onScroll cannot be used) I’ve stumbled upon a problem.
I’ve attached one mousedown-callback to the dragger bar element and one mouseup-callback to the document. In mousedown-callback I add the specific class to the scrollbar’s root element and in mouseup-callback I remove this class. So this way it is easy to style the rail when I need it. In Chrome and Firefox everything is fine. But in IE (11) none of the callbacks fire for some reason. I understand that this is most probably browser-specific thing but maybe there are stopImmediatePropagation functions out there (blocking only IE11) that can be removed? Or maybe there’s some workaround for my problem?
For those who encounters the same problem the culprit was jquery.mCustomScrollbar.js:1115. The thing is that that event handler first handles the ‘pointerdown’ event and e.preventDefault() in this case prevents the generation of ‘mousedown’ event.
As of now the ‘pointerdown’ and ‘pointerup’ events are supported only by IE10/11 hence the problem was only observed in IE11 in my case.
Hello,
I’m trying your plugin inside a panel in asp.net Ajax.
With each refresh of the panel is called the code to initialize the scroolbar.
Unfortunately, I found that trying it on IE after refresh everything becomes a little slow. It should be a little better in firefox and chrome but even here after a while it all becomes very slow.
I’ve seen other examples you’ve done with ajax panels but I have not found evidence.
I also saw in debug that at every refresh the mCSB_ + index number continues to increase.
Maybe not good in this circumstance, or I’m wrong code to initialize the scrool properly.
Can you give me some advice?
Thanks and great job.
Unsuccessfully tried $ (“. ViewThumbScrool”). MCustomScrollbar (“update”);
Wow! I studied still is the option I’ve seen live: true.
I’m trying to say I know you if I can solve.
With the option “live: true” is performed correctly and every 500ms and the scroll bars are added correctly in IE but it is a disaster refresh after a few stops.
It should be a little better in Firefox and Chrome but it all gets very very slow.
🙁
Don’t know if this is a typo but the code is:
$(".ViewThumbScrool").mCustomScrollbar("update");
This will update the scrollbar when content length has changed. In plugin version 3.x this is not really needed as the script calls the method automatically when a content change is detected.
The live option is used when you want to add scrollbar(s) automatically on elements that do not exist in your page (yet).
Destroy method might also help if you’re removing/adding elements. For example, you should first destroy the element and then add it again:
$(".ViewThumbScrool").mCustomScrollbar("destroy"); $(".ViewThumbScrool").mCustomScrollbar();
I can’t really help though unless I see your implementation live. If you could send me link or code I’d be able to understand how your app works and provide more help.
The code for “update” as you said is a copying error.
The live option works correctly, but practically IE crashes.
I’ll see if I can send you an extract of code to replicate the problem.
Thank you!
I have the same problem what do you mean with live: true?
Really nice!
I will love to use it in my website but how can I install it in cargocollective?
Hi!
Can I define callbacks after I used some methods?
$('.content').mCustomScrollbar(“scrollTo”, "bottom"); $('.content').mCustomScrollbar({callbacks:{ onScroll: function() { console.log('scroll'); }});
That code doesn’t work now.
And another question: can I listening event of scroll appear, when i add content dynamicaly?
Thank you!
The callbacks are defined when you initialize the scrollbar. You should define them first and they’ll work fine:
$('.content').mCustomScrollbar({callbacks:{ onScroll: function() { console.log("scroll"); }}); $('.content').mCustomScrollbar("scrollTo", "bottom");
hello sir,
I have a reply button at bottom near scrollbar
when I click on reply button a form shows and when I click to fill up field scrollbar automatically goest to top everytime.
Hello,
This can be caused by some CSS property missing (e.g. floated elements not cleared or elements needing position:relative). If you can’t find/fix the CSS, you can disable autoScrollOnFocus option by setting it to false, e.g.:
$(".content").mCustomScrollbar({ advanced:{ autoScrollOnFocus: false} });