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 🙂
Hi,
I am trying to use both vertical and horizontal stroll in my dialog. But i saw that it just only show the horizontal stroll when i set horizontalstroll:true and only vertical stroll when set it false. Could you please help me to solved this problem.
The plugin currently does not support both axis scrollbars on the same element. I’ll add this feature on the next major version.
Is there anything in the works as in beta that is out? I could really use both vertical and horizontal scroll for a project I am working on. Thanks!
This is a best scroller plugins, Thanks you!
Great Plugin! When using this on a touch enabled device (in this example, and iPad) is there a few to have it so when you scroll it has the flow part at the end of the scroll, currently when you scroll, as soon as you stop the scrolling stops, which is not very true life feel? So when you flick your finger it scrolls threw a large chunk?
Hi awesome plugin !!
I’m having a little problem I have to scrolls in my page and whenever I reach to the bottom of each they get stuck and won’t scroll up using the scroll wheel. This usually happens when I clear cache. If I press F12 it fixes itself so its kinda weird. Maybe I have the loading of the events in the wrong order or something like ?
http://gravitonbit.com/test/event/edificio-metalico/
Hi,
Try calling mCustomScrollbar on window load (instead of document ready). This makes sure all content inside is fully loaded. Also try moving scrollbar.js below other scripts or at the bottom of your document (just before the closing body tag).
Hello there! Thanks for the great plugin.
I have used your scroller several times and I love it.
I have one doubt though, wonder if you can help me?
How should I do so when the user presses the keyboard “right” or “left” key, the content scrolls in the direction they pressed?
Thank you so very very much!
Hello and thanks for the comments 🙂
Check this example:
http://manos.malihu.gr/tuts/custom-scrollbar-plugin/keyboard_nav_example.html
It uses up/down keys but you should be able to change it for left/right.
Awesome. Keep up the great work!!
Hi, Thanks for the awesome plugin. I just have one small query.
Scenario: A textarea with a scrollbar inside body with a scrollbar.
Issue: Scrollbar is not very smooth and when I have a textarea with scrollbar, the scrollbar on the body outside doesn’t work at all.
This is how I have used textarea scrollbar
var width=$(textareaSelector).outerWidth(); var height=$(textareaSelector).outerHeight(); $(textareaSelector).wrap("<div class='berlin-textarea-wrapper'/>"); $(textareaSelector).parent().css('height', height).css('width', width).css('overflow', 'auto'); var scrollableEl = $(textareaSelector).parent(); if(scrollableEl && !scrollableEl.hasClass('content')){ scrollableEl.addClass('content').mCustomScrollbar({ scrollButtons:{ enable: true }, advanced:{ updateOnBrowserResize:true, /*update scrollbars on browser resize (for layouts based on percentages): boolean*/ updateOnContentResize:true, /*auto-update scrollbars on content resize (for dynamic content): boolean*/ autoExpandHorizontalScroll:false, /*auto expand width for horizontal scrolling: boolean*/ autoScrollOnFocus:true, /*auto-scroll on focused elements: boolean*/ contentTouchScroll: true } }); } var textareaClone=$('<div style="word-wrap:break-word" />').appendTo($(textareaSelector).parent()); var copyAttributes=['font-family','font-size','font-weight','letter-spacing','word-spacing','line-height','width']; for (var i = 0; i < copyAttributes.length; i++) { textareaClone.css(copyAttributes[i], $(textareaSelector).css(copyAttributes[i])); } textareaClone.html(' '); var heightPerRow = textareaClone.height(); textareaClone.html($(textareaSelector).val().replace(/\n/g,'<br />')); var overallHeight = textareaClone.height(); $(textareaSelector).attr('rows', Math.round(overallHeight / heightPerRow)); $(textareaSelector).css('height', 'auto'); // textareaClone.html($(textareaSelector).val().substring(0, range.end).replace(/\n/g,'<br />') + ' '); textareaClone.remove();
Can you please help me out with this ? As what could be the issue. Why the body scrollbar stopped working when I apply scrollbar to textarea
Ok it’s resolved. I was using old plulgin of urs and seems that you have resolved it in your latest plugin. 🙂
There is an issue with autohide,
If you have the scrollbar attached to a div (e.g. body) and nother scrollbar inside that div then even with autohide, the topmost scrollbar will always show.
Would it be possible to make it so autohide would hide the scrollbar always and only show it while scrolling with a fadein/out effect like it happens with mobile scrollbars? Or maybe make it a new option,
autoHide: false //always show
autoHide: ‘hover’ //show on hover and scrolling
autoHide: ‘scroll’ //show while scrolling only
Also a autoHideEffect would be useful for specifying the show/hide effect.
autoHideEffect: false //instantly show/hide on autohide
autoHideEffect: ‘fade’ //fade in/out on autohide
I’ll consider adding such option on the next version, although showing the scrollbar only while scrolling is not very user-friendly (a user should normally be aware the is more content to scroll before actually starts scrolling).
Hello Again,
I’ve got a little problem.. i’m using scroll bar on my “content” page so when scroll first page to bottom, all others sites opens on bottom. Please help me.
Hi,
I’m trying to completely prevent any scrolling from happening when the scroll buttons are click, unless certain conditions are met. I’ve gotten it close, but it still scrolls down maybe 5-7 pixels or so. I’m preventDefault’ing and using the “stop” method. This residual scrolling also doesn’t seem to have any smooth animation like normal scrolling for the plugin, seems to happen instaneously. Any thoughts?
Thanks
Think I got it. Set the scrollType to “pixels”, set the scrollAmount to “0”. Then let different functions handle the scrolling.
Hi,
Thanks for the plugin, but I have a problem with it. When the scroll reaches the end activates the browser’s scroll. Is there any way to lock the browser scroll while the mouse is over the div that has the customScrollbar?
Kind regards and thanks for your job,
Iago
I wanna know how to fix this too! I want it to behaved like the new Facebook sidebar… when the scroll div reaches the end, the page scroll must stop.
Same issue. Would need to be able to stop the scroll event from propagating to the window even when the scrolling has reached the end.
Malihu, awesome script! out of all the other ones on the net, it’s the sleekest looking, finally got it implemented tonight and loving it, many thanks for your work!
I’m having a bit of a problem (I’m kind of a beginner), wondering if you could shed some light if you have a moment….
I’m applying the plugin to a div that is hidden/expanded via fadeToggle and every time I click on the link that toggles the div to expand another scroll bar appears until there’s 2,3,4,5…etc scroll bars in the div and they crowd out the content – do you have any idea what might be making this happen?
A million thank yous for any suggestions 🙂
Hello and thank you for your comments,
You need to use update method of the script (see methods: update). I have a working example here: http://manos.malihu.gr/tuts/custom-scrollbar-plugin/init_hidden_example.html
Hi Malihu – I am just baffled by this problem. Could you take a look at my site http://drumprofessor.net? From the homepage navigation bar, please click on the “testimonials” button. A page that includes your scrollbar will slide into view. Scroll down about halfway until you get to the testimony (text in red) of “Glen G. Gates”. I created two hotspots here, one on his email address, the other for his website. When I click on either hotspot, instead of being taken to the page or email, the scroller takes me halfway up the page again. I’ve tried every variation or trick I can think of. Any idea what I am missing? Thanks very much. from Peter
solved the problem just now with:
advanced:{
autoScrollOnFocus: Boolean
}
Thank you!
Hi
I’ve just downloaded your script and try to make it work. The first thing I’ve noticed is the mousewheel scrolling. It works perfectly when scrolling down, but I cannot scroll up. It works sometimes, but most times it doesn’t.
My test sample is as simple as can be with a surrounding some simple content. I am testing in IE10, Win8.
Do you have any ideas of what might be wrong?
…and that should be…
My test sample is as simple as can be with a [div class=’scrollbar’] surrounding some simple content.
OK, I may have found a bug. Scrolling up with the mousewheel only Works as long as I don’t scroll all the way to the bottom of my content. After hitting the bottom it’s game over for the mousewheel.
Hope you can replicate and fix it 🙂
Don’t worry, it works – my fault of course! 🙂
lol @ the name
No problem 🙂
Hi,
My requirement is that i have to add horizontal and vertical scroll for a same container plz help me in that..
thanks
Teja
The plugin currently does not support both axis scrollbars on the same element. I’ll add this feature on the next major version.
Do we know when would be the next major release out to the world? Is there any workaround for getting both the scrollbars? We are planning to mimic the code, is it worth doing it? If the this is not possible we may look into another plugin. Please suggest
Hey There,
This plugin is great! But i’ve got a little problem.. when resize of my window, can’t use horizontal scroll only vertical.
Second problem: i’m using scroll bar on my “content” page so when scroll first page to bottom, all others sites opens on bottom. Please help me.
Btw sorry for my english -.-
please help me
$(“#chat_container”).mCustomScrollbar({
autoHideScrollbar:true,
scrollButtons:{
enable:true
},
theme:”dark-thick”
});
Please…………………….
How to make this stay on bottom?
horizontalScroll:true;
Hi, thanks for this great plugin.
Can I also own scroll buttons – outside the scrollable area – use the scroll function and assign them via jquery?
thank you
falk
Yes. You need to use the scrollTo (see plugin methods) method. Also, few of the demo pages use this, so you can view their source. For example: http://manos.malihu.gr/tuts/custom-scrollbar-plugin/nested_scrollbars_demo.html
Yes, i see. But i don’t need a target for the scrollTo, i need the same function like the arrow-buttons.
is this possible?
I am facing a problem… I have a form inside a wrapper and I called the scroller on wrapper. I worked fine but when I focus on any input field it automatically scrolls back to top. Please help.
This probably happens due to some CSS positioning of input fields being off…
You can disable auto-scrolling on focus by setting autoScrollOnFocus to false (see Configuration).
this script is shit. code is too big and incomprehensible !
for begginers like me it’s just shit !
why people use this longest script only for scrolling ?!
Hello Alex,
This script is a plugin, not a tutorial. Its purpose is to plug-it in a project and work. In my opinion, for the amount of features it has and the things you can do with it, its size is not that big.
People use this plugin because they usually require extra functionality (scroll-to, touch support, nested scrollbars, user defined callback functions etc.) and this script provides them.
The guides for using and implementing the plugin are fairly simple. If you want to study its source code, you’re more than welcome but the script itself is pretty advanced and not really for beginners in javascript/jQuery (no custom scrollbar script is suited for beginners).
Thanks for the feedback
I’m enjoying your plugin but I’m having trouble when creating hotspots on an image. The page just scrolls upward slowly. If I click very fast, the hotspots work. I must be missing something …
Actually i am applying this scrollbar to a div contained inside body. On page load i set body to display none after 1 sec i set it to display block. But after display block neither my div nor my scrollbar is visible. I tried calling update after the delay but no luck..
This plugin looks fantastic. I had an issue using it within tabs but figured out how I could initialize the tabs upon each tab control fix. The easing really makes the scrolling super smooth!
Hi Devin,
We are trying to get this working with TABS as well but haven’t been able to get it working yet. Saw your post and figured I should ask you since you already came up with a solution- Could you please post/send an example of what you came up with?
Thanks 🙂
The most common method would be to call mCustomScrollbar on each tab with the updateOnContentResize option parameter set to true. Alternately, and depending on your tabs design, you can call mCustomScrollbar on an outer container with either updateOnContentResize option parameter set to true or manually call the update method every time you click a tab.
scroll bar appearing fine on page load. but when i click any button in a web page automatically mcustomscrollbar disappears and the default scroll bar get appears. i used scroll bar for datalist item. scroll bar disappear while clicking any item in data list and also getting disapper if i click any other button in a web page. kindly help in resolving this issue.
Hi,
This is a great plugin and without being an expert, i make it work without problem!
I just have two questions and one problem.
Is it possible to make it work with Jquery prettyphoto which dunamically construct an iframe ? I can’t make it works at the moment (using $(“iframe”).mCustomScrollbar({… and even when the iframe as an “id” )…
But my more urgent problem is to know ik it’s possible to make an element inside the container with the scrollbar, appear in the center of the container space (or go to top).
I’m using WordPress and I apply the CustomScrollbar to a div which contains a list (ul) with (li) which are dynamically construct by a wordpress loop. This list is placed to the left of the content of the current product browsing. I display all of that on product page, and the list is pretty long… I would have the current element ( which is highlight with css) at the top of the list, is it possible ? Someone could help me on this way, please ?
I will really appreciate your help, cause i’m lost…
Many thanks !
Sylvie
<script> (function($){ $(window).load(function(){ $("#content-cat-left").mCustomScrollbar({ mouseWheel:true, theme:"dark-thick", scrollButtons:{enable:true, scrollType:"pixels", scrollAmount:200 }, scrollInertia: 0, advanced:{updateOnContentResize: true}, callbacks:{onTotalScrollOffset:100} }); }); })(jQuery); </script> Part of my page <ul id="menu-toggle"> <li <?php if($currentpost == $post->ID) { echo ' class="current"'; } ?>> <div class="show-content-bt"> <?php if( get_field('photo_produit_1') ):?> <div class="photo-prod"> <img src="<?php echo bloginfo('template_url'); ?>/timthumb.php?src=<?php echo get_field('photo_produit_1') ?>&w=57&h=57&zc=1&q=100&a=t" alt="<?php the_title(); ?>" width="57" height="57" alt="<?php the_title(); ?>" /> </div> <?php else: endif;?> <a href="<?php the_permalink(); ?>"><h2><?php the_title(); ?></h2></a> </div> <?php endwhile; ?> <?php wp_reset_postdata(); // reset the query ?> </li> </ul> <!-- End of #menu-toggle -->
Hello Malihu, thank you very much for your plugin. Here’s my question:
I am having problems making it work with bbq in a div ajax content.
I tried several ways and I always get different behaviors.
In this case the first default content loads the scrollbar correctly but following a link and loading ajax content no scrollbar is displayed at all (loaded data exceeds div height).
Back button works okay but going to the first default page: div#content is hidden
Thank for help.
(function($){
$(window).load(function(){
$(“#content”).mCustomScrollbar({
theme:”dark-2″,
advanced:{
updateOnContentResize: true
},
mouseWheelPixels:300,
scrollButtons:{
enable:false,
scrollSpeed: “auto”
}
});
//$(“#content”).mCustomScrollbar(“update”); //update scrollbar according to newly loaded content
//$(“#content”).mCustomScrollbar(“scrollTo”,”top”,{scrollInertia:200}); //scroll to top
});
})(jQuery);
$(function(){
var cache = {
”: $(‘.bbq-default’),
‘#’:$(‘.bbq-default’)
};
$(window).bind( ‘hashchange’, function(e) {
var url = $.param.fragment();
$( ‘a.bbq-current’ ).removeClass( ‘bbq-current’ );
$( ‘#content’ ).children( ‘:visible’ ).hide();
url && $( ‘a[href=”#’ + url + ‘”]’ ).addClass( ‘bbq-current’ );
if ( cache[ url ] ) {
cache[ url ].show();
}
else {
$( ‘.bbq-loading’ ).show();
cache[ url ] = $( ” )
.appendTo( ‘#content’ )
.load( url, function(){
// Content loaded, hide “loading” content.
$( ‘.bbq-loading’ ).hide();
$(“#content”).hide();
$(“#content”).fadeIn();
$(“#content”).mCustomScrollbar(“update”);
//$(“#content”).mCustomScrollbar(“scrollTo”,”top”,{scrollInertia:200});
});
}
})
$(window).trigger( ‘hashchange’ );
});
http://jsfiddle.net/sqfcX/
could someone help me about this stuff?
Basically, open your browser console. Then rotate your screen using (CTRL+ALT+LEFT).
As you can see value in console doesn’t work properly.
Otherway, removing the scrollbar from #container div fixes the problem.
But I need the scrollbar on that div. Any solution?
Thanks
edited with this
http://jsfiddle.net/4g3zx/
to make it more clear
Hi there,
I’m having a really odd problem with embedded Vimeo / Youtube videos
I get a very fast flickering iframe instead of the embedded video, see here:
http://andybarter.com/main/?p=409
The video plays fine when I disable the scroll bar… any ideas?
Thanks
I get the following console error:
“Unsafe JavaScript attempt to access frame with URL http://andybarter.com/main/?p=409 from frame with URL http://player.vimeo.com/video/65420706?title=0&byline=0&portrait=0&color=ffffff. Domains, protocols and ports must match.”
And since you have set updateOnContentResize to true, it just reloads the video with the error…
Hi,
first of all great plugin, the best!
i have a problem, i have two sides in my layout, the left side have scroll and the right side have scroll too.
when i scroll the left side it scrolls the right side only, and when i scroll the right side it scroll the right side as it should.
can u help me to understand why it happen plz?
Hi,
I have an issue after calling scrollTo. Problem is that after calling that method a can’t scroll anymore. It looks like it freezes or something like that. Can you help me with that?
Unfortunately, the plugin is *broken* when used toghether with jquery ui:
http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js
Muhc of the code seems to execute but the scrollbars stay with display:none;
Never mind, using the latest version of the jquery ui library seems to fix this.
http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js
jQuery UI usually comes with a compatible jQuery version.
1.8.9 is a bit old and came with jQuery 1.4.4 (it also works with jQuery 1.7).