This website uses cookies to personalise ads and to analyse traffic ok
web design

jQuery custom content scroller

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

When upgrading from version 2.x to 3.x it’s important to use version 3 CSS and .png files. Version 3 is backwards compatible but it’s also a huge overhaul. One significant change is that you don’t need to call the update method manually (the script does it automatically). For more info see changelog.

Version 2 is still maintained and updated here.


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).

Instead of hosting the plugin files on your web server, you can load them directly from a CDN like jsdelivr, Github etc.

  • jsdelivr versioned/minified
    • //cdn.jsdelivr.net/jquery.mcustomscrollbar/3.0.6/jquery.mCustomScrollbar.concat.min.js
    • //cdn.jsdelivr.net/jquery.mcustomscrollbar/3.0.6/jquery.mCustomScrollbar.min.css
    • //cdn.jsdelivr.net/jquery.mcustomscrollbar/3.0.6/mCSB_buttons.png
  • Github latest/minified
    • //malihu.github.io/custom-scrollbar/jquery.mCustomScrollbar.concat.min.js
    • //malihu.github.io/custom-scrollbar/jquery.mCustomScrollbar.min.css
    • //malihu.github.io/custom-scrollbar/mCSB_buttons.png


HTML

Include jquery.mCustomScrollbar.css in the head tag your HTML document (more info)

jquery.mCustomScrollbar.css contains the styling of the custom scrollbar and themes. It should normally be included in the head tag of your html (typically before any script tags). If you wish to reduce http requests and/or have all your website stylesheet in a single file, you should move/copy scrollbars styling in your main CSS document.

mCSB_buttons.png contains all the button arrows (up, down, left and right) as image sprites for all scrollbar themes. The plugin archive contains the PSD source (source-files/mCSB_buttons.psd) so you can change them or add your own. This file should be in the same directory with plugin stylesheet.


<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

Some frameworks and CMS include jQuery library in the head tag to make sure it’s loaded when other scripts request it. Usually, including .js files on the bottom of the HTML document (just before the closing body tag) is recommended for better performance. In any case, jQuery must be included first, before plugin scripts.


<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>

more info

The code is wrapped in (function($){ ... })(jQuery);. This ensures no conflict between jQuery and other libraries using $ shortcut (see Avoiding Conflicts with Other Libraries for more info). The plugin function is called in $(window).on("load") so it executes after all page elements (like images) are loaded.

You can change the function selector ".content" to any selector you want (an element id, class name, js variable etc.). For instance, if you want custom scrollbars to apply on the element with id content-1, you simply do:

$("#content-1").mCustomScrollbar();

You may also have multiple selectors by inserting comma separated values

$(".content,#content-1").mCustomScrollbar();

The above code adds custom scrollbars to a)every element with class name content and b)the element with id content-1.

Additionally, you may want to call mCustomScrollbar multiple times within a page in order to set different options (configuration and option parameters explained below) for each selector

<script>
  (function($){
    $(window).on("load",function(){
      $("#vertical-content").mCustomScrollbar({
        theme:"light-3",
        scrollButtons:{
          enable:true
        }
      });
      $("#horizontal-content").mCustomScrollbar({
        axis:"x",
        theme:"3d"
      });
    });
  })(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 scrollbar
  • axis: "yx" – vertical and horizontal scrollbars
scrollbarPosition: "string"
Set the position of scrollbar in relation to content.
Available values: "inside", "outside".
Setting scrollbarPosition: "inside" (default) makes scrollbar appear inside the element. Setting scrollbarPosition: "outside" makes scrollbar appear outside the element. Note that setting the value to "outside" requires your element (or parent elements) to have CSS position: 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 to 0 to disable.
autoDraggerLength: boolean
Enable or disable auto-adjusting scrollbar dragger length in relation to scrolling amount (same bahavior with browser’s native scrollbar).
Set autoDraggerLength: false when you want your scrollbar to (always) have a fixed size.
autoHideScrollbar: boolean
Enable or disable auto-hiding the scrollbar when inactive.
Setting autoHideScrollbar: 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 visible
  • alwaysShowScrollbar: 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.
Set axis: "y" (default) for vertical or axis: "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, set contentTouchScroll: 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 to true, content will expand horizontally to accommodate any floated/inline-block elements.
Setting its value to 2 (integer) forces the non scrollHeight/scrollWidth method. A value of 3 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, set autoScrollOnFocus: 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 be true (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 is auto which triggers the function only on "x" and "yx" axis (if needed).
The value should be true 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, setting updateOnSelectorChange: "ul li" will update scrollbars each time list-items inside the element are changed.
Setting the value to true, will update scrollbars each time any element is changed.
To disable (default) set to false.
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, setting onTotalScrollOffset: 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, setting onTotalScrollBackOffset: 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.
Set alwaysTriggerOffsets: 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.
Set live: 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, set live: "off" and "on" respectively.
You can also tell the script to disable live option after the first invocation by setting live: "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.

view examples

/* initialize plugin with auto-update options disabled */
$(selector).mCustomScrollbar({
  advanced:{
    updateOnContentResize: false,
    updateOnImageLoad: false
  }
});

/* at some point in your js script/code update scrollbar manually */
$(selector).mCustomScrollbar("update");

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"
  • integer
    • e.g. number of pixels: 100
  • [array]
    • e.g. different y/x position: [100,50]
  • object/function
    • e.g. jQuery object: $("#element-id")
    • e.g. js object: document.getelementbyid("element-id")
    • e.g. function: function(){ return 100; }

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

view examples

Scroll to element with id “#el-1″

$(selector).mCustomScrollbar("scrollTo","#el-1");

Scroll to top

$(selector).mCustomScrollbar("scrollTo","top");

Scroll by 100 pixels down or right

var val=100;
$(selector).mCustomScrollbar("scrollTo","-="+val);

Scroll by 100 pixels up or left

$(selector).mCustomScrollbar("scrollTo","+=100");

Scroll by 100 pixels down and by 50 pixels right

$(selector).mCustomScrollbar("scrollTo",["-=100","-=50"]);

Scroll to the fifth paragraph

$(selector).mCustomScrollbar("scrollTo",$("p:eq(4)"));

Scroll to the last element within your content

$(selector).mCustomScrollbar("scrollTo","last");

Scroll to some variable value

var val=document.getelementbyid("element-id");
$(selector).mCustomScrollbar("scrollTo",val);

Scroll to 300 pixels

$(selector).mCustomScrollbar("scrollTo",300);

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);

view examples

/* initialize plugin */
$(selector).mCustomScrollbar();

/* at some point in your js script/code disable scrollbar */
$(selector).mCustomScrollbar("disable");

/* re-enable scrollbar as needed */
$(selector).mCustomScrollbar("update");

destroy

Usage $(selector).mCustomScrollbar("destroy");

Calling destroy method will completely remove the custom scrollbar and return the element to its original state (demo).

view examples

/* initialize plugin */
$(selector).mCustomScrollbar();

/* at some point in your js script/code destroy scrollbar */
$(selector).mCustomScrollbar("destroy");

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"
});

View all ready-to-use themes

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; }

Custom scrollbar layout

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 starts
  • whileScrolling – triggers while scroll event is running
  • onScroll – triggers when a scroll event completes
  • onTotalScroll – triggers when content has scrolled all the way to bottom or right
  • onTotalScrollBack – 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).

The following will trigger the callback function when content has scrolled to bottom minus 100 pixels

$(".content").mCustomScrollbar({
    callbacks:{
        onTotalScroll:function(){
            console.log("scrolled to bottom");
        },
    onTotalScrollOffset:100
    }
});

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).

$(".content").mCustomScrollbar({
    callbacks:{
        onTotalScroll:function(){
            console.log("scrolled to bottom");
        },
    onTotalScrollOffset:100,
    alwaysTriggerOffsets:false
    }
});

Additional callbacks:

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 object
  • this.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 percentage
  • this.mcs.leftPct – content horizontal scrolling percentage
  • this.mcs.direction – content’s scrolling direction (y or x)

view examples

Load more content when scrolled to bottom

$(selector).mCustomScrollbar({
    callbacks:{
        onTotalScroll:function(){
            this.mcs.content.append("...");
        }
    }
});

Run code when at least half of the content is scrolled

$(selector).mCustomScrollbar({
    callbacks:{
        whileScrolling:function(){
            var pct=this.mcs.topPct;
            if(pct>=50){
              /* do something... */
            }
        }
    }
});

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

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

Pages: 1 2 3 4


5,630 Comments

Post a comment

Comments pages: 1 58 59 60 61 62 85

  1. Roma
    Posted on February 27, 2015 at 21:36 Permalink

    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)

    Reply
    • malihu
      Posted on February 27, 2015 at 23:00 Permalink

      Hello,

      Are you using version 3.0.6 and later? Is the custom scrollbar activated on element(s)?

      Reply
      • Roma
        Posted on February 28, 2015 at 10:34 Permalink

        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…

        Reply
  2. Alex
    Posted on February 27, 2015 at 19:13 Permalink

    Hello, is it possible for me to create a custom handle for this scroll bar? perhaps by just using an SVG?

    Reply
  3. J.C.
    Posted on February 26, 2015 at 14:21 Permalink

    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!

    Reply
  4. Ashot
    Posted on February 25, 2015 at 20:54 Permalink

    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.

    Reply
  5. Tim
    Posted on February 25, 2015 at 17:09 Permalink

    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!

    Reply
    • malihu
      Posted on February 25, 2015 at 17:20 Permalink

      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?

      Reply
  6. Trick Kramer
    Posted on February 25, 2015 at 00:03 Permalink

    How can you get this plugin to work with DataTables/Bootstrap 3?

    Reply
  7. Jeff
    Posted on February 23, 2015 at 15:48 Permalink

    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 ?

    Reply
    • Jeff
      Posted on February 23, 2015 at 15:50 Permalink

      Edit the HTML renderred worngly:

      <div class="container"><div class="scroll"> scrollable content </div> other content </div>

      Reply
    • malihu
      Posted on February 24, 2015 at 01:35 Permalink

      Does the .scroll element have a height value?

      Reply
      • Jeff
        Posted on February 24, 2015 at 10:25 Permalink

        Yes a max-height value

        Reply
      • Jeff
        Posted on February 24, 2015 at 10:58 Permalink

        Yes, a max-height:600px value

        Reply
        • malihu
          Posted on February 24, 2015 at 14:14 Permalink

          And does its content exceed the 600 pixels height so a scrollbar can be displayed?

          Reply
          • Jeff
            Posted on February 25, 2015 at 10:34 Permalink

            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

        • malihu
          Posted on February 25, 2015 at 14:18 Permalink

          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…

          Reply
  8. Sreadon
    Posted on February 22, 2015 at 22:47 Permalink

    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.

    Reply
    • malihu
      Posted on February 24, 2015 at 01:31 Permalink

      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

      Reply
      • Sreadon
        Posted on February 24, 2015 at 21:50 Permalink

        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.

        Reply
        • malihu
          Posted on February 25, 2015 at 00:03 Permalink

          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();

          Reply
          • Steven
            Posted on February 25, 2015 at 23:04 Permalink

            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.

  9. J.C.
    Posted on February 21, 2015 at 18:59 Permalink

    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!

    Reply
    • J.C.
      Posted on February 22, 2015 at 17:05 Permalink

      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. 🙂

      Reply
      • malihu
        Posted on February 24, 2015 at 01:22 Permalink

        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);

        Reply
  10. alitscha
    Posted on February 19, 2015 at 11:19 Permalink

    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!

    Reply
    • alitscha
      Posted on February 19, 2015 at 11:34 Permalink

      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.

      Reply
  11. طراحی سایت در تبریز
    Posted on February 19, 2015 at 10:36 Permalink

    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!

    Reply
  12. Richard
    Posted on February 19, 2015 at 01:34 Permalink

    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

    Reply
    • malihu
      Posted on February 19, 2015 at 02:09 Permalink

      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).

      Reply
      • Richard
        Posted on February 19, 2015 at 03:24 Permalink

        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!

        Reply
        • malihu
          Posted on February 19, 2015 at 04:44 Permalink

          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?

          Reply
  13. Ganesh Kunwar
    Posted on February 18, 2015 at 08:26 Permalink

    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.

    Reply
    • malihu
      Posted on February 18, 2015 at 08:33 Permalink

      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.

      Reply
      • Ganesh Kunwar
        Posted on February 18, 2015 at 08:35 Permalink

        There is no any error related to scrolling.

        Reply
      • Ganesh Kunwar
        Posted on February 18, 2015 at 08:39 Permalink

        Please send me your email address, I’ll send you problem detail with login credentials of my site.

        Reply
  14. Ciro
    Posted on February 17, 2015 at 19:15 Permalink

    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!

    Reply
    • malihu
      Posted on February 18, 2015 at 02:38 Permalink

      You’re welcome 🙂

      Your project looks awesome.
      Thanks a lot for your words, comments and the reference in the greetings!

      Reply
  15. Caroline
    Posted on February 17, 2015 at 18:47 Permalink

    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

    Reply
  16. Jason
    Posted on February 16, 2015 at 05:43 Permalink

    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!

    Reply
    • malihu
      Posted on February 16, 2015 at 09:37 Permalink

      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" });

      Reply
      • Jason
        Posted on February 17, 2015 at 07:22 Permalink

        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?

        Reply
        • malihu
          Posted on February 17, 2015 at 07:34 Permalink

          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).

          Reply
  17. Alexander Wright
    Posted on February 15, 2015 at 19:22 Permalink

    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

    Reply
    • malihu
      Posted on February 15, 2015 at 20:12 Permalink

      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; }

      Reply
      • Alexander Wright
        Posted on February 15, 2015 at 22:02 Permalink

        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

        Reply
        • malihu
          Posted on February 15, 2015 at 22:28 Permalink

          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?

          Reply
    • Alexander Wright
      Posted on February 15, 2015 at 20:55 Permalink

      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

      Reply
  18. jubw
    Posted on February 14, 2015 at 20:08 Permalink

    It’s working thanks 😉

    Reply
  19. jpbw
    Posted on February 14, 2015 at 04:40 Permalink

    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.

    Reply
    • malihu
      Posted on February 14, 2015 at 05:33 Permalink

      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');

      Reply
  20. Fran
    Posted on February 13, 2015 at 11:20 Permalink

    Hola,

    maravilloso aporte de este plugin.

    Gracias por la información, lo voy a probar ahora mismo.

    Reply
  21. jubw
    Posted on February 13, 2015 at 09:15 Permalink

    Btw, awesome plugin congrats 😉

    Reply
  22. jubw
    Posted on February 13, 2015 at 09:14 Permalink

    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?

    Reply
    • malihu
      Posted on February 13, 2015 at 11:20 Permalink

      Do you add the content directly inside the element with the scrollbar? Can you post your code where you add the content?

      Reply
  23. John
    Posted on February 12, 2015 at 22:55 Permalink

    God bless You and thanks

    Reply
  24. tarek
    Posted on February 11, 2015 at 13:57 Permalink

    Is it possible to use this plugin in conjunction with another one to show the related video of each thumbnail on click event?

    Reply
    • malihu
      Posted on February 11, 2015 at 17:46 Permalink

      Probably. If the other plugin works on overflowed elements with browser’s native scrollbar, it should also work with custom scrollbar.

      Reply
  25. Jv
    Posted on February 11, 2015 at 02:27 Permalink

    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”?

    Reply
  26. Inno
    Posted on February 6, 2015 at 17:14 Permalink

    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

    Reply
    • malihu
      Posted on February 7, 2015 at 16:27 Permalink

      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; }

      Reply
      • Inno
        Posted on February 12, 2015 at 08:47 Permalink

        Thanks a lot for answering! 😉

        Reply
  27. Abdul Jabbar Dumrai
    Posted on February 5, 2015 at 15:23 Permalink

    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.

    Reply
  28. Mela
    Posted on February 5, 2015 at 02:52 Permalink

    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 🙂

    Reply
    • Mela
      Posted on February 5, 2015 at 02:58 Permalink

      I got it to work by manually calling “update,” so all good now 🙂

      Reply
  29. Nikok
    Posted on February 4, 2015 at 13:16 Permalink

    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! 🙂

    Reply
    • Nikok
      Posted on February 4, 2015 at 13:49 Permalink

      Resolved!

      With the callback and the onInit 😉

      Reply
  30. Sems
    Posted on February 3, 2015 at 15:50 Permalink

    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

    Reply
    • Sems
      Posted on February 3, 2015 at 15:53 Permalink

      <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>

      Reply
    • malihu
      Posted on February 3, 2015 at 18:37 Permalink

      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"

      Reply
      • Sems
        Posted on February 3, 2015 at 21:52 Permalink

        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.

        Reply
        • malihu
          Posted on February 3, 2015 at 23:47 Permalink

          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(?)

          Reply
          • Sems
            Posted on February 4, 2015 at 00:52 Permalink

            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.

Comments pages: 1 58 59 60 61 62 85

Post a comment

Cancel reply

Your e-mail is never published nor shared. Required fields are marked *

You may use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
You can write or copy/paste code directly in your comment using the <code> tag:
<code>code here...</code>
You may also use the data-lang attribute to determine the code language like so:
<code data-lang-html>, <code data-lang-css>, <code data-lang-js> and <code data-lang-php>

css.php