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, first I would like to thank you for this great and free plugin.
I’ve tested the recently added jQuery expressions. I can’t get them to work as expected.
this
if($(".page").is(":mcsInView")){ alert('is in view'); }
return
Syntax error, unrecognized expression: unsupported pseudo: mcsInView
page is at around 1500px from top…
(tested with jQuery v1.11.0)
Hello,
Are you using version 3.0.6 and later? Is the custom scrollbar activated on element(s)?
1) Yes, I’m using version 3.0.7.
2) I think so… element .page is inside activated scrollbar.
Structure currently look like this:
<body class="home mCustomScrollbar"> <div class="header">~150px height(h)</div> <div class="intro">~ 450px h</div> <div class="main-content">~ 900px h</div> <div class="page">~300px h</div> <div class="footer">~200px</div> </body>
What I’m trying to achieve is
a) stop scroll
$('body').mCustomScrollbar("stop");
inside conditional expression when .page is visible (best would be “reach top”)b) the other issue is the vertical scroll direction (up/down). On the my test I’ve settled a scroll to top button. Conditional shouldn’t top when srolling up…
Hello, is it possible for me to create a custom handle for this scroll bar? perhaps by just using an SVG?
Hi, I’m back again with another question, if you don’t mind.
Is there a way to disable the scrollbar on mobile-based interfaces (e.g. iPads, phones, tablets, etc.) without disabling the whole thing? The scroller works perfectly for me on desktops and laptops, but I have a hard time scrolling on mobiles, as it tends to get “stuck” if I’m scrolling using the screen and not hovering over the scrollbar itself.
Thanks!
Hello, Thank you very much for great plugin, especially for comments and wonderful support.
If you have little time for me to help figure out problems, will be very helpful.
Problem I have is
I am using windows 8.1 touch device and having lot of problems using it (when I try to swipe down from scroll bar it doesn’t react or scrolling opposite directing) on firefox. Then I tried to integrate hammer.js to handle touch events and no success.
Have you any ideas how to fix that problem?
Thank’s in advance.
Hi,
Is your scrollable content an iframe? Can you send me a link?
http://www.worldlifeexpectancy.com/world-health-rankings
Here is link. Content of scrollbar not using iframe.
Do you have any idea?
Hi there,
I have a page that has very long content and when I implemented the scrollbar, it takes a very long time to load the page. Is that something you can suggest for a fix?
Great plugin, thanks a million!
Hello,
The plugin is 39kb and the CSS (unminified) is about 53kb. So, with the plugin you’ll have something like an extra 90kb which should not be a big difference in loading times. Can you send me your link?
How can you get this plugin to work with DataTables/Bootstrap 3?
I have an issue with the plugin :
scrollable content other content
It seems that in this scenario I can’t make the div scroll scrollable with the following code :
$(“.scroll”).mCustomScrollbar({
theme:”rounded-dark”,
scrollInertia:0,
scrollButtons: { enable: true }
});
When applying the same code to the container makes the whole container div scrollable. Any ideas ?
Edit the HTML renderred worngly:
<div class="container"><div class="scroll"> scrollable content </div> other content </div>
Does the .scroll element have a height value?
Yes a max-height value
Yes, a
max-height:600px
valueAnd does its content exceed the 600 pixels height so a scrollbar can be displayed?
Yes it does. I really don’t get what’s happening. The size of the content vary depending on which button I click on. And when the content height overpass 600px the div just get bigger instead of being scrollable. On the other hand usingthe scrollable function on the container makes the div scrollable when the height overpass 600px.
So I was wondering if you managed to makes a div scrollable within another div. And if so how exactly. MAybe I missed something
It sounds like the max-height rule is not applied on the element (since it expands). When you inspect the element with browser’s dev tools, does the correct CSS apply?
In general, you need just 2 rules for the scrollbar: height (or max-height) and overflow (auto or hidden).
I could really help if you could send me a link or a test page where the issue happens as at the moment I’m just guessing…
Hi, first of all, thank you for this plugin, it works really well.
I have a question about the update function. On my website, I’m using a lot of ajax to load pages without having to reload everything, and when I’m loading them with the “load()” function of jQuery, I can’t manage to get your plugin working, but if I reload the full page, it works as it should, do you have any solution?
Here’s my code if you need:
$(“body”).on(‘click’, ‘.link-videoplayer-full’, function () {
var fileURL = $(this).data(“fileurl”);
var myUrl = $(this).data(“link”) + ” #section-container”;
if(Modernizr.history) {
_href = server+”webroot/”+myUrl;
history.pushState(null, null, _href);
$(“.spinner”).css(“display”, “block”).fadeIn(“slow”);
$(“#section-container”).fadeOut( “slow”, function() {
$(“#section-container”).load(myUrl, function(){
$(“.link-files-list”).addClass(“selected”);
$(“.spinner”).fadeOut(“slow”);
$(“#section-container” ).fadeIn( “slow”, function() {
$(‘#section-container’).mCustomScrollbar(“update”); // Here I call the update function
});
jwplayer(“video-player”).setup({
file: fileURL,
width: 800,
height: 450,
image: “/videoPlayer.jpg”
});
});
});
$(window).bind(“popstate”, function() {
link = location.pathname.replace(/^.*[\\/]/, “”);
loadContent(link);
});
}
return false;
});
Thank you,
Steven.
Hello,
I think you need to change:
$("#section-container").load(myUrl, function(){
to:
$("#section-container .mCSB_container").load(myUrl, function(){
and remove:
$('#section-container').mCustomScrollbar("update");
The problem is just that you’re loading new content directly in #section-container. New content should be loaded in .mCSB_container div which is the actual content wrapper after scrollbar is initialized. The update method is not needed as the plugin will do it automatically.
let me know if this works
Thank you for the answer.
I tried what you said and unfortunately it didn’t solved my problem. I think I’ve done something wrong with my page’s structure that cause your plugin to not load, I’ll try to investigate more and I’ll come back to let you know where was the problem.
JFYI, I think that my container (#section-container) is the good one to apply the .load() because it work as it should when I don’t call it with AJAX (On the first init of the page, when I press F5 for example). I init it like this:
(function($){
$(window).load(function(){
$(“#section-container”).mCustomScrollbar({
….
Thanks again,
Steven.
I thought you were already calling:
$("#section-container").mCustomScrollbar({ ... })
before the ajax call.
Is the scrollbar initialized on page load? If not, you should change:
$("#section-container").mCustomScrollbar("update");
to:
$("#section-container").mCustomScrollbar();
Hi,
Yes, the scrollbar is initialized on page load (on #section-container) and it works really well, the problem came only when I’m loading new content in the #section-container div so I think the right function to use is the “update” one as the scrollbar is already initialized before AJAX call.
Anyway, I’ve done something wrong I’m still investigate to know what and I hope I’ll find 🙂
Thank you.
I finally got the scrollbar to work on my Blogger blog, you can imagine how ecstatic I feel! You’re a genius!
Being fairly new to the JavaScript language, however, I’ve run into a problem: how do I get the script to scroll down to a div id when its anchor tag is clicked? I saw some “scroll to” plugin code above, but I’m not sure how to work it or where to place it.
Currently, I’ve tried doing something like this:
(function($){
$(window).load(function(){
$(“body”).mCustomScrollbar();
});
$(“body”).mCustomScrollbar(“scrollTo”,”#name-of-id”);
})(jQuery);
I’ve probably gotten it wrong, because when I click on the anchor tag, it abruptly drops me down to the div, but the scrollbar disappears. So I’m looking for a solution to the scrollbar disappearance and a way to get a “smooth scroll” from anchors to div’s.
I’d really appreciate any advice on this. Thanks!
I just read through past comments of people who had similar questions to mine, and used the suggestions you gave them to find my solution. No need to respond to this now, but thank you anyway. 🙂
No problem 🙂
Just a note:
Since you’re initializing the scrollbar on window load, you must also call the scrollTo method on window load:
(function($){ $(window).load(function(){ $("body").mCustomScrollbar(); $("body").mCustomScrollbar("scrollTo","#name-of-id"); }); })(jQuery);
You could also chain scrollbar functions and methods:
(function($){ $(window).load(function(){ $("body").mCustomScrollbar().mCustomScrollbar("scrollTo","#name-of-id"); }); })(jQuery);
hi! great plugin! i added it to a wordpress child theme and it works, only I can’t figure out how to set the buttons as visible, any hint would be greatly appreciated!
pls ignore the question, I have sorted it out in the meanwhile, my mistake was that I had added the .mCustomScrollbar manually, so the option related to the #id were being overwritten.
great plugin! I’m getting some wiggling/vibrating action of images in scrollbar on IE9 and Chrome on PC, any thoughts on what’s happening?
Thanks!
Hey malihu,
First of all, great plugin! Simple, easy to learn, yet capable of so much – I am very greatful. I see you’re very active in supporting the plugin and answering questions, so if you have a little time, I hope you can help me out with mine.
I tried to create a minimal scenario for the problem: http://embed.plnkr.co/sspi7E2QckRwa5e4Xqbl/preview
Essentially it’s a basic horizontal scroll box containing a gallery of images. However, your plugin doesn’t seem to recognise that content is overflowing fully, only half the images are displayed, even though the scroll is working fine.
I’ve read many pages of comments, and have tried the min-height/width trick, and added the autoExpandHorizontalScroll. While these both help, I’m still having the issue of only half the content being scrollable.
Am I missing something basic here? Can I do what I want with your plugin? Thanks for your time!
Richard
Hello and thanks for your comments!
The problem is the percentage based width of your .box elements.
autoExpandHorizontalScroll cannot work with percentages as it’ll try to auto-expand the content wrapper element to the sum of all inner elements (in your case: .box). Since these are set to width:20% (meaning one fifth of their container), you’ll always see 5 per line. That’s why you only see 5 of your elements (the others are wrapped below).
I hope I’m making sense lol
In short, you should set the width of .box to a fixed value (e.g. 200px).
If you still want your elements to have a percentage based width, you’ll have to place them inside a div which should have the same (fixed) width value (e.g. 1200px) as your main element (.main or .container).
Thanks, that makes a lot of sense as to why you can’t use straight up percentages, even if accompanied by min-* values.
I’m still a little confused about how to retain the percentage based width. If I put the images (20% width) inside a div (.container) and fix that div to a value (1200px/400px), I still see the problem of clipped content (similar to the example I posted).
My current workaround is to set a fixed width based on the width of the parent element using $.css() on window resize/load.
parentWidth = $(".container").css("width"); parentWidthNumeric = parseInt(parentWidth); childWidthNumeric = 0.2*parentWidthNumeric; childWidth = childWidthNumeric + "px"; $(".box").css("width", childWidth); //$(".box").css("width",0.2*parseInt($(".container").css("width"))+"px");
It works, and I could put it into a function, but it feels messy. Is there a better alternative?
Thanks again, super quick response!
Yes, my bad as I didn’t explain well.
The container should have a fixed width and the inner elements (.box) should have a percentage-based width according to their total number. For example if you have 10 elements, their width should be 10%. I don’t know if this would help in a design/layout though…
What you did works but I’m not sure what design/layout would this approach serve(?)
Wouldn’t be better to set their width to say 200px and skip the container and the extra script?
I want to enable the scrolling only click to the buttons not scrolling mouse wheel. I tried using:
mouseWheel: {enable: false}
option but it didn’t work. Then I tried:
mouseWheel: false
It stop scrolling the content on mouse wheel scroll but it also stop scrolling whole page content.
Is there any idea to scrolling whole page content with when scrolling mouse wheel over the scrolling content.
Both of the code you posted should work.
Do you get any console errors? I’d need to see your page to know what might causes this.
There is no any error related to scrolling.
Please send me your email address, I’ll send you problem detail with login credentials of my site.
http://manos.malihu.gr/contact
Hello malihu,
This post is only to say thank you…
For this incredible plugin and work, an example of free and open source
Look what i made thanks to custom scroll bar, my personal open source and free project, to build Single Page Web Applications with PHP and jQuery:
http://algosemueve.es/ababool
Of course here are the greetings http://algosemueve.es/ababool/greetings and of course the license http://algosemueve.es/ababool/license
In a few days i hope to publish it on Github!
Thanks malihu!
You’re welcome 🙂
Your project looks awesome.
Thanks a lot for your words, comments and the reference in the greetings!
Hi,
Great to have a ScrollTo plugin for my favorite Scrollbar – thanks a lot!
If you could find the time to answer this dummy question, it would really help me.
How do I have to change the function:
$(".text").mCustomScrollbar("scrollTo","#el-1");
when I have multiple links and targets in one page (“#el-2”, “#el-3” and so on…)?
All links and targets are inside the div “.text” and I need each link to have one specific target.
Thank you!
Caroline
Hello,
Normally, element ids are (and should be) unique on a document. For example there should be only one element with id “el-1”, one element with id “el-2” and so on…
If your ids are unique, you simply do:
$(".text").mCustomScrollbar("scrollTo","#el-1"); $(".text").mCustomScrollbar("scrollTo","#el-2"); $(".text").mCustomScrollbar("scrollTo","#el-3");
I don’t know if your issue is not having unique ids (e.g. multiple “#el-1” elements) but if you do you could differentiate them by their index number (if they’re siblings). For instance:
$(".text").mCustomScrollbar("scrollTo","#el-1:eq(0)"); //1st element $(".text").mCustomScrollbar("scrollTo","#el-1:eq(1)"); //2nd element (right after 1st) $(".text").mCustomScrollbar("scrollTo","#el-1:eq(2)"); //3rd element (right after 2nd)
In any case, you can always pass a jquery object as the target position, e.g.:
$(".text").mCustomScrollbar("scrollTo",$("#el-1"));
which means you can use any jquery selector you want.
See all jquery selectors: http://api.jquery.com/category/selectors/
Does this help?
Hi,
thanks a lot for your answer.
I’ve tried all three of your solutions, but I still have the same problem: The scrolling works, but all links in my scrollTo animated sub navigation take me to the same target: the very last one (“#el-3”).
All targets have unique id’s. I must have messed up somewhere else.
My js code goes as follows:
<script> (function($){ $(window).load(function(){ $(".text").mCustomScrollbar({ theme:"dark-thick", scrollButtons:{ enable:true} }); $(".scrollTo a").click(function(){ $(".text").mCustomScrollbar("scrollTo","#el-1"); $(".text").mCustomScrollbar("scrollTo","#el-2"); $(".text").mCustomScrollbar("scrollTo","#el-3"); }); }); })(jQuery); </script>
And the HTML:
<div class="text"> <div class="mCustomScrollbar" data-mcs-theme="dark-thick"> <h3 class="scrollTo"> <a href="#el-1">target element 1</a>, <a href="#el-2">target element 2</a>, <a href="#el-3">target element 3</a>, </h3> <p>....</p> <h3 id="el-1">...</h3> <p>....</p> <h3 id="el-2">...</h3> <p>....</p> <h3 id="el-3">...</h3> <p>....</p> </div> </div>
Thanks a lot for your patience!
Caroline
It seems that you’re activating the plugin twice. One on .text and one on .mCustomScrollbar div. Is this done on purpose?
If nested scrollbars is not want you intended, you need to use only one initialization method (HTML or javascript).
To initialize via javascript just remove the mCustomScrollbar class and data-mcs-theme attribute from the div. To initialize via HTML remove the mCustomScrollbar function from your script.
Let me know if this works
Thanks, that was indeed a mistake.
I’ve removed the mCustomScrollbar class and data-mcs-theme from my div.
The scrollTo behavior remains the same as before, though (always scrolls all the way down to my last target element).
I havn’t tried to initialize via HTML as I am not sure where/how exactly the mCustomScrollbar function is to be removed.
I am truly greatful for any other clues…
Ok, I think the problem you’re having is that when you click the link, the hash (#) value is added in the browser’s address bar. This makes the script hide the scrollbar and go to the associated id as if you were using “Find in page” in the browser.
To fix this, you just need to prevent the default behavior in your click function like this:
$(".scrollTo a").click(function(e){ e.preventDefault(); $(".text").mCustomScrollbar("scrollTo","#el-1"); $(".text").mCustomScrollbar("scrollTo","#el-2"); $(".text").mCustomScrollbar("scrollTo","#el-3"); });
Hi,
thanks! This still didn’t change the fact that all href-links lead to the very last target, though.
But I just resolved the problem by putting each string insinde a specific class (“.scrollTo1” and so on) and adjust the js code like this:
<script> (function($){ $(window).load(function(){ $(".text").mCustomScrollbar({ theme:"dark-thick", scrollButtons:{ enable:true} }); $(".scrollTo1 a").click(function(){ $(".text").mCustomScrollbar("scrollTo","#el-1"); }); $(".scrollTo2 a").click(function(){ $(".text").mCustomScrollbar("scrollTo","#el-2"); }); $(".scrollTo3 a").click(function(){ $(".text").mCustomScrollbar("scrollTo","#el-3"); }); }); })(jQuery); </script>
… and html now looks like this:
<div class="text"> <h3> <span class="scrollTo1"><a href="#el-1">target element 1</a>,</span> <span class="scrollTo2"><a href="#el-2">target element 2</a>, </span> <span class="scrollTo3"><a href="#el-3">target element 3</a>,</span> </h3> <p>....</p> <h3 id="el-1">...</h3> <p>....</p> <h3 id="el-2">...</h3> <p>....</p> <h3 id="el-3">...</h3> <p>....</p> </div>
Not the best or simpliest solution, but it works. In fact, It works as well without the “href=”#el-1”:
<span class="scrollTo1"><a>target element 1</a>,</span>
but that makes the cursor an arrow instead of a pointer so this would have to be changed via css.
Thanks again for your support!
Your plugin is awesome, but I’ve hit a snag and need your help. I’ve looked over you documentation and haven’t seen an answer for this question I have yet so here it is:
When I try to use multiple callbacks it they do not fire correctly. Only one of them will fire.
Here is some of the code:
$(“#myDiv”).mCustomScrollbar({
callbacks:{
onOverflowY:function(){
alert(“scrolling needed”);
}
},
callbacks:{
onOverflowYNone:function(){
alert(“no scrolling needed”);
}
},
theme:”myTheme”,
scrollbarPosition: “inside”
});
This doesn’t work, why is this? The code doesn’t throw any errors, but only one of the callbacks ever fire. Is there a way to use mutiple callbacks. I need to use multiple callbacks b/c I want to adjust the margin of the div to make up for the added space that comes with the scrollbar itself being added to prevent the scroller from throwing off my centering.
Thanks and your plugin rocks!
Place all callback functions inside (single) callbacks option:
$("#myDiv").mCustomScrollbar({ callbacks:{ onOverflowY:function(){ alert("scrolling needed"); }, onOverflowYNone:function(){ alert("no scrolling needed"); } }, theme:"myTheme", scrollbarPosition:"inside" });
I see, thank you. How do I get your plugin to work on a textarea?
I looked at the demo in the examples folder for textareas, but am a little unclear on how much of the code I need to carry over to my own document to get it to function properly.
Do I need all of the code that is in the inline script tag at the bottom of this example including the clone scripting in addition to the regular plugin files (i.e the main css and js files for your plugin)?
Does this still work with
resize:vertical
applied to the textarea?
What are the css rule restrictions for this type of operation with your plugin, if any?
Yes you need all the code in the inline script (in addition to plugin files) and adjust mCustomScrollbar to your own element.
It won’t really be functional with the resize property as the textarea is wrapped in another div in order to apply the scrollbar (the scrollbar will function but the resize handle will get hidden).
Hi. Great Plugin
I have a page and div with 100% width. However, there is a gap between the page content (some images are width 100%) and the edge of the screen. Without the custom scrollbar, it goes to the edge as expected. Image of problem (http://postimg.org/image/cctqvcyvt/)Here is my code
(function($){ $(window).load(function(){ $("#main123").mCustomScrollbar({ theme:"dark", setWidth:"100%" }); }); })(jQuery);
and My div is
<div class="main12hidden" id="main123" style="height:100%; position: relative">
(by the way, the div is hidden then is shown on page load)
Also, when I apply the ‘light’ or ”dark’ themes, there are no arrows at the top or bottom. I have uploaded the png to the same directory as the style sheet.
Please Help
Regards, Alex
Hi,
To enable the arrow buttons you need to add:
scrollButtons:{ enable: true }
in your function call.
You can remove the right margin via CSS by adding:
#main123 .mCSB_inside > .mCSB_container { margin-right: 0; }
to your stylesheet or by editing jquery.mCustomScrollbar.css and change line 54 to:
.mCSB_inside > .mCSB_container{ margin-right: 0; }
Another way to remove the margin would be to set scrollbarPosition option parameter to “outside”:
scrollbarPosition: "outside"
and set scrollbar’s CSS right position to zero (line 75 in jquery.mCustomScrollbar.css):
#main123 .mCSB_outside + .mCSB_scrollTools{ right: 0; }
Hi, Thanks for the reply. I managed to get the buttons to show and the margin to go, but I’m having trouble getting the dragger rail to appear. I’ve changed the
z-index
to be above my content, but it still is not showing. The dragger bar is showing, but not the rail behind it.Here is my updated code :
<script> (function($){ $(window).load(function(){ $("#main123").mCustomScrollbar({ theme:"light-thin", setWidth:"100%", scrollbarPosition: "inside", snapAmount:windowheight, alwaysShowScrollbar: 1, scrollButtons:{ enable:true, scrollAmount:windowheight, scrollType: "stepped", }, keyboard:{ enable:true, scrollAmount:windowheight, scrollType: "stepped", }, contentTouchScroll: 100, }); }); })(jQuery); </script>
Regards, Alex
Can you send me your page link? I can’t really say but it might be some CSS rule(?)
Can you inspect the rail element and see its CSS via brwoser’s dev tools?
UPDATED CODE:
I’ve managed to fix the images not displaying 100% and get the up / down buttons by changing the scrollbar
z-index
.However, I am still not able to have the dragger rail appear. Updated Code:
<script> (function($){ $(window).load(function(){ $("#main123").mCustomScrollbar({ theme:"light-thin", setWidth:"100%", scrollbarPosition: "inside", snapAmount:windowheight, alwaysShowScrollbar: 1, scrollButtons:{ enable:true, scrollAmount:windowheight, scrollType: "stepped", }, keyboard:{ enable:true, scrollAmount:windowheight, scrollType: "stepped", }, contentTouchScroll: 100, }); }); })(jQuery); </script>
Regards
Alex
It’s working thanks 😉
Hey thanks for answering my question here is the code to activate the plugin
comments_section.mCustomScrollbar({ setHeight:250, theme:'minimal-dark', updateOnContentResize:true });
this part works perfectly, but when i add content like this, after ajax call
comments_section.append(newComment).fadeIn('slow');
the layout falls apart.
You just need to append the new content inside the .mCSB_container element and not directly in comments_section.
.mCSB_container is the element that contains your actual content after custom scrollbar has initialized.
Just change your append function to:
comments_section.find(".mCSB_container").append(newComment).fadeIn('slow');
Hola,
maravilloso aporte de este plugin.
Gracias por la información, lo voy a probar ahora mismo.
Btw, awesome plugin congrats 😉
When i try to add dynamic content to my comment-section, the custom scrollbar doesn’t update, and the content shows up in front of the textarea why this happen? i already try, update the scrollbar plugin after inserting the comment on the view and didn’t work, any suggestions?
Do you add the content directly inside the element with the scrollbar? Can you post your code where you add the content?
God bless You and thanks
Is it possible to use this plugin in conjunction with another one to show the related video of each thumbnail on click event?
Probably. If the other plugin works on overflowed elements with browser’s native scrollbar, it should also work with custom scrollbar.
Does calling “Destroy” on the scrollbar also remove all elements from the DOM created by the plugin? if no, how can I also remove the elements from the DOM when calling “destroy”?
Yes, all markup generated by the plugin is removed and the element gets back to its original state (prior to plugin activation). The only thing left is the class “mCS_destroyed” on the element.
Check the following demo via browser’s dev tools to see in real-time DOM changes:
http://manos.malihu.gr/repository/custom-scrollbar/demo/examples/disable_destroy_example.html
Hi and many thanks for your plugin!
One more question, maybe somebody asked it before: could I keep the smooth scroll effect but preserving the browser scrollbar (I mean the default one)? I want to do this because of some aesthetic issues on my site (the stylized bar is hidden by fixed elments and I don’t like this too much).
Waiting for your answer!
Best regards,
Inno
Hi,
You cannot have browser’s native (default) scrollbar with custom scrollbar functionality.
If the scrollbar is “hidden” by some other fixed-positioned element you can change the scrollbar CSS (e.g. margins, position, height, z-index etc.) in jquery.mCustomScrollbar.css.
I don’t know your page’s layout, but if for example the top of the scrollbar is hidden by some other element, you could change its top position (line: 65) from zero to say 60 pixels:
.mCSB_scrollTools{ top: 60px; }
Thanks a lot for answering! 😉
WOW Awesome! Thanks a lot man. It’s wonderful. I wish I could buy you a bear. Really helpful. The web is getting more beautiful due to the presence of people like you. Once again thanks.
Hi! I’ve been using this for a horizontal scrollbar. There are some elements in there that I show/hide using JQuery show/hide/toggle. I have this in my code:
updateOnContentResize: true
But the scrollbars don’t seem to work properly with the hidden elemeents.
Setup 1: The elements are initially set to hidden by CSS, and I make them appear by clicking on a link
Results: The last few elements disappear from the container
Setup 2: I have JQuery hide the elements after the scrollbar has been initialized
Results: The scrollbar is too long, and there is a big empty space at the end of my container element
Any thoughts what could be happening?
Thank you so much 🙂
I got it to work by manually calling “update,” so all good now 🙂
Hi!
Thank you for your plugin, it’s awesome!
Can i add the chat of Spot.IM (www.spot.im) in a page with the custom content scroller?
And, if the answer is affermative, how?
Thank you! 🙂
Resolved!
With the callback and the onInit 😉
Hello thanks for very good plugin. Is there any way to load scrolling with predefined scrolling. scrolling to position after load casing jump when navigating to different pages. Or maybe can suggest where inside plugin i can scroll to position i need to (selected item ). So can avoid jump. I have div inside and i have content position so it is in his place us you see it (before plugin loaded )
content ….
$(“#scrolling_content-1”).css(‘overflow’, ‘auto’);
$(“#scrolling_content-1″).mCustomScrollbar({
scrollInertia:false,
scrollButtons:{enable:true},
theme:”3d-thick”
});
marginTop = $(“.s_left”).css(‘margin-top’);
$(“#scrolling_content-1”).mCustomScrollbar(‘scrollTo’,marginTop, {
scrollInertia:true
});
$(“.s_left”).css(‘margin-top’, 0);
Thanks you very match
<div id="scrolling_content-1" style="float: left;width: 122px;height: 300px;overflow: hidden;" > <div class="s_left" style="margin-top:3250px;" id="country_list_wrapper"> content .... </div> </div>
Hi,
You probably want to use setTop option parameter:
setTop: "-100px"
You could also set it via variable:
var marginTop=$(".s_left").css("margin-top"); setTop: -marginTop+"px"
or
var to=$("#target-element-id").position().top; setTop:-to+"px"
It look to me when i gave number greater then 1/2 size it reversing back. For example if size of scrolling 2000 px and i setTop to -1500 he make scroll to have like -500 but works good before 1/2 example -500 will gave -500.
If the height of your scrollable content is 2000 pixels, then the total scrolling value is not 2000px. It’s 2000px minus the height of the (container) element. For instance, if your element with the scrollbar is 500px, then the maximum scrolling is 1500px (2000-500).
When you set setTop to a value further than maximum scrolling, it’ll just scroll to the maximum (e.g. bottom).
You should also remember to set the “px” part in the value, e.g. “-1500px”. Maybe that’s why the “reversing” happened(?)
I figure out. It was my mistake. Sometimes very hard to find your own mistakes. Have to remove margins from inner div before initiating the plugin. Thank you very match.