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 56 57 58 59 60 85

  1. Fabrice
    Posted on January 13, 2015 at 00:40 Permalink

    Hi Malihu,

    For some reason my parameters don’t seem to apply, I wrote:

    $(window).load(function(){ $('.accordion_section_content').mCustomScrollbar({ scrollInertia: "0" }); });

    Scrollbar work, but inertia remains the same. Also if I do:

    $('.accordion_section_content').mCustomScrollbar({ scrollInertia: "0", autoHideScrollbar: true });

    … the autoHideScrollbar also doesn’t work. Any idea why?

    Reply
    • malihu
      Posted on January 13, 2015 at 01:26 Permalink

      Any chance you added the class “mCustomScrollbar” to “.accordion_section_content” manually? If yes, remove the class as it adds the scrollbar with the default parameters (as described in “Initialize via HTML” section guide).

      Reply
      • Fabrice
        Posted on January 13, 2015 at 13:04 Permalink

        Yes I did manually add the class to each of the elements where I want the scrollbar, because if I don’t then I get no scrollbar at all. Any idea where the problem stems from?

        Reply
        • malihu
          Posted on January 13, 2015 at 15:39 Permalink

          Do you get any console errors? Can you send me a link or code?

          Reply
          • Fabrice
            Posted on January 13, 2015 at 21:06 Permalink

            Oooh yeah I had:

            TypeError: $ is not a function $(window).load(function(){

            I replaced “$” with “jQuery” and now it works! Not sure how it somehow worked despite the error though.

            Thanks malihu.

  2. Neviton
    Posted on January 12, 2015 at 14:48 Permalink

    Hi Malihu,

    Should the scrollbar be auto-updated when the window height is increased?

    I’m playing with your scrollbar and when I resize the window, the height of the div element with id mCSB_1 is not updated.

    Do I have to manually call the scroll update?

    Reply
    • malihu
      Posted on January 12, 2015 at 17:23 Permalink

      Unless you’re using a very old version, the scrollbar updates itself by default. Have you set your elements height in percentages? Can you send me a link with your code?

      Reply
  3. Shichi
    Posted on January 12, 2015 at 00:07 Permalink

    Hi,

    First of all, I apologise for my poor English.

    Thanks for making such a great plugin.
    It’s been helping me a bunch but there’s a problem I can’t figure out by myself as I’m new to this.

    I’ll greatly appreciate it if you could help me out in your spare time.

    The problem I have is
    when I place scroll bar inside the main content or the wrapper so that it’s practically replacing the browser’s default scroll bar, scroll bar’s buttons won’t show even when I have scrollButtons option enabled. (It’s a vertical scroll bar)

    Also, is there a way to move the scrollTools position to the left?
    because right now, scrollbar has no gap between the edge of the browser window and the bar itself, and there’s a huge gap between the div box sitting at left side of the scroll bar and the scroll bar even though there’s no padding or margin set to the div.

    Everything else is working perfectly.

    Best regards

    S.

    Reply
    • malihu
      Posted on January 12, 2015 at 17:18 Permalink

      Hello,

      Can you make sure you have mCSB_buttons.png in the same directory as plugin’s CSS file? It’s the file holding the button arrow icons.

      The scrollbar markup is contained in .mCSB_scrollTools element and its position is defined in jquery.mCustomScrollbar.css. More specifically, vertical scrollbar position is set in line 65. Changing the right value from 0 to e.g. 20px will move scrollbar 20 pixels to the left.

      For further assistance I’d have to see your page (code or link).

      Reply
  4. Dave
    Posted on January 11, 2015 at 20:50 Permalink

    Hi. Thank you for your great work. I am a beginner and I was hoping you could help for a moment. I would like to be able to click a link and then make the scrollbar stop at a specific spot. Whenever I try to use an

    anchor with #certainlocation

    the bar always scrolls to top.

    Any example is appreciated. Thanks is advance.

    Dave

    Reply
    • malihu
      Posted on January 12, 2015 at 17:05 Permalink

      Hello,

      You’ll need to use plugin’s scrollTo method within a click event.

      For example, assuming your HTML link is the following:
      <a href="#my-element-id">Scroll to #my-element-id</a>
      you could add a script in your page like this:
      $("a[href*='#']").click(function(e){ e.preventDefault(); var target=$(this).attr("href"); $(selector).mCustomScrollbar("scrollTo", target); });

      Does this help?

      Edit: Note that selector should be the element you applied the scrollbar.

      Reply
      • Dave
        Posted on January 22, 2015 at 18:54 Permalink

        Yes thank you. It helped but I am still having some trouble. I want the target to be the value of the querystring item ABC…not sure how to do this:

        $(“a”).click(function(e){
        e.preventDefault();

        var target= $.QueryString[“ABC”];
        $(“.content”).mCustomScrollbar(“scrollTo”, target);
        });

        Thanks again.

        Reply
  5. Andreas
    Posted on January 11, 2015 at 16:45 Permalink

    Hi,

    thank you for your great work and your wonderful plugin.

    I’ve tried to implement it to my current project, and it works like a charm, except for one thing. When trying to “grab” the scrollbar with the mouse, the middle area of the scrollbar is not “grabbable”. I’ve uploaded a screenshot here:
    http://www.falkenbach-rpg.de/screenshot.jpg
    to show what i mean.

    I implemented the scrollbar using the following code:
    <div class="charsheetmidright mCustomScrollbar" data-mcs-theme="3d-dark" id="skillsheet">

    I’d be happy if you could help me out.

    Best regards
    Andreas

    Reply
    • malihu
      Posted on January 12, 2015 at 16:44 Permalink

      Hi,

      This is weird… Does this happen on any of the plugin demos/examples as well?
      Any chance an element with a “high” z-index value overlaps the scrollbar in your layout?
      Can you send me a link or some test HTML to check it?

      Reply
      • Andreas
        Posted on January 13, 2015 at 08:33 Permalink

        Yes, of course. Try this page:
        http://falkenbach-rpg.de/register.php

        While there are elements with higher z elements on the page, none of them should overlap the bar.

        Reply
        • malihu
          Posted on January 13, 2015 at 15:36 Permalink

          In your stylesheet.css in line 67 you have:
          div{ z-index: 2; }
          I don’t know why this rule is set but if you remove it fixes the issue.

          If for some reason you want to keep the above, you can specifically set the scrollbar dragger to a higher z-index like this:
          .mCustomScrollbar .mCSB_scrollTools .mCSB_dragger{ z-index: 3; }

          Reply
          • Andreas
            Posted on January 16, 2015 at 00:04 Permalink

            Thanks a lot! That did in fact save me. I like to give my elements a z value to ensure the layout stays the same throughout all browsers. the divs are the element with the actual content, so they usually have the highest z.

            Thanks again for doing so much support for your tool. i’ll not only consider, but i am honestly planing to donate a bit start of next month. Because you rock.

        • malihu
          Posted on January 16, 2015 at 00:41 Permalink

          Thank you 🙂
          I try to provide support as much as possible although sometimes I get overwhelmed!

          Reply
  6. matthew
    Posted on January 11, 2015 at 05:23 Permalink

    hi there, great work with this script! i’m very bad with javascript but you made this easy to understand.
    i’ve encountered a problem though- the script does not seem to work when max-height has a calc() value! why is this? when i set the max-height to a px value, the scrollbar appears, but when i set it back to the calc() value, the browser’s default scrollbar apepars instead.

    here is the code in question.
    #stats { position:absolute; max-height:calc(100% - 390px); width:290px; left:5px; bottom:15px; overflow:auto; font:12px consolas; }

    Reply
    • malihu
      Posted on January 12, 2015 at 16:37 Permalink

      Hello,

      The plugin currently does not support CSS calc() values for max-height. I’ll try to add support for it on the next version. Thanks for the feedback!

      Reply
  7. Anil
    Posted on January 10, 2015 at 06:24 Permalink

    hyy,

    how to set .mCSB_dragger offset custom value because i have issue in custom offset set…so plz do you know me how to set custom offset to .mCSB_dragger??

    Reply
    • malihu
      Posted on January 10, 2015 at 12:53 Permalink

      Can you send a screenshot of the offset you want?

      Reply
      • Anil
        Posted on January 10, 2015 at 13:09 Permalink

        How to send screenshot?

        Reply
      • Anil
        Posted on January 10, 2015 at 13:11 Permalink

        How to update scrollAmount in window resize ??

        Reply
      • Anil
        Posted on January 10, 2015 at 13:46 Permalink

        how to update scrollAmount on window resize?

        Reply
  8. Ric
    Posted on January 9, 2015 at 10:14 Permalink

    How can I change the colour of the dragger bar and dragger rail of the ’rounded-dark’ theme by giving my own custom theme name?

    For example, I want to do something like this but use the ’rounded-dark’ properties:
    $('.content').mCustomScrollbar({ theme:"my-theme", scrollButtons:{ enable:false } });

    Reply
    • malihu
      Posted on January 9, 2015 at 15:18 Permalink

      To create a new theme out of “rounded-dark” you can do the following:

      1. Open jquery.mCustomScrollbar.css.

      2. Find and copy .mCS-rounded-dark CSS rules to another stylesheet or style tag.

      3. Change “.mCS-rounded-dark” to “.mCS-my-theme” in all rules.

      4. Change the colors/backgrounds. For reference, these are defined in lines 705, 708, 710, 713 and 713 of jquery.mCustomScrollbar.css.

      Reply
  9. Karl
    Posted on January 8, 2015 at 20:57 Permalink

    Great work on this! Love everything about it!

    I got it working and had a quick question. I had previously defined a class for the divs that I am using these scrollbars on. I would like to define a set height and background (transback is what I was using). Should I just do it in the HTML or is there an area in the CSS that I can make these edits?

    Thanks again for an awesome piece of work!

    Reply
    • malihu
      Posted on January 9, 2015 at 01:53 Permalink

      You could do it in jquery.mCustomScrollbar.css but the best way is to do it on your HTML/CSS file, so you can easily update jquery.mCustomScrollbar.css to a newer version if needed.

      If you still like to edit jquery.mCustomScrollbar.css you can see the actual plugin markup in the following URL and edit the CSS rules accordingly:
      http://manos.malihu.gr/wp-content/uploads/2012/07/scrollbar_layout.png

      Reply
  10. nitin
    Posted on January 8, 2015 at 12:30 Permalink

    Hi,
    I am getting some weird behavior while writing for horizontal scroll (axis: “yx”).
    the size of horizontal scroll track and scroll bar is very small (approx 30px) its not expanding upto entire page body.
    The vertical scroll working properly in both cases, with/without horizontal scroll bar.

    Reply
    • malihu
      Posted on January 8, 2015 at 13:51 Permalink

      Can you send a link so I can check it?

      Reply
    • nitin
      Posted on January 8, 2015 at 15:14 Permalink

      its not deployed on any server…. I can send you the screen shot

      Reply
      • malihu
        Posted on January 8, 2015 at 15:33 Permalink

        Maybe you need to add a width value (e.g. width: 100%;) to your element (e.g. body)? Can you replicate the issue on a test page and send it to me via email?

        Reply
  11. yuvaraj
    Posted on January 8, 2015 at 10:13 Permalink

    i need a scroll bar that should appear only when the content exeeds some height the content comes into the box dynamically. the height of the div should not be fixed . three div oone below the other . box 1 , box2, box 3 ,
    scroll for all three shouls apper if content comes above heigh: 400px.

    the height of the box is not fixed . if there is only some content in box1 and no content in 2 and little in 3 . all 3 should appen one below other without fixed height for each

    Reply
    • malihu
      Posted on January 8, 2015 at 13:53 Permalink

      Give your elements a max-height value of 400px, e.g.:
      .box-1, .box-2, .box-3{ height: auto; max-height: 400px; }

      Reply
  12. Neeson
    Posted on January 6, 2015 at 09:21 Permalink

    Can I set the configuration via HTML tags?

    some thing like,

    <div " id="test" class="mCustomScrollbar" data-mcs-theme="dark-thick" data-mcs-scrollInertia="0" >

    because I want disable scrollInertia at beginning.

    Thanks

    Reply
    • malihu
      Posted on January 6, 2015 at 10:21 Permalink

      No. You can only change it via js:
      //when initializing $(selector).mCustomScrollbar({ scrollInertia:0 }); //after initialization $(selector).data("mCS").opt.scrollInertia=0;

      You may also set it to zero as the default value, e.g.:
      $(document).ready(function(){ $.mCustomScrollbar.defaults.scrollInertia=0; });

      What do you want to do?

      Reply
      • Neeson
        Posted on January 7, 2015 at 05:17 Permalink

        Thanks for the reply,

        nothing special for my request, previous I initialed the scroll bar via HTML tag, just want put them in the same style.

        By the way, there is a big gap between the context and the scroll bar by default, actually in my case I don’t want that gap, after study, seems overriding your css is the only way to remove it,

        .mCSB_inside > .mCSB_container{ margin-right: 0px; }

        is there an official way to remove it? or a parameter to disable the gap ‘issue’ while initialing?

        Many thanks.

        Reply
        • malihu
          Posted on January 7, 2015 at 06:49 Permalink

          No. I’ve left (almost) all scrollbar design to be done via CSS so the user can do whatever he likes without restrictions.

          One of the option parameters that might also work for what you need is scrollbarPosition

          Reply
  13. Joe
    Posted on January 5, 2015 at 22:40 Permalink

    Is it possible to *completely* disable to the easing when approaching the top or bottom of a mCustomScrollbar-enabled container? Thanks in advance.

    Reply
    • malihu
      Posted on January 6, 2015 at 05:26 Permalink

      You can access and modify the scrollInertia option value (which defines the scrolling animation easing) like this:
      //get scrollInertia (default value is 950) $(selector).data("mCS").opt.scrollInertia; //set scrollInertia to zero $(selector).data("mCS").opt.scrollInertia=0;

      Maybe you could you use the above inside onTotalScroll and onTotalScrollBack callbacks to do what you need?

      Reply
  14. Amit
    Posted on January 5, 2015 at 20:29 Permalink

    Hello Mailhu,

    Can you please help me to implement below requirement:

    When user try change the ordinal then the vertical scroll bar should also be in sink with the dragged form.

    Thanks
    Amit

    Reply
    • malihu
      Posted on January 6, 2015 at 05:01 Permalink

      Hello,

      I can’t really tell what you’re trying to do… Can you send me a link or code?

      Reply
  15. Denis GOUJON de BEAUVIVIER
    Posted on January 5, 2015 at 15:23 Permalink

    (translation)

    Hello,

    First of all, I beg you to excuse my english …

    Looking for a powerful CCS library to manage Scrollbar, I just discovered your achievement.
    Any congratulations, efficient, flexible code, and extremely functional, which I plan operation and integration in my WebAPI underway.
    However, I have a problem of implementation in a very specific context: scroll the contents of an iframe.

    In this iFrame, will be responsible different URL in the format “smartphone”. (Chooses a select user).
    A very variable navigation, according to pages, the scroll length should be regularly updated. (though I thought I see this update).

    However, there is the aspect of the problem, the scrollbar appears to target the iFrame itself, but not the content of the url loaded in the iFrame.
    Suddenly, the scroll does not really work, and its update is not performed when navigating within the mobile site displayed in the iFrame.

    In addition, it is essential to place a in the so that the scrollBar appears ??

    Well, I hope I was clear enough …
    Along href=”http://maquette.iqrterra.fr/malihuScrollbar/examples/exemple_iqr.html” here on the model link implementing the scrollbar along the iFrame .

    Thanking you in advance.

    Denis

    > ——————-

    (original)

    Bonjour,

    Tout d’abord, je vous prie de bien vouloir excuser mon anglais …

    Recherchant une bibliothèque CCS performante pour gérer les Scrollbar, je viens de découvrir votre réalisation.
    Toute mes félicitations, un code efficace, souple, et extrèmement fonctionnel, dont j’envisage son exploitation et intégration dans ma webAPI en cours.
    Cependant, je rencontre un problème d’implémentation dans un contexte bien spécifique : le scroll du contenu d’un iFrame.

    Dans cet iFrame, sera chargé différente url au format “smartphone”. (Choisit dans un select par l’utilisateur).
    Une navigation très variable, selon les pages, dont la longueur du scroll doit régulierement être mis à jour. (quoique j’ai cru constater cette mise à jour).

    Cependant, là est l’aspect du problème, le scrollbar semble cibler l’iFrame proprement dit, mais pas le contenu de l’url chargé dans l’iFrame.
    Du coup, le scroll ne fonctionne pas vraiment, et sa mise à jour n’est pas effectué lors de la navigation au sein du site mobile affiché dans l’iFrame.

    De plus, il faut impérativement placer une balise dans la afin que la scrollBar s’affiche ??

    Voilà, j’espère avoir été suffisamment explicite …
    Je joins ici le lien de la maquette implémentant le scrollbar en bordure de l’iFrame.

    Vous remerciant par avance.

    Denis

    Reply
    • malihu
      Posted on January 5, 2015 at 15:38 Permalink

      Hello,

      I think you should remove:
      #iframe-container iframe{ height: 100%; }
      from your CSS, as the iframe must have the (correct) height set in its attribute (416 pixels).

      Reply
      • GOUJON de BEAUVIVIER
        Posted on January 5, 2015 at 16:15 Permalink

        Re: Hello,

        Thank you for your quick response …

        I just deleted height of the iframe iframe id-container,
        but to no avail?

        The problem must come from elsewhere

        Thank you again to get involved as well.

        to be continued

        Denis

        >—–

        Re:Bonjour,

        Merci pour votre réponse rapide …

        Je viens de supprimer height de l’id iframe-container iframe,
        mais sans effet !?

        Le probleme doit venir d’ailleurs

        Merci encore de vous impliquer ainsi.

        A suivre

        Denis

        Reply
        • malihu
          Posted on January 5, 2015 at 18:16 Permalink

          You need to adjust the height of your #iframe-container element. Now it is 694px which is greater than the height (416px) of the iframe, so no scrollbar is needed/visible. Just change 694px to something less than 416px (e.g. 300px).

          Normally, you’ll also need to change the height attribute of your iframe element each time you load a new one.

          Reply
          • Goujon de Beauvivier
            Posted on January 5, 2015 at 20:47 Permalink

            Re:

            You mean there is no analysis of the height of the new page before it is displayed in the iframe.
            The code will have to calculate the height and update server side before the client side display?

            Also I see meet another security problem, to the extent the URL of my iFrame call the address of another domain, although hosted on the same server.
            (Unsafe JavaScript Attempt to access frame with URL http://www.tagiqr.fr/tagiqr/page_int2.php from frame with URL http://maquette.iqrterra.fr/malihuScrollbar/examples/exemple_iqr.html. Domains, protocols and ports must match.)

            Either I clone the mobile site code in an adjacent file, or I find a setting in my server to resolve the upstream security problem.

            I then would resume work setting ds scrollbar.

            Thank you very much

            Denis

        • malihu
          Posted on January 6, 2015 at 04:56 Permalink

          Yes. The custom scrollbar script cannot modify the content within an iframe from a parent document.
          Also when parent window and iframe are different domains, you’ll get a “Unsafe JavaScript Attempt”, meaning that mouse-wheel won’t work when hovering over the iframe (this is a browser security feature).

          Reply
  16. George P
    Posted on January 5, 2015 at 10:06 Permalink

    Hi,

    Firstly, thanks for this very nice plugin.

    I wanted to ask how can i change in the hover state the height of the scrollbar, but when I click it to drag it, the height should be at the default height. Do you have any ideas about that?

    Thanks in advance.

    Reply
    • malihu
      Posted on January 5, 2015 at 15:25 Permalink

      Hi,

      Do you mean the scrollbar dragger alone or the scrollbar dragger, rail, buttons etc.? On vertical or horizontal scrollbar?

      Changing scrollbar dragger’s height on vertical scrollbar would feel a bit weird and probably not user-friendly…

      Reply
  17. MarkInPDX
    Posted on January 3, 2015 at 17:13 Permalink

    Hello,

    I’ve just installed the latest version of your custom scrollbar (I had a version from way back that needed to be updated) but I’m having a problem with it. There seems to be a “no man’s land” in terms of content length where the dragger shows up (I have the drag rail set always show and the dragger set to a specific height) but it won’t scroll using the mouse. I can grab it with the mouse and drag it up and down, but that’s a crappy experience when for other content I can use the mouse. If I decrease content just enough, the dragger disappears properly and if I increase content just enough, then the scrolling works properly.

    Here’s the call that I make in my code:
    <script> (function($){ $(window).load(function(){ $(".scroll_left_side").mCustomScrollbar({ theme:"dark", alwaysShowScrollbar: 1, autoDraggerLength: false, autoHideScrollbar: false, scrollButtons:{ enable: 0 } }); }); })(jQuery); </script>

    Here’s the CSS for my scroll block:
    .scroll_left_side{ height: 450px; margin-top: -333px; margin-left: 40px; overflow: auto; width: 441px; font-family: verdana, arial, helvetica, sans-serif; font-size: 11px; color: grey; line-height: 16px; }

    And here’s the modification I made to jquery.mCustomScrollbar.css (at the very bottom of the file):
    I’ve tried removing these changes just to see if it matters and it doesn’t appear to. The same behavior occurs.
    #mCSB_1_scrollbar_vertical .mCSB_dragger{ height: 30px; width: 75%; margin-left: 2px; background-color: #fab751; background-color: rgba(250,183,81,0.75); -webkit-border-radius: 16px; -moz-border-radius: 16px; border-radius: 16px; } #mCSB_1_scrollbar_vertical .mCSB_dragger .mCSB_dragger_bar{ width: 1px; background-color: rgba(0,0,0,0.15); } #mCSB_2_scrollbar_vertical .mCSB_dragger{ height: 30px; width: 75%; margin-left: 2px; background-color: #fab751; background-color: rgba(250,183,81,0.75); -webkit-border-radius: 16px; -moz-border-radius: 16px; border-radius: 16px; } #mCSB_2_scrollbar_vertical .mCSB_dragger .mCSB_dragger_bar{ width: 1px; background-color: rgba(0,0,0,0.15); }

    Reply
    • malihu
      Posted on January 3, 2015 at 17:53 Permalink

      Hi,

      I just made a test page with your CSS and scrollbar options and didn’t get any issues. Can you send me by email your page(s)/files? This might be a CSS issue but I can’t be sure.

      Reply
      • MarkInPDX
        Posted on January 3, 2015 at 18:45 Permalink

        Sure. Here are some links:

        This works: http://www.echoflyfishing.com/2015/html/bios.php?bio_id=34&bio_type=prostaff
        This doesn’t: http://www.echoflyfishing.com/2015/html/bios.php?bio_id=47&bio_type=prostaff

        Same exact code, just different content.

        Another example:

        This works: http://www.echoflyfishing.com/2015/html/warranty.php
        This doesn’t: http://www.echoflyfishing.com/2015/html/about.php

        Again, exact same code but different amounts of content.

        Any help would be appreciated. Thanks!

        Reply
        • malihu
          Posted on January 3, 2015 at 20:36 Permalink

          Maybe I didn’t understand the issue you’re having but all links seem to work as expected.

          When content is not long enough (e.g. in both of your first links) scrollbar dragger is not visible and there’s nothing to scroll. Your second links (warranty.php and about.php) have long-enough content so scrollbar is visible and scrolling is working (via mousewheel, drag etc.).

          I’ve tested it with latest Chrome, Firefox and IE. Does this happen on a particular/other browser? Isn’t this the behavior you’re expecting?

          Reply
          • MarkInPDX
            Posted on January 3, 2015 at 20:47 Permalink

            For the first two links, the second link doesn’t scroll using the mouse. I have to drag the dragger. The first link works fine.

            Same with “about” vs. “warranty”. On the ABOUT page, I can’t scroll using a mouse. On the WARRANTY page, I can.

            I’ve tried Chrome, Firefox and Safari (I’m on a Mac Mini using OS X 10.10.1) and get the same results in all three browsers.

          • MarkInPDX
            Posted on January 3, 2015 at 20:56 Permalink

            FYI: I just tried it on my MacBook Air and MacBook Pro and got exactly the same results. First link works. Second link doesn’t.

        • malihu
          Posted on January 3, 2015 at 22:24 Permalink

          This must be an issue with magic mouse/macbook trackpad.

          I just tested the links on the following and scrolling works on all links:

          1. OSX 10.9/Safari 7 virtual machine with a “standard” mouse with wheel.

          2. iPad 2 (iOS 8.1.2).

          3. Windows laptop with trackpad.

          Can you try changing the values of either:
          mouseWheel:{ scrollAmount } mouseWheel:{ deltaFactor } mouseWheel:{ normalizeDelta }
          and see if results are different?

          Reply
          • MarkInPDX
            Posted on January 4, 2015 at 00:31 Permalink

            Awesome! That seems to have done the trick.

            Changed my call to the following:

            <script> (function($){ $(window).load(function(){ $(".scroll_left_side").mCustomScrollbar({ theme:"dark", alwaysShowScrollbar: 1, autoDraggerLength: false, scrollButtons:{ enable: 0 }, mouseWheel:{ scrollAmount: 150, deltaFactor: 150, normalizeDelta: 1 } }); }); })(jQuery); </script> <script> (function($){ $(window).load(function(){ $(".scroll_right_side").mCustomScrollbar({ theme:"dark", alwaysShowScrollbar: 1, autoDraggerLength: false, scrollButtons:{ enable: 0 }, mouseWheel:{ scrollAmount: 150, deltaFactor: 150, normalizeDelta: 1 } }); }); })(jQuery); </script>

            I also increased the size of the scroller container slightly and that seemed to resolve the problem with the draggers showing up for text that was right on the edge of being too large for the container.

            I’ll keep testing the rest of the pages now and see if I come across anything else. Thanks a lot for your help!

  18. hunter
    Posted on January 1, 2015 at 20:49 Permalink

    Hello,

    Thx for great work but when i used (‘html’).myCustomScroll…. this ‘local scroll’ function doesnt work:

    $(‘a.bind’).on(‘click’,function(){
    if (location.pathname.replace(/^\//,”) == this.pathname.replace(/^\//,”) && location.hostname == this.hostname) {
    var target = $(this.hash);
    target = target.length ? target : $(‘[name=’ + this.hash.slice(1) +’]’);
    if (target.length) {
    $(‘html,body’).animate({
    scrollTop: target.offset().top
    }, 1000);
    return false;
    }
    }
    });

    Can u tell me how to fix it ?

    Reply
    • malihu
      Posted on January 2, 2015 at 01:37 Permalink

      jQuery scrollTop() works only with browser’s native scrollbar.
      The plugin provides the scrollTo method which you can use to scroll to anywhere within your content (method guide and examples).

      Reply
      • hunter
        Posted on January 2, 2015 at 10:09 Permalink

        Thank you so much. U are the best due!!

        Reply
        • hunter
          Posted on January 2, 2015 at 10:19 Permalink

          Btw. 4 anyone who wants local_scroll with html custom scrollbar i used this function:

          function local_scroll(){
          $(‘a.bind’).on(‘click’,function(){
          var local_scroll = $(this).attr(‘href’);
          $(‘html’).mCustomScrollbar(“scrollTo”,local_scroll);
          return false;
          });
          }
          $(local_scroll).jQuery;

          Reply
  19. Max
    Posted on January 1, 2015 at 17:36 Permalink

    Hi,
    I am working on automatically updated content using mcustomscrollbar.
    However, when the content is too short and the scrollbars are removed, it is not scrolled to the top and some content becomes unreachable.
    The callbacks onUpdate or onOverflowYNone do not seem to work.
    I have a total of three of these boxes with different class names and configured individually.
    Thanks in advance,

    Max

    Reply
    • malihu
      Posted on January 1, 2015 at 17:59 Permalink

      Can you send me a link or your code? How do you update the content? Do you add/remove content from within .mCSB_container element?

      Reply
    • Max
      Posted on January 1, 2015 at 17:59 Permalink

      This is the main code btw:

      $(selector).mCustomScrollbar({
      theme: (G.is(theme) ? theme : “dark-3”),
      scrollInertia: 150,
      advanced:{
      updateOnContentResize: true,
      updateOnImageLoad: true,
      updateOnSelectorChange: true
      },
      callbacks:{
      onOverflowYNone: function() {
      console.log(“Vertical scrolling is not required”);
      },
      onScroll: function() {
      console.log(this.mcs.topPct);
      },
      onUpdate: function() {
      console.log(“update”);
      },
      onSelectorChange:function(){
      console.log(“Scrollbars updated”);
      }
      },
      live: true,
      scrollButtons:{
      enable: false
      }
      });

      I added this to restore the content when the scrollbars are removed, it is called every time the content is updated, but does not work great:

      setTimeout(function() {
      if($(‘.HomeAllergies .mCSB_scrollTools_vertical’).css(“display”)==”none”) {
      $(‘.HomeAllergies .mCSB_container’).css(“top”,”0px”);
      }
      }, 100);

      Reply
      • Max
        Posted on January 1, 2015 at 18:01 Permalink

        Yes, the content is placed in .mCSB_container, by the following code:

        if($(“.HomeAllergies .mCSB_container”).length) exists = ‘ .mCSB_container’;
        $(‘.HomeAllergies’+exists).html(content);

        Reply
      • malihu
        Posted on January 2, 2015 at 01:32 Permalink

        Can you remove the updateOnSelectorChange option (normally you don’t need it) and setTimeout function?

        Also, can you inspect your element with developer tools to see if a)you get any console errors and b)if there’s a CSS property causing your inner content not sticking to the top?

        Reply
        • Max
          Posted on January 4, 2015 at 13:41 Permalink

          There are no console error or ignored CSS for top fixation. The top position is defined in the element.
          I added those lines in an attempt to fix the error and the setTimeout sortof worked.
          After removing those lines again I now changed line 56 of the CSS to:
          .mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{ margin-right: 0; top: 0 !important; } /* non-visible scrollbar */

          and now it sticks to the top.
          Thanks for helping!

          Reply
  20. Sameer Ali
    Posted on January 1, 2015 at 10:47 Permalink

    Hi,
    I want to know how i can make it responsive for all devices. i have vertical scroller on my site, i want to make it horizontal on small screens. How i can?

    Reply
  21. Vangelis
    Posted on December 30, 2014 at 16:59 Permalink

    Hi,

    first off, excellent script! Congrats!

    My question is, can I place two horizontal scroll bars, one above the content to be scrolled and one below it?

    They would obviously need to be synced so that when you scroll one the other one is scrolled as well.

    There are cases where my content is too big in terms of height and placing two scroll bars would make it easier for the user to scroll whether they are at the top or the bottom of the page

    cheers

    Reply
    • malihu
      Posted on December 30, 2014 at 17:41 Permalink

      Hello and thanks for your comments,

      You cannot have 2 same axis scrollbars on a single element.

      The only solutions I can think of to help users with the long element are:

      a)Give your element a max-height and add both vertical and horizontal scrollbars on it.

      b)Have the normal horizontal scrollbar on bottom and create 2 additional buttons on top that will also scroll content horizontally using plugin’s scrollTo method.

      Reply
  22. Sanyam Kapoor
    Posted on December 26, 2014 at 13:24 Permalink

    Hey there,
    I added your scrollbar to a div with the following CSS:
    #div-for custom-scroll { position: relative; float: left; width: 92%; height: 100%; overflow-x: auto; overflow-y: hidden; }
    Configured the scolling using this code:
    $('#div-for-custom-scroll').mCustomScrollbar({ theme: "minimal", axis: "x" });

    While the scolling works perfectly, the size of the container is disturbed. Any ideas as to why this would happen?

    Reply
    • malihu
      Posted on December 26, 2014 at 13:28 Permalink

      Can’t really say. Can you send me a link?

      Reply
  23. nookie
    Posted on December 24, 2014 at 21:01 Permalink

    Hi!

    Thanx for an awesome script!
    I have 2 issues with the script. The first one when page loads it seems to show the entire content first quickly then hide it.
    It can be reproduced by refreshing the browser .

    Second issue.
    I can’t get the horizontal scroll to work. I have been trying for hours without success.

    Please help.

    The website can be found at: http://dev.cmok.ba/cm

    Cheerz

    Reply
    • malihu
      Posted on December 24, 2014 at 23:13 Permalink

      Hello,

      In your markup you probably need to set autoExpandHorizontalScroll to true. For example:
      $("#content-1").mCustomScrollbar({ scrollButtons:{enable:true}, axis: "x", theme:"rounded", setWidth: "100%", setHeight: "70px", scrollbarPosition: "outside" advanced:{ autoExpandHorizontalScroll: true } });

      To hide content while page is loading you should set your element’s CSS overflow property to either hidden or auto.

      Reply
  24. Fylux
    Posted on December 24, 2014 at 18:29 Permalink

    Hi, I want to detect when the scroll is near the end so I can start loading the pagination results before the user request for them.

    Greetings.

    Reply
    • malihu
      Posted on December 24, 2014 at 18:44 Permalink

      Hi,

      Using plugin’s callbacks you can get the scrolling position and call your own functions. Please see User-defined callbacks for more info.

      Reply
      • Fylux
        Posted on December 25, 2014 at 12:38 Permalink

        Ok, thank you very much.

        Greetings.

        Reply
  25. nishant
    Posted on December 24, 2014 at 09:23 Permalink

    how do i implement scroll bar with tablesorter with filter option

    Reply
    • malihu
      Posted on December 24, 2014 at 18:13 Permalink

      Please send more info, code and/or links to what you need to do, so I can provide help.

      Reply
  26. Peter
    Posted on December 24, 2014 at 03:37 Permalink

    hi.
    Am trying connect mCustomScrollbar with jQuery autocomplete.

    open: function(event, ui) { $(" .ui-autocomplete").mCustomScrollbar(); }

    I use code below and when I stat autocomplete first time is OK, but on second time I get default scrollbar.

    Can г help me?

    Reply
  27. Marrr
    Posted on December 23, 2014 at 19:48 Permalink

    Hi Malihu, I have a problem with a horizontal scroller.
    ONLY in windows phone 8/8.1 the scroller area not swipe left nor right unless using scrollbar (that’s not confortable) and also block the natural page scrolling so you can’t go up and down the page. you’ve noticed something like that before or someone have found a solution?

    on my mac, and my ipad all works right, on my wp8.1 phone it breaks.
    by the way, great script!

    Reply
    • malihu
      Posted on December 23, 2014 at 19:54 Permalink

      Yes this is a known issue with the latest version and will be fixed on next update (asap). In the meantime, you could test the previous plugin versions (e.g. 3.0.5 or 3.0.4) which should work on Windows Phone.

      Reply
      • Marrr
        Posted on December 24, 2014 at 21:39 Permalink

        Thanks, man.
        Very fast reply!

        Reply
      • Adam
        Posted on January 9, 2015 at 03:39 Permalink

        I was experiencing the same problem on my HP TouchSmart Laptop using:

        Windows 8
        IE 11
        Custom Scroll 3.0.7

        Reverting back to Custom Scroll 3.0.5 fixed the problem. When will a fix be available for this issue? Great plugin!!

        Reply
        • malihu
          Posted on January 9, 2015 at 04:00 Permalink

          Version 3.0.7 should not have this issue. Are you sure you weren’t using version 3.0.6?

          Reply
  28. Gabbostyle
    Posted on December 23, 2014 at 13:41 Permalink

    Hi,
    i would like to add some margin from scrollTo element and container top so it is not attached on the container top.

    Do you know how i can add it?

    Thanks in advance

    Reply
    • Gabbostyle
      Posted on December 23, 2014 at 14:02 Permalink

      Hi,
      i solved calculating the element offset top relative to their scroll container and adding a top distance in this way:

      var valueToScroll = $(ELEMENT).offset().top - $(SCROLL-CONTAINER).offset().top + DISTANCE(integer));

      I think that would be a good idea integrate your scrollTo function with an option to set a distance (left,right,top,bottom) to apply to the element.

      Regards

      G.

      Reply
  29. Paul
    Posted on December 22, 2014 at 09:23 Permalink

    Hi,
    I was wondering if it was possible to overlay the scroll buttons over the actual content – so basically I am looking for something like the “rounded-dots” theme, but the mcsb buttons would be centered over the content (top and button).

    Thanks a bunch for this wonderful plugin!

    Reply
    • malihu
      Posted on December 23, 2014 at 17:07 Permalink

      You can style your buttons however you like via CSS. For example you can do:
      .mCSB_buttonUp, .mCSB_buttonDown{ left: -200px; }
      or
      .mCSB_buttonUp, .mCSB_buttonDown{ margin-left: -200px; }

      You can add the CSS rules directly in jquery.mCustomScrollbar.css or overwrite the styling in another stylesheet, providing more specific selectors. For example:
      #my-element-id .mCSB_scrollTools_vertical .mCSB_buttonUp, #my-element-id .mCSB_scrollTools_vertical .mCSB_buttonDown{ left: -200px; }

      Reply
  30. shaban
    Posted on December 19, 2014 at 09:42 Permalink

    Hi,

    I am using this scroll bar in a web page, actually the web application is like pdf format , there are about three hundreds pages when i am at the very bottom its scroll the elements very fast is there any way to make them slow when it is at the bottom.

    I think there is any interval problem i am facing , i have used this plugin in various projects it is awesome but now i am having problem

    Thanks
    Shaban

    Reply
    • malihu
      Posted on December 19, 2014 at 16:05 Permalink

      Hi,
      Can you send me a link where such issue occurs?

      Reply

Comments pages: 1 56 57 58 59 60 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