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 🙂
This is so great. Is this possible to be added in a textarea?
Nope. Cannot create the additional divs required inside a textarea input. You might be able to simulate a custom scrollbar for a textarea with an outer container and some additional javascript. I might create such demo when I get some some time.
EDIT: ok, I made one 😉 Check it here:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/textarea_example.html
Ahh thanks!
Although there is a bit jerky movement when the textarea gains focus.
Have you thought of using a contenteditable workaround? (Like textareas being replaced with contenteditable and the scrollbar applied to them)
Yes, I believe you can definitely use the html5 contenteditable attribute to create a better simulated textarea.
I just made a quick example on an actual textarea as I don’t know if every user can use or code their forms with non-form elements.
It’s a great idea though, so thanks for the feedback 🙂
Thanks a lot for that. Answer me please – where is the page that’s screenshot is a topic-image of this thread? I mean – how can I open this page – http://manos.malihu.gr/wp-content/uploads/2012/07/jQuery-custom-content-scroller-v2-fm.png – it looks awesome too:)
It’s the “view demo” link right below the screenshot (it has many examples and the plugin’s main demo):
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/complete_examples.html
I am having an issue with using the css style “max-height and overflow:auto” together for my div. If I use these together this scrollbar will not show up at all. Is there a fix for this? Any help would be appreciated as I am very new to these things. Thanks ahead of time.
Hi,
The plugin currently requires a height value to function correctly, but you can achieve what you need with a couple of extra lines in your script.
You can programmatically get your div’s max-height value and set it as your div’s height. For example:
$(window).load(function(){ var YourMaxHeightDiv=$("#content_1"); YourMaxHeightDiv.mCustomScrollbar().css({"height":YourMaxHeightDiv.css("max-height")}).mCustomScrollbar("update"); });
The code might look a bit confusing cause we “chain” all functions in a single line, but it’s actually very simple.
We firstly declare our max-height div (YourMaxHeightDiv) and then we use it to a)call the plugin function, b)set its height by its max-height value and c)call the update method of the plugin.
Also, each time you add, remove content from your div or change its dimensions, you will need to call the update method:
YourMaxHeightDiv.mCustomScrollbar("update");
Hope this helps
So should it look like this?
!window.jQuery && document.write(unescape('%3Cscript src="jquery/jquery-1.7.2.min.js"%3E%3C/script%3E')) !window.jQuery.ui && document.write(unescape('%3Cscript src="jquery/jquery-ui-1.8.21.custom.min.js"%3E%3C/script%3E')) <!-- mousewheel plugin --> <!-- custom scrollbars plugin --> (function($){ $(window).load(function(){ var YourMaxHeightDiv=$(".content"); YourMaxHeightDiv.mCustomScrollbar().css({"600":YourMaxHeightDiv.css("600")}).mCustomScrollbar("update"); }); })(jQuery);
I am guessing not because it is not working. I apologize I am not the greatest at jQuery yet.
No. You insert the code I provided exactly as it is and just change the #content_1 selector to your div.
For example, if your div has class .content and you’ve set in your CSS a max-height for it, the complete code would be:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script> <script>!window.jQuery && document.write(unescape('%3Cscript src="jquery/jquery-1.7.2.min.js"%3E%3C/script%3E'))</script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script> <script>!window.jQuery.ui && document.write(unescape('%3Cscript src="jquery/jquery-ui-1.8.21.custom.min.js"%3E%3C/script%3E'))</script> <script src="jquery.mousewheel.min.js"></script> <script src="jquery.mCustomScrollbar.js"></script> <script> (function($){ $(window).load(function(){ var YourMaxHeightDiv=$(".content"); YourMaxHeightDiv.mCustomScrollbar().css({"height":YourMaxHeightDiv.css("max-height")}).mCustomScrollbar("update");}); })(jQuery); </script>
Ok I understand now. Thank you for your help.
Manos, just a question about scrollbar style. In my page http://gavs.it/rci_dev_scroll.php the scrollbar looks not styled like in the example of the following page: http://gavs.it/rci_test.php. Both pages share your css and file but the scrollbar looks quite odd, not rounded border or style.
Thanks for any help.
You need to change the styling (colors, buttons images etc.) of the scrollbar within the CSS according to your white background (my demo has light colored scrollbar on dark background).
I’ve also included light and dark colored versions of arrows images in the mCSB_buttons.png, so you don’t have to create them on your own (that is if you do use the arrow buttons).
On the demo the 5th example (.content_5) has dark colored scrollbar so you can check its css rules in jquery.mCustomScrollbar.css and apply them to your styling 😉
Hello. you have a major bug in your code.
In our dynamically scalled site the verticall scroller breaks. The last entry of the list jumps to the nexst row becouse he automatically set width of the div “div#mCSB_1.mCustomScrollBox div.mCSB_container” gets some pixels to short. only solution for us was that we increase its width after he instances for about 40 pixels.
ps. forgot to mention what couses this bug. it is coused when the elements in the div. is somthing else then letters.
Even spaces , +,- etc breaks it…. nutss….
Hello,
Can you provide a link or a description on how to replicate this bug? Thanks.
Sorry, I need to ask some help. I’ve applied all needed libraries and followed the example, but the custom scrollbar seems not applied to my box :(. You can see it at this page: http://gavs.it/rci_dev_scroll.php
The box is the area on the right column with title “RCI latest updates”, right now it includes a long list of dates into an unordered list.
Thanks for any help
I think you need to give your .content_8 div a height value, otherwise the div expands to fully display its content, so the plugin assumes no scrollbar is needed (just like the browser does with its native scrollbar on divs with overflow: auto).
Hi Manos, thanks a lot for your feedback and help. Your great work deserve a donation (sent right now). Thanks again
Thanks a ton Federico 🙂
Hi Malihu, great script! Just wondering if scrolling a div at the bottom of its own area the script could load more content using AJAX and PHP server script.
In your AJAX example I can load more content using a link on the div, could be done automatically as I wrote above? In my site I have a box on the right side of a main page, the box show latest additions into a database, ordered by date; would be useful to scroll that box and see older updates loaded dinamically.
Thanks for reply
Hello Federico,
Check the last example of the following demo which is basically an infinite scroll:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/issue_2_fix_test/infinite_scroll_examples-issue_2.html
Using the onTotalScroll callback you can call your custom functions (e.g. ajax calls) and create exactly what you want.
Why does the scroller look broken in IE7
Its just the styling of the scrollbar that is probably too advanced for IE7… Scrollbar functions correctly, so you could just add some CSS hacks and prefixes to provide support for old IE versions.
HI! First of all I want to congratulate you and thank to you, because it’s a great Script and the instructions are very easily to follow.
However, I want to make the following question and may be you can help me.
I’m working with this example:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/ajax_example.html
The first link for downloading a new content works perfectly.
But when from this HTML, that I previously loaded (demo_files/ajax_content.html), I want to load a new content, it doesn’t load it in the same scroll, but in a new webpage.
My idea is to load new contents from the same html that I’ve loaded before.
Any suggestion how I can solve this problem?
Thank you!
Hello,
This probably happens because the click event does not bind to your newly added link. This is normal as the new link was not in the DOM when the click function was declared. I think you should use something like jQuery’s .live() event handler which binds events on current and future elements.
See here for more info and usage:
http://api.jquery.com/live/
Hello,
I have a problem in IE7 and IE8. I have the scrollbar on tag in display block and the problem is that when I scroll down to items with link which are hidden in the scroll and trying to click on them I just got scrolled up to the top and the href link doesn´t work. It only happens in IE7 and IE8.
Anyone can hepl?
Thanks
code update:
scrollbar on
<ul>
tag in display blockclick on
<li><a>
tag doesn´t workgot it .. just comment out /*scrolling on element focus (e.g. via TAB key)*/
Do you have anchor links or input buttons that produce this issue when clicked? If you want, please make sure you have the very latest plugin version as it only focuses links that have “tabindex” attribute.
Nice scroller
But dont work on iphone 🙁
Hi,
What iOS version does your iPhone have?
I was wondering if anyone has found a way to include this custom scroll bar into WordPress 3.4.1 without breaking other plug ins. Once I include the scroller’s required js files into my site, my Carousel image gallery stops working (I think because it uses jquery 1.7.2). I realize that this may be more of a WordPress question, so no worries if you can’t tackle it here, but I figured some other people may be dealing with a similar problem. I’m the first to admit that I don’t know much about jquery (that’s why I loved being able to use this plug in, as it is very simple to implement for beginning coders). Thanks in advance!
I’ve tested the plugin on a vanilla WordPress installation and it works well.
If you have other plugins that already use jQuery, you can skip the jQuery inclusion step on the guide above. You should have 1 instance of jquery loaded on your page.
The plugin works with the current and previous versions of jQuery, so there shouldn’t be any problem using jQuery 1.6 for example.
Also, check your page with firebug (or any other developer tools) to see if you get any console errors.
Sorry for the doublepost (#481);
I actually managed to get the main page to scroll down at the end of the content by combining a simple jQuery command with your OnTotalScroll function. However, this only works when scrolling down. Is it also possible to implement this when reaching the top of the content (i.e. an inverted OnTotalScroll)?
I understand that this function would probably require some work on your sourcecode but if you could point me in the right direction that would be great!
Check the following example, which I believe does what you need:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/top_scroll_callback_example.html
I use the onScroll callback to check for top position and call a custom function.
Thanks, it works perfectly now!
Hi, firstly this is a really great script, and the instructions very easy to follow.
However, I wonder whether you may be able to help me please with a slight problem I have.
I’m able to put together a page, which correctly shows the scroll bar if the content of the div is hardcoded text. But when the content of the div is dynamic, i.e. RSS feeds , although there are no specific errors shown, the scroll bar is no longer visible, and despite spending quite some time trying to get this to work, I’ve been unable to find a solution.
I just wondered whether you may be able to offer any guidance on how I may be able to get this to work?
Many thanks and kind regards
Chris
Hello,
You need to call the plugin function (or update method) after your dynamic content is fully loaded, in order for the script to calculate correctly your content’s length. Please check section “Loading & updating content dynamically” of the post for more info and examples.
Hi, thank you very much for your help and clear guidance.
I’ve now been able to get this to work.
Sincere thanks and kind regards
Chris
Good plugin…very good 🙂
Is it compatible with the new Jquery 1.8.0? It seems Not Yet.
I’ve just tested the demo with jQuery 1.8 (via Google CDN) and works as expected.
Thank you for response.
Doesnt work for me.
Try to clear the browser cache.
I have. I also tested it with a local copy of jQuery 1.8.0 and it works. Do you test the demo or another implementation? Also does it fail on all browsers?
Thank you. Solved. It was a jquery-ui version problem ( 1.8.20 updated to 1.8.22 solved problem)
Is very useful for minilaptops and tablets, but @ iPhone or some similar (smartphone off course) doesn’t work . .
how can i apply it at smartphones?
Thanks and have a nice weekend.
I’ve tested it on Android smartphones (version 2.x and 4.x) and it works as expected. What iOS version is your iPhone?
great work!
the up and down images are not showing on white background help please
Hello,
You can change the up and down images within the CSS file. The mCSB_buttons.png file contains multiple sets of arrows. Changing the background-position of .mCSB_buttonUp and .mCSB_buttonDown reveals different coloured arrows.
Info on CSS sprites:
http://css-tricks.com/css-sprites/
Ok, this one is truly magnificent job.
I’m pulling my hear out trying to resolve issue when is set to display:none and scroll has to be inside it.
I don’t want to ask any questions – I’ll go trough documentation and Q&A once again, and if I fail, THEN I will ask… :))
Cheers, mate, and thanks for this!
Ok, I’m out of hair, and best I’ve got so far is this:
function($){ $(window).load(function(){ $("#myContentID").mCustomScrollbar(); $(document).ready(function(){ $("#myContentID").hide(); }) }); })(jQuery);
But for a few (awful) parts of sec’s when page loads, whole div with that ID is visible.
I’ve put .hide(); under (document).ready ’cause it’s kinda faster then (window).load (some my logic..?) but still no luck.
Any help will be more than appreciated!
Thanks in advance
Hi,
The way you do it, hide happens before custom scrollbar is applied (because of document ready). A hidden element has zero dimensions so the script cannot calculate content length correctly.
Please check section “Hiding & showing content blocks with custom scrollbars” for more info and examples.
Demo here:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/init_hidden_example.html
Solved. Many thanks for your time and effort.
Thank You 🙂
I love this custom scroller and love this fluid part too! Simplicty is always the best. However I am so sad cause I can’t use it.
It seems to break two other scripts that are on same page and I am not quite sure if its fixable. I’ve tried many scrollers, none seem to be good looking and many of them require bunch of scripts.
What does it conflict with , I have no ideas but I have just modal popup script and custom image over youtube script 🙁
If you know any reasons… cheers!
YES! My mistake, thank God!
It is just a conflict due to one gateway that uses older jQuery … 1.4.x or 1.6.x not quite sure!
I’ll find a way to fix this then. Cheers fella!
Hi
congrats to this great work!
I have a problem using the option “updateOnContentResize” – when set to false (default) i cannot see any of the scrolling content on iOS Safari or Chrome which exceeds the visible scroll-area (using horizontalScroll: true), the scrolled content is just cut off (but funny side effect: links are clickable, though)…
on a desktop-browser everythings works as expected.
when the option “updateOnContentResize” is set to TRUE the smooth scrolling gets disabled and theexceedingscrolling content is visible, so the plugin behaves as expected.
are there any known workarounds for this problem?
Hello,
Can you scroll the div containing your content? Does the same happens on any of the demo and examples posted here?
updateOnContentResize option parameter works for dynamic content and auto-updates the scrollbar (instead of manually using the update method). When working with horizontal layout, you must make sure your new content is floated (left or right).
I could provide more help if you could post a link with your implementation.
Hi – just sent you an email 🙂
Hello once again Malihu!
I have another question for you.
Is it possible to load something on reaching the top/bottom of the scroll box without a div at the top or bottom.
I saw your example at: http://manos.malihu.gr/tuts/custom-scrollbar-plugin/complete_examples.html
However this just uses a div at the bottom and checks the length of it and then appends the picture if the “appended” divs length is less than 1.
Is it possible to do this without a div at the top or bottom?
Hello Jake,
Yes, of course. You can call any js function you want inside the onTotalScroll option parameter. Using extra divs, paragraphs etc. is totally up to you and depends on your implementation and markup.
I have some additional examples you can check here:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/issue_2_fix_test/infinite_scroll_examples-issue_2.html
Awesome Malihu!
I might just be inexperienced with web development, which is entirely possible, however with each of your examples you are loading, refreshing, adding, etc. whenever the user scrolls to the bottom of the scroll box.
Is the function onTotalScrollback only used for scrolling to the bottom? I’d like to be loading something when someone reached the top of a scroll box. Which I’m sure is possible but perhaps I’m just missing. Apologies for my inexperience.
Ah yes, onTotalScroll only runs when the total scrolling is reached (bottom or right-end).
You can use the onScroll callback, check container’s position and apply your callback function if it has reached the top. I have made an example that does exactly this. Check it here:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/top_scroll_callback_example.html
Hi Malihu, thanks for the plugin! I’ve used them on some websites that I’ve created and it works great.
The only problem I am having is that when I used it along with bxSlider (http://bxslider.com/) the scrollUp and Down button does not work at FIRST until you drag the dragger then the buttons will start to work. I’m not sure if it conflicting or something? please help me thanks!
$(document).ready(function(){
$(‘#id’).bxSlider();
});
(function($){
$(window).load(function(){
mCustomScrollbars();
});
})(jQuery);
function mCustomScrollbars(){
$(“#id”).mCustomScrollbar(“vertical”,400,”easeOutCirc”,1.05,”auto”,”yes”,”yes”,3);
}
Hi,
I’d suggest trying to implement the new version of the plugin and see if you have the same issues.
Heyo, the script works great, and it’s pretty easy to use. The only problem I’m having (and I’ve seen one person ask about it above) is that it won’t work on my homepage. If I jump off of my home page and come back to it, it seems to then work, but on the first page load the contents are formatted in the scrollbox, but the scroll bar does not appear and I can not scroll down the contents. Any suggestions?
Is your content loaded dynamically? If yes, make sure you call the plugin after content is fully loaded. The same applies if your content is initially hidden.
Also, make sure you call the plugin inside window load function (especially if you have images, objects etc.).
In general, make sure the custom scrollbar is applied after your content is fully loaded and visible, otherwise the plugin won’t have the correct content dimensions.
Ah! What an obvious answer, thank you very much. The plugin works amazingly!
Awesome plugin!
However I do have a question. When I’m appending something new to one of the scrollable divs I need to append it to the mSCB_container. Otherwise it won’t do anything.
Another thing was I was wondering if it would be possible to completely reload a scrollable div using javascript. I’ve tried multiple ways now however I’m finding it quite difficult. I was hoping to be able to have a empty (or relatively empty) div. Then after you press a button it calls a php script that echo’s the proper information. Is that possible or just wishful thinking?
Thanks a lot!
Jake
Just to further explain the reasoning why I do:
$(“.mCSB_container”).append(” … “);
When I do it the way it is described in the config notes where I just do append to the class of the div. Ex:
$(“.content”).append(” … “);
It does add the content however it doesn’t add it into the scrollable div. It adds it after the scrollable div and creates a regular scroll bar.
Please help!
Hello,
Seems I’ve miss-typed the correct selector for the example (I’ve just corrected it).
You need to append/load new content within the .mCSB_container, as it is the div containing the content to be scrolled. So, the correct way would be:
$(".content .mCSB_container").append(" … ");
Thanks for posting this 🙂
I’ve made an additional ajax example, so check it to see if this helps you with your other question.
Awesome! I got the append working! Thanks a lot!
Where was the ajax example you just made? I’d love to take a look at that to hopefully get my other part working.
Thanks so much Malihu!
Ooops! Forgot to paste it lol! Here it is:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/ajax_example.html
I have the link also in “Loading & updating content dynamically” section.
I’m having an issue implementing your plugin into a textarea.Is that possible?
Not really. You cannot manipulate html textareas because the script needs to append various divs on the markup.
EDIT: I made an example of simulating custom scrollbar in textarea by adding a wrapper div and some additional code: http://manos.malihu.gr/tuts/custom-scrollbar-plugin/textarea_example.html
I’m having an issue implementing your plugin into a ?Is that possible?
I have problems getting it to work on Mobile Browsers. It works good on normal browsers but on mobile is not showing the scroll bar.
Hello,
I’m having a very strange problem with form elements. Each time I click on a input, select, or textarea the page scrolls up almost to the top… I found the code that was causing this, but I didn’t understand what it is doing, so I commented it for now (lines 529 to 534). There is any solution for this, so I can uncomment it again?
Thanks!
The script auto-scrolls to input, textarea etc. when those have focus. You probably have floated elements that are not cleared correctly, so check your CSS to see if this is the cause.
I got the same question! Please, tell me if you could solve it. I would really appreciate it. My content must be able to focus via tab key and scroll properly but I can’t figure it out.
Thanks
Great tool! I have one question though. If you apply the scrollbar to content that’s only a small part of your webpage, the ‘scrolling’ doesn’t revert to the normal browser scrollbar when the top or bottom of that content is reached. For example, when you scroll down your custom content (but the lower part of that particular doesn’t fit on your screen/browser window), it scrolls down the content perfectly but you can’t see the lower part of that content (you would have to scroll down your browser for that). How do I make it so that when the top or bottom of the content is reached, the ‘scrolling’ reverts back to the browser scrollbar as opposed to the content scrollbar?
Thanks in advance and compliments for the tool!
I see what you mean. At the moment there’s not much you can do as this is the way mousewheel plugin works. When I get some time, I’ll see if I can apply a workaround for it.
Thanks for your comment and feedback.
Thanks for your response. I actually managed to get the main page to scroll down when the end of the content container is reached by combining a simple jQuery command with your OnTotalScroll function. However, this only works when scrolling down. Is it also possible to implement this when reaching the top of the content (i.e. an inverted OnTotalScroll)?
Also, there seems to be some kind of small delay before the OnTotalScroll function is executed. Is this a normal for jQuery/your plugin or is there a solution for this?
Thanks in advance!