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 🙂
Is there a way that when you highlight words and it gets to the bottom, the scrollbar will follow to the highlighted text? The only thing i can see is that i have to move the mousewheel down so i can highlight the rest of the words.
Not possible at the moment. I’ll examine if I can implement a solution for this. Thanks a lot for the feedback.
Hi
I want to link navigation to scrollers left and right from an external div, is this possible, tried giving same class but it does nothing? great plugin by the way!!!
Hello,
Thanks a lot for this great Tutorial! But I just have a little problem.
I just added the Scrollbar to the content of my Joomla Site.
Now the scrollbar of the div where the content is placed has a new design.
That’s perfect.
But I can’t scroll or move it. When I sroll with the mousewheel, nothings happens. And when I try to move the scrollbar with my mouse – also nothing happens.
Can you hellp me?
I just found the solutions.
Very easy -> jquery wasn’t embed correct …
sorry
No problem. This is frequent when dealing with joompla, wordpress etc.
I would like to add scroll bar to textarea.
—- ….. —–
and in my script block i am calling
$(".styling").mCustomScrollbar({ scrollButtons:{ enable:false } });
But my textarea is displaying blank, all content is hidden.
I am making sure that if i am not calling script, data with scroll available
You cannot attach the scrollbar directly on a textarea (you cannot generate html inside a textarea). I have a demo of simulating a textarea with custom scrollbar by adding few functions and some additional markup:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/textarea_example.html
This is awsome.
This is working as expected. But there is a small issue.
Scroll bar not adding as soon as we reach height of the textarea.
Say for example height of textarea has some 8 lines, we need to type 9 lines, where as 9th line is not visible, until scrolls are added. Scrolls are adding only after you finish 9th line
Malihu,
First of all, very nice plugin. I have a simple question. The scrollbar doesn’t work with my sortable() table. When I grab an item, for example, “sub 1 1” and dragged it all the way down to “Main 11,” the scrollbar refuse to follow my dragged item. Hence, I can’t sort it all the way down because it doesn’t auto scroll. Have any ideas?
Here is a sample code:
<div id="main-div"> <ul id="main-ul"> <li class="main-li">Main 1 <ul class="sub-ul"> <li>sub 1 1</li> <li>sub 1 2</li> <li>sub 1 3</li> <li>sub 1 4</li> <li>sub 1 5</li> </ul></li> <li class="main-li">Main 2 <ul class="sub-ul"> <li>sub 2 1</li> <li>sub 2 2</li> <li>sub 2 3</li> <li>sub 2 4</li> <li>sub 2 5</li> <li>sub 2 6</li> </ul></li> <li class="main-li">Main 3 <ul class="sub-ul"> <li>sub 3 1</li> <li>sub 3 2</li> <li>sub 3 3</li> <li>sub 3 4</li> <li>sub 3 5</li> <li>sub 3 6</li> <li>sub 3 7</li> </ul></li> <li class="main-li">Main 4 <ul class="sub-ul"></ul></li> <li class="main-li">Main 5 <ul class="sub-ul"></ul></li> <li class="main-li">Main 6 <ul class="sub-ul"></ul></li> <li class="main-li">Main 7 <ul class="sub-ul"></ul></li> <li class="main-li">Main 8 <ul class="sub-ul"></ul></li> <li class="main-li">Main 9 <ul class="sub-ul"></ul></li> <li class="main-li">Main 10 <ul class="sub-ul"></ul></li> <li class="main-li">Main 11 <ul class="sub-ul"></ul></li> </ul> </div>
Here is the script:
<script type="text/javascript"> $(document).ready(function () { // Sortables $('#main-div ul').sortable({ axis: 'y', dropOnEmpty: true, connectWith: '#main-div ul', containment: '#main-ul' }); // scrollbar $('#main-div').mCustomScrollbar(); }); </script>
Hello,
jQuery UI scroll option will not simply work on js scrollbars. You’ll need to utilize some of the sortable events (e.g. sort, change etc.) so you can call scrollTo method when boundaries are reached (sortable api).
I’ve made a quick demo with sortable content with custom scrollbar attached here (view source to see the extra functions and sortable events):
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/simple_example_sortable.html
thanks so much 🙂
Hi. I am fascinated by your plug-in.
I’ve been working on making a horizontal scroller that advances its “slides” on click. I would like to center each slide div within the visible portion of the scroller (940px). Right now I am getting the left offset of each slide and subtracting 110px to get the scrollto number, since all of my slides are 720px wide. This works nicely to center the slide — approximately. But I can’t get it perfect! The offset seems to vary by around ten pixels for each slide — I’m getting numbers anywhere between 725 and 715 for each slide, and not in any pattern that I can recognize.
Can you help me understand this mystery? It’s the “Viewbook” section of my website.
Thank you!
I’ve got the variance down to one pixel by changing this in the CSS:
.mCSB_horizontal .mCSB_scrollTools .mCSB_buttonLeft+.mCSB_draggerContainer{
padding-bottom:0;
padding-right:20px;
}
to
.mCSB_horizontal .mCSB_scrollTools .mCSB_buttonLeft+.mCSB_draggerContainer{
padding-bottom:0;
padding-right:0;
}
Now the dragger bar is slightly damaged but I think I can manage that separately. Maybe the one pixel variance is a rounding issue?
I’ve always enjoyed this plugin uses. It works well, but with Windows 8 and Google Chrome does this not work anymore. I do not know why this is happening?
Are you using a touch-screen? Do you get any console errors in Chrome dev tools?
I’m not using a touchscreen, and I don’t get any error messages in the dev tools from Chrome. It is in both the normal desktop app and Windows 8 app
Hi again,
Did some testing and indeed Chrome has touch events enabled by default (in Windows 8, even if no touch screen is present). I’ll add an additional check for touch devices and I’ll update the plugin soon.
Thank you very much! Could you please react on this comment when the plugin is updated?
Sure, I’ll let you know.
I am using your script for a horizontal scroller. Is their a scrollTo method where the selected item is centered rather than scrolled to the left side.
Here is how I am scrolling to a specific item in the list
$(“.content”).mCustomScrollbar(“scrollTo”,”#george”);
My scrollbar is 980 pixels wide so I need #george to be offset 490 pixels from the left side so it appears in the middle of the horizontal scroll.
Works beautifully otherwise.
Do you have some kind of offset function that can achieve this? Any help would be appreciated.
First of all: Thank you very much!
I looked a lot for scrolling plugins and yours was the only one I found that satisfied all my needs. There is of course one little flaw though and it is the same that Jon described in post 66. Except I’m experiencing this problem while using the mousewheel. The scrolling on the pages with a lot content is way too fast – or way too slow on the pages with not so much to scroll when I turn down the scrollingspeed via the mousewheel option. And to add an additional ‘scrollingspeed’-attribute to every article in my database is a way I’d like to avoid…
Without the plugin the browser use to scroll a fix number of lines (or pixels, I don’t know, but it’s fix). I think that’s the behaviour people are used to. I hope its possible with your plugin to do that. The up- and down-buttons are adjustable to scroll a fix amount of pixels as well. (That is if you put the scrolltype to ‘pixels’. If you want continous scrolling you will have the problem Jon described.)
So my question is: Can you think of any way to (quoting Jon) “fix the speed of the scrolling regardless of the content length?” Important for me is the mousewheel to work like that because I hide the scroll buttons anyway. Maybe I missed something in the configuration. If that’s the case please tell me. Otherwise I hope you can come up with a solution…
Thanks for all your efforts, no matter what!
James
Writing this I come to think of a possible way: An algorithm considering the length of the content, which delivers an integer value (the mousewheel-scrollingspeed) shouldn’t be that difficult to work out. It wouldn’t be very accurate though with large images in the content because I can only think of a way to measure the html-content characterwise. – Well, I’m posting this anyway ’cause (while I keep trying) you hopefully come up with a faster and easier way to solve this…
Hello James and thanks a lot for the feedback.
I’ve made a modified script with mousewheel scrolling by number of pixels here:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/mousewheel_fixed_scrolling/simple_example.html
Check the scrolling with the mousewheel (resize the browser to change the scrolling amount) and let me know if this is the expected behavior.
Is there any method to unbind or remove this plugin from an bound DOM element?
I’ve made a temporary script file with a destroy method.
script: http://manos.malihu.gr/tuts/custom-scrollbar-plugin/temp/jquery.mCustomScrollbar_destroy.js
example: http://manos.malihu.gr/tuts/custom-scrollbar-plugin/temp/simple_example_destroy.html
You can use the temp script until I update the public version, github files etc.
Thanks~
It worked well.
Almost all decoration were removed, but seems the class “_mCS_1”, “_mCS_2”, … still left in the target DOM elements.
Just not so clear.
Yes I left everything in order to be able to re-enable the scrollbar by calling the update method. I’ll probably set an extra parameter to completely remove it.
Hi Malihu
Thank you for your great plugin !
I have a problem . I want to put vertical scrollbar on left side of a div
(direction =rtl )
Is it possible ??
Hi, nAviD.
Just change the ‘right: ?px’ in .mCustomScrollBox .mCSB_scrollTools in the css-file to ‘left: ?px;’. That should do it.
Greetings
James
that worked !
tnx so much
Hey Malihu,
Really great plug in! Thank you! I have looked at a lot of plugins to do what I want and this one is so close but seems to be a small bug.
I am having the same problem as mentioned in comment 72.
I have created a responsive layout with a horizontal scrollbar full of images. Sometimes the last image drops down and creates a new row and will not fit into the last space in the scrollbar.
Using Firebug if I make
.mCSB_container
larger by 1 pixel the image pops back into place. This behaviour does not happen at all the breakpoints. The breakpoint that it happens at changes depending on how many images I have.In the example below it is happening at the smallest breakpoint. Make the window less than 480px to see.
http://guswhite.com/sandbox/jquery/scrollbar/
This is happening in Firefox 16.0.2 (mac), Firefox 15.0.2 (windows), IE 9.0.8112. I have not tested in other versions of IE or in Opera yet. Perhaps this has something to do with how browsers round up or round down pixel values when elements with percentages are used?
Webkit browsers are not affected. Any ideas on a workaround or solution?
Thanks
You are correct. In Opera it works just fine. I checked it with its developer tools (Opera Dragonfly) and the computed width of one of your images is exactly 267 pixels. In Firefox Firebug, the same image has a computed width 267.25 pixels. That’s causing the problem. Firefox and IE do not round up pixels and the issue can happen at any random point.
The only solution I can think right now is playing with your css percentage values/media queries so they yield integer pixel values.
Unfortunately because the width of the images will always vary I don’t think changing the percentage/media query values will work in all cases (although I may be wrong about that)
Would it work in my case to get the script to add a few extra pixels to the calculated width of the scrollbar after its performed its width calculations? Effectively increasing the width of the content area by a few pixels.
Or would that just cause the images to fill that extra space and the same issue would remain?
Awesome plugin.
I have 2 problems.
——————————————————————-
first:
function changeEducacion(source) { $('#contenido_educacion').slideUp(800); setTimeout(function(){ $('#contenido_educacion').html("") $('#contenido_educacion').load(source); setTimeout(function(){$('#contenido_educacion').slideDown(800)},800); },800); }
and what i load is kinda this
<div class="noticias_noticia_individual"> <div id="noticias_noticia_individual_titulo"> <img src="images/educacion/001.jpg" height="100" width="151" alt=""/><span>Los 5 peores errores al comer</span> </div> <p> </p> </div>
the problem is that i need to scroll #noticias_noticia_individual, but i can’t make the mCustomScrollbar on it.
———————————————————————————–
Second:
I’ve make a kind of file/documentation link box, with div inside div inside div.
And actually it’s a bit extrange because the mCustomScrollbar does load, but doesnt show unless, for example, i’ve pressed a F12 key for inspect the web and then it shows, any idea??
Any Idea? i’m still having the problem!
Hello,
The plugin does not support nested scrollbars (scrollbar inside another scrollbar). I can’t really say when/if this feature will be implemented.
how I can use CustomScroll with Tabs, if I take first tab but otherwise I can not as I do.
Example
<div class="tabs"> <ul> <li><a href="tabs-1">Tab 1</a></li> <li><a href="tabs-2">Tab 2</a></li> </ul> <div id="tabs-1" class="scrol"> Content.... </div> <div id="tabs-2" class="scrol"> Content.... </div> </div> <script> $(document).ready(function(){ $(".scrol").mCustomScrollbar(); }); </script>
this is what I do but nothing else appears in the first tab
I can do?
Each time a tab is clicked, you need to call the update method of the plugin as a callback:
$(".scrol").mCustomScrollbar("update");
The following is a tabs demo made for another user, which might help you:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/tabs_temp_demo.html
Hi malihu,
thank you very much for this amazing plugin , i am implementing it im my website,
but my functionality is different, i want the scrolltools outside the container div , and of custom height width.
how can i do this, help me please.
thanks in advance.
Shashikant
Hello Shashikant,
You can change the height/width of the scrollbar directly from the CSS.
It’s impossible for the scrollbar to be outside of the container (the plugin cannot know what the rest of your layout is). To have the scrollbar appear out of the container (design-wise), you can wrap your content in an additional div that you can style the way you like (e.g. give it a background) so the scrollbar “appears” out of the styled block.
See this example:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/design-test-scrollbar-outside.html
Hi Malihu,
Thank you very much for the immediate response, i did that , there is one more thing i want to clarify is – i have to load my images dynamically, currently i am doing it in the way that i am showing the images after loading all the images (recursively). but i want to do it in the way that i want to append every next images as soon as they load, and according to that the width should be change, please have a look at my site. (after load click on anyone of thumbnail). link is – mjd2.tekege.com
I have trouble incorporating your component into joomla – problem is that mCSB_scrollTools (when I check it in firebug) is grayed out – and display:none. So it doesn’t show up the scroller, but at least it limits the display area, but still I can’t scroll…like the whole functionality is off….any idea why such thing happens?
I checked the .content display and it always shows, there is no hidden options anywhere…
Outside of joomla it works beautifuly 🙂
Can you send me a link to check it online?
I’ts not online yet (we don’t have servers yet), but maybe I can send you the code via email..?
Sure.
Hi again,
How can I load an imagem gallery inside “your” scrollable div?
I’m using touchcarrousell for the image gallery, and if I insert the image gallery div normally in the page, it works fine, but if I load it into “your” srollbar div it doesn’t work.
Can you please help me?
Thanks
Hi,
To load it programmatically into the element with custom scrollbar attached, you need to insert it into .mSCB_container div that resides inside the element (e.g. .content .mSCB_container).
You can also try loading the gallery first and call the scrollbar function afterwards.
Hi there,
Great script.
I’ve got a question:
when loading a div with a image (with no height and width specified) for the first time the scrollbars doesn’t appear.
they appear only after I refresh.
it appears that because the script doesn’t know the size of the image it doesn’t put the scrollbars.
the same happens if instead of image I place another div (with dynamic conten), with no size specified.
I tried using the “update” method, but still doesn’t work.
Is it necessary to specify the image size?
I do not want to specify it because I want the site to be responsive.
Can you please tell me what to do?
Thanks in advance
Already solved this one.
I didn’t read the documentation properly.
Thanks anyway.
But there’s another issue I came to that I think it’s not mentioned in the doc.
How can I load an imagem gallery inside “your” scrollable div?
I’m using touchcarrousell for the image gallery, and if I insert the image gallery div normally in the page, it works fine, but if I load it into “your” srollbar div it doesn’t work.
Can you please help me?
Thanks
Hi,
great plugins.
I am wondering if there is an option to automatically scroll text in container in loop, all the time, and when its mouse over the mCustomScrollBox text stop scrolling and it can be scrolled by scrollTools.
Hey! The plugin with the horizontal scrollbar and the update function works great for me, except two things:
1. Using Safari 6.0.1 and the horizontal scroller on my macbook feels quite strange. Its hard to explain… Its pretty slow and sometimes it jumps around. A friend of mine has the same problem. Setting „mouseWheel:auto“ to the value „8“ helped, but its still lagging a little bit. Any suggestions?
2. Using Firefox 13.0.1 sometimes the last image in the horizontal slider appears at the beginning of the slider in a 2. row! Seems like the content is to long for the slider so it breaks the content. The sliders stays with its height. The same page with safari 6.0.1 looks right.
It would be awesome if you could help with this two problems!
Thanks alot!
hi
I have tried several plugins that do parts of what I am looking for – yours seems to be very close , is it possible to have the horizontal scrollbar a different width to the content ‘viewport’, I need this to fit in with the design I am using – I can see that in the version 1, you have done this on the vertical scroll bar on the demo page, although I cant see how in the customisation information
So for example the content viewer is 1000px wide, the scrollbar is below, aligned to the left but 900 px wide.
thanks in advance,
John
Yes, you can style the scrollbar exactly as you like via the CSS file. See comment 57 for a similar example.
hi
i saw that yesterday after i posted the question, and although that method works, i was trying to change the width of the css container via jquery. I am making a fluid layout loading galleries via xml, so i need to
1. change the number of images inside the content box
2. alter the length of the scrollbar
i found that although I can get the bar to display at the length i want – it does not correspond to the scroll distance of the content
does any of that make sense? and does it sound possible or not – I tried a different plugin – tiny scroller – which worked great but it does not have any inertia attached to it which i ideally want
sorry to add – i am trying to alter the length of the scrollbar dynamically using jquery
hi
I had a play, and read all of your notes – it all seeems to be fine – it is important that if you are altering anything to use the ‘update’ function after each alteration.
thanks for making this available
Hi,
I’m developing a chat and your scroll plugin was the best choice!
I want to implement a thing and I don’t know how to do it. When the window loads new chats, the scroll should update (already done this!) and scroll to the bottom (already done this too), but ONLY should scroll if the user is already at the bottom (in this case, the “previous” bottom, as it was updated).
Can you help me?
Thanks in advance!
tl;dr: Is there a way to know if the user is at the bottom of the container?
Love this plugin!!! Spent hours looking for this and then a few more having to do some backwards engineering to get it to work. Before I spend any more time customizing a few questions:
1- Is there an option to have the scrollbar appear on the left side of the
2- Can the rail be set to a specific size as to not look like a divider
You can style your scrollbar exactly as you like via CSS (no need for options). Scrollbar markup (dragger bar, rail etc.) resides in the .mCSB_scrollTools div (see .mCSB_scrollTools and .mCSB_draggerRail in jquery.mCustomScrollbar.css for what you need).
Thanks for the response. I have the color and size of the scrollbar figured out but I still can’t get it on the left side of the div. Suggestions
All scrollbar markup resides in the .mCSB_scrollTools div. In the CSS, you can change its position to where you need (e.g. left):
.mCustomScrollBox .mCSB_scrollTools{ width:16px; height:100%; top:0; left:0; }
You also might want to give .mCSB_container a left margin (instead of right), as your scrollbar will be on the left side (1st and 2nd selectors in jquery.mCustomScrollbar.css):
.mCSB_container{ width:auto; margin-left:30px; overflow:hidden; } .mCSB_container.mCS_no_scrollbar{ margin-left:0; }
hello / help!
i am using the expositio theme.
i have tried everything to implement jQuery custom content scroller in the sidebar but it just won’t work…
help!
is expositio the problem or something i have missed…?
no idea what i should do next to get this scroller in my sidebar!
thank you in advance
anouk
Dosen’t work with jquery UI 1.9, returns object as an error.
Hello,
I’ve uploaded a test page with jQuery 1.8 and jQuery UI 1.9.1 which works as expected:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/simple_example_jquery_ui_test.html
Thanks for a fantastic script.
One problem I’m having though is that the scroll speed and amount when using the scroll buttons is dependant on the on the content size. That is, when the content is only just long enough to require a scrollbar, the scroll buttons scroll very slowly. When there is a very large amount of content, the scroll buttons scroll the content very quickly for the same settings.
Is there a way to prevent this behaviour and fix the speed of the scrolling regardless of the content length?
Thanks in advance.
Hello,
Currently there’s no way of preventing this behavior. Please check this modified script:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/mousewheel_fixed_scrolling/simple_example.html
Scroll with the mousewheel (resize the browser to change the scrolling amount). If this is the expected behavior, I’ll properly update the plugin, add extra option parameters etc.
Hey there,
Gotta say am loving your plugin, however I’ve sort of ran into a pretty annoying issue in IE7…
It seems that your scrollbar doesn’t scale correctly, and instead becomes higher then actual parent. However this seems to only occur when the scroll up/right/down/left buttons are shown. Without these, it seems to work just fine. It seems to me that in IE7 the “button height” calculations aren’t totally succeeding… And the scroll bar itself also hover slightly away from the actual bar, though that should be quite easily fixed with CSS!
In case you don’t want to bother fixing your plugin up for IE7, no worries, it’s not really that much of an issue, could just show the default (ugly…) scrollbar to the 14% of users still on IE7… 🙂
Never mind, just sort of found a fix for it! 🙂
Note: The code IS optimized for the vertical scrollbar! For a horizontal scrollbar you would have to use width instead of height.
By changing line 70 in jQuery.mCustomScrollbar.js from
mCSB_container.after("<div class='mCSB_scrollTools' style='position:absolute;'><div class='mCSB_draggerContainer' style='position:relative;'><div class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>");
to
if (navigator.appVersion.indexOf("MSIE 7.") != -1) { mCSB_container.after("<div class='mCSB_scrollTools' style='position:absolute; height: 88%;'><div class='mCSB_draggerContainer' style='position:relative;'><div class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>"); }else{ mCSB_container.after("<div class='mCSB_scrollTools' style='position:absolute;'><div class='mCSB_draggerContainer' style='position:relative;'><div class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>"); }
We can catch about 80% of the miss sizing. However, this still isn’t good enough. As when the window resizes the percentages start to differ, which causes the scrollbar to sometimes grow too small, or too big. Therefore a little more user code is required to get it to fully function. What this code does is pretty much get the parent height, subtract 40px from that height (Although, this would most likely be dependant on the buttons used!), and set the height back to .mCSB_scrollTools.
function resize() { if (navigator.appVersion.indexOf("MSIE 7.") != -1) { $('.mCSB_scrollTools').each(function() { $(this).height($(this).parent().height() - 40); }); } } $(document).ready(function() { resize(); }); $(window).resize(function() { resize(); });
Using this I so far have been able to catch 100% of the resize issues. I have also attempted to just use the user code without ever touching the jQuery.mCustomScrollbar.js, however this turned out to cause a weird glitch where the scrollbar could go above the actual scroll height, and become uncapable of moving down again. Therefore essentially breaking the scrollbar…
As to the CSS issue, that is a bit more tricky, as a horizontal scrollbar lies about 7px below the actual assigned position, where as a vertical scrollbar is about 7px right of the actual assigned position. However as I only require the vertical scrollbar, I have not decided to also make it compatible to the horizontal version!
<!--[if IE 7]> <style type="text/css" media="screen"> .mCSB_scrollTools .mCSB_dragger { margin-left: -7px; } </style> <![endif]-->
Hello and thanks a lot for taking the time to post your solution 🙂
The issue on ie7 is basically not supporting the CSS box-sizing property. When creating the plugin, I just checked that the actual script did work on ie7 but I didn’t really bother adding extra CSS to make it scale correctly on fluid scrollbars with buttons.
If you want to try, I think there might be a CSS only solution (haven’t tested it on ie7):
.mCSB_scrollTools .mCSB_buttonUp+.mCSB_draggerContainer{ position:absolute !important; height:auto; top:0; bottom:0; right:0; margin:20px 0; width:100%; padding-bottom:0; } .mCSB_scrollTools .mCSB_buttonUp, .mCSB_scrollTools .mCSB_buttonDown{ height:20px; width:16px; overflow:hidden; margin:0 auto; cursor:pointer; position:absolute !important; } .mCSB_scrollTools .mCSB_buttonDown{ top:100%; margin-top:-20px; }
The above is for vertical scrollbars and you can try the same for horizontal ones.
Hey Malihu,
Can you use the update and scroll to methods on the same click event? If so, how?
Thanks!
$("#your-link").click(function(e){ e.preventDefault(); var theContent=$(".content"); /* do some stuff here... */ theContent.mCustomScrollbar("update"); theContent.mCustomScrollbar("scrollTo",bottom); });
Something like this?
I have setup the scroller and it works great except the content doesn’t scroll. the page using the scroller is http://loretta.ravennainteractive.com/about-loretta-soffe-consulting/background/ . I have checked it in mulitple browsers and its the same issue. Is there a normal issue here where thats something easy to fix?
thanks, and great plugin!
You’re loading jQuery library twice (in head and body). Try removing the last one and/or check the custom jQuery and jQuery UI files you’re loading have the necessary components.
Hello again!
I have installed v2.x on my website and it works great in most browsers. I am finding however in Google Chrome the dragger bar fills most of the rail and so I cannot scroll all of my content.
If I hit enter in the URL bar a second time the dragger bar re-sizes to the correct size and I can scroll down through all my content like on the other browers! Any idea why this might be happening?
p.s I also note the same behavior in Safari for windows.
Kind regards and thanks,
Matt
The content probably hasn’t loaded completely when scrollbar is applied. Try calling mCustomScrollbar function on window load instead of document ready (see “How to use it”) or set updateOnContentResize option parameter to true (see “Configuration”).