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 21 22 23 24 25 85

  1. jologz
    Posted on November 7, 2012 at 16:46 Permalink

    Is there a way that when you highlight words and it gets to the bottom, the scrollbar will follow to the highlighted text? The only thing i can see is that i have to move the mousewheel down so i can highlight the rest of the words.

    Reply
    • malihu
      Posted on November 7, 2012 at 17:59 Permalink

      Not possible at the moment. I’ll examine if I can implement a solution for this. Thanks a lot for the feedback.

      Reply
  2. Shan
    Posted on November 7, 2012 at 12:49 Permalink

    Hi

    I want to link navigation to scrollers left and right from an external div, is this possible, tried giving same class but it does nothing? great plugin by the way!!!

    Reply
  3. Joachim
    Posted on November 7, 2012 at 10:35 Permalink

    Hello,
    Thanks a lot for this great Tutorial! But I just have a little problem.
    I just added the Scrollbar to the content of my Joomla Site.
    Now the scrollbar of the div where the content is placed has a new design.
    That’s perfect.

    But I can’t scroll or move it. When I sroll with the mousewheel, nothings happens. And when I try to move the scrollbar with my mouse – also nothing happens.

    Can you hellp me?

    Reply
    • Joachim
      Posted on November 7, 2012 at 12:36 Permalink

      I just found the solutions.
      Very easy -> jquery wasn’t embed correct …

      sorry

      Reply
      • malihu
        Posted on November 7, 2012 at 17:49 Permalink

        No problem. This is frequent when dealing with joompla, wordpress etc.

        Reply
  4. Dhoni
    Posted on November 7, 2012 at 00:23 Permalink

    I would like to add scroll bar to textarea.

    —- ….. —–

    and in my script block i am calling
    $(".styling").mCustomScrollbar({ scrollButtons:{ enable:false } });
    But my textarea is displaying blank, all content is hidden.
    I am making sure that if i am not calling script, data with scroll available

    Reply
    • malihu
      Posted on November 7, 2012 at 01:37 Permalink

      You cannot attach the scrollbar directly on a textarea (you cannot generate html inside a textarea). I have a demo of simulating a textarea with custom scrollbar by adding few functions and some additional markup:
      http://manos.malihu.gr/tuts/custom-scrollbar-plugin/textarea_example.html

      Reply
      • Dhoni
        Posted on November 18, 2012 at 21:40 Permalink

        This is awsome.
        This is working as expected. But there is a small issue.
        Scroll bar not adding as soon as we reach height of the textarea.

        Say for example height of textarea has some 8 lines, we need to type 9 lines, where as 9th line is not visible, until scrolls are added. Scrolls are adding only after you finish 9th line

        Reply
  5. jologz
    Posted on November 6, 2012 at 22:02 Permalink

    Malihu,

    First of all, very nice plugin. I have a simple question. The scrollbar doesn’t work with my sortable() table. When I grab an item, for example, “sub 1 1” and dragged it all the way down to “Main 11,” the scrollbar refuse to follow my dragged item. Hence, I can’t sort it all the way down because it doesn’t auto scroll. Have any ideas?

    Here is a sample code:
    <div id="main-div"> <ul id="main-ul"> <li class="main-li">Main 1 <ul class="sub-ul"> <li>sub 1 1</li> <li>sub 1 2</li> <li>sub 1 3</li> <li>sub 1 4</li> <li>sub 1 5</li> </ul></li> <li class="main-li">Main 2 <ul class="sub-ul"> <li>sub 2 1</li> <li>sub 2 2</li> <li>sub 2 3</li> <li>sub 2 4</li> <li>sub 2 5</li> <li>sub 2 6</li> </ul></li> <li class="main-li">Main 3 <ul class="sub-ul"> <li>sub 3 1</li> <li>sub 3 2</li> <li>sub 3 3</li> <li>sub 3 4</li> <li>sub 3 5</li> <li>sub 3 6</li> <li>sub 3 7</li> </ul></li> <li class="main-li">Main 4 <ul class="sub-ul"></ul></li> <li class="main-li">Main 5 <ul class="sub-ul"></ul></li> <li class="main-li">Main 6 <ul class="sub-ul"></ul></li> <li class="main-li">Main 7 <ul class="sub-ul"></ul></li> <li class="main-li">Main 8 <ul class="sub-ul"></ul></li> <li class="main-li">Main 9 <ul class="sub-ul"></ul></li> <li class="main-li">Main 10 <ul class="sub-ul"></ul></li> <li class="main-li">Main 11 <ul class="sub-ul"></ul></li> </ul> </div>

    Reply
    • jologz
      Posted on November 6, 2012 at 22:03 Permalink

      Here is the script:
      <script type="text/javascript"> $(document).ready(function () { // Sortables $('#main-div ul').sortable({ axis: 'y', dropOnEmpty: true, connectWith: '#main-div ul', containment: '#main-ul' }); // scrollbar $('#main-div').mCustomScrollbar(); }); </script>

      Reply
    • malihu
      Posted on November 7, 2012 at 17:56 Permalink

      Hello,

      jQuery UI scroll option will not simply work on js scrollbars. You’ll need to utilize some of the sortable events (e.g. sort, change etc.) so you can call scrollTo method when boundaries are reached (sortable api).

      I’ve made a quick demo with sortable content with custom scrollbar attached here (view source to see the extra functions and sortable events):
      http://manos.malihu.gr/tuts/custom-scrollbar-plugin/simple_example_sortable.html

      Reply
      • jologz
        Posted on November 14, 2012 at 18:55 Permalink

        thanks so much 🙂

        Reply
  6. Jennifer
    Posted on November 5, 2012 at 23:12 Permalink

    Hi. I am fascinated by your plug-in.

    I’ve been working on making a horizontal scroller that advances its “slides” on click. I would like to center each slide div within the visible portion of the scroller (940px). Right now I am getting the left offset of each slide and subtracting 110px to get the scrollto number, since all of my slides are 720px wide. This works nicely to center the slide — approximately. But I can’t get it perfect! The offset seems to vary by around ten pixels for each slide — I’m getting numbers anywhere between 725 and 715 for each slide, and not in any pattern that I can recognize.

    Can you help me understand this mystery? It’s the “Viewbook” section of my website.

    Thank you!

    Reply
    • Jennifer
      Posted on November 5, 2012 at 23:33 Permalink

      I’ve got the variance down to one pixel by changing this in the CSS:

      .mCSB_horizontal .mCSB_scrollTools .mCSB_buttonLeft+.mCSB_draggerContainer{
      padding-bottom:0;
      padding-right:20px;
      }

      to

      .mCSB_horizontal .mCSB_scrollTools .mCSB_buttonLeft+.mCSB_draggerContainer{
      padding-bottom:0;
      padding-right:0;
      }

      Now the dragger bar is slightly damaged but I think I can manage that separately. Maybe the one pixel variance is a rounding issue?

      Reply
  7. Mitchell Klijs
    Posted on November 5, 2012 at 20:49 Permalink

    I’ve always enjoyed this plugin uses. It works well, but with Windows 8 and Google Chrome does this not work anymore. I do not know why this is happening?

    Reply
    • malihu
      Posted on November 6, 2012 at 01:01 Permalink

      Are you using a touch-screen? Do you get any console errors in Chrome dev tools?

      Reply
      • Mitchell Klijs
        Posted on November 6, 2012 at 20:40 Permalink

        I’m not using a touchscreen, and I don’t get any error messages in the dev tools from Chrome. It is in both the normal desktop app and Windows 8 app

        Reply
        • malihu
          Posted on November 10, 2012 at 04:24 Permalink

          Hi again,
          Did some testing and indeed Chrome has touch events enabled by default (in Windows 8, even if no touch screen is present). I’ll add an additional check for touch devices and I’ll update the plugin soon.

          Reply
          • Mitchell Klijs
            Posted on November 10, 2012 at 20:12 Permalink

            Thank you very much! Could you please react on this comment when the plugin is updated?

        • malihu
          Posted on November 11, 2012 at 02:28 Permalink

          Sure, I’ll let you know.

          Reply
  8. easinewe
    Posted on November 5, 2012 at 04:40 Permalink

    I am using your script for a horizontal scroller. Is their a scrollTo method where the selected item is centered rather than scrolled to the left side.

    Here is how I am scrolling to a specific item in the list
    $(“.content”).mCustomScrollbar(“scrollTo”,”#george”);

    My scrollbar is 980 pixels wide so I need #george to be offset 490 pixels from the left side so it appears in the middle of the horizontal scroll.

    Works beautifully otherwise.

    Reply
    • easinewe
      Posted on November 6, 2012 at 20:03 Permalink

      Do you have some kind of offset function that can achieve this? Any help would be appreciated.

      Reply
  9. James
    Posted on November 4, 2012 at 20:19 Permalink

    First of all: Thank you very much!

    I looked a lot for scrolling plugins and yours was the only one I found that satisfied all my needs. There is of course one little flaw though and it is the same that Jon described in post 66. Except I’m experiencing this problem while using the mousewheel. The scrolling on the pages with a lot content is way too fast – or way too slow on the pages with not so much to scroll when I turn down the scrollingspeed via the mousewheel option. And to add an additional ‘scrollingspeed’-attribute to every article in my database is a way I’d like to avoid…

    Without the plugin the browser use to scroll a fix number of lines (or pixels, I don’t know, but it’s fix). I think that’s the behaviour people are used to. I hope its possible with your plugin to do that. The up- and down-buttons are adjustable to scroll a fix amount of pixels as well. (That is if you put the scrolltype to ‘pixels’. If you want continous scrolling you will have the problem Jon described.)

    So my question is: Can you think of any way to (quoting Jon) “fix the speed of the scrolling regardless of the content length?” Important for me is the mousewheel to work like that because I hide the scroll buttons anyway. Maybe I missed something in the configuration. If that’s the case please tell me. Otherwise I hope you can come up with a solution…

    Thanks for all your efforts, no matter what!

    James

    Writing this I come to think of a possible way: An algorithm considering the length of the content, which delivers an integer value (the mousewheel-scrollingspeed) shouldn’t be that difficult to work out. It wouldn’t be very accurate though with large images in the content because I can only think of a way to measure the html-content characterwise. – Well, I’m posting this anyway ’cause (while I keep trying) you hopefully come up with a faster and easier way to solve this…

    Reply
  10. Micky
    Posted on November 4, 2012 at 07:57 Permalink

    Is there any method to unbind or remove this plugin from an bound DOM element?

    Reply
  11. nAviD
    Posted on November 3, 2012 at 23:42 Permalink

    Hi Malihu

    Thank you for your great plugin !

    I have a problem . I want to put vertical scrollbar on left side of a div
    (direction =rtl )
    Is it possible ??

    Reply
    • James
      Posted on November 4, 2012 at 20:30 Permalink

      Hi, nAviD.

      Just change the ‘right: ?px’ in .mCustomScrollBox .mCSB_scrollTools in the css-file to ‘left: ?px;’. That should do it.

      Greetings
      James

      Reply
      • nAviD
        Posted on November 7, 2012 at 00:25 Permalink

        that worked !

        tnx so much

        Reply
  12. Gus White
    Posted on November 3, 2012 at 11:36 Permalink

    Hey Malihu,

    Really great plug in! Thank you! I have looked at a lot of plugins to do what I want and this one is so close but seems to be a small bug.

    I am having the same problem as mentioned in comment 72.

    I have created a responsive layout with a horizontal scrollbar full of images. Sometimes the last image drops down and creates a new row and will not fit into the last space in the scrollbar.

    Using Firebug if I make .mCSB_container larger by 1 pixel the image pops back into place. This behaviour does not happen at all the breakpoints. The breakpoint that it happens at changes depending on how many images I have.

    In the example below it is happening at the smallest breakpoint. Make the window less than 480px to see.

    http://guswhite.com/sandbox/jquery/scrollbar/

    This is happening in Firefox 16.0.2 (mac), Firefox 15.0.2 (windows), IE 9.0.8112. I have not tested in other versions of IE or in Opera yet. Perhaps this has something to do with how browsers round up or round down pixel values when elements with percentages are used?

    Webkit browsers are not affected. Any ideas on a workaround or solution?

    Thanks

    Reply
    • malihu
      Posted on November 3, 2012 at 13:49 Permalink

      You are correct. In Opera it works just fine. I checked it with its developer tools (Opera Dragonfly) and the computed width of one of your images is exactly 267 pixels. In Firefox Firebug, the same image has a computed width 267.25 pixels. That’s causing the problem. Firefox and IE do not round up pixels and the issue can happen at any random point.

      The only solution I can think right now is playing with your css percentage values/media queries so they yield integer pixel values.

      Reply
      • Gus White
        Posted on November 4, 2012 at 12:05 Permalink

        Unfortunately because the width of the images will always vary I don’t think changing the percentage/media query values will work in all cases (although I may be wrong about that)

        Would it work in my case to get the script to add a few extra pixels to the calculated width of the scrollbar after its performed its width calculations? Effectively increasing the width of the content area by a few pixels.

        Or would that just cause the images to fill that extra space and the same issue would remain?

        Reply
  13. Braian Mellor
    Posted on November 2, 2012 at 03:17 Permalink

    Awesome plugin.

    I have 2 problems.

    ——————————————————————-
    first:

    function changeEducacion(source) { $('#contenido_educacion').slideUp(800); setTimeout(function(){ $('#contenido_educacion').html("") $('#contenido_educacion').load(source); setTimeout(function(){$('#contenido_educacion').slideDown(800)},800); },800); }

    and what i load is kinda this

    <div class="noticias_noticia_individual"> <div id="noticias_noticia_individual_titulo"> <img src="images/educacion/001.jpg" height="100" width="151" alt=""/><span>Los 5 peores errores al comer</span> </div> <p> </p> </div>

    the problem is that i need to scroll #noticias_noticia_individual, but i can’t make the mCustomScrollbar on it.

    ———————————————————————————–

    Second:

    I’ve make a kind of file/documentation link box, with div inside div inside div.
    And actually it’s a bit extrange because the mCustomScrollbar does load, but doesnt show unless, for example, i’ve pressed a F12 key for inspect the web and then it shows, any idea??

    Reply
    • Braian Mellor
      Posted on November 19, 2012 at 15:29 Permalink

      Any Idea? i’m still having the problem!

      Reply
      • malihu
        Posted on November 19, 2012 at 16:42 Permalink

        Hello,
        The plugin does not support nested scrollbars (scrollbar inside another scrollbar). I can’t really say when/if this feature will be implemented.

        Reply
  14. Wilver
    Posted on November 1, 2012 at 19:53 Permalink

    how I can use CustomScroll with Tabs, if I take first tab but otherwise I can not as I do.

    Example
    <div class="tabs"> <ul> <li><a href="tabs-1">Tab 1</a></li> <li><a href="tabs-2">Tab 2</a></li> </ul> <div id="tabs-1" class="scrol"> Content.... </div> <div id="tabs-2" class="scrol"> Content.... </div> </div> <script> $(document).ready(function(){ $(".scrol").mCustomScrollbar(); }); </script>
    this is what I do but nothing else appears in the first tab

    I can do?

    Reply
  15. Shashikant
    Posted on November 1, 2012 at 13:02 Permalink

    Hi malihu,

    thank you very much for this amazing plugin , i am implementing it im my website,
    but my functionality is different, i want the scrolltools outside the container div , and of custom height width.
    how can i do this, help me please.
    thanks in advance.
    Shashikant

    Reply
    • malihu
      Posted on November 1, 2012 at 13:30 Permalink

      Hello Shashikant,

      You can change the height/width of the scrollbar directly from the CSS.

      It’s impossible for the scrollbar to be outside of the container (the plugin cannot know what the rest of your layout is). To have the scrollbar appear out of the container (design-wise), you can wrap your content in an additional div that you can style the way you like (e.g. give it a background) so the scrollbar “appears” out of the styled block.

      See this example:
      http://manos.malihu.gr/tuts/custom-scrollbar-plugin/design-test-scrollbar-outside.html

      Reply
      • Shashikant Giri
        Posted on November 5, 2012 at 14:56 Permalink

        Hi Malihu,

        Thank you very much for the immediate response, i did that , there is one more thing i want to clarify is – i have to load my images dynamically, currently i am doing it in the way that i am showing the images after loading all the images (recursively). but i want to do it in the way that i want to append every next images as soon as they load, and according to that the width should be change, please have a look at my site. (after load click on anyone of thumbnail). link is – mjd2.tekege.com

        Reply
  16. Katarzyna Jasik
    Posted on October 31, 2012 at 14:58 Permalink

    I have trouble incorporating your component into joomla – problem is that mCSB_scrollTools (when I check it in firebug) is grayed out – and display:none. So it doesn’t show up the scroller, but at least it limits the display area, but still I can’t scroll…like the whole functionality is off….any idea why such thing happens?

    I checked the .content display and it always shows, there is no hidden options anywhere…

    Outside of joomla it works beautifuly 🙂

    Reply
    • malihu
      Posted on November 1, 2012 at 12:39 Permalink

      Can you send me a link to check it online?

      Reply
      • Szatanica
        Posted on November 3, 2012 at 17:48 Permalink

        I’ts not online yet (we don’t have servers yet), but maybe I can send you the code via email..?

        Reply
  17. Mauricio Pereira
    Posted on October 29, 2012 at 17:33 Permalink

    Hi again,
    How can I load an imagem gallery inside “your” scrollable div?
    I’m using touchcarrousell for the image gallery, and if I insert the image gallery div normally in the page, it works fine, but if I load it into “your” srollbar div it doesn’t work.
    Can you please help me?
    Thanks

    Reply
    • malihu
      Posted on November 1, 2012 at 12:37 Permalink

      Hi,
      To load it programmatically into the element with custom scrollbar attached, you need to insert it into .mSCB_container div that resides inside the element (e.g. .content .mSCB_container).
      You can also try loading the gallery first and call the scrollbar function afterwards.

      Reply
  18. Mauricio Pereira
    Posted on October 29, 2012 at 14:17 Permalink

    Hi there,
    Great script.
    I’ve got a question:
    when loading a div with a image (with no height and width specified) for the first time the scrollbars doesn’t appear.
    they appear only after I refresh.
    it appears that because the script doesn’t know the size of the image it doesn’t put the scrollbars.
    the same happens if instead of image I place another div (with dynamic conten), with no size specified.
    I tried using the “update” method, but still doesn’t work.
    Is it necessary to specify the image size?
    I do not want to specify it because I want the site to be responsive.
    Can you please tell me what to do?
    Thanks in advance

    Reply
    • Mauricio Pereira
      Posted on October 29, 2012 at 17:32 Permalink

      Already solved this one.
      I didn’t read the documentation properly.
      Thanks anyway.
      But there’s another issue I came to that I think it’s not mentioned in the doc.
      How can I load an imagem gallery inside “your” scrollable div?
      I’m using touchcarrousell for the image gallery, and if I insert the image gallery div normally in the page, it works fine, but if I load it into “your” srollbar div it doesn’t work.
      Can you please help me?
      Thanks

      Reply
  19. JELLY
    Posted on October 29, 2012 at 02:54 Permalink

    Hi,

    great plugins.

    I am wondering if there is an option to automatically scroll text in container in loop, all the time, and when its mouse over the mCustomScrollBox text stop scrolling and it can be scrolled by scrollTools.

    Reply
  20. Marcel
    Posted on October 28, 2012 at 03:09 Permalink

    Hey! The plugin with the horizontal scrollbar and the update function works great for me, except two things:

    1. Using Safari 6.0.1 and the horizontal scroller on my macbook feels quite strange. Its hard to explain… Its pretty slow and sometimes it jumps around. A friend of mine has the same problem. Setting „mouseWheel:auto“ to the value „8“ helped, but its still lagging a little bit. Any suggestions?

    2. Using Firefox 13.0.1 sometimes the last image in the horizontal slider appears at the beginning of the slider in a 2. row! Seems like the content is to long for the slider so it breaks the content. The sliders stays with its height. The same page with safari 6.0.1 looks right.

    It would be awesome if you could help with this two problems!

    Thanks alot!

    Reply
  21. John
    Posted on October 26, 2012 at 07:33 Permalink

    hi

    I have tried several plugins that do parts of what I am looking for – yours seems to be very close , is it possible to have the horizontal scrollbar a different width to the content ‘viewport’, I need this to fit in with the design I am using – I can see that in the version 1, you have done this on the vertical scroll bar on the demo page, although I cant see how in the customisation information

    So for example the content viewer is 1000px wide, the scrollbar is below, aligned to the left but 900 px wide.

    thanks in advance,

    John

    Reply
    • malihu
      Posted on October 26, 2012 at 10:09 Permalink

      Yes, you can style the scrollbar exactly as you like via the CSS file. See comment 57 for a similar example.

      Reply
      • john
        Posted on October 26, 2012 at 17:51 Permalink

        hi

        i saw that yesterday after i posted the question, and although that method works, i was trying to change the width of the css container via jquery. I am making a fluid layout loading galleries via xml, so i need to

        1. change the number of images inside the content box

        2. alter the length of the scrollbar

        i found that although I can get the bar to display at the length i want – it does not correspond to the scroll distance of the content

        does any of that make sense? and does it sound possible or not – I tried a different plugin – tiny scroller – which worked great but it does not have any inertia attached to it which i ideally want

        Reply
      • john
        Posted on October 26, 2012 at 17:52 Permalink

        sorry to add – i am trying to alter the length of the scrollbar dynamically using jquery

        Reply
      • john
        Posted on October 28, 2012 at 06:07 Permalink

        hi

        I had a play, and read all of your notes – it all seeems to be fine – it is important that if you are altering anything to use the ‘update’ function after each alteration.

        thanks for making this available

        Reply
  22. João Luís
    Posted on October 26, 2012 at 02:55 Permalink

    Hi,

    I’m developing a chat and your scroll plugin was the best choice!

    I want to implement a thing and I don’t know how to do it. When the window loads new chats, the scroll should update (already done this!) and scroll to the bottom (already done this too), but ONLY should scroll if the user is already at the bottom (in this case, the “previous” bottom, as it was updated).

    Can you help me?

    Thanks in advance!

    Reply
    • João Luís
      Posted on October 26, 2012 at 10:37 Permalink

      tl;dr: Is there a way to know if the user is at the bottom of the container?

      Reply
  23. Vagabras
    Posted on October 26, 2012 at 01:22 Permalink

    Love this plugin!!! Spent hours looking for this and then a few more having to do some backwards engineering to get it to work. Before I spend any more time customizing a few questions:

    1- Is there an option to have the scrollbar appear on the left side of the

    2- Can the rail be set to a specific size as to not look like a divider

    Reply
    • malihu
      Posted on October 26, 2012 at 10:20 Permalink

      You can style your scrollbar exactly as you like via CSS (no need for options). Scrollbar markup (dragger bar, rail etc.) resides in the .mCSB_scrollTools div (see .mCSB_scrollTools and .mCSB_draggerRail in jquery.mCustomScrollbar.css for what you need).

      Reply
      • Vagabras
        Posted on November 2, 2012 at 07:24 Permalink

        Thanks for the response. I have the color and size of the scrollbar figured out but I still can’t get it on the left side of the div. Suggestions

        Reply
        • malihu
          Posted on November 2, 2012 at 12:14 Permalink

          All scrollbar markup resides in the .mCSB_scrollTools div. In the CSS, you can change its position to where you need (e.g. left):
          .mCustomScrollBox .mCSB_scrollTools{ width:16px; height:100%; top:0; left:0; }

          You also might want to give .mCSB_container a left margin (instead of right), as your scrollbar will be on the left side (1st and 2nd selectors in jquery.mCustomScrollbar.css):
          .mCSB_container{ width:auto; margin-left:30px; overflow:hidden; } .mCSB_container.mCS_no_scrollbar{ margin-left:0; }

          Reply
  24. Anouk
    Posted on October 25, 2012 at 18:36 Permalink

    hello / help!

    i am using the expositio theme.
    i have tried everything to implement jQuery custom content scroller in the sidebar but it just won’t work…
    help!
    is expositio the problem or something i have missed…?
    no idea what i should do next to get this scroller in my sidebar!
    thank you in advance

    anouk

    Reply
  25. eric
    Posted on October 25, 2012 at 17:28 Permalink

    Dosen’t work with jquery UI 1.9, returns object as an error.

    Reply
  26. Jon
    Posted on October 25, 2012 at 17:09 Permalink

    Thanks for a fantastic script.

    One problem I’m having though is that the scroll speed and amount when using the scroll buttons is dependant on the on the content size. That is, when the content is only just long enough to require a scrollbar, the scroll buttons scroll very slowly. When there is a very large amount of content, the scroll buttons scroll the content very quickly for the same settings.

    Is there a way to prevent this behaviour and fix the speed of the scrolling regardless of the content length?

    Thanks in advance.

    Reply
  27. Giant
    Posted on October 25, 2012 at 04:31 Permalink

    Hey there,

    Gotta say am loving your plugin, however I’ve sort of ran into a pretty annoying issue in IE7…

    It seems that your scrollbar doesn’t scale correctly, and instead becomes higher then actual parent. However this seems to only occur when the scroll up/right/down/left buttons are shown. Without these, it seems to work just fine. It seems to me that in IE7 the “button height” calculations aren’t totally succeeding… And the scroll bar itself also hover slightly away from the actual bar, though that should be quite easily fixed with CSS!

    In case you don’t want to bother fixing your plugin up for IE7, no worries, it’s not really that much of an issue, could just show the default (ugly…) scrollbar to the 14% of users still on IE7… 🙂

    Reply
    • Giant
      Posted on October 25, 2012 at 05:26 Permalink

      Never mind, just sort of found a fix for it! 🙂

      Note: The code IS optimized for the vertical scrollbar! For a horizontal scrollbar you would have to use width instead of height.

      By changing line 70 in jQuery.mCustomScrollbar.js from
      mCSB_container.after("<div class='mCSB_scrollTools' style='position:absolute;'><div class='mCSB_draggerContainer' style='position:relative;'><div class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>");
      to
      if (navigator.appVersion.indexOf("MSIE 7.") != -1) { mCSB_container.after("<div class='mCSB_scrollTools' style='position:absolute; height: 88%;'><div class='mCSB_draggerContainer' style='position:relative;'><div class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>"); }else{ mCSB_container.after("<div class='mCSB_scrollTools' style='position:absolute;'><div class='mCSB_draggerContainer' style='position:relative;'><div class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>"); }

      We can catch about 80% of the miss sizing. However, this still isn’t good enough. As when the window resizes the percentages start to differ, which causes the scrollbar to sometimes grow too small, or too big. Therefore a little more user code is required to get it to fully function. What this code does is pretty much get the parent height, subtract 40px from that height (Although, this would most likely be dependant on the buttons used!), and set the height back to .mCSB_scrollTools.

      function resize() { if (navigator.appVersion.indexOf("MSIE 7.") != -1) { $('.mCSB_scrollTools').each(function() { $(this).height($(this).parent().height() - 40); }); } } $(document).ready(function() { resize(); }); $(window).resize(function() { resize(); });

      Using this I so far have been able to catch 100% of the resize issues. I have also attempted to just use the user code without ever touching the jQuery.mCustomScrollbar.js, however this turned out to cause a weird glitch where the scrollbar could go above the actual scroll height, and become uncapable of moving down again. Therefore essentially breaking the scrollbar…

      As to the CSS issue, that is a bit more tricky, as a horizontal scrollbar lies about 7px below the actual assigned position, where as a vertical scrollbar is about 7px right of the actual assigned position. However as I only require the vertical scrollbar, I have not decided to also make it compatible to the horizontal version!
      <!--[if IE 7]> <style type="text/css" media="screen"> .mCSB_scrollTools .mCSB_dragger { margin-left: -7px; } </style> <![endif]-->

      Reply
      • malihu
        Posted on October 25, 2012 at 08:50 Permalink

        Hello and thanks a lot for taking the time to post your solution 🙂

        The issue on ie7 is basically not supporting the CSS box-sizing property. When creating the plugin, I just checked that the actual script did work on ie7 but I didn’t really bother adding extra CSS to make it scale correctly on fluid scrollbars with buttons.

        If you want to try, I think there might be a CSS only solution (haven’t tested it on ie7):
        .mCSB_scrollTools .mCSB_buttonUp+.mCSB_draggerContainer{ position:absolute !important; height:auto; top:0; bottom:0; right:0; margin:20px 0; width:100%; padding-bottom:0; } .mCSB_scrollTools .mCSB_buttonUp, .mCSB_scrollTools .mCSB_buttonDown{ height:20px; width:16px; overflow:hidden; margin:0 auto; cursor:pointer; position:absolute !important; } .mCSB_scrollTools .mCSB_buttonDown{ top:100%; margin-top:-20px; }

        The above is for vertical scrollbars and you can try the same for horizontal ones.

        Reply
  28. Nevin
    Posted on October 23, 2012 at 01:19 Permalink

    Hey Malihu,

    Can you use the update and scroll to methods on the same click event? If so, how?

    Thanks!

    Reply
    • malihu
      Posted on October 23, 2012 at 02:12 Permalink

      $("#your-link").click(function(e){ e.preventDefault(); var theContent=$(".content"); /* do some stuff here... */ theContent.mCustomScrollbar("update"); theContent.mCustomScrollbar("scrollTo",bottom); });

      Something like this?

      Reply
  29. TJ Sherrill
    Posted on October 22, 2012 at 22:14 Permalink

    I have setup the scroller and it works great except the content doesn’t scroll. the page using the scroller is http://loretta.ravennainteractive.com/about-loretta-soffe-consulting/background/ . I have checked it in mulitple browsers and its the same issue. Is there a normal issue here where thats something easy to fix?

    thanks, and great plugin!

    Reply
    • malihu
      Posted on October 23, 2012 at 02:08 Permalink

      You’re loading jQuery library twice (in head and body). Try removing the last one and/or check the custom jQuery and jQuery UI files you’re loading have the necessary components.

      Reply
  30. Matt
    Posted on October 22, 2012 at 18:04 Permalink

    Hello again!

    I have installed v2.x on my website and it works great in most browsers. I am finding however in Google Chrome the dragger bar fills most of the rail and so I cannot scroll all of my content.

    If I hit enter in the URL bar a second time the dragger bar re-sizes to the correct size and I can scroll down through all my content like on the other browers! Any idea why this might be happening?

    p.s I also note the same behavior in Safari for windows.

    Kind regards and thanks,

    Matt

    Reply
    • malihu
      Posted on October 22, 2012 at 18:10 Permalink

      The content probably hasn’t loaded completely when scrollbar is applied. Try calling mCustomScrollbar function on window load instead of document ready (see “How to use it”) or set updateOnContentResize option parameter to true (see “Configuration”).

      Reply

Comments pages: 1 21 22 23 24 25 85

Post a comment

Cancel reply

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

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

css.php