add files

This commit is contained in:
Andrey Kuvshinov
2025-07-09 21:21:17 +03:00
commit 8fc8cbae32
596 changed files with 207566 additions and 0 deletions

View File

@@ -0,0 +1,812 @@
<!DOCTYPE html>
<html>
<head>
<title>jQuery Advanced Scrollbar Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="../includes/style.css" />
<link rel="stylesheet" href="../includes/prettify/prettify.css" />
<link rel="stylesheet" href="../jquery.scrollbar.css" />
<script src="../includes/prettify/prettify.js"></script>
<script src="../includes/jquery.js"></script>
<script src="../jquery.scrollbar.js"></script>
<script>
jQuery(function($){
function getAlignedText(text){
text = text.split('\n');
while(text.length > 0 && $.trim(text[0]) == ''){
text.shift();
}
var tabs = (text[0] || '').replace(/^(\s+).+$/, '$1');
for(var i=0; i<text.length; i++){
text[i] = text[i].replace(tabs, '');
}
if(text.length > 0 && text[text.length - 1].match(/^\s*$/)){
text.pop();
}
return text.join('\n');
}
$('.container').each(function(){
var content = $(this).find('.content');
var controls = $(this).find('.controls');
$('<pre></pre>').addClass('prettyprint linenums lang-html').text(getAlignedText(content.find('.demo').html())).appendTo(content.find('.html'));
$('<pre></pre>').addClass('prettyprint linenums lang-css').text(getAlignedText($('#css-common').html()) + "\n" + getAlignedText(content.find('style').html())).appendTo(content.find('.css'));
$('<pre></pre>').addClass('prettyprint linenums lang-js').text(getAlignedText(content.find('script').html())).appendTo(content.find('.js'));
controls.on('click', 'span', function(){
content.find('.' + $(this).removeClass('active').attr('class')).show().siblings('div').hide();
$(this).addClass('active').siblings('span').removeClass('active');
});
controls.find('.demo').click();
});
$('.container').on('click', '.add-content', function(){
$('#lorem-ipsum').clone().removeAttr('id').appendTo($(this).closest('.container').find('.scroll-content'));
return false;
});
$('.container').on('click', '.remove-content', function(){
$(this).closest('.container').find('.scroll-content').find('p').not('.permanent').last().remove();
return false;
});
window.prettyPrint && prettyPrint();
$('.wrapper').scrollbar();
});
</script>
<script type="text/javascript">
if(window.location.href.match(/gromo.github.io/i)){
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-52878040-1', 'auto');
ga('send', 'pageview');
}
</script>
<style type="text/css">
.content .demo {
border: none;
}
.content .demo > div {
height: 400px;
max-height: none;
overflow: auto;
width: 600px;
}
.scroll-content img {
display: block;
}
label.theme {
cursor: pointer;
margin-right: 14px;
}
label.theme input {
margin-right: 2px;
}
</style>
<style type="text/css" id="css-common">
/*************** SCROLLBAR BASE CSS ***************/
.scroll-wrapper {
overflow: hidden !important;
padding: 0 !important;
position: relative;
}
.scroll-wrapper > .scroll-content {
border: none !important;
box-sizing: content-box !important;
height: auto;
left: 0;
margin: 0;
max-height: none;
max-width: none !important;
overflow: scroll !important;
padding: 0;
position: relative !important;
top: 0;
width: auto !important;
}
.scroll-wrapper > .scroll-content::-webkit-scrollbar {
height: 0;
width: 0;
}
.scroll-element {
display: none;
}
.scroll-element, .scroll-element div {
box-sizing: content-box;
}
.scroll-element.scroll-x.scroll-scrollx_visible,
.scroll-element.scroll-y.scroll-scrolly_visible {
display: block;
}
.scroll-element .scroll-bar,
.scroll-element .scroll-arrow {
cursor: default;
}
.scroll-textarea {
border: 1px solid #cccccc;
border-top-color: #999999;
}
.scroll-textarea > .scroll-content {
overflow: hidden !important;
}
.scroll-textarea > .scroll-content > textarea {
border: none !important;
box-sizing: border-box;
height: 100% !important;
margin: 0;
max-height: none !important;
max-width: none !important;
overflow: scroll !important;
outline: none;
padding: 2px;
position: relative !important;
top: 0;
width: 100% !important;
}
.scroll-textarea > .scroll-content > textarea::-webkit-scrollbar {
height: 0;
width: 0;
}
</style>
</head>
<body>
<div class="wrapper scrollbar-dynamic">
<div class="page-content">
<h1>Advanced Scrollbars</h1>
<a href="basic.html">Basic Scrollbars Demo</a><br/>
<a href="angular.html">jQuery Scrollbars as Angular.JS directive</a><br/>
<a href="../">&laquo; Back to home</a>
<div class="container">
<h2>Microsoft Windows Vista</h2>
<div class="controls">
<span class="demo">DEMO</span>
<span class="html">HTML</span>
<span class="css">CSS</span>
<span class="js">JS</span>
<button onclick="jQuery('.scrollbar-vista').scrollbar('destroy');">Destroy</button>
</div>
<div class="content">
<style type="text/css">
/******************* WINDOWS VISTA SCROLLBAR *******************/
.scrollbar-vista > .scroll-content.scroll-scrolly_visible { left: -17px; margin-left: 17px; }
.scrollbar-vista > .scroll-content.scroll-scrollx_visible { top: -17px; margin-top: 17px; }
.scrollbar-vista > .scroll-element {
background-color: #fcfdff;
}
.scrollbar-vista > .scroll-element,
.scrollbar-vista > .scroll-element div
{
border: none;
margin: 0;
overflow: hidden;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-vista > .scroll-element .scroll-element_outer,
.scrollbar-vista > .scroll-element .scroll-element_size,
.scrollbar-vista > .scroll-element .scroll-element_inner-wrapper,
.scrollbar-vista > .scroll-element .scroll-element_inner,
.scrollbar-vista > .scroll-element .scroll-bar,
.scrollbar-vista > .scroll-element .scroll-bar div
{
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-vista > .scroll-element .scroll-element_outer,
.scrollbar-vista > .scroll-element .scroll-element_size,
.scrollbar-vista > .scroll-element .scroll-element_inner-wrapper,
.scrollbar-vista > .scroll-element .scroll-bar_body
{
background: none !important;
}
.scrollbar-vista > .scroll-element.scroll-x {
border-top: solid 1px #fcfdff;
bottom: 0;
height: 16px;
left: 0;
min-width: 100%;
width: 100%;
}
.scrollbar-vista > .scroll-element.scroll-y {
border-left: solid 1px #fcfdff;
height: 100%;
min-height: 100%;
right: 0;
top: 0;
width: 16px;
}
.scrollbar-vista > .scroll-element.scroll-x div {
background-image: url('skins/vista-x.png');
background-repeat: repeat-x;
}
.scrollbar-vista > .scroll-element.scroll-y div {
background-image: url('skins/vista-y.png');
background-repeat: repeat-y;
}
.scrollbar-vista > .scroll-element.scroll-x .scroll-arrow {}
.scrollbar-vista > .scroll-element.scroll-x .scroll-bar { min-width: 16px; background-position: 0px -34px; background-repeat: no-repeat; }
.scrollbar-vista > .scroll-element.scroll-x .scroll-bar_body { left: 2px; }
.scrollbar-vista > .scroll-element.scroll-x .scroll-bar_body-inner { left: -4px; background-position: 0px -17px; }
.scrollbar-vista > .scroll-element.scroll-x .scroll-bar_center { left: 50%; margin-left: -6px; width: 12px; background-position: 24px -34px; }
.scrollbar-vista > .scroll-element.scroll-x .scroll-bar_bottom { left: auto; right: 0; width: 2px; background-position: 37px -34px; }
.scrollbar-vista > .scroll-element.scroll-y .scroll-bar { min-height: 16px; background-position: -34px 0px; background-repeat: no-repeat; }
.scrollbar-vista > .scroll-element.scroll-y .scroll-bar_body { top: 2px; }
.scrollbar-vista > .scroll-element.scroll-y .scroll-bar_body-inner { top: -4px; background-position: -17px 0px; }
.scrollbar-vista > .scroll-element.scroll-y .scroll-bar_center { top: 50%; margin-top: -6px; height: 12px; background-position: -34px 24px; }
.scrollbar-vista > .scroll-element.scroll-y .scroll-bar_bottom { top: auto; bottom: 0; height: 2px; background-position: -34px 37px; }
/* SCROLL ARROWS */
.scrollbar-vista > .scroll-element .scroll-arrow { display: none; }
.scrollbar-vista > .scroll-element.scroll-element_arrows_visible .scroll-arrow { display: block; z-index: 12; }
.scrollbar-vista > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-arrow_less { height: 100%; width: 17px; background-position: 0px -51px;}
.scrollbar-vista > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-arrow_more { height: 100%; left: auto; right: 0; width: 17px; background-position: 17px -51px;}
.scrollbar-vista > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-element_outer { left: 17px; }
.scrollbar-vista > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-element_inner { left: -34px; }
.scrollbar-vista > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-element_size { left: -34px; }
.scrollbar-vista > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-arrow_less { width: 100%; height: 17px; background-position: -51px 0px;}
.scrollbar-vista > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-arrow_more { width: 100%; top: auto; bottom: 0; height: 17px; background-position: -51px 17px;}
.scrollbar-vista > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-element_outer { top: 17px; }
.scrollbar-vista > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-element_inner { top: -34px; }
.scrollbar-vista > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-element_size { top: -34px; }
/* PROCEED OFFSET IF ANOTHER SCROLL VISIBLE */
.scrollbar-vista > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -17px; }
.scrollbar-vista > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -17px; }
.scrollbar-vista > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_inner { left: -17px; }
.scrollbar-vista > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_inner { top: -17px; }
/* PROCEED OFFSET IF ARROWS & ANOTHER SCROLL */
.scrollbar-vista > .scroll-element.scroll-x.scroll-element_arrows_visible.scroll-scrolly_visible .scroll-arrow_more { right: 17px;}
.scrollbar-vista > .scroll-element.scroll-x.scroll-element_arrows_visible.scroll-scrolly_visible .scroll-element_inner { left: -51px;}
.scrollbar-vista > .scroll-element.scroll-x.scroll-element_arrows_visible.scroll-scrolly_visible .scroll-element_size { left: -51px;}
.scrollbar-vista > .scroll-element.scroll-y.scroll-element_arrows_visible.scroll-scrollx_visible .scroll-arrow_more { bottom: 17px;}
.scrollbar-vista > .scroll-element.scroll-y.scroll-element_arrows_visible.scroll-scrollx_visible .scroll-element_inner { top: -51px;}
.scrollbar-vista > .scroll-element.scroll-y.scroll-element_arrows_visible.scroll-scrollx_visible .scroll-element_size { top: -51px;}
</style>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery('.scrollbar-vista').scrollbar({
"showArrows": true,
"scrollx": "advanced",
"scrolly": "advanced"
});
});
</script>
<div class="demo">
<div class="scrollbar-vista">
<img src="../includes/tarzan.jpg" height="2100" width="2800">
</div>
</div>
<div class="html"></div>
<div class="css"></div>
<div class="js"></div>
</div>
</div>
<div class="container">
<h2>External</h2>
<p>External scrollbars can be located in any place inside or outside of scrollable container</p>
<div class="controls">
<span class="demo">DEMO</span>
<span class="html">HTML</span>
<span class="css">CSS</span>
<span class="js">JS</span>
</div>
<div class="content">
<style type="text/css">
.scrollbar-external_wrapper {
height: 450px !important;
position: relative;
width: auto !important;
}
.scrollbar-external {
height: 400px;
overflow: auto;
width: 600px;
}
/******************* EXTERNAL SCROLLBAR *******************/
.external-scroll_x,
.external-scroll_y {
border: solid 1px #9999fc;
cursor: pointer;
display: none;
position: absolute;
}
.external-scroll_x.scroll-scrollx_visible {
display: block;
height: 10px;
left: 0;
top: 410px;
width: 200px;
}
.external-scroll_y.scroll-scrolly_visible {
display: block;
height: 200px;
left: 610px;
top: 0;
width: 10px;
}
.external-scroll_x div,
.external-scroll_y div
{
height: 100%;
left: 0;
top: 0;
position: absolute;
width: 100%;
}
.external-scroll_x .scroll-bar,
.external-scroll_y .scroll-bar {
background: #9999fc;
z-index: 12;
}
.external-scroll_x .scroll-bar {
width: 100px;
}
.external-scroll_y .scroll-bar {
height: 100px;
}
</style>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery('.scrollbar-external').scrollbar({
"autoScrollSize": false,
"scrollx": $('.external-scroll_x'),
"scrolly": $('.external-scroll_y')
});
});
</script>
<div class="demo">
<div class="scrollbar-external_wrapper">
<div class="scrollbar-external">
<img src="../includes/tarzan.jpg">
</div>
<div class="external-scroll_x">
<div class="scroll-element_outer">
<div class="scroll-element_size"></div>
<div class="scroll-element_track"></div>
<div class="scroll-bar"></div>
</div>
</div>
<div class="external-scroll_y">
<div class="scroll-element_outer">
<div class="scroll-element_size"></div>
<div class="scroll-element_track"></div>
<div class="scroll-bar"></div>
</div>
</div>
</div>
</div>
<div class="html"></div>
<div class="css"></div>
<div class="js"></div>
</div>
</div>
<div class="container">
<h2>Page Map</h2>
<p>Page Map is resizable scrollbar that combinates both horizontal and vertical scrollbars in one element</p>
<div class="controls">
<span class="demo">DEMO</span>
<span class="html">HTML</span>
<span class="css">CSS</span>
<span class="js">JS</span>
<button onclick="$('.scrollbar-map img').css({'height':'2100px','width':'2800px'});">Resize</button>
<button onclick="$('.scrollbar-map img').css({'height':'600px','width':'800px'});">Original</button>
</div>
<div class="content">
<style type="text/css">
/******************* PAGE THUMBNAIL SCROLLBAR *******************/
.scrollbar-map > .scroll-element_outer {
display: none;
height: 100px;
position: absolute;
right: 10px;
top: 10px;
width: 100px;
}
.scrollbar-map > .scroll-element_outer .scroll-element_size,
.scrollbar-map > .scroll-element_outer .scroll-element_track {
background-color: #999;
background-color: rgba(153, 153, 153, 0.4);
height: 100%;
position: absolute;
right: 0;
top: 0;
width: 100%;
}
.scrollbar-map > .scroll-element_outer .scroll-bar {
background-color: #CCC;
background-color: rgba(204, 204, 204, 0.5);
height: 100%;
position: absolute;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-map > .scroll-element_outer.scroll-scrollx_visible,
.scrollbar-map > .scroll-element_outer.scroll-scrolly_visible {
display: block;
}
</style>
<script type="text/javascript">
/**
* Get inscribed area size
*
* @param int oW outer width
* @param int oH outer height
* @param int iW inner width
* @param int iH inner height
* @param bool R resize if smaller
*/
function getInscribedArea(oW, oH, iW, iH, R){
if(!R && iW < oW && iH < oH){
return {
"h": iH,
"w": iW
};
}
if((oW / oH) > (iW / iH)){
return {
"h": oH,
"w": Math.round(oH * iW / iH)
}
} else {
return {
"h": Math.round(oW * iH / iW),
"w": oW
};
}
}
jQuery(document).ready(function(){
jQuery('.scrollbar-map').scrollbar({
"onInit": function(){
this.container.find('.scroll-element_outer').appendTo(this.wrapper);
},
"onUpdate": function(container){
var s = getInscribedArea(140, 140, this.scrollx.size, this.scrolly.size);
this.scrolly.scroll.height(s.h);
this.scrollx.scroll.width(s.w);
},
"scrollx": $('.scrollbar-map .scroll-element_outer'),
"scrolly": $('.scrollbar-map .scroll-element_outer'),
"stepScrolling": false
});
});
</script>
<div class="demo">
<div class="scrollbar-map">
<div class="scroll-element_outer">
<div class="scroll-element_size">
<div class="scroll-element_track"></div>
<div class="scroll-bar"></div>
</div>
</div>
<img src="../includes/tarzan.jpg" height="900" width="1200">
</div>
</div>
<div class="html"></div>
<div class="css"></div>
<div class="js"></div>
</div>
</div>
<div class="container">
<h2>Janos Scrollbar</h2>
<p>Janos Scrollbar uses design from
<a href="http://users.atw.hu/nokiss/formstyle.html" target="_blank">Janos custom form elements</a></p>
<div class="controls">
<span class="demo">DEMO</span>
<span class="html">HTML</span>
<span class="css">CSS</span>
<span class="js">JS</span>
</div>
<div>
<label class="theme"><input type="radio" name="janos-theme" value="theme-blue" checked="checked">Blue</label>
<label class="theme"><input type="radio" name="janos-theme" value="theme-woods">Woods</label>
<label class="theme"><input type="radio" name="janos-theme" value="theme-paint4">Paint 4</label>
<label class="theme"><input type="radio" name="janos-theme" value="theme-palace3">Palace 3</label>
<label class="theme"><input type="radio" name="janos-theme" value="theme-dark">Dark</label>
<label class="theme"><input type="radio" name="janos-theme" value="theme-sprites">Sprites</label>
<script type="text/javascript">
jQuery(function($){
var currentTheme = 'theme-blue';
$('input:radio[name="janos-theme"]').on('change', function(){
$('.scrollbar-janos').removeClass(currentTheme);
currentTheme = $(this).val();
$('.scrollbar-janos').addClass(currentTheme);
}).eq(0).prop('checked', true).change();
});
</script>
</div>
<div class="content">
<style type="text/css">
.scrollbar-janos.theme-blue > .scroll-element,
.scrollbar-janos.theme-blue > .scroll-element .scroll-bar,
.scrollbar-janos.theme-blue > .scroll-element .scroll-element_corner,
.scrollbar-janos.theme-blue > .scroll-element .scroll-element_track
{ background-color: #66CCEE; }
.scrollbar-janos.theme-woods > .scroll-element,
.scrollbar-janos.theme-woods > .scroll-element .scroll-bar,
.scrollbar-janos.theme-woods > .scroll-element .scroll-element_corner,
.scrollbar-janos.theme-woods > .scroll-element .scroll-element_track
{ background-color: #5F7C7F; }
.scrollbar-janos.theme-paint4 > .scroll-element,
.scrollbar-janos.theme-paint4 > .scroll-element .scroll-bar,
.scrollbar-janos.theme-paint4 > .scroll-element .scroll-element_corner,
.scrollbar-janos.theme-paint4 > .scroll-element .scroll-element_track
{ background-color: #5566AA; }
.scrollbar-janos.theme-palace3 > .scroll-element,
.scrollbar-janos.theme-palace3 > .scroll-element .scroll-bar,
.scrollbar-janos.theme-palace3 > .scroll-element .scroll-element_corner,
.scrollbar-janos.theme-palace3 > .scroll-element .scroll-element_track
{ background-color: #028B54; }
.scrollbar-janos.theme-dark > .scroll-element,
.scrollbar-janos.theme-dark > .scroll-element .scroll-bar,
.scrollbar-janos.theme-dark > .scroll-element .scroll-element_corner,
.scrollbar-janos.theme-dark > .scroll-element .scroll-element_track
{ background-color: #999999; }
.scrollbar-janos.theme-sprites > .scroll-element,
.scrollbar-janos.theme-sprites > .scroll-element .scroll-bar,
.scrollbar-janos.theme-sprites > .scroll-element .scroll-element_corner,
.scrollbar-janos.theme-sprites > .scroll-element .scroll-element_track
{ background-color: #BBBBBB; }
/******************* JANOS SCROLLBAR *******************/
.scrollbar-janos > .scroll-element,
.scrollbar-janos > .scroll-element div
{
border: none;
margin: 0;
overflow: hidden;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-janos > .scroll-element div {
background-color: transparent;
display: block;
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-janos > .scroll-element.scroll-x {
border-top: 1px solid #AAAAAA;
bottom: 0;
height: 16px;
left: 0;
min-width: 100%;
width: 100%;
}
.scrollbar-janos > .scroll-element.scroll-y {
border-left: 1px solid #AAAAAA;
height: 100%;
min-height: 100%;
right: 0;
top: 0;
width: 16px;
}
.scrollbar-janos > .scroll-element .scroll-element_corner {
display: none;
}
.scrollbar-janos > .scroll-element.scroll-x,
.scrollbar-janos > .scroll-element.scroll-x .scroll-bar {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAPCAYAAADd/14OAAAAS0lEQVR42qzQywkAIAxEQQPpvwn7E/EDESXREt7BHPY0sEvE3XMCpyJiwIW+mBR2Civa+BVGhOuLQt/TaHWncFBoFC4KN4WHwCvAAHI/GzHvcCTCAAAAAElFTkSuQmCC);
background-repeat: repeat-x;
}
.scrollbar-janos > .scroll-element.scroll-x .scroll-bar {
box-shadow: 0 1px 2px, 0 -1px 1px rgba(255, 255, 255, 0.8);
}
.scrollbar-janos > .scroll-element.scroll-y,
.scrollbar-janos > .scroll-element.scroll-y .scroll-bar {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAKCAYAAABrGwT5AAAAAXNSR0IArs4c6QAAAEtJREFUKM/ty00Kg0AAQ+Ev3v8W3k/8qWipzLiYFrqR7osPsknyUkrpk2xYsWDCWGsdMCaZ3/0DO5544eg08pVWJJ/tkp+HW/4L+QSzjxQbWJrRJQAAAABJRU5ErkJggg==);
background-repeat: repeat-y;
}
.scrollbar-janos > .scroll-element.scroll-y .scroll-bar {
box-shadow: 0 1px 2px, 0 -1px 1px rgba(255, 255, 255, 0.8);
}
.scrollbar-janos > .scroll-element.scroll-x .scroll-element_track {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAQCAYAAAAvf+5AAAAAXklEQVR42mJkYGBIZcAO/iPR/1iAxG8CisAYpPAnsQp/EGE1XoUoiklS+J0BPwArJmQiA7FWoyj8hUXiH7oArnBE9ghc4S9irf5NrMI/xFr9hwgTwQr/4TMJBgACDABrOConte5OAgAAAABJRU5ErkJggg==);
background-repeat: repeat-x;
}
.scrollbar-janos > .scroll-element.scroll-y .scroll-element_track {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAKCAYAAAC9vt6cAAAAAXNSR0IArs4c6QAAAFNJREFUKM/FzksKgDAMBNDX3NT7X8BaC25clBKw4sKBgYTMJwUbGurAfWLFcbPhREcPBEpC05ztqXkUPyKS5LJqHj9YaU11sdgarw+LKF8D/B9wAWL/DzbaLOVxAAAAAElFTkSuQmCC);
background-repeat: repeat-y;
}
.scrollbar-janos > .scroll-element.scroll-x .scroll-bar .scroll-bar_body {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAYAAADAp4fuAAAAMklEQVR42mL4DwRnz579zwAEMDYTiLN7924GGACxmRiwAEoFV6xYwSAvLw/mwNgAAQYAEz0X3c1VmrwAAAAASUVORK5CYII=);
}
.scrollbar-janos > .scroll-element.scroll-y .scroll-bar .scroll-bar_body {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAFCAYAAACJmvbYAAAAAXNSR0IArs4c6QAAAChJREFUCNdj/P///38GLGDFihUMLOfOnWPYvXs3hqS8vDwDXsBItrEA28oV4/a4edAAAAAASUVORK5CYII=);
}
.scrollbar-janos > .scroll-element.scroll-x .scroll-arrow_less {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAj0lEQVR42mJgwA4EgVgbRP///58BhJmwKFIwNTW1AEpGANlSMEEWNFOkNm/ebObj42MHZLMDsSi6QpApmqdOnbICspWxuQWkUPTYsWOOlpaWMFOwAiYGIgFI4WsrK6v9ZmZmq4Dsu4RMfHD69OkTjIyMK7Zs2bIbyP9JjC0gj3kCg6cZFJawcGQgNsABAgwAc40zrttfic8AAAAASUVORK5CYII=);
box-shadow: 0 1px 2px, 0 -1px 1px rgba(255, 255, 255, 0.8);
}
.scrollbar-janos > .scroll-element.scroll-x .scroll-arrow_more {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAh0lEQVR42mL4//8/AwgDgSAQa0NpDMCExJYCaogwNTW1ALIVMFQimegApJcB8fzNmzcnopvOhMUWdh8fH1d007EphAHlU6dOhR07dswRyBbFpxAFsOCRu2tmZnbs9OnT14Hs19gU/tyyZcshX1/fU0D2MyB+j+5rbSDdDPSAJ6HgwRvgAAEGAC2sRKFV1v+TAAAAAElFTkSuQmCC);
}
.scrollbar-janos > .scroll-element.scroll-y .scroll-arrow_less {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAjklEQVR42mJgwASiUIwCGNH4CseOHXMEMaysrPYDqQdYDGIQNDU19fz///98EAaxQWLYTNQGKogA0spQ/l1GRsYVQPoqiMMEs3Lz5s1mSIpAQBkqpgAzEWSlxalTp8KAbHY05/w0MzNbdfr06ROMWKxEB2AnMEIdLIUtSKDgNRA/YwSaxkAMYGIgEgAEGADQpyzNaQf+BAAAAABJRU5ErkJggg==);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.7);
}
.scrollbar-janos > .scroll-element.scroll-y .scroll-arrow_more {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAg0lEQVR42mL8//8/AzGAiYFIwAjEgkAsBcSiONS8BuJnLCBFQOsjgLQyDoV3GRkZV4CsfmZmZnYMSP/EougnVO4ZSOH706dPX9+yZcshdFUgMZAcSA0jkrg2mhPAVgLpq+i+RnYC3EpkXyMDhWPHjjmCGFZWVvuB1AN8QSaKLagAAgwAkYkwicybOCoAAAAASUVORK5CYII=);
}
.scrollbar-janos > .scroll-element .scroll-arrow,
.scrollbar-janos > .scroll-element .scroll-bar_body {
background-position: center;
background-repeat: no-repeat;
}
.scrollbar-janos > .scroll-content.scroll-scrolly_visible { left: -17px; margin-left: 17px; }
.scrollbar-janos > .scroll-content.scroll-scrollx_visible { top: -17px; margin-top: 17px; }
/* scrollbar arrows */
.scrollbar-janos > .scroll-element .scroll-arrow { display: none; }
.scrollbar-janos > .scroll-element.scroll-element_arrows_visible .scroll-arrow { display: block; z-index: 12; }
.scrollbar-janos > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-arrow_less { height: 100%; width: 16px;}
.scrollbar-janos > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-arrow_more { height: 100%; left: auto; right: 0; width: 16px;}
.scrollbar-janos > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-element_outer { left: 16px; }
.scrollbar-janos > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-element_track { left: -32px; }
.scrollbar-janos > .scroll-element.scroll-x.scroll-element_arrows_visible .scroll-element_size { left: -33px; }
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-arrow_less { width: 100%; height: 16px;}
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-arrow_more { width: 100%; top: auto; bottom: 0; height: 16px;}
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-element_outer { top: 16px; }
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-element_track { top: -32px; }
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible .scroll-element_size { top: -33px; }
/* if another scrollbar is visible */
.scrollbar-janos > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -17px; }
.scrollbar-janos > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -17px; }
.scrollbar-janos > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_inner { left: -17px; }
.scrollbar-janos > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_inner { top: -17px; }
/* if arrows & another scrollbar are visible */
.scrollbar-janos > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_corner,
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible.scroll-scrollx_visible .scroll-element_corner {
border-top: 1px solid #AAAAAA;
bottom: 0;
display: block;
height: 16px;
left: auto;
right: 0;
top: auto;
width: 16px;
z-index: 13;
}
.scrollbar-janos > .scroll-element.scroll-x.scroll-element_arrows_visible.scroll-scrolly_visible .scroll-arrow_more { right: 17px;}
.scrollbar-janos > .scroll-element.scroll-x.scroll-element_arrows_visible.scroll-scrolly_visible .scroll-element_track { left: -50px;}
.scrollbar-janos > .scroll-element.scroll-x.scroll-element_arrows_visible.scroll-scrolly_visible .scroll-element_size { left: -51px;}
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible.scroll-scrollx_visible .scroll-arrow_more { bottom: 17px;}
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible.scroll-scrollx_visible .scroll-element_track { top: -50px;}
.scrollbar-janos > .scroll-element.scroll-y.scroll-element_arrows_visible.scroll-scrollx_visible .scroll-element_size { top: -51px;}
</style>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery('.scrollbar-janos').scrollbar({
"showArrows": true,
"scrollx": "advanced",
"scrolly": "advanced"
});
});
</script>
<div class="demo">
<div class="scrollbar-janos theme-blue">
<img src="../includes/tarzan.jpg" height="2100" width="2800">
</div>
</div>
<div class="html"></div>
<div class="css"></div>
<div class="js"></div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,175 @@
<!DOCTYPE html>
<html>
<head>
<title>jQuery Scrollbar as AngularJS directive</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="../includes/style.css" />
<link rel="stylesheet" href="../includes/prettify/prettify.css" />
<link rel="stylesheet" href="../jquery.scrollbar.css" />
<style type="text/css">
* {
box-sizing: border-box;
}
.content .demo > div {
max-height: none;
}
</style>
<script src="../includes/prettify/prettify.js"></script>
<script src="../includes/jquery.js"></script>
<script src="../includes/angular.js"></script>
<script src="../jquery.scrollbar.js"></script>
<script type="text/javascript">
if(window.location.href.match(/gromo.github.io/i)){
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-52878040-1', 'auto');
ga('send', 'pageview');
}
</script>
</head>
<body>
<div class="wrapper scrollbar-dynamic">
<div class="page-content">
<h1>jQuery Scrollbar as AngularJS directive</h1>
<a href="basic.html">Basic Scrollbars Demo</a><br/>
<a href="advanced.html">Advanced Scrollbars Demo</a><br/>
<a href="../">&laquo; Back to home</a>
<p id="lorem-ipsum">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Proin nibh augue, suscipit a,
scelerisque sed, lacinia in, mi. Cras vel lorem. Etiam pellentesque aliquet tellus.
Phasellus pharetra nulla ac diam. Quisque semper justo at risus. Donec venenatis, turpis vel
hendrerit interdum, dui ligula ultricies purus, sed posuere libero dui id orci. Nam congue,
pede vitae dapibus aliquet, elit magna vulputate arcu, vel tempus metus leo non est. Etiam
sit amet lectus quis est congue mollis. Phasellus congue lacus eget neque. Phasellus ornare,
ante vitae consectetuer consequat, purus sapien ultricies dolor, et mollis pede metus eget
nisi. Praesent sodales velit quis augue. Cras suscipit, urna at aliquam rhoncus, urna quam
viverra nisi, in interdum massa nibh nec erat.
</p>
<div class="container">
<h2></h2>
<div class="controls">
<span class="demo">DEMO</span>
<span class="html">HTML</span>
<span class="css">CSS</span>
<span class="js">JS</span>
<button class="add-content">Add Content</button>
<button class="remove-content">Remove Content</button>
</div>
<div class="content">
<style type="text/css">
.scrollbar-dynamic {
max-height: 300px;
overflow: auto;
}
</style>
<script type="text/javascript">
var demoApp = angular.module('demoApp', ['jQueryScrollbar']);
demoApp.controller('SimpleController', function($scope){
$scope.jqueryScrollbarOptions = {
"onScroll":function(y, x){
if(y.scroll == y.maxScroll){
alert('Scrolled to bottom');
}
}
};
});
</script>
<div class="demo">
<div data-ng-app="demoApp">
<div data-ng-controller="SimpleController">
<div class="scrollbar-dynamic" data-jquery-scrollbar="jqueryScrollbarOptions">
<p class="permanent">
Using jQuery scrollbar as Angular.JS directive is simple. Just include jquery.scrollbar.js
file after jQuery and Angular. jQuery Scrollbar automatically creates Angular.JS module
<em>jQueryScrollbar</em> with directive <em>jqueryScrollbar</em>.<br/>
<i>* Please note that Angular.JS does not work with IE 7.</i>
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Proin nibh augue, suscipit a,
scelerisque sed, lacinia in, mi. Cras vel lorem. Etiam pellentesque aliquet tellus.
Phasellus pharetra nulla ac diam. Quisque semper justo at risus. Donec venenatis, turpis vel
hendrerit interdum, dui ligula ultricies purus, sed posuere libero dui id orci. Nam congue,
pede vitae dapibus aliquet, elit magna vulputate arcu, vel tempus metus leo non est. Etiam
sit amet lectus quis est congue mollis. Phasellus congue lacus eget neque. Phasellus ornare,
ante vitae consectetuer consequat, purus sapien ultricies dolor, et mollis pede metus eget
nisi. Praesent sodales velit quis augue. Cras suscipit, urna at aliquam rhoncus, urna quam
viverra nisi, in interdum massa nibh nec erat.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Proin nibh augue, suscipit a,
scelerisque sed, lacinia in, mi. Cras vel lorem. Etiam pellentesque aliquet tellus.
Phasellus pharetra nulla ac diam. Quisque semper justo at risus. Donec venenatis, turpis vel
hendrerit interdum, dui ligula ultricies purus, sed posuere libero dui id orci. Nam congue,
pede vitae dapibus aliquet, elit magna vulputate arcu, vel tempus metus leo non est. Etiam
sit amet lectus quis est congue mollis. Phasellus congue lacus eget neque. Phasellus ornare,
ante vitae consectetuer consequat, purus sapien ultricies dolor, et mollis pede metus eget
nisi. Praesent sodales velit quis augue. Cras suscipit, urna at aliquam rhoncus, urna quam
viverra nisi, in interdum massa nibh nec erat.
</p>
</div>
</div>
</div>
</div>
<div class="html"></div>
<div class="css"></div>
<div class="js"></div>
</div>
</div>
</div>
</div>
<script>
function getAlignedText(text){
text = (text || '').split('\n');
while(text.length > 0 && $.trim(text[0]) == ''){
text.shift();
}
var tabs = (text[0] || '').replace(/^(\s+).+$/, '$1');
for(var i=0; i<text.length; i++){
text[i] = text[i].replace(tabs, '');
}
if(text.length > 0 && text[text.length - 1].match(/^\s*$/)){
text.pop();
}
return text.join('\n');
}
$('.container').each(function(){
var content = $(this).find('.content');
var controls = $(this).find('.controls');
$('<pre></pre>').addClass('prettyprint linenums lang-html').text(getAlignedText(content.find('.demo').html())).appendTo(content.find('.html'));
$('<pre></pre>').addClass('prettyprint linenums lang-css').text(getAlignedText($('#css-common').html()) + "\n" + getAlignedText(content.find('style').html())).appendTo(content.find('.css'));
$('<pre></pre>').addClass('prettyprint linenums lang-js').text(getAlignedText(content.find('script').html())).appendTo(content.find('.js'));
controls.on('click', 'span', function(){
content.find('.' + $(this).removeClass('active').attr('class')).show().siblings('div').hide();
$(this).addClass('active').siblings('span').removeClass('active');
});
controls.find('.demo').click();
});
$('.container').on('click', '.add-content', function(){
$('#lorem-ipsum').clone().removeAttr('id').appendTo($(this).closest('.container').find('.scroll-content'));
return false;
});
$('.container').on('click', '.remove-content', function(){
$(this).closest('.container').find('.scroll-content').find('p').not('.permanent').last().remove();
return false;
});
window.prettyPrint && prettyPrint();
$('.wrapper').scrollbar();
</script>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}

View File

@@ -0,0 +1,30 @@
!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a=
b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b[a],c.push(g(h[0])),
h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1))&&l<=h&&
(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9,n:10,v:11,
f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m[j++<<1|1]=
a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.charAt(0)];
if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c<i;++c){var r=
g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com",
/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+
s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,
q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=
c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var r=j.createElement("ol");
r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c,a.i),b=g.a;
a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType!==1&&(G=x.substring(g,
t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",
/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],
["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}),
["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q,
hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);
p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1});
return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.test(o.tagName)&&
o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J(d,u,o);r=
{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code|xmp)$/i,
h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()

View File

@@ -0,0 +1,515 @@
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
/**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined in IE 8/9.
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}
/**
* 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/
audio,
canvas,
progress,
video {
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address `[hidden]` styling not present in IE 8/9.
* Hide the `template` element in IE, Safari, and Firefox < 22.
*/
[hidden],
template {
display: none;
}
/* Links
========================================================================== */
/**
* Remove the gray background color from active links in IE 10.
*/
a {
background: transparent;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
}
/* Text-level semantics
========================================================================== */
/**
* Address styling not present in IE 8/9, Safari 5, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
*/
b,
strong {
font-weight: bold;
}
/**
* Address styling not present in Safari 5 and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari 5, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Address styling not present in IE 8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* Embedded content
========================================================================== */
/**
* Remove border when inside `a` element in IE 8/9.
*/
img {
border: 0;
}
/**
* Correct overflow displayed oddly in IE 9.
*/
svg:not(:root) {
overflow: hidden;
}
/* Grouping content
========================================================================== */
/**
* Address margin not present in IE 8/9 and Safari 5.
*/
figure {
margin: 1em 40px;
}
/**
* Address differences between Firefox and other browsers.
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* Contain overflow in all browsers.
*/
pre {
overflow: auto;
}
/**
* Address odd `em`-unit font size rendering in all browsers.
*/
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
/* Forms
========================================================================== */
/**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/
/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
*/
button,
input,
optgroup,
select,
textarea {
color: inherit; /* 1 */
font: inherit; /* 2 */
margin: 0; /* 3 */
}
/**
* Address `overflow` set to `hidden` in IE 8/9/10.
*/
button {
overflow: visible;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8+, and Opera
* Correct `select` style inheritance in Firefox.
*/
button,
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* Remove inner padding and border in Firefox 4+.
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
input {
line-height: normal;
}
/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
* `font-size` values of the `input`, it causes the cursor style of the
* decrement button to change from `default` to `text`.
*/
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}
/**
* Remove default vertical scrollbar in IE 8/9.
*/
textarea {
overflow: auto;
}
/**
* Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
td,
th {
padding: 0;
}
/* General
========================================================================== */
html, body {
height: 100%;
width: 100%;
}
body {
background: #fff;
font: 14px/1.55 Helvetica, sans-serif;
color: #393938;
}
.wrapper {
height: 100%;
overflow: auto;
width: 100%;
}
.wrapper.scrollbar-dynamic {
max-height: none;
}
.page-content {
margin: 0 auto;
max-width: 1600px;
padding: 25px;
}
.content .demo {
padding: 25px;
}
h1 {
font: bold 32px/1.2 Helvetica, sans-serif;
margin: 24px 0 16px;
}
h2 {
font: bold 26px/1.2 Helvetica, sans-serif;
margin: 24px 0 16px;
}
h3 {
font: bold 22px/1.2 Helvetica, sans-serif;
margin: 24px 0 16px;
}
h4 {
font: bold 18px/1.2 Helvetica, sans-serif;
margin: 24px 0 16px;
}
h5 {
font: bold 16px/1.2 Helvetica, sans-serif;
margin: 24px 0 16px;
}
h6 {
font: bold 14px/1.2 Helvetica, sans-serif;
margin: 24px 0 16px;
}
/** Custom page styles **/
.content {
max-width: 1200px;
}
.content .demo {
border: 1px solid #CCC;
}
.content .demo .inner-content {
border: 1px solid #CCC;
max-height: 170px;
width: 600px;
}
.content .demo > div {
max-height: 250px;
overflow: auto;
}
.content .demo .permanent {
min-width: 800px;
}
.controls {
padding: 0 0 10px;
}
.controls span {
cursor: pointer; padding: 2px 8px;
}
.controls span.active {
background: #4698CE;
color: #fff;
cursor: default;
}
.prettyprint ol.linenums > li {
list-style-type: decimal;
}
#lorem-ipsum {
display: none;
}

View File

@@ -0,0 +1,371 @@
<!DOCTYPE html>
<html>
<head>
<title>jQuery Scrollbar</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="includes/style.css">
<link rel="stylesheet" href="includes/prettify/prettify.css">
<link rel="stylesheet" href="jquery.scrollbar.css">
<script type="text/javascript" src="includes/prettify/prettify.js"></script>
<script type="text/javascript" src="includes/jquery.js"></script>
<script type="text/javascript" src="jquery.scrollbar.js"></script>
<script type="text/javascript">
jQuery(document).ready(function($){
window.prettyPrint && prettyPrint();
$('.wrapper').scrollbar();
});
</script>
<script type="text/javascript">
if(window.location.href.match(/gromo.github.io/i)){
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-52878040-1', 'auto');
ga('send', 'pageview');
}
</script>
</head>
<body>
<div class="wrapper scrollbar-dynamic">
<div class="page-content">
<h1>jQuery Scrollbar</h1>
Cross-browser CSS customizable scrollbar with advanced features:
<ul>
<li>Easy to implement</li>
<li>No fixed height or width needed</li>
<li>Supports responsive design</li>
<li>Customizable CSS</li>
<li>Standard browser scroll behaviour</li>
<li>Supports vertical and horizontal scrollbars or both</li>
<li>Automatically re-initializes scrollbars</li>
<li>Supports external scrollbars</li>
<li>Provides a AngularJS directive</li>
<li>Supports the use as textarea scrollbar</li>
<li>Browser support: IE7+, Edge, Firefox, Opera, Chrome, Safari</li>
</ul>
<h4><a href="demo/basic.html">Basic Scrollbars Demo</a></h4>
<h4><a href="demo/advanced.html">Advanced Scrollbars Demo</a></h4>
<h4><a href="demo/angular.html">jQuery Scrollbars as AngularJS directive</a></h4>
<h4><a href="https://github.com/gromo/jquery.scrollbar/archive/gh-pages.zip">Download example</a></h4>
<h3>Easy to implement</h3>
<p>
Go to the demo pages, find a scrollbar that fits your needs, copy the HTML/CSS/JavaScript and paste it to your page.
Modify CSS styles to change scrollbar colors/sizes. If you can't find a scrollbar that fits your needs, contact the
author and your scrollbar will be added to the demo page.
</p>
<h3>No fixed height or width needed</h3>
<p>
Most of the scrollbar plugins require container height or width to be set in order to calculate scrollbar sizes.
jQuery Scrollbar does not require height, nor width. You can use max-height/max-width to restrict
container sizes, or use standard height/width in pixels/percents in the parent container.
</p>
<h3>Supports responsive design</h3>
<p>
jQuery Scrollbar can be used in responsive designs as there is no need to set fixed height/width to the container.
Scrollbars will be automatically updated/hidden/displayed when content or container size changes.
</p>
<h3>Customizable CSS</h3>
<p>
Use CSS to customize scrollbar colors, sizes or positions. Use simple or advanced HTML structure to
customize how scrollbars should look. If simple or advanced HTML structure is not what you are looking for,
you can use your own HTML structure with custom elements.
</p>
<h3>Standard browser scroll behaviour</h3>
<p>
If your browser can scroll content, jQuery Scrollbar will scroll it too! Why? Because it does not emulate
browser scroll behaviour as many plugins do, instead hides standard scrollbars and displays custom ones. You want
to scroll with mouse middle button? Just use it! You want to scroll with touch? Do it! Your browser
supports custom scroll behavior? Use it too! Use the standard or jQuery scrollTop/scrollLeft functions to get
current scroll offset or scroll to any position. Use the standard "scroll" event to handle content scrolling.
You don't need to know custom functions/events everything is done based on standard scroll behaviour.
</p>
<h3>Supports vertical and horizontal scrollbars or both</h3>
<p>
Most of the scrollbar plugins allow using either vertical or horizontal scrollbars.
Only a few can use both vertical and horizontal scrollbars and they are using scroll emulation
which has limitations. jQuery Scrollbar does not emulate scroll behaviour. Also it can work
with both vertical and horizontal scrollbars together.
</p>
<h3>Automatically re-initializes scrollbars</h3>
<p>
Usually scrollbar size and positions are calculated when plugin is initialized. What if content or container
size is changed with javascript/ajax? - You have to update plugin to recalculate scrollbar sizes. And it's
OK because you know when content is changed. But what to do if you don't know when it is changed? For
example, if content contains images without height/width. These images change content size after loading.
There are 3 obvious ways: always set image height/width (and force users to set image size for content added
with WYSIWYG editor), wait for whole page to load and then initialize scrollbars or handle content images
loading and then re-initialize scrollbar plugin. Annoying, isn't it?
</p>
<p>
jQuery Scrollbar handles content/container size changes and recalculate scrollbar sizes automatically. Just
initialize it once and forget about it.
</p>
<h3>Supports external scrollbars</h3>
<p>
jQuery Scrollbar supports 3 types of scrollbars: <strong>inner</strong> &mdash; scrollbar is displayed over
content (Apple Mac OS); <strong>outer</strong> &mdash; scrollbar shifts content to display itself (Microsoft
Windows scrollbars); <strong>external</strong> &mdash; scrollbar is located in any place of your page. So,
you can choose between Apple Mac and Windows style scrollbar or even place it outside of the container and
style it as you wish. Cool, isn't it?
</p>
<h3>Provides a AngularJS directive</h3>
<p>
Now you can easily use jQuery Scrollbar with AngularJS as directive. Just include module <em>jQueryScrollbar</em>
as dependency in your module, and you can use jQuery Scrollbar on your container with attribute
<em>data-jquery-scrollbar</em>. <a href="demo/angular.html">jQuery Scrollbar as AngularJS directive</a>.
</p>
<h3>Textarea scrollbars</h3>
<p>
Apply jQuery Scrollbar to your textarea and enjoy CSS styled scrollbars. Supports IE8+. Fixed height/width are required.
</p>
<h3>Browser support: IE7+, Edge, Firefox, Opera, Chrome, Safari</h3>
<p>
Of course all modern browsers are supported starting from IE7. The most problematic browser is IE, as you
already suspect. But it's not IE7, it's IE8! Surprised? I was! IE7 works better with height/width
calculations than IE8. IE8 renderer is crashed when using <em>max-height</em> with <em>overflow:auto</em>.
It is officially logged as a <a href="https://www.google.com/#q=IE8+max+height+crash" target="_blank">bug</a>
in the final version of IE8 with no fix. There are also other bugs with max-height/max-width and positioning.
So, be careful if you are going to support IE8.
</p>
<h4>Advanced features that standard scroll has, but scroll emulation plugins have to emulate or don't have at all</h4>
<ul>
<li>mouse middle button / touch / arrow buttons scrolling</li>
<li>auto content scrolling when selecting text</li>
<li>auto scrolling to focused element</li>
</ul>
<h2>jQuery Scrollbar Options</h2>
<ul>
<li>
<strong>autoScrollSize</strong> [true|false] (default: true)<br/>
automatically calculate scrollbar size depending on container/content size
</li>
<li>
<strong>autoUpdate</strong> [true|false] (default: true)<br/>
automatically update scrollbar if container/content size is changed
</li>
<li>
<strong>disableBodyScroll</strong> [true|false] (default: false)<br/>
if this option is enabled and the mouse is over the scrollable container, the main page won't be scrolled
</li>
<li>
<strong>duration</strong> [ms] (default: 200)<br/>
scroll speed duration when the mouse is over scrollbar (scroll emulating mode)
</li>
<li>
<strong>ignoreMobile</strong> [true|false] (default: false)<br/>
do not initialize custom scrollbars on mobile devices
</li>
<li>
<strong>ignoreOverlay</strong> [true|false] (default: false)<br/>
do not initialize custom scrollbars in browsers when native scrollbars
overlay content (Mac OS, mobile devices, etc...)
</li>
<li>
<strong>scrollStep</strong> [px] (default: 30)<br/>
scroll step when the mouse is over the scrollbar (scroll emulating mode)
</li>
<li>
<strong>showArrows</strong> [true|false] (default: false)<br/>
add a class to show scrollbar arrows in the advanced scrollbar
</li>
<li>
<strong>stepScrolling</strong> [true|false] (default: true)<br/>
emulate step scrolling on mousedown over scrollbar
</li>
<li>
<strong>scrollx</strong> [string|element] (default: simple)<br/>
<i>simple</i>, <i>advanced</i>, HTML or jQuery element for horizontal scrollbar
</li>
<li>
<strong>scrolly</strong> [string|element] (default: simple)<br/>
<i>simple</i>, <i>advanced</i>, HTML or jQuery element for vertical scrollbar
</li>
<li>
<strong>onDestroy</strong> [function] (default: null)<br/>
callback function when scrollbar is destroyed
</li>
<li>
<strong>onInit</strong> [function] (default: null)<br/>
callback function when scrollbar is initialized at the first time
</li>
<li>
<strong>onScroll</strong> [function] (default: null)<br/>
callback function when container is scrolled
</li>
<li>
<strong>onUpdate</strong> [function] (default: null)<br/>
callback function before scrollbars size is calculated
</li>
</ul>
<h2>Limitations</h2>
<ul>
<li>scrollable elements should not have paddings, margins, left/top values</li>
<li>do not use max-height in IE8 it crashes browser renderer</li>
<li>custom scroll is not initialized in Firefox under MacOS because of a bug while hiding native overlay scrollbar</li>
<li>custom scroll works incorrectly if containers children's height is set in percent of parent (issue <a href="https://github.com/gromo/jquery.scrollbar/issues/57">#57</a>)</li>
</ul>
<h2>FAQ</h2>
<ol>
<li>
<p>
<strong>Question:</strong> I need padding between border/scrollbar and text, but scrollbar does not
allow it. What should I do?
</p>
<p>
<strong>Answer:</strong> Wrap the inner content in the div with padding
</p>
</li>
<li>
<p>
<strong>Question:</strong> I need space between content with scrollbar and the rest of the page.
What should I do?
</p>
<p>
<strong>Answer:</strong> Wrap the scrollable content into container with padding.
</p>
</li>
<li>
<p>
<strong>Question:</strong> If content contains images, content size can be changed after images will
be loaded. Should I re-initialize scrollbar?
</p>
<p>
<strong>Answer:</strong> No, scrollbar detects content/container size changes automatically and
recalculates its size or hides/shows scrollbars.
</p>
</li>
<li>
<p>
<strong>Question:</strong> How can I scroll content to a custom position?
</p>
<p>
<strong>Answer:</strong> Use standard jQuery scrollTop/scrollLeft functions on the container.
For example if you have a container with a class "scrollbar-macosx" use the following code to scroll 50px from top:
<pre class="prettyprint linenums lang-js">
jQuery('.scrollbar-macosx').scrollTop(50);</pre>
</p>
</li>
<li>
<p>
<strong>Question:</strong> I want to know when the content is scrolled. Is there any callback for this?
</p>
<p>
<strong>Answer:</strong> Yes, you can use "onScroll" callback (look at AngularJS example),
or use the standard "scroll" event on the container. For example you have a container with a class
"scrollbar-macosx", then use the following code to handle the scroll event:
<pre class="prettyprint linenums lang-js">
jQuery('.scrollbar-macosx').not('.scroll-wrapper').on("scroll", function(){
console.log('content is scrolling');
});</pre>
</p>
</li>
<li>
<p>
<strong>Question:</strong> The scrollbar does not replace the standard scrollbar. What should I do?
</p>
<p>
<strong>Answer:</strong> It's not a good idea to replace the standard scrollbar for a whole page. But if you
really need it, wrap all page into container with height/width 100%, overflow: auto and apply
the scrollbar to this container.
</p>
</li>
<li>
<p>
<strong>Question:</strong> I don't want to see horizontal scrollbar ever. What should I do?
</p>
<p>
<strong>Answer:</strong> Hide it with CSS like this:
<pre class="prettyprint linenums lang-css">
.scroll-element.scroll-x {
display: none !important;
}</pre>
But don't forget that even if the scrollbar is hidden, the content still may be scrollable horizontally.
</p>
</li>
<li>
<p>
<strong>Question:</strong> Using jQuery's .width() or .height() on a container
will return incorrect values. What is going on?
</p>
<p>
<strong>Answer:</strong> Inner scrollable content uses additional height/width & offset of the scrollbar
to hide it. To get correct height/width values use the visible container:
<pre class="prettyprint linenums lang-js">
jQuery('.scrollbar-macosx').not('.scroll-content').height();
jQuery('.scrollbar-macosx').not('.scroll-content').width();</pre>
</p>
</li>
<li>
<p>
<strong>Question:</strong> How to detect when a DIV is scrolled to the bottom edge?
</p>
<p>
<strong>Answer:</strong> You can make calculations using jQuery's "scroll" event or you can use
the "onScroll" callback function that provides information about container's sizes &amp; offset:
<pre class="prettyprint linenums lang-js">
jQuery('.scrollbar-dynamic').scrollbar({
"onScroll": function(y, x){
if(y.scroll == y.maxScroll){
console.log('Scrolled to bottom');
}
}
});</pre>
</p>
</li>
<li>
<p>
<strong>Question:</strong> Can I use jQuery Scrollbar to customize textarea scrollbar?
</p>
<p>
<strong>Answer:</strong> Yes, you can. Textarea scrollbars are supported now.
Look at <a href="demo/basic.html">Basic Scrollbars Demo</a> page.
</p>
</li>
<li>
<p>
<strong>Question:</strong> Is it possible to set scrollbars max/min size?
</p>
<p>
<strong>Answer:</strong> Use CSS max-height/min-height (max-width/min-width) to set scrollbar size limits.
</p>
</li>
<li>
<p>
<strong>Question:</strong> I have a question / want to report an issue. How can I contact the author?
</p>
<p>
<strong>Answer:</strong> Please send an email to <a href="mailto:13real008@gmail.com">13real008@gmail.com</a>
</p>
</li>
</ol>
<h5 style="display:none;">
<a href="https://docs.google.com/spreadsheet/ccc?key=0Ao4HbHsCLP0YdEhnZVh1WGZSbXloekZiNWlaNElnTnc&usp=sharing"
target="_blank">Compare with other popular scrollbars</a>
</h5>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,791 @@
/*************** SCROLLBAR BASE CSS ***************/
.scroll-wrapper {
overflow: hidden !important;
padding: 0 !important;
position: relative;
}
.scroll-wrapper > .scroll-content {
border: none !important;
box-sizing: content-box !important;
height: auto;
left: 0;
margin: 0;
max-height: none;
max-width: none !important;
overflow: scroll !important;
padding: 0;
position: relative !important;
top: 0;
width: auto !important;
}
.scroll-wrapper > .scroll-content::-webkit-scrollbar {
height: 0;
width: 0;
}
.scroll-element {
display: none;
}
.scroll-element, .scroll-element div {
box-sizing: content-box;
}
.scroll-element.scroll-x.scroll-scrollx_visible,
.scroll-element.scroll-y.scroll-scrolly_visible {
display: block;
}
.scroll-element .scroll-bar,
.scroll-element .scroll-arrow {
cursor: default;
}
.scroll-textarea {
border: 1px solid #cccccc;
border-top-color: #999999;
}
.scroll-textarea > .scroll-content {
overflow: hidden !important;
}
.scroll-textarea > .scroll-content > textarea {
border: none !important;
box-sizing: border-box;
height: 100% !important;
margin: 0;
max-height: none !important;
max-width: none !important;
overflow: scroll !important;
outline: none;
padding: 2px;
position: relative !important;
top: 0;
width: 100% !important;
}
.scroll-textarea > .scroll-content > textarea::-webkit-scrollbar {
height: 0;
width: 0;
}
/*************** SIMPLE INNER SCROLLBAR ***************/
.scrollbar-inner > .scroll-element,
.scrollbar-inner > .scroll-element div
{
border: none;
margin: 0;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-inner > .scroll-element div {
display: block;
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-inner > .scroll-element.scroll-x {
bottom: 2px;
height: 8px;
left: 0;
width: 100%;
}
.scrollbar-inner > .scroll-element.scroll-y {
height: 100%;
right: 2px;
top: 0;
width: 8px;
}
.scrollbar-inner > .scroll-element .scroll-element_outer {
overflow: hidden;
}
.scrollbar-inner > .scroll-element .scroll-element_outer,
.scrollbar-inner > .scroll-element .scroll-element_track,
.scrollbar-inner > .scroll-element .scroll-bar {
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
}
.scrollbar-inner > .scroll-element .scroll-element_track,
.scrollbar-inner > .scroll-element .scroll-bar {
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=40)";
filter: alpha(opacity=40);
opacity: 0.4;
}
.scrollbar-inner > .scroll-element .scroll-element_track { background-color: #e0e0e0; }
.scrollbar-inner > .scroll-element .scroll-bar { background-color: #c2c2c2; }
.scrollbar-inner > .scroll-element:hover .scroll-bar { background-color: #919191; }
.scrollbar-inner > .scroll-element.scroll-draggable .scroll-bar { background-color: #919191; }
/* update scrollbar offset if both scrolls are visible */
.scrollbar-inner > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -12px; }
.scrollbar-inner > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -12px; }
.scrollbar-inner > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -12px; }
.scrollbar-inner > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -12px; }
/*************** SIMPLE OUTER SCROLLBAR ***************/
.scrollbar-outer > .scroll-element,
.scrollbar-outer > .scroll-element div
{
border: none;
margin: 0;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-outer > .scroll-element {
background-color: #ffffff;
}
.scrollbar-outer > .scroll-element div {
display: block;
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-outer > .scroll-element.scroll-x {
bottom: 0;
height: 12px;
left: 0;
width: 100%;
}
.scrollbar-outer > .scroll-element.scroll-y {
height: 100%;
right: 0;
top: 0;
width: 12px;
}
.scrollbar-outer > .scroll-element.scroll-x .scroll-element_outer { height: 8px; top: 2px; }
.scrollbar-outer > .scroll-element.scroll-y .scroll-element_outer { left: 2px; width: 8px; }
.scrollbar-outer > .scroll-element .scroll-element_outer { overflow: hidden; }
.scrollbar-outer > .scroll-element .scroll-element_track { background-color: #eeeeee; }
.scrollbar-outer > .scroll-element .scroll-element_outer,
.scrollbar-outer > .scroll-element .scroll-element_track,
.scrollbar-outer > .scroll-element .scroll-bar {
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
}
.scrollbar-outer > .scroll-element .scroll-bar { background-color: #d9d9d9; }
.scrollbar-outer > .scroll-element .scroll-bar:hover { background-color: #c2c2c2; }
.scrollbar-outer > .scroll-element.scroll-draggable .scroll-bar { background-color: #919191; }
/* scrollbar height/width & offset from container borders */
.scrollbar-outer > .scroll-content.scroll-scrolly_visible { left: -12px; margin-left: 12px; }
.scrollbar-outer > .scroll-content.scroll-scrollx_visible { top: -12px; margin-top: 12px; }
.scrollbar-outer > .scroll-element.scroll-x .scroll-bar { min-width: 10px; }
.scrollbar-outer > .scroll-element.scroll-y .scroll-bar { min-height: 10px; }
/* update scrollbar offset if both scrolls are visible */
.scrollbar-outer > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -14px; }
.scrollbar-outer > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -14px; }
.scrollbar-outer > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -14px; }
.scrollbar-outer > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -14px; }
/*************** SCROLLBAR MAC OS X ***************/
.scrollbar-macosx > .scroll-element,
.scrollbar-macosx > .scroll-element div
{
background: none;
border: none;
margin: 0;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-macosx > .scroll-element div {
display: block;
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-macosx > .scroll-element .scroll-element_track { display: none; }
.scrollbar-macosx > .scroll-element .scroll-bar {
background-color: #6C6E71;
display: block;
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
opacity: 0;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
border-radius: 7px;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
-o-transition: opacity 0.2s linear;
-ms-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.scrollbar-macosx:hover > .scroll-element .scroll-bar,
.scrollbar-macosx > .scroll-element.scroll-draggable .scroll-bar {
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
filter: alpha(opacity=70);
opacity: 0.7;
}
.scrollbar-macosx > .scroll-element.scroll-x {
bottom: 0px;
height: 0px;
left: 0;
min-width: 100%;
overflow: visible;
width: 100%;
}
.scrollbar-macosx > .scroll-element.scroll-y {
height: 100%;
min-height: 100%;
right: 0px;
top: 0;
width: 0px;
}
/* scrollbar height/width & offset from container borders */
.scrollbar-macosx > .scroll-element.scroll-x .scroll-bar { height: 7px; min-width: 10px; top: -9px; }
.scrollbar-macosx > .scroll-element.scroll-y .scroll-bar { left: -9px; min-height: 10px; width: 7px; }
.scrollbar-macosx > .scroll-element.scroll-x .scroll-element_outer { left: 2px; }
.scrollbar-macosx > .scroll-element.scroll-x .scroll-element_size { left: -4px; }
.scrollbar-macosx > .scroll-element.scroll-y .scroll-element_outer { top: 2px; }
.scrollbar-macosx > .scroll-element.scroll-y .scroll-element_size { top: -4px; }
/* update scrollbar offset if both scrolls are visible */
.scrollbar-macosx > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -11px; }
.scrollbar-macosx > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -11px; }
/*************** SCROLLBAR LIGHT ***************/
.scrollbar-light > .scroll-element,
.scrollbar-light > .scroll-element div {
border: none;
margin: 0;
overflow: hidden;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-light > .scroll-element {
background-color: #ffffff;
}
.scrollbar-light > .scroll-element div {
display: block;
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-light > .scroll-element .scroll-element_outer {
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}
.scrollbar-light > .scroll-element .scroll-element_size {
background: #dbdbdb;
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2RiZGJkYiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlOGU4ZTgiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+');
background: -moz-linear-gradient(left, #dbdbdb 0%, #e8e8e8 100%);
background: -webkit-gradient(linear, left top, right top, color-stop(0%,#dbdbdb), color-stop(100%,#e8e8e8));
background: -webkit-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%);
background: -o-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%);
background: -ms-linear-gradient(left, #dbdbdb 0%,#e8e8e8 100%);
background: linear-gradient(to right, #dbdbdb 0%,#e8e8e8 100%);
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}
.scrollbar-light > .scroll-element.scroll-x {
bottom: 0;
height: 17px;
left: 0;
min-width: 100%;
width: 100%;
}
.scrollbar-light > .scroll-element.scroll-y {
height: 100%;
min-height: 100%;
right: 0;
top: 0;
width: 17px;
}
.scrollbar-light > .scroll-element .scroll-bar {
background: #fefefe;
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZlZmVmZSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNWY1ZjUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+');
background: -moz-linear-gradient(left, #fefefe 0%, #f5f5f5 100%);
background: -webkit-gradient(linear, left top, right top, color-stop(0%,#fefefe), color-stop(100%,#f5f5f5));
background: -webkit-linear-gradient(left, #fefefe 0%,#f5f5f5 100%);
background: -o-linear-gradient(left, #fefefe 0%,#f5f5f5 100%);
background: -ms-linear-gradient(left, #fefefe 0%,#f5f5f5 100%);
background: linear-gradient(to right, #fefefe 0%,#f5f5f5 100%);
border: 1px solid #dbdbdb;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}
/* scrollbar height/width & offset from container borders */
.scrollbar-light > .scroll-content.scroll-scrolly_visible { left: -17px; margin-left: 17px; }
.scrollbar-light > .scroll-content.scroll-scrollx_visible { top: -17px; margin-top: 17px; }
.scrollbar-light > .scroll-element.scroll-x .scroll-bar { height: 10px; min-width: 10px; top: 0px; }
.scrollbar-light > .scroll-element.scroll-y .scroll-bar { left: 0px; min-height: 10px; width: 10px; }
.scrollbar-light > .scroll-element.scroll-x .scroll-element_outer { height: 12px; left: 2px; top: 2px; }
.scrollbar-light > .scroll-element.scroll-x .scroll-element_size { left: -4px; }
.scrollbar-light > .scroll-element.scroll-y .scroll-element_outer { left: 2px; top: 2px; width: 12px; }
.scrollbar-light > .scroll-element.scroll-y .scroll-element_size { top: -4px; }
/* update scrollbar offset if both scrolls are visible */
.scrollbar-light > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -19px; }
.scrollbar-light > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -19px; }
.scrollbar-light > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -19px; }
.scrollbar-light > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -19px; }
/*************** SCROLLBAR RAIL ***************/
.scrollbar-rail > .scroll-element,
.scrollbar-rail > .scroll-element div
{
border: none;
margin: 0;
overflow: hidden;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-rail > .scroll-element {
background-color: #ffffff;
}
.scrollbar-rail > .scroll-element div {
display: block;
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-rail > .scroll-element .scroll-element_size {
background-color: #999;
background-color: rgba(0, 0, 0, 0.3);
}
.scrollbar-rail > .scroll-element .scroll-element_outer:hover .scroll-element_size {
background-color: #666;
background-color: rgba(0, 0, 0, 0.5);
}
.scrollbar-rail > .scroll-element.scroll-x {
bottom: 0;
height: 12px;
left: 0;
min-width: 100%;
padding: 3px 0 2px;
width: 100%;
}
.scrollbar-rail > .scroll-element.scroll-y {
height: 100%;
min-height: 100%;
padding: 0 2px 0 3px;
right: 0;
top: 0;
width: 12px;
}
.scrollbar-rail > .scroll-element .scroll-bar {
background-color: #d0b9a0;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5);
}
.scrollbar-rail > .scroll-element .scroll-element_outer:hover .scroll-bar {
box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6);
}
/* scrollbar height/width & offset from container borders */
.scrollbar-rail > .scroll-content.scroll-scrolly_visible { left: -17px; margin-left: 17px; }
.scrollbar-rail > .scroll-content.scroll-scrollx_visible { margin-top: 17px; top: -17px; }
.scrollbar-rail > .scroll-element.scroll-x .scroll-bar { height: 10px; min-width: 10px; top: 1px; }
.scrollbar-rail > .scroll-element.scroll-y .scroll-bar { left: 1px; min-height: 10px; width: 10px; }
.scrollbar-rail > .scroll-element.scroll-x .scroll-element_outer { height: 15px; left: 5px; }
.scrollbar-rail > .scroll-element.scroll-x .scroll-element_size { height: 2px; left: -10px; top: 5px; }
.scrollbar-rail > .scroll-element.scroll-y .scroll-element_outer { top: 5px; width: 15px; }
.scrollbar-rail > .scroll-element.scroll-y .scroll-element_size { left: 5px; top: -10px; width: 2px; }
/* update scrollbar offset if both scrolls are visible */
.scrollbar-rail > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -25px; }
.scrollbar-rail > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -25px; }
.scrollbar-rail > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -25px; }
.scrollbar-rail > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -25px; }
/*************** SCROLLBAR DYNAMIC ***************/
.scrollbar-dynamic > .scroll-element,
.scrollbar-dynamic > .scroll-element div
{
background: none;
border: none;
margin: 0;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-dynamic > .scroll-element div {
display: block;
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-dynamic > .scroll-element.scroll-x {
bottom: 2px;
height: 7px;
left: 0;
min-width: 100%;
width: 100%;
}
.scrollbar-dynamic > .scroll-element.scroll-y {
height: 100%;
min-height: 100%;
right: 2px;
top: 0;
width: 7px;
}
.scrollbar-dynamic > .scroll-element .scroll-element_outer {
opacity: 0.3;
-webkit-border-radius: 12px;
-moz-border-radius: 12px;
border-radius: 12px;
}
.scrollbar-dynamic > .scroll-element .scroll-element_size {
background-color: #cccccc;
opacity: 0;
-webkit-border-radius: 12px;
-moz-border-radius: 12px;
border-radius: 12px;
-webkit-transition: opacity 0.2s;
-moz-transition: opacity 0.2s;
-o-transition: opacity 0.2s;
-ms-transition: opacity 0.2s;
transition: opacity 0.2s;
}
.scrollbar-dynamic > .scroll-element .scroll-bar {
background-color: #6c6e71;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
border-radius: 7px;
}
/* scrollbar height/width & offset from container borders */
.scrollbar-dynamic > .scroll-element.scroll-x .scroll-bar {
bottom: 0;
height: 7px;
min-width: 24px;
top: auto;
}
.scrollbar-dynamic > .scroll-element.scroll-y .scroll-bar {
left: auto;
min-height: 24px;
right: 0;
width: 7px;
}
.scrollbar-dynamic > .scroll-element.scroll-x .scroll-element_outer {
bottom: 0;
top: auto;
left: 2px;
-webkit-transition: height 0.2s;
-moz-transition: height 0.2s;
-o-transition: height 0.2s;
-ms-transition: height 0.2s;
transition: height 0.2s;
}
.scrollbar-dynamic > .scroll-element.scroll-y .scroll-element_outer {
left: auto;
right: 0;
top: 2px;
-webkit-transition: width 0.2s;
-moz-transition: width 0.2s;
-o-transition: width 0.2s;
-ms-transition: width 0.2s;
transition: width 0.2s;
}
.scrollbar-dynamic > .scroll-element.scroll-x .scroll-element_size { left: -4px; }
.scrollbar-dynamic > .scroll-element.scroll-y .scroll-element_size { top: -4px; }
/* update scrollbar offset if both scrolls are visible */
.scrollbar-dynamic > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -11px; }
.scrollbar-dynamic > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -11px; }
/* hover & drag */
.scrollbar-dynamic > .scroll-element:hover .scroll-element_outer,
.scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer {
overflow: hidden;
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
filter: alpha(opacity=70);
opacity: 0.7;
}
.scrollbar-dynamic > .scroll-element:hover .scroll-element_outer .scroll-element_size,
.scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer .scroll-element_size {
opacity: 1;
}
.scrollbar-dynamic > .scroll-element:hover .scroll-element_outer .scroll-bar,
.scrollbar-dynamic > .scroll-element.scroll-draggable .scroll-element_outer .scroll-bar {
height: 100%;
width: 100%;
-webkit-border-radius: 12px;
-moz-border-radius: 12px;
border-radius: 12px;
}
.scrollbar-dynamic > .scroll-element.scroll-x:hover .scroll-element_outer,
.scrollbar-dynamic > .scroll-element.scroll-x.scroll-draggable .scroll-element_outer {
height: 20px;
min-height: 7px;
}
.scrollbar-dynamic > .scroll-element.scroll-y:hover .scroll-element_outer,
.scrollbar-dynamic > .scroll-element.scroll-y.scroll-draggable .scroll-element_outer {
min-width: 7px;
width: 20px;
}
/*************** SCROLLBAR GOOGLE CHROME ***************/
.scrollbar-chrome > .scroll-element,
.scrollbar-chrome > .scroll-element div
{
border: none;
margin: 0;
overflow: hidden;
padding: 0;
position: absolute;
z-index: 10;
}
.scrollbar-chrome > .scroll-element {
background-color: #ffffff;
}
.scrollbar-chrome > .scroll-element div {
display: block;
height: 100%;
left: 0;
top: 0;
width: 100%;
}
.scrollbar-chrome > .scroll-element .scroll-element_outer {}
.scrollbar-chrome > .scroll-element .scroll-element_track {
background: #f1f1f1;
border: 1px solid #dbdbdb;
}
.scrollbar-chrome > .scroll-element.scroll-x {
bottom: 0;
height: 16px;
left: 0;
min-width: 100%;
width: 100%;
}
.scrollbar-chrome > .scroll-element.scroll-y {
height: 100%;
min-height: 100%;
right: 0;
top: 0;
width: 16px;
}
.scrollbar-chrome > .scroll-element .scroll-bar {
background-color: #d9d9d9;
border: 1px solid #bdbdbd;
cursor: default;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
}
.scrollbar-chrome > .scroll-element .scroll-bar:hover {
background-color: #c2c2c2;
border-color: #a9a9a9;
}
.scrollbar-chrome > .scroll-element.scroll-draggable .scroll-bar {
background-color: #919191;
border-color: #7e7e7e;
}
/* scrollbar height/width & offset from container borders */
.scrollbar-chrome > .scroll-content.scroll-scrolly_visible { left: -16px; margin-left: 16px; }
.scrollbar-chrome > .scroll-content.scroll-scrollx_visible { top: -16px; margin-top: 16px; }
.scrollbar-chrome > .scroll-element.scroll-x .scroll-bar { height: 8px; min-width: 10px; top: 3px; }
.scrollbar-chrome > .scroll-element.scroll-y .scroll-bar { left: 3px; min-height: 10px; width: 8px; }
.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_outer { border-left: 1px solid #dbdbdb; }
.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_track { height: 14px; left: -3px; }
.scrollbar-chrome > .scroll-element.scroll-x .scroll-element_size { height: 14px; left: -4px; }
.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_outer { border-top: 1px solid #dbdbdb; }
.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_track { top: -3px; width: 14px; }
.scrollbar-chrome > .scroll-element.scroll-y .scroll-element_size { top: -4px; width: 14px; }
/* update scrollbar offset if both scrolls are visible */
.scrollbar-chrome > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -19px; }
.scrollbar-chrome > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -19px; }
.scrollbar-chrome > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_track { left: -19px; }
.scrollbar-chrome > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_track { top: -19px; }

View File

@@ -0,0 +1,781 @@
/**
* jQuery CSS Customizable Scrollbar
*
* Copyright 2015, Yuriy Khabarov
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* If you found bug, please contact me via email <13real008@gmail.com>
*
* @author Yuriy Khabarov aka Gromo
* @version 0.2.10
* @url https://github.com/gromo/jquery.scrollbar/
*
*/
;
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else {
factory(root.jQuery);
}
}(this, function ($) {
'use strict';
// init flags & variables
var debug = false;
var browser = {
data: {
index: 0,
name: 'scrollbar'
},
macosx: /mac/i.test(navigator.platform),
mobile: /android|webos|iphone|ipad|ipod|blackberry/i.test(navigator.userAgent),
overlay: null,
scroll: null,
scrolls: [],
webkit: /webkit/i.test(navigator.userAgent) && !/edge\/\d+/i.test(navigator.userAgent)
};
browser.scrolls.add = function (instance) {
this.remove(instance).push(instance);
};
browser.scrolls.remove = function (instance) {
while ($.inArray(instance, this) >= 0) {
this.splice($.inArray(instance, this), 1);
}
return this;
};
var defaults = {
"autoScrollSize": true, // automatically calculate scrollsize
"autoUpdate": true, // update scrollbar if content/container size changed
"debug": false, // debug mode
"disableBodyScroll": false, // disable body scroll if mouse over container
"duration": 200, // scroll animate duration in ms
"ignoreMobile": false, // ignore mobile devices
"ignoreOverlay": false, // ignore browsers with overlay scrollbars (mobile, MacOS)
"scrollStep": 30, // scroll step for scrollbar arrows
"showArrows": false, // add class to show arrows
"stepScrolling": true, // when scrolling to scrollbar mousedown position
"scrollx": null, // horizontal scroll element
"scrolly": null, // vertical scroll element
"onDestroy": null, // callback function on destroy,
"onInit": null, // callback function on first initialization
"onScroll": null, // callback function on content scrolling
"onUpdate": null // callback function on init/resize (before scrollbar size calculation)
};
var BaseScrollbar = function (container) {
if (!browser.scroll) {
browser.overlay = isScrollOverlaysContent();
browser.scroll = getBrowserScrollSize();
updateScrollbars();
$(window).resize(function () {
var forceUpdate = false;
if (browser.scroll && (browser.scroll.height || browser.scroll.width)) {
var scroll = getBrowserScrollSize();
if (scroll.height !== browser.scroll.height || scroll.width !== browser.scroll.width) {
browser.scroll = scroll;
forceUpdate = true; // handle page zoom
}
}
updateScrollbars(forceUpdate);
});
}
this.container = container;
this.namespace = '.scrollbar_' + browser.data.index++;
this.options = $.extend({}, defaults, window.jQueryScrollbarOptions || {});
this.scrollTo = null;
this.scrollx = {};
this.scrolly = {};
container.data(browser.data.name, this);
browser.scrolls.add(this);
};
BaseScrollbar.prototype = {
destroy: function () {
if (!this.wrapper) {
return;
}
this.container.removeData(browser.data.name);
browser.scrolls.remove(this);
// init variables
var scrollLeft = this.container.scrollLeft();
var scrollTop = this.container.scrollTop();
this.container.insertBefore(this.wrapper).css({
"height": "",
"margin": "",
"max-height": ""
})
.removeClass('scroll-content scroll-scrollx_visible scroll-scrolly_visible')
.off(this.namespace)
.scrollLeft(scrollLeft)
.scrollTop(scrollTop);
this.scrollx.scroll.removeClass('scroll-scrollx_visible').find('div').andSelf().off(this.namespace);
this.scrolly.scroll.removeClass('scroll-scrolly_visible').find('div').andSelf().off(this.namespace);
this.wrapper.remove();
$(document).add('body').off(this.namespace);
if ($.isFunction(this.options.onDestroy)){
this.options.onDestroy.apply(this, [this.container]);
}
},
init: function (options) {
// init variables
var S = this,
c = this.container,
cw = this.containerWrapper || c,
namespace = this.namespace,
o = $.extend(this.options, options || {}),
s = {x: this.scrollx, y: this.scrolly},
w = this.wrapper;
var initScroll = {
"scrollLeft": c.scrollLeft(),
"scrollTop": c.scrollTop()
};
// do not init if in ignorable browser
if ((browser.mobile && o.ignoreMobile)
|| (browser.overlay && o.ignoreOverlay)
|| (browser.macosx && !browser.webkit) // still required to ignore nonWebKit browsers on Mac
) {
return false;
}
// init scroll container
if (!w) {
this.wrapper = w = $('<div>').addClass('scroll-wrapper').addClass(c.attr('class'))
.css('position', c.css('position') == 'absolute' ? 'absolute' : 'relative')
.insertBefore(c).append(c);
if (c.is('textarea')) {
this.containerWrapper = cw = $('<div>').insertBefore(c).append(c);
w.addClass('scroll-textarea');
}
cw.addClass('scroll-content').css({
"height": "auto",
"margin-bottom": browser.scroll.height * -1 + 'px',
"margin-right": browser.scroll.width * -1 + 'px',
"max-height": ""
});
c.on('scroll' + namespace, function (event) {
if ($.isFunction(o.onScroll)) {
o.onScroll.call(S, {
"maxScroll": s.y.maxScrollOffset,
"scroll": c.scrollTop(),
"size": s.y.size,
"visible": s.y.visible
}, {
"maxScroll": s.x.maxScrollOffset,
"scroll": c.scrollLeft(),
"size": s.x.size,
"visible": s.x.visible
});
}
s.x.isVisible && s.x.scroll.bar.css('left', c.scrollLeft() * s.x.kx + 'px');
s.y.isVisible && s.y.scroll.bar.css('top', c.scrollTop() * s.y.kx + 'px');
});
/* prevent native scrollbars to be visible on #anchor click */
w.on('scroll' + namespace, function () {
w.scrollTop(0).scrollLeft(0);
});
if (o.disableBodyScroll) {
var handleMouseScroll = function (event) {
isVerticalScroll(event) ?
s.y.isVisible && s.y.mousewheel(event) :
s.x.isVisible && s.x.mousewheel(event);
};
w.on('MozMousePixelScroll' + namespace, handleMouseScroll);
w.on('mousewheel' + namespace, handleMouseScroll);
if (browser.mobile) {
w.on('touchstart' + namespace, function (event) {
var touch = event.originalEvent.touches && event.originalEvent.touches[0] || event;
var originalTouch = {
"pageX": touch.pageX,
"pageY": touch.pageY
};
var originalScroll = {
"left": c.scrollLeft(),
"top": c.scrollTop()
};
$(document).on('touchmove' + namespace, function (event) {
var touch = event.originalEvent.targetTouches && event.originalEvent.targetTouches[0] || event;
c.scrollLeft(originalScroll.left + originalTouch.pageX - touch.pageX);
c.scrollTop(originalScroll.top + originalTouch.pageY - touch.pageY);
event.preventDefault();
});
$(document).on('touchend' + namespace, function () {
$(document).off(namespace);
});
});
}
}
if ($.isFunction(o.onInit)){
o.onInit.apply(this, [c]);
}
} else {
cw.css({
"height": "auto",
"margin-bottom": browser.scroll.height * -1 + 'px',
"margin-right": browser.scroll.width * -1 + 'px',
"max-height": ""
});
}
// init scrollbars & recalculate sizes
$.each(s, function (d, scrollx) {
var scrollCallback = null;
var scrollForward = 1;
var scrollOffset = (d === 'x') ? 'scrollLeft' : 'scrollTop';
var scrollStep = o.scrollStep;
var scrollTo = function () {
var currentOffset = c[scrollOffset]();
c[scrollOffset](currentOffset + scrollStep);
if (scrollForward == 1 && (currentOffset + scrollStep) >= scrollToValue)
currentOffset = c[scrollOffset]();
if (scrollForward == -1 && (currentOffset + scrollStep) <= scrollToValue)
currentOffset = c[scrollOffset]();
if (c[scrollOffset]() == currentOffset && scrollCallback) {
scrollCallback();
}
}
var scrollToValue = 0;
if (!scrollx.scroll) {
scrollx.scroll = S._getScroll(o['scroll' + d]).addClass('scroll-' + d);
if(o.showArrows){
scrollx.scroll.addClass('scroll-element_arrows_visible');
}
scrollx.mousewheel = function (event) {
if (!scrollx.isVisible || (d === 'x' && isVerticalScroll(event))) {
return true;
}
if (d === 'y' && !isVerticalScroll(event)) {
s.x.mousewheel(event);
return true;
}
var delta = event.originalEvent.wheelDelta * -1 || event.originalEvent.detail;
var maxScrollValue = scrollx.size - scrollx.visible - scrollx.offset;
if ((delta > 0 && scrollToValue < maxScrollValue) || (delta < 0 && scrollToValue > 0)) {
scrollToValue = scrollToValue + delta;
if (scrollToValue < 0)
scrollToValue = 0;
if (scrollToValue > maxScrollValue)
scrollToValue = maxScrollValue;
S.scrollTo = S.scrollTo || {};
S.scrollTo[scrollOffset] = scrollToValue;
setTimeout(function () {
if (S.scrollTo) {
c.stop().animate(S.scrollTo, 240, 'linear', function () {
scrollToValue = c[scrollOffset]();
});
S.scrollTo = null;
}
}, 1);
}
event.preventDefault();
return false;
};
scrollx.scroll
.on('MozMousePixelScroll' + namespace, scrollx.mousewheel)
.on('mousewheel' + namespace, scrollx.mousewheel)
.on('mouseenter' + namespace, function () {
scrollToValue = c[scrollOffset]();
});
// handle arrows & scroll inner mousedown event
scrollx.scroll.find('.scroll-arrow, .scroll-element_track')
.on('mousedown' + namespace, function (event) {
if (event.which != 1) // lmb
return true;
scrollForward = 1;
var data = {
"eventOffset": event[(d === 'x') ? 'pageX' : 'pageY'],
"maxScrollValue": scrollx.size - scrollx.visible - scrollx.offset,
"scrollbarOffset": scrollx.scroll.bar.offset()[(d === 'x') ? 'left' : 'top'],
"scrollbarSize": scrollx.scroll.bar[(d === 'x') ? 'outerWidth' : 'outerHeight']()
};
var timeout = 0, timer = 0;
if ($(this).hasClass('scroll-arrow')) {
scrollForward = $(this).hasClass("scroll-arrow_more") ? 1 : -1;
scrollStep = o.scrollStep * scrollForward;
scrollToValue = scrollForward > 0 ? data.maxScrollValue : 0;
} else {
scrollForward = (data.eventOffset > (data.scrollbarOffset + data.scrollbarSize) ? 1
: (data.eventOffset < data.scrollbarOffset ? -1 : 0));
scrollStep = Math.round(scrollx.visible * 0.75) * scrollForward;
scrollToValue = (data.eventOffset - data.scrollbarOffset -
(o.stepScrolling ? (scrollForward == 1 ? data.scrollbarSize : 0)
: Math.round(data.scrollbarSize / 2)));
scrollToValue = c[scrollOffset]() + (scrollToValue / scrollx.kx);
}
S.scrollTo = S.scrollTo || {};
S.scrollTo[scrollOffset] = o.stepScrolling ? c[scrollOffset]() + scrollStep : scrollToValue;
if (o.stepScrolling) {
scrollCallback = function () {
scrollToValue = c[scrollOffset]();
clearInterval(timer);
clearTimeout(timeout);
timeout = 0;
timer = 0;
};
timeout = setTimeout(function () {
timer = setInterval(scrollTo, 40);
}, o.duration + 100);
}
setTimeout(function () {
if (S.scrollTo) {
c.animate(S.scrollTo, o.duration);
S.scrollTo = null;
}
}, 1);
return S._handleMouseDown(scrollCallback, event);
});
// handle scrollbar drag'n'drop
scrollx.scroll.bar.on('mousedown' + namespace, function (event) {
if (event.which != 1) // lmb
return true;
var eventPosition = event[(d === 'x') ? 'pageX' : 'pageY'];
var initOffset = c[scrollOffset]();
scrollx.scroll.addClass('scroll-draggable');
$(document).on('mousemove' + namespace, function (event) {
var diff = parseInt((event[(d === 'x') ? 'pageX' : 'pageY'] - eventPosition) / scrollx.kx, 10);
c[scrollOffset](initOffset + diff);
});
return S._handleMouseDown(function () {
scrollx.scroll.removeClass('scroll-draggable');
scrollToValue = c[scrollOffset]();
}, event);
});
}
});
// remove classes & reset applied styles
$.each(s, function (d, scrollx) {
var scrollClass = 'scroll-scroll' + d + '_visible';
var scrolly = (d == "x") ? s.y : s.x;
scrollx.scroll.removeClass(scrollClass);
scrolly.scroll.removeClass(scrollClass);
cw.removeClass(scrollClass);
});
// calculate init sizes
$.each(s, function (d, scrollx) {
$.extend(scrollx, (d == "x") ? {
"offset": parseInt(c.css('left'), 10) || 0,
"size": c.prop('scrollWidth'),
"visible": w.width()
} : {
"offset": parseInt(c.css('top'), 10) || 0,
"size": c.prop('scrollHeight'),
"visible": w.height()
});
});
// update scrollbar visibility/dimensions
this._updateScroll('x', this.scrollx);
this._updateScroll('y', this.scrolly);
if ($.isFunction(o.onUpdate)){
o.onUpdate.apply(this, [c]);
}
// calculate scroll size
$.each(s, function (d, scrollx) {
var cssOffset = (d === 'x') ? 'left' : 'top';
var cssFullSize = (d === 'x') ? 'outerWidth' : 'outerHeight';
var cssSize = (d === 'x') ? 'width' : 'height';
var offset = parseInt(c.css(cssOffset), 10) || 0;
var AreaSize = scrollx.size;
var AreaVisible = scrollx.visible + offset;
var scrollSize = scrollx.scroll.size[cssFullSize]() + (parseInt(scrollx.scroll.size.css(cssOffset), 10) || 0);
if (o.autoScrollSize) {
scrollx.scrollbarSize = parseInt(scrollSize * AreaVisible / AreaSize, 10);
scrollx.scroll.bar.css(cssSize, scrollx.scrollbarSize + 'px');
}
scrollx.scrollbarSize = scrollx.scroll.bar[cssFullSize]();
scrollx.kx = ((scrollSize - scrollx.scrollbarSize) / (AreaSize - AreaVisible)) || 1;
scrollx.maxScrollOffset = AreaSize - AreaVisible;
});
c.scrollLeft(initScroll.scrollLeft).scrollTop(initScroll.scrollTop).trigger('scroll');
},
/**
* Get scrollx/scrolly object
*
* @param {Mixed} scroll
* @returns {jQuery} scroll object
*/
_getScroll: function (scroll) {
var types = {
advanced: [
'<div class="scroll-element">',
'<div class="scroll-element_corner"></div>',
'<div class="scroll-arrow scroll-arrow_less"></div>',
'<div class="scroll-arrow scroll-arrow_more"></div>',
'<div class="scroll-element_outer">',
'<div class="scroll-element_size"></div>', // required! used for scrollbar size calculation !
'<div class="scroll-element_inner-wrapper">',
'<div class="scroll-element_inner scroll-element_track">', // used for handling scrollbar click
'<div class="scroll-element_inner-bottom"></div>',
'</div>',
'</div>',
'<div class="scroll-bar">', // required
'<div class="scroll-bar_body">',
'<div class="scroll-bar_body-inner"></div>',
'</div>',
'<div class="scroll-bar_bottom"></div>',
'<div class="scroll-bar_center"></div>',
'</div>',
'</div>',
'</div>'
].join(''),
simple: [
'<div class="scroll-element">',
'<div class="scroll-element_outer">',
'<div class="scroll-element_size"></div>', // required! used for scrollbar size calculation !
'<div class="scroll-element_track"></div>', // used for handling scrollbar click
'<div class="scroll-bar"></div>', // required
'</div>',
'</div>'
].join('')
};
if (types[scroll]) {
scroll = types[scroll];
}
if (!scroll) {
scroll = types['simple'];
}
if (typeof (scroll) == 'string') {
scroll = $(scroll).appendTo(this.wrapper);
} else {
scroll = $(scroll);
}
$.extend(scroll, {
bar: scroll.find('.scroll-bar'),
size: scroll.find('.scroll-element_size'),
track: scroll.find('.scroll-element_track')
});
return scroll;
},
_handleMouseDown: function(callback, event) {
var namespace = this.namespace;
$(document).on('blur' + namespace, function () {
$(document).add('body').off(namespace);
callback && callback();
});
$(document).on('dragstart' + namespace, function (event) {
event.preventDefault();
return false;
});
$(document).on('mouseup' + namespace, function () {
$(document).add('body').off(namespace);
callback && callback();
});
$('body').on('selectstart' + namespace, function (event) {
event.preventDefault();
return false;
});
event && event.preventDefault();
return false;
},
_updateScroll: function (d, scrollx) {
var container = this.container,
containerWrapper = this.containerWrapper || container,
scrollClass = 'scroll-scroll' + d + '_visible',
scrolly = (d === 'x') ? this.scrolly : this.scrollx,
offset = parseInt(this.container.css((d === 'x') ? 'left' : 'top'), 10) || 0,
wrapper = this.wrapper;
var AreaSize = scrollx.size;
var AreaVisible = scrollx.visible + offset;
scrollx.isVisible = (AreaSize - AreaVisible) > 1; // bug in IE9/11 with 1px diff
if (scrollx.isVisible) {
scrollx.scroll.addClass(scrollClass);
scrolly.scroll.addClass(scrollClass);
containerWrapper.addClass(scrollClass);
} else {
scrollx.scroll.removeClass(scrollClass);
scrolly.scroll.removeClass(scrollClass);
containerWrapper.removeClass(scrollClass);
}
if (d === 'y') {
if(container.is('textarea') || AreaSize < AreaVisible){
containerWrapper.css({
"height": (AreaVisible + browser.scroll.height) + 'px',
"max-height": "none"
});
} else {
containerWrapper.css({
//"height": "auto", // do not reset height value: issue with height:100%!
"max-height": (AreaVisible + browser.scroll.height) + 'px'
});
}
}
if (scrollx.size != container.prop('scrollWidth')
|| scrolly.size != container.prop('scrollHeight')
|| scrollx.visible != wrapper.width()
|| scrolly.visible != wrapper.height()
|| scrollx.offset != (parseInt(container.css('left'), 10) || 0)
|| scrolly.offset != (parseInt(container.css('top'), 10) || 0)
) {
$.extend(this.scrollx, {
"offset": parseInt(container.css('left'), 10) || 0,
"size": container.prop('scrollWidth'),
"visible": wrapper.width()
});
$.extend(this.scrolly, {
"offset": parseInt(container.css('top'), 10) || 0,
"size": this.container.prop('scrollHeight'),
"visible": wrapper.height()
});
this._updateScroll(d === 'x' ? 'y' : 'x', scrolly);
}
}
};
var CustomScrollbar = BaseScrollbar;
/*
* Extend jQuery as plugin
*
* @param {Mixed} command to execute
* @param {Mixed} arguments as Array
* @return {jQuery}
*/
$.fn.scrollbar = function (command, args) {
if (typeof command !== 'string') {
args = command;
command = 'init';
}
if (typeof args === 'undefined') {
args = [];
}
if (!$.isArray(args)) {
args = [args];
}
this.not('body, .scroll-wrapper').each(function () {
var element = $(this),
instance = element.data(browser.data.name);
if (instance || command === 'init') {
if (!instance) {
instance = new CustomScrollbar(element);
}
if (instance[command]) {
instance[command].apply(instance, args);
}
}
});
return this;
};
/**
* Connect default options to global object
*/
$.fn.scrollbar.options = defaults;
/**
* Check if scroll content/container size is changed
*/
var updateScrollbars = (function () {
var timer = 0,
timerCounter = 0;
return function (force) {
var i, container, options, scroll, wrapper, scrollx, scrolly;
for (i = 0; i < browser.scrolls.length; i++) {
scroll = browser.scrolls[i];
container = scroll.container;
options = scroll.options;
wrapper = scroll.wrapper;
scrollx = scroll.scrollx;
scrolly = scroll.scrolly;
if (force || (options.autoUpdate && wrapper && wrapper.is(':visible') &&
(container.prop('scrollWidth') != scrollx.size || container.prop('scrollHeight') != scrolly.size || wrapper.width() != scrollx.visible || wrapper.height() != scrolly.visible))) {
scroll.init();
if (options.debug) {
window.console && console.log({
scrollHeight: container.prop('scrollHeight') + ':' + scroll.scrolly.size,
scrollWidth: container.prop('scrollWidth') + ':' + scroll.scrollx.size,
visibleHeight: wrapper.height() + ':' + scroll.scrolly.visible,
visibleWidth: wrapper.width() + ':' + scroll.scrollx.visible
}, true);
timerCounter++;
}
}
}
if (debug && timerCounter > 10) {
window.console && console.log('Scroll updates exceed 10');
updateScrollbars = function () {};
} else {
clearTimeout(timer);
timer = setTimeout(updateScrollbars, 300);
}
};
})();
/* ADDITIONAL FUNCTIONS */
/**
* Get native browser scrollbar size (height/width)
*
* @param {Boolean} actual size or CSS size, default - CSS size
* @returns {Object} with height, width
*/
function getBrowserScrollSize(actualSize) {
if (browser.webkit && !actualSize) {
return {
"height": 0,
"width": 0
};
}
if (!browser.data.outer) {
var css = {
"border": "none",
"box-sizing": "content-box",
"height": "200px",
"margin": "0",
"padding": "0",
"width": "200px"
};
browser.data.inner = $("<div>").css($.extend({}, css));
browser.data.outer = $("<div>").css($.extend({
"left": "-1000px",
"overflow": "scroll",
"position": "absolute",
"top": "-1000px"
}, css)).append(browser.data.inner).appendTo("body");
}
browser.data.outer.scrollLeft(1000).scrollTop(1000);
return {
"height": Math.ceil((browser.data.outer.offset().top - browser.data.inner.offset().top) || 0),
"width": Math.ceil((browser.data.outer.offset().left - browser.data.inner.offset().left) || 0)
};
}
/**
* Check if native browser scrollbars overlay content
*
* @returns {Boolean}
*/
function isScrollOverlaysContent() {
var scrollSize = getBrowserScrollSize(true);
return !(scrollSize.height || scrollSize.width);
}
function isVerticalScroll(event) {
var e = event.originalEvent;
if (e.axis && e.axis === e.HORIZONTAL_AXIS)
return false;
if (e.wheelDeltaX)
return false;
return true;
}
/**
* Extend AngularJS as UI directive
* and expose a provider for override default config
*
*/
if (window.angular) {
(function (angular) {
angular.module('jQueryScrollbar', [])
.provider('jQueryScrollbar', function () {
var defaultOptions = defaults;
return {
setOptions: function (options) {
angular.extend(defaultOptions, options);
},
$get: function () {
return {
options: angular.copy(defaultOptions)
};
}
};
})
.directive('jqueryScrollbar', ['jQueryScrollbar', '$parse', function (jQueryScrollbar, $parse) {
return {
"restrict": "AC",
"link": function (scope, element, attrs) {
var model = $parse(attrs.jqueryScrollbar),
options = model(scope);
element.scrollbar(options || jQueryScrollbar.options)
.on('$destroy', function () {
element.scrollbar('destroy');
});
}
};
}]);
})(window.angular);
}
}));