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,627 Comments

Post a comment

Comments pages: 1 51 52 53 54 55 85

  1. Deathly
    Posted on September 23, 2014 at 22:39 Permalink

    Hello! Nice plugin! The only problem I have is that when I scroll div to its bottom on mobile devices with touch, the whole page doesnt start scrolling when I keep scrolling this div with touch… the same with the top of the div

    Reply
    • malihu
      Posted on September 24, 2014 at 01:40 Permalink

      Does this happen on the examples/demos included in the archive? I’m testing them in an iPad and they do scroll the page when bottom/top is reached. What device/OS have you used?

      Reply
      • Deathly
        Posted on September 24, 2014 at 03:20 Permalink

        It’s not working on any iOS and Android device (for example Lenovo K900 and Gooogle Chrome Mobile).
        I initialize in $(document).ready() like this: $(“#myId”).mCustomScrollbar(); (without any additional options). Not on mobile devices it works fine, when I reach the bottom or top of my div with mousewheel scrolling when cursor is inside my div, it starts to scroll the whole page.
        I’m using version: 2.8.3 of the plugin.

        Reply
        • malihu
          Posted on September 24, 2014 at 03:27 Permalink

          Ah I see. You need to use a newer version. If I remember correctly this is issue was fixed in version 3.0.0. If you download the latest version and replace the script and css files you should be ok (without needing any other changes).

          Reply
      • Deathly
        Posted on September 24, 2014 at 03:22 Permalink

        I can’t check the demos now. 🙂 Will try tomorrow at work.

        Reply
  2. bitelz
    Posted on September 23, 2014 at 12:56 Permalink

    Hi!

    Great plugin 😉
    I have only one problem with it…
    I want to scroll div’s content including its background.

    Is it possible ?

    Cheers

    Reply
    • malihu
      Posted on September 23, 2014 at 21:44 Permalink

      Sure. You’ll need to add the background on the .mCSB_container div (which is added by the plugin) that contains your actual content. For example, if you have a CSS like this:
      #myElement{ background: #000; }

      you should also add this rule:
      #myElement .mCSB_container{ background: #000; }

      Another way would be to add an additional div to your element that’ll have the background, e.g.:
      <div id="#myElement"> <div id="#myBackgroundElement"> <!-- your content... --> </div> </div>

      and call mCustomScrollbar function on #myElement as you’d normally do.

      Reply
  3. bharat
    Posted on September 23, 2014 at 12:26 Permalink

    Hi ,

    Is it possible to make work up/down navigation from external link buttons?

    plz answer…

    Reply
    • malihu
      Posted on September 23, 2014 at 21:51 Permalink

      You can do almost anything by using plugin’s scrollTo method (see Plugin methods for info). For example:
      $("a.down-button").click(function(e){ e.preventDefault(); $(selector).mCustomScrollbar("scrollTo","-="+100); });

      Reply
  4. George
    Posted on September 23, 2014 at 06:57 Permalink

    Great plugin. I have a problem though…

    I have a list of DIVs, which I made all into your scrollbar by calling $('div').mCustomScrollbar();. Each of the DIVs have their own IDs, such as #div1,#div2,#div3, etc.

    Essentially, I wanted to hide all of the DIVs in one call and show the appropriate one based on user selection.
    I’m doing this right now:

    $('div').css('display', 'none'); $('#div1').css('display', 'block');

    It seems that when hiding the DIVs, the display: none property gets propagated to all the mCustomScrollbar elements, but when I try to show them again, the display: block property does not propagate.

    Any solutions?

    Reply
    • malihu
      Posted on September 23, 2014 at 07:46 Permalink

      $('div').css('display', 'none'); will hide all divs as the selector is just ‘div’.
      $('#div1').css('display', 'block'); will show only the div with id: ‘div1’ as the selector is ‘#div1’.

      Using just ‘div’ as a jQuery selector is generally not good, because the entire document is usually made of divs. You should make your selector(s) more specific, e.g. ‘.container div’.

      If you want to use a single selector for hiding/showing divs, a better way is to give them an additional class, e.g. #div1.myClass, #div2.myClass, #div3.myClass etc. and toggle visibility like this:
      $('.myClass').css('display', 'none'); $('.myClass').css('display', 'block');

      Reply
  5. Rom
    Posted on September 22, 2014 at 16:00 Permalink

    Thanks for the previous answer !

    I have an other one

    I have a empty div.content at the start, so the scrollBar is hidden automaticly
    And when i add some text(with JS) in the .content, the scrollBar don’t appear

    How to appear scrollBar OR how to never hide this ?

    I tried :
    alwaysShowScrollbar: 1
    or
    autoHideScrollbar: true/false

    THANKS YOU !

    Reply
    • Matthias
      Posted on September 22, 2014 at 16:07 Permalink

      have you tried:

      $(selector).mCustomScrollbar(“update”);

      after you added the content via JS?

      Reply
    • malihu
      Posted on September 22, 2014 at 23:35 Permalink

      If mCustomScrollbar function is already called on the element, you should add new content in .mCSB_container which is inside your element (rather than directly inside the element itself). For example:
      $(".content").mCustomScrollbar(); $(".content .mCSB_container").append("...");

      Reply
      • Rom
        Posted on September 23, 2014 at 17:13 Permalink

        Okay thanks, it’s work

        Reply
  6. Matthias
    Posted on September 22, 2014 at 15:38 Permalink

    Hi,

    I got problems when I rotate the content including the scrollbar 180 degrees via CSS. The touchgestures react totally weird. It jumps all over the place. I can’t grab the grabber via touch anymore as well.

    Any suggestions to solve that issue? I already tried updating and inverting Scrollwheel.

    Thanks, Matthias

    Reply
    • malihu
      Posted on September 22, 2014 at 23:27 Permalink

      At the moment there’s no solution for this. CSS transformations like rotate alter completely a number of values (position, offset etc.) which are almost impossible to calculate correctly for all browsers.

      Scrollbar dragging could (somewhat) work via a modified script but I don’t know about content touch-swipe scrolling…

      My suggestion is to simply disable the scrollbar (e.g. $(selector).mCustomScrollbar("disable");) when content is rotated above 90 degrees, as I can’t see a situation where a user would want to scroll content that’s upside-down.

      Reply
      • Matthias
        Posted on September 23, 2014 at 10:48 Permalink

        Hey, thanks for your reply.

        The usecase is a large touchscreen embedded into a customerdesk where the customer stands on the “normal” side and the employee on the other side. Some informations on the site need to be rotated so that the employee can see all the details and scroll through it.

        So the buttons still work when rotated. That should be ok then. Do you see a way to disable swipe scrolling and touch in general for that case?

        But apart from that, this plugin is really easy to implement and it feels great! And big props for the huge and detailed documentation!

        Reply
        • Matthias
          Posted on September 23, 2014 at 11:44 Permalink

          ok contentTouchScroll disables the swipe gestures but the dragger can still be “touched”. This should be disabled as well.

          Any ideas?

          Reply
          • malihu
            Posted on September 24, 2014 at 01:48 Permalink

            You could just hide the dragger container in css:
            .mCSB_draggerContainer{ display: none; }
            and then show it again:
            .mCSB_draggerContainer{ display: block; }

  7. David
    Posted on September 22, 2014 at 11:06 Permalink

    Hi,

    thanks for this awesome script! Is there a way to include two horizontal, opposite scrollbars (below and above content-div)?

    Thanks for a short reply in advance.

    Best
    David

    Reply
    • malihu
      Posted on September 22, 2014 at 23:12 Permalink

      No, elements cannot have 2 horizontal scrollbars (same as browser’s native scrollbar).

      Reply
  8. Matjaz Jurecic
    Posted on September 19, 2014 at 13:16 Permalink

    Is there a callback for when the library is initialised or when rerendering is done?

    Reply
    • malihu
      Posted on September 19, 2014 at 18:25 Permalink

      Currently there’s no init callback but you can probably use the onOverflowY/onOverflowX that trigger when content becomes scrollable:
      $(selector).mCustomScrollbar({ callbacks:{ onOverflowY:function(){ console.log("done") } } });

      I’ll probably add an init callback on the next version though 😉

      Reply
    • malihu
      Posted on October 21, 2014 at 05:52 Permalink

      onInit callback added in version 3.0.5

      Reply
  9. heather
    Posted on September 19, 2014 at 00:41 Permalink

    so hi… great plugin… do love it and it works fine with fancy box which another did not. however, i am having a little problem. i have images in a scrolling div. the div has 100% height and 100% width. the image in the div has max-width and auto height so that when the containing div shrinks with the viewport, the image will size proportionately keeping it’s aspect ratio. the problem occurs when the image is just about small enough to clear the y-overflow and a little beyond that. at that point, the scrollbar starts to flicker in and out and won’t stop until you resize the window.

    the site is here: http:www.imagesrising.com/ir2013 go to portfolio and click on a long-thin sample and resize the window horizontally.

    i could fix this by having the scrollbars always showing, but i would rather not do that. any suggestions?

    thanks so much!
    heather…

    Reply
    • malihu
      Posted on September 19, 2014 at 01:21 Permalink

      This happens because by default, the scrollbar position is considered relative to content. This means that the actual content and scrollbar are “separated” by a fixed margin (see CSS line 54), which is removed (see CSS line 56) when scrollbar is not visible.

      You can either change the CSS (e.g. remove one of those 2 rules and/or add an opposite margin to center the image), or set the scrollbarPosition option parameter to “outside”:
      $(selector).mCustomScrollbar({ scrollbarPosition: "outside" });

      Since you’ll still need to somehow visually accommodate the scrollbar (and not just let it overlap the image), I suggest to simply edit plugin’s CSS and remove:
      margin-right: 0;
      from line 56, and add:
      margin-left: 20px;
      in line 54.

      Reply
      • heather
        Posted on September 19, 2014 at 03:09 Permalink

        thank you so much for your prompt reply!!

        Reply
  10. Rom
    Posted on September 18, 2014 at 18:17 Permalink

    Hey,

    How to change size(height) of draggerBar ?
    It’s too big when the content is too small

    .mCSB_dragger_bar{height:Xpx;} doesn’t work

    Thanks

    Reply
    • malihu
      Posted on September 18, 2014 at 19:41 Permalink

      By default, the scrollbar height changes the same way browser’s native scrollbar does (e.g. when content is too short, the scrollbar height is near 100%).

      To disable auto-adjusting scrollbar dragger length (the draggable element is the .mCSB_dragger), you need to set autoDraggerLength to false:
      $(selector).mCustomScrollbar({ autoDraggerLength: false });

      This will make the scrollbar have a fixed height which you can change in CSS (line 103):
      .mCSB_scrollTools .mCSB_dragger{ height: 30px; }

      Reply
  11. MD
    Posted on September 16, 2014 at 18:48 Permalink

    Hi, I want to pass the mousewheel event from an element to the custom scrollbar container.

    I tried something like this, but this is not working:

    $el.on(‘mousewheel DOMMouseScroll’, function (event) {
    var newEvent = $.Event(‘mousewheel’, {
    deltaY: event.deltaY,
    deltaFactor: event.deltaFactor,
    deltaX: event.deltaX,
    target: $scrollbox[0]
    });

    $scrollbox.trigger(newEvent);
    });

    Using $container.mCustomScrollbar(“scrollTo”, x) is not helping, I want to have a smooth scroll.

    Reply
  12. Mahadevan
    Posted on September 13, 2014 at 23:37 Permalink

    Hi,

    I have a query on horizontal scroll can I use div blocks instead of image for horizontal scroll.

    If you have any example kindly provide me the same.

    Because I tried it was not working.

    Eagerly waiting for your reply

    Mahadevan

    Reply
  13. Noel S
    Posted on September 12, 2014 at 09:48 Permalink

    A great plugin. thanks for the same :)..

    Just a small question. I didnt see any top or bottom arrows in the scroll bar. Tried changing some values in mCSB_buttonUp and buttondown but just couldnt get it. Keeping the scroll in the container with a fixed position has any effects?? Thanks in Advance

    Reply
    • Noel S
      Posted on September 12, 2014 at 10:21 Permalink

      I being a newb in a hurry overlooked some properties given above… Going through it in detail again(this time slowly) helped me out here…. Thanks for the detailed explanations dude…… Working like a charm,…. 🙂

      Reply
  14. Luis R Pacheco
    Posted on September 11, 2014 at 20:29 Permalink

    Hello, I have a little problem with this, in this site http://optisnte.mx/snte-relaciones-internacionales/
    (sorry it´s in Spanish).
    If you click ” Comunicación Internacional” you will see 3 tabs, they are set to work with this plugin, but for some reason, depending on the size of the screen it works on different tabs, let me try to explain, in the first tab it works on 15″ and bigger screens, and the second tab doesn´t. If I make the browser smaller then they switch, the first one doesn´t work and the second one does, and I can´t seem to find the issue.
    Any help would be greatly appreciated thank you

    Reply
    • malihu
      Posted on September 12, 2014 at 02:19 Permalink

      Hi,

      It seems you’re using an older version of the plugin (2.x), meaning that the scrollbar needs to be updated each time you change/click a tab.

      This can be done in 2 ways:

      1. Call the update method manually in your script where you change the tabs, for example:
      $(selector).mCustomScrollbar("update");

      2. Enable updateOnContentResize option parameter once when you initialize the scrollbar(s), e.g.:
      $(selector).mCustomScrollbar({ advanced:{ updateOnContentResize: true } });

      Reply
  15. Organic
    Posted on September 10, 2014 at 13:40 Permalink

    autoHideScrollbar: false doesn’t work with theme: "minimal"

    Reply
    • malihu
      Posted on September 10, 2014 at 18:25 Permalink

      Indeed. Some ready-to-use themes are “special” in the sense that they overwrite some options in order to function/appear as they do. “minimal” is such a theme as it’s made to look/feel like mobile OS native scrollbars do.

      You can always copy “minimal” theme’s CSS and make your own clone if you want.

      Reply
      • Organic
        Posted on September 16, 2014 at 15:01 Permalink

        Fair enough.

        How about being able to set autoHideScrollbar:true only after first interaction?

        I don’t want users to miss the scrollbar when they first see the content but I’d like to hide it after they’ve used it once.

        Thank you.

        Reply
        • malihu
          Posted on September 16, 2014 at 16:52 Permalink

          You can use the onScroll callback like this:
          $(selector).mCustomScrollbar({ theme:"minimal-dark", callbacks:{ onScroll:function(){ $(this).find(".mCSB_draggerContainer").css("display","none"); } } });

          Reply
          • Organic
            Posted on September 16, 2014 at 17:01 Permalink

            Thanks for the swift reply but that hides the scrollbar as you scroll for the first time!

            I’m sorry for not making it clear, I meant that I want the scrollbar behaviour to change to the autoHide behaviour after scrolling once and leaving the scrolling area.

            I was hoping there was a way of setting the property autoHideScrollbar: true after instantiation of the scrollbar.

            Note: I’m now using “light-3” as minimal was too subtle for our needs.

            Thank you.

        • malihu
          Posted on September 16, 2014 at 17:30 Permalink

          In this case you can do:
          var once=0; $(selector).mCustomScrollbar({ theme:"light-3", callbacks:{ onScroll:function(){ if(!once){ $(this) .addClass("mCS-autoHide") .data("mCS").opt.autoHideScrollbar=true; once=1; } } } });

          Reply
          • organic
            Posted on September 16, 2014 at 17:42 Permalink

            That did it, I only to fix a JS error by changing if(!once){ to if(once == undefined){

            Thanks a bunch for your help : )

      • Organic
        Posted on September 16, 2014 at 16:53 Permalink

        Btw, In the following setup:

        scrollButtons:{ enable: true, scrollAmount: 300, scrollType: "stepped"}

        scrollAmount appears to be ignored and snapAmount appears to be used instead for the stepped type of scrollButtons.

        Reply
  16. nilesh
    Posted on September 10, 2014 at 11:01 Permalink

    how can we apply this style to whole body of website…i want apply the same scrollbar style to all scrollbar in my website…how to do that? plz help

    Reply
    • malihu
      Posted on September 10, 2014 at 12:08 Permalink

      Add the class mCustomScrollbar to any element you want to add the scrollbar (including the body tag). This will apply the scrollbar with the default options.

      If you want to customize its settings, call mCustomScrollbar function on the element selector you want to add the scrollbar. For example, give your elements (including the body tag) the class my-custom-scrollbar and add/change your options via a script like:

      <script> (function($){ $(window).load(function(){ $(".my-custom-scrollbar").mCustomScrollbar({ theme:"dark" }); }); })(jQuery); </script>

      Reply
  17. Alpio
    Posted on September 9, 2014 at 20:32 Permalink

    Hi, i have this on my backbone view and it does not work all the times. It should catch the id of the element and then navigate to that pont. Sometimes it does, but sometimes i doesnt. Could you help me? My PM keep saying its the plugin fault.

    //this is the BB event

    events: {
    ‘click ol a’: ‘setScrollHash’,
    },

    //This are the BB methods

    setScrollHash: function (e) {
    e.preventDefault();
    this.scrollTo(e.target.getAttribute(‘href’));
    },

    scrollTo: function (hash) {
    if(hash) {
    this.body.mCustomScrollbar(‘scrollTo’, hash);
    } else {
    this.body.mCustomScrollbar(‘scrollTo’, ‘top’);
    }
    }

    //This is the HTML

    1.- Intro

    1.- Intro

    Reply
    • malihu
      Posted on September 10, 2014 at 12:18 Permalink

      My guess is that the script (sometimes) stops the scroll-to action as it hasn’t finish updating the scrollbar according to (new) content.

      I don’t know how you load your content or when the scrollbar is applied (on window load? on DOM ready?) but a solution might be to add a small timeout (delay) to your scrollTo method.

      If you’re using the latest version (3.0.4) you can change scrollTo method timeout via the timeout option, e.g.:
      $(selector).mCustomScrollbar('scrollTo', hash,{timeout:150});

      Reply
  18. Jose Romero
    Posted on September 9, 2014 at 14:49 Permalink

    Hi there,

    Congrats for the plugin, you really did a nice job.

    I just have a quick question. I used this on a webapp for touch screens, and the scroll works in all the container by sliding fingers up or down (on touch screens), and my question is for non touch screens, which have to click in the scrollbar to scroll the container, is there any way to click and slide in any part of the container and do the same behaviour (scroll) as if you were clicking in the scroll bar?

    Many thanks for your time, and hopefully you could help me to sort it out 🙂

    Regards,

    José

    Reply
    • malihu
      Posted on September 10, 2014 at 12:31 Permalink

      It would need a modified script. This behavior would of course prevent users from selecting text, fill forms etc. On non-touch screens, click’n’drag content with a cursor in order to scroll it would feel counter-productive or just awkward.

      I probably have a script modified to do this but I haven’t tested it to see if/how it would work along with actual touch-screens. Let me know if you want to send it to you.

      Reply
      • Jose Romero
        Posted on September 10, 2014 at 12:36 Permalink

        Hi malihu,

        Thanks for your reply. Yes I would like if you can send it to me.

        Actually, The container always content text but I added the rules in css in order to do not allow to select text, so people can’t copy it.

        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        -o-user-select: none;
        user-select: none;

        Looking forward to hearing from you,

        Regards

        Reply
  19. ลงประกาศฟรี
    Posted on September 8, 2014 at 13:01 Permalink

    Can we add previous and next button like this?
    or do you have any suggestion?

    $(“.previous”).click(function(e) {
    $(“#main-deck-box”).mCustomScrollbar(“scrollTo”,”-=”+100);
    return false;
    });

    $(“.next”).click(function(e) {
    $(“#main-deck-box”).mCustomScrollbar(“scrollTo”,”+=”+100);
    return false;
    });

    Reply
    • malihu
      Posted on September 8, 2014 at 13:59 Permalink

      Yes this would work

      Reply
  20. Arthur M.
    Posted on September 4, 2014 at 17:23 Permalink

    It’s the greatest plugin that I found!

    Congratz!

    Reply
  21. Lucaraid
    Posted on September 4, 2014 at 15:55 Permalink

    I did a chat which refreshes every second. I would like to have the position of the scrollbar. If the scrollbar is not on bottom i don’t wanna scroll the scrollbar to bottom. Otherwise i want. Is this possible to get the position?

    Reply
    • Lucaraid
      Posted on September 4, 2014 at 17:03 Permalink

      And do you know how to start at bottom. That means the start position of the scrollbar is the bottom.
      😀 thanks for your help

      Reply
      • malihu
        Posted on September 7, 2014 at 22:41 Permalink

        To start at the bottom you can either use the setTop option:
        $(selector).mCustomScrollbar({ setTop:"-9999px" });
        or the scrollTo right after plugin initialization:
        $(selector).mCustomScrollbar("scrollTo","bottom")

        Reply
    • Lucaraid
      Posted on September 6, 2014 at 16:46 Permalink

      malihu could you please help me?

      Reply
    • malihu
      Posted on September 7, 2014 at 22:57 Permalink

      You can get content position via the mcs object by invoking for instance an empty onScroll callback:
      $(selector).mCustomScrollbar({ callbacks:{ onScroll:function(){} } });

      Then in your script(s) you can get the top position and test if it’s at the bottom like this:
      var positionPercentage=$(selector)[0].mcs.topPct; if(positionPercentage===100){ console.log("content scrolled all the way to the bottom"); }else{ console.log("content is not at the bottom"); }

      Reply
      • Lucaraid
        Posted on September 8, 2014 at 14:41 Permalink

        Hey
        Thank’s for your help.
        If I do not scroll to the bottom in my script, everything works great. But when the script scrolls to the bottom, the console always say you are at the bottom. I think it is because i call the ajax every second to refresh the chat…
        I might refresh the chat every 3 second. Then the users would have 3 seconds to scrollup..
        Is there any other way to get the scrollbar position..?

        Thank you very much!
        Lucaraid

        Reply
        • malihu
          Posted on September 8, 2014 at 17:25 Permalink

          When you do the ajax call do you also scroll-to bottom in order to display the last message? For example:
          if(positionPercentage===100){ $(selector).mCustomScrollbar("scrollTo","bottom",{scrollInertia:0}); }

          Reply
          • Lucaraid
            Posted on September 9, 2014 at 08:50 Permalink

            Of Course, i will only to scroll to bottom if the user does not scroll . Because it’s dumb if you scroll the user to bottom and he scrolls to top.

            And when I scroll to bottom every second with your plugin:
            $(selector).mCustomScrollbar("scrollTo","bottom",{scrollInertia:0});
            There’s no time for the user to scroll up.

            I think i put now a checkbox on my site and when the checkbox is checked the div scrolls to bottom. Otherwise not.

            Thank you very much!

  22. Holger
    Posted on September 3, 2014 at 11:51 Permalink

    Thanks so much for this wonderful scroller!

    I have a little problem in the following situation:
    I have a and activate the scroller. Then I load via jquery .load new content to that div. After that just have the normal scrollbar. I tried to use .mCustomScrollbar(“update”) and also the live : “on” option with no result or errors. Where is the fault?

    Reply
    • malihu
      Posted on September 3, 2014 at 20:35 Permalink

      When you have already initialize the scrollbar, you must load your new content inside the .mCSB_container div (instead of directly inside your element). For example:
      $(".content").mCustomScrollbar(); $(".content .mCSB_container").append( /* your content... */ )

      Reply
      • Holger
        Posted on September 8, 2014 at 18:17 Permalink

        Thank you! Now it works perfect!

        Reply
      • Matthias
        Posted on September 11, 2014 at 08:20 Permalink

        Hi Malihu,

        thanks for the nice scrollbar:
        I hope you can help me with my little problem:

        I added the scrollbar in my content in index.php.
        The box and container works but i can´t activate the sroll button up or down . is it possible that you can explain me how i have to do this ??

        In jquery.mCustumScrollbar.js i already set the button on true….
        but i didnt´t work.

        Thanks for your answer

        Reply
        • malihu
          Posted on September 11, 2014 at 09:17 Permalink

          You enable scrolling buttons via the scrollButtons option like this:
          $(selector).mCustomScrollbar({ scrollButtons:{ enable: true } });

          If you already have this option set and the buttons don’t appear, make sure you have mCSB_buttons.png in plugin’s directory.

          Reply
  23. Matjaz Jurecic
    Posted on September 3, 2014 at 11:40 Permalink

    Hi, great plugin, works great.

    Currently I have a problem with this example http://jsfiddle.net/mato75/ztLhpf2g/5/.

    I am using it with angularjs and with angular-vs-repeat. This plugin seems to work with scrolling of the browser, so how do I tell the browser that I am scrolling and the position, so that this library will update its values.

    Reply
    • malihu
      Posted on September 3, 2014 at 21:30 Permalink

      You’ll need to use plugin’s callback options and get the scrolling position (among other values) from mcs object, e.g.:
      angular.element('#dd').mCustomScrollbar({ callbacks:{ whileScrolling:function(){ console.log(this.mcs.top); /* your function(s) here */ } } });

      See “User-defined callbacks” for more info on available callbacks and mcs object

      Reply
  24. Mirko
    Posted on September 2, 2014 at 17:16 Permalink

    Hi, I am using your plugin and it works great.
    I have this problem: I have a ‘container’ div (initialized with the scrollbar plugin) with some content.
    I’d like to know if there is a way to know whether a DIV with a given id inside the ‘container’ is visible to the user (that is, inside the viewport) or not (based on the scrolling of the container).
    Is there a way to know how much the ‘container’ has been scrolled? I didn’t see it in the documentation, or maybe I missed something. Thank you

    Reply
    • malihu
      Posted on September 2, 2014 at 20:57 Permalink

      Hi,

      You can do it by calling a custom function inside a plugin callback option. For example:
      $(selector).mCustomScrollbar({ callbacks:{ onScroll:function(){ if(isVisible("#id",this)){ //if #id is visible console.log("#id is visible"); //run your code } } } }); function isVisible(id,container){ var elem=$(id), scrollable=$(container).find(".mCSB_container"), pos=container.mcs.top+(elem.offset().top-scrollable.offset().top); return pos>=0 && pos<scrollable.parent().height()-elem.outerHeight(false); }

      The isVisible function above will return true only when #id is fully visible. To make it return true when #id is partially visible, change:
      return pos>=0 && pos<scrollable.parent().height()-elem.outerHeight(false);
      to:
      return pos>=-elem.outerHeight(false) && pos<scrollable.parent().height();

      Reply
      • Mirko
        Posted on September 8, 2014 at 12:11 Permalink

        Cool works great thx 🙂

        Reply
  25. Rick
    Posted on September 1, 2014 at 18:44 Permalink

    Hi,
    Awesome scroller – thanks for the effort you have put in!

    I have a problem – I am using the scroller around an ASPxCheckBoxList – When someone ticks an item I am calling an OnSelectedIndexChanged function in the code behind.

    This causes the scrollbar to return to the top of the list. Is there any way to stop this happening?

    Thank you.

    Reply
  26. OPcode
    Posted on September 1, 2014 at 16:05 Permalink

    Hello again.

    While I was trying to implement the showing of the dragger rail only when the mouse is over it and when the user drags the dragger bar with the mouse (not when the user scrolls the content with the mouse wheel so onScrollStart and onScroll cannot be used) I’ve stumbled upon a problem.
    I’ve attached one mousedown-callback to the dragger bar element and one mouseup-callback to the document. In mousedown-callback I add the specific class to the scrollbar’s root element and in mouseup-callback I remove this class. So this way it is easy to style the rail when I need it. In Chrome and Firefox everything is fine. But in IE (11) none of the callbacks fire for some reason. I understand that this is most probably browser-specific thing but maybe there are stopImmediatePropagation functions out there (blocking only IE11) that can be removed? Or maybe there’s some workaround for my problem?

    Reply
    • OPcode
      Posted on September 6, 2014 at 13:45 Permalink

      For those who encounters the same problem the culprit was jquery.mCustomScrollbar.js:1115. The thing is that that event handler first handles the ‘pointerdown’ event and e.preventDefault() in this case prevents the generation of ‘mousedown’ event.
      As of now the ‘pointerdown’ and ‘pointerup’ events are supported only by IE10/11 hence the problem was only observed in IE11 in my case.

      Reply
  27. Nico
    Posted on August 31, 2014 at 22:21 Permalink

    Hello,
    I’m trying your plugin inside a panel in asp.net Ajax.

    With each refresh of the panel is called the code to initialize the scroolbar.

    Unfortunately, I found that trying it on IE after refresh everything becomes a little slow. It should be a little better in firefox and chrome but even here after a while it all becomes very slow.

    I’ve seen other examples you’ve done with ajax panels but I have not found evidence.

    I also saw in debug that at every refresh the mCSB_ + index number continues to increase.

    Maybe not good in this circumstance, or I’m wrong code to initialize the scrool properly.

    Can you give me some advice?

    Thanks and great job.

    Reply
    • Nico
      Posted on September 1, 2014 at 19:26 Permalink

      Unsuccessfully tried $ (“. ViewThumbScrool”). MCustomScrollbar (“update”);

      Reply
      • Nico
        Posted on September 1, 2014 at 19:46 Permalink

        Wow! I studied still is the option I’ve seen live: true.
        I’m trying to say I know you if I can solve.

        Reply
        • Nico
          Posted on September 1, 2014 at 20:04 Permalink

          With the option “live: true” is performed correctly and every 500ms and the scroll bars are added correctly in IE but it is a disaster refresh after a few stops.

          It should be a little better in Firefox and Chrome but it all gets very very slow.

          🙁

          Reply
      • malihu
        Posted on September 1, 2014 at 21:11 Permalink

        Don’t know if this is a typo but the code is:
        $(".ViewThumbScrool").mCustomScrollbar("update");

        This will update the scrollbar when content length has changed. In plugin version 3.x this is not really needed as the script calls the method automatically when a content change is detected.

        The live option is used when you want to add scrollbar(s) automatically on elements that do not exist in your page (yet).

        Destroy method might also help if you’re removing/adding elements. For example, you should first destroy the element and then add it again:
        $(".ViewThumbScrool").mCustomScrollbar("destroy"); $(".ViewThumbScrool").mCustomScrollbar();

        I can’t really help though unless I see your implementation live. If you could send me link or code I’d be able to understand how your app works and provide more help.

        Reply
        • Nico
          Posted on September 2, 2014 at 10:58 Permalink

          The code for “update” as you said is a copying error.

          The live option works correctly, but practically IE crashes.

          I’ll see if I can send you an extract of code to replicate the problem.

          Thank you!

          Reply
          • Lucaraid
            Posted on September 3, 2014 at 16:41 Permalink

            I have the same problem what do you mean with live: true?

  28. Marc
    Posted on August 31, 2014 at 19:09 Permalink

    Really nice!
    I will love to use it in my website but how can I install it in cargocollective?

    Reply
  29. t0s
    Posted on August 30, 2014 at 19:37 Permalink

    Hi!

    Can I define callbacks after I used some methods?

    $('.content').mCustomScrollbar(“scrollTo”, "bottom"); $('.content').mCustomScrollbar({callbacks:{ onScroll: function() { console.log('scroll'); }});
    That code doesn’t work now.

    And another question: can I listening event of scroll appear, when i add content dynamicaly?

    Thank you!

    Reply
    • malihu
      Posted on August 31, 2014 at 20:06 Permalink

      The callbacks are defined when you initialize the scrollbar. You should define them first and they’ll work fine:
      $('.content').mCustomScrollbar({callbacks:{ onScroll: function() { console.log("scroll"); }}); $('.content').mCustomScrollbar("scrollTo", "bottom");

      Reply
  30. Sunil kumar
    Posted on August 30, 2014 at 17:29 Permalink

    hello sir,

    I have a reply button at bottom near scrollbar

    when I click on reply button a form shows and when I click to fill up field scrollbar automatically goest to top everytime.

    Reply
    • malihu
      Posted on August 30, 2014 at 17:46 Permalink

      Hello,

      This can be caused by some CSS property missing (e.g. floated elements not cleared or elements needing position:relative). If you can’t find/fix the CSS, you can disable autoScrollOnFocus option by setting it to false, e.g.:
      $(".content").mCustomScrollbar({ advanced:{ autoScrollOnFocus: false} });

      Reply

Comments pages: 1 51 52 53 54 55 85

Post a comment

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