Browse Source
- Only Basilisk wallet widgets are activated first - wallet widgets populate dynamically as coins are active - addresses list is updated in each wallet widgetmaster
Satinder Grewal
9 years ago
7 changed files with 1774 additions and 293 deletions
@ -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; } |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -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); |
|||
} |
|||
})); |
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 15 KiB |
Loading…
Reference in new issue