自定义滚动条3.0

  1. 支持任意形式(包括图片自定义)的美化扩展,跨浏览器支持
  2. 支持鼠标按住上、下箭按钮实现上下滚动
  3. 支持鼠标滚轮放于“滚动条区”滚动,而不仅限放于滚动内容区才滚
  4. 支持鼠标按住滚动条(未松开)并移出滚动区域仍然能拖拽滚动
  5. 滚动条子根据左边滚动内容高与可视区域高度比例等比例,且当滚动条细到一定程度时设置最小高度值,内容过少时隐藏滚动条子
  6. 支持鼠标在滚动条子的上下空白区间点击实现上、下定位滚动(模拟windows滚动条)
  7. 支持键盘上下方向键,滚动区滚完之后才轮到页面body滚
  8. 支持页面刷新后保留滚动条滚动位置(需浏览器支持或打开cookie)
  9. 鼠标放于自定义滚动区滚动滚轮,滚动区滚完之后才轮到页面body滚
  10. 在原来几个版本基础上代码重构,这回只需在渲染的div里追加一个名为"dumascroll" 的class即可自动渲染,而不设此class的不受影响
  11. 修复了以往版本所发现的bug:以往版本
将来版本可继续扩展的功能有
1、增加空格键的“下方向”快速滚动支持(更好地模拟windows滚动条用户体验)
2、增加页面body的渲染支持
3、增加textarea的渲染支持
4、增加嵌套div的渲染支持(目前代码嵌套时有滚动的bug,被嵌套的div的滚动高度算法到这个版本时将大幅修改)
5、增加同时出现横向滚动条的支持(当有这方面需求时可以扩展)

演示:

* { margin:0; padding:0; }
body { margin:20px 0 400px 20px; font:12px Arial; }
h1 { font-size:14px; }
ol,ul { margin:20px; line-height:160%; }
ul li { color:#f00; }
.a1 { width:300px; height:190px; border:1px solid #f00; overflow:auto; }
.a2 { width:600px; height:350px; margin:100px 0 100px 80px; border:1px solid #369; background:#eee url(http://www.blueidea.com/articleimg/2009/07/6875/duma.gif) no-repeat 50%; overflow:auto; }
.dumascroll {} /*只需对需要渲染滚动条的div设置该class即可*/
.dumascroll_area {
height:100%;
overflow:hidden;
}
.dumascroll_bar,.dumascroll_handle,.dumascroll_handle_a,.dumascroll_arrow_up,.dumascroll_arrow_up_a,.dumascroll_arrow_down,.dumascroll_arrow_down_a {
background-image:url(http://www.blueidea.com/articleimg/2009/07/6875/un_bg_bar.gif);
}
.dumascroll_bar {
position:absolute;
top:0;
right:0;
z-index:9;
width:14px;
height:100%;
cursor:default;
-moz-user-select:none;
-khtml-user-select:none;
user-select:none;
background-repeat:repeat-y;
background-position:-42px 0;
float:left;
}
.dumascroll_arrow_up,.dumascroll_arrow_up_a,.dumascroll_handle,.dumascroll_handle_a,.dumascroll_arrow_down,.dumascroll_arrow_down_a {
position:absolute;
left:0;
}
.dumascroll_arrow_up,.dumascroll_arrow_up_a,.dumascroll_arrow_down,.dumascroll_arrow_down_a {
width:100%;
height:14px;
color:#fff;
text-align:center;
}
.dumascroll_arrow_up,.dumascroll_arrow_up_a { top:0; }
.dumascroll_arrow_down,.dumascroll_arrow_down_a { bottom:0; }
.dumascroll_handle,.dumascroll_handle_a { width:100%; background-repeat:repeat-y; }
.dumascroll_arrow_up { background-position:0 0; }
.dumascroll_arrow_up_a { background-position:-14px 0; }
.dumascroll_handle { background-position:-28px 0; }
.dumascroll_handle_a { background-position:-56px 0; }
.dumascroll_arrow_down { background-position:-70px 0; }
.dumascroll_arrow_down_a { background-position:-84px 0; }

var duma = {
$:function(o){ if(document.getElementById(o)) {return document.getElementById(o);} },
getStyle:function(o) { return o.currentStyle||document.defaultView.getComputedStyle(o,null); },
getOffset:function(o) {
var t = o.offsetTop,h = o.offsetHeight;
while(o = o.offsetParent) { t += o.offsetTop; }
return { top:t, height:h };
},
bind:function(o,eType,fn) {
if(o.addEventListener) { o.addEventListener(eType,fn,false); }
else if(o.attachEvent) { o.attachEvent("on" + eType,fn); }
else { o["on" + eType] = fn; }
},
stopEvent:function(e) {
e = e || window.event;
e.stopPropagation && (e.preventDefault(),e.stopPropagation()) || (e.cancelBubble = true,e.returnValue = false);
},
setCookie:function(c_name,value,expiredays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays);
document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
},
getCookie:function(c_name) {
if(document.cookie.length > 0) {
c_start = document.cookie.indexOf(c_name + "=");
if(c_start != -1) {
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";",c_start);
if(c_end == -1) { c_end = document.cookie.length; }
return unescape(document.cookie.substring(c_start,c_end));
}
}
return "";
}
};
duma.BeautifyScrollBar = function(obj,arrowUpCss,arrowUpActiveCss,handleCss,handleActiveCss,arrowDownCss,arrowDownActiveCss) {
this.arrowUpInterval;
this.arrowDownInterval;
this.barMouseDownInterval;
this.relY;
this.id = obj;
this.obj = duma.$(this.id);
this.setObjCss(); //预先设置父容器的css定位才能让接下来的属性设置起作用
this.obj.innerHTML = '

' + this.obj.innerHTML + '

';
this.area = duma.$(obj + "Area");
this.bar = duma.$(obj + "Bar");
this.barPos;
this.arrowUp = this.bar.getElementsByTagName("div")[0];
this.arrowUpCss = arrowUpCss;
this.arrowUpActiveCss = arrowUpActiveCss;
this.handle = this.bar.getElementsByTagName("div")[1];
this.handleCss = handleCss;
this.handleActiveCss = handleActiveCss;
this.arrowDown = this.bar.getElementsByTagName("div")[2];
this.arrowDownCss = arrowDownCss;
this.arrowDownActiveCss = arrowDownActiveCss;
this.handleMinHeight = 15;
this.arrowUpHeight = parseInt(duma.getStyle(this.arrowUp).height);
this.arrowDownHeight = parseInt(duma.getStyle(this.arrowDown).height);
this.areaScrollHeight = this.area.scrollHeight;
this.handleHeight = parseInt(this.area.offsetHeight/this.area.scrollHeight * (this.bar.offsetHeight - this.arrowUpHeight - this.arrowDownHeight));
}
duma.BeautifyScrollBar.prototype = {
setObjCss:function() {
duma.getStyle(this.obj).position == "static" ? this.obj.style.position = "relative" : duma.getStyle(this.obj).backgroundColor == "transparent" ? this.obj.style.backgroundColor = "#fff" : null; //若容器本来就没有设position,则初始化为relative;若容器原来未设置背景色,则初始化为白色;
},
sethandle:function() { //当内容超多时设置拖拽条子的最小高度
this.handle.style.top = this.arrowUpHeight + "px";
if(this.handleHeight > this.handleMinHeight) {
this.handleHeight 0 && that.area.scrollTop 0 ? this.area.scrollTop -= 80 : this.area.scrollTop += 80; //步长设80像素比较接近window滚动条的滚动速度
if(this.area.scrollTop > 0 && this.area.scrollTop hOffset.top + hOffset.height) { this.barMouseDownInterval = setInterval(function(){
that.area.scrollTop += that.area.offsetHeight;
if(that.area.scrollTop >= (eY + documentScrollTop - bOffset.top - that.arrowUpHeight - hOffset.height)/(that.bar.offsetHeight - that.arrowUpHeight - that.arrowDownHeight) * that.area.scrollHeight) { that.clearBarMouseDownInterval(); }
that.setBarPos();
},80); }
duma.stopEvent(e);
},
arrowUpMouseDown:function(e) {
var that = this;
this.arrowUpInterval = setInterval(function(){ that.area.scrollTop -= 25; that.setBarPos(); },10);
this.arrowUp.className = this.arrowUpActiveCss;
duma.stopEvent(e);
},
arrowUpMouseUp:function() { this.clearArrowUpInterval(); this.arrowUp.className = this.arrowUpCss; },
arrowUpMouseOut:function() { this.clearArrowUpInterval(); this.arrowUp.className = this.arrowUpCss; },
arrowDownMouseDown:function(e) {
var that = this;
this.arrowDownInterval = setInterval(function(){ that.area.scrollTop += 25; that.setBarPos(); },10);
this.arrowDown.className = this.arrowDownActiveCss;
duma.stopEvent(e);
},
arrowDownMouseUp:function() { this.clearArrowDownInterval(); this.arrowDown.className = this.arrowDownCss; },
arrowDownMouseOut:function() { this.clearArrowDownInterval(); this.arrowDown.className = this.arrowDownCss; },
run:function(){
var that = this;
this.sethandle();
this.areaScroll();
this.getBarPos();
this.area.onscroll = function(){that.areaScroll()};
this.area.onmouseover = this.bar.onmouseover = function(event){that.areakeydown(event)};
this.area.onmouseout = this.bar.onmouseout = function(){document.onkeydown = null};
this.handle.onmousedown = function(event){that.handleMouseDown(event)};
this.bar.onmousedown = function(event){that.barDown(event)};
this.bar.onmouseup = function(){that.clearBarMouseDownInterval()};
this.bar.onmouseout = function(){that.clearBarMouseDownInterval()};
this.arrowUp.onmousedown = function(event){that.arrowUpMouseDown(event)};
this.arrowUp.onmouseup = function(){that.arrowUpMouseUp()};
this.arrowUp.onmouseout = function(){that.arrowUpMouseOut()};
this.arrowDown.onmousedown = function(event){that.arrowDownMouseDown(event)};
this.arrowDown.onmouseup = function(){that.arrowDownMouseUp()};
this.arrowDown.onmouseout = function(){that.arrowDownMouseOut()};
duma.bind(this.obj,"mousewheel",function(event){that.barScroll(event)});
duma.bind(this.obj,"DOMMouseScroll",function(event){that.barScroll(event)});
}
}
duma.BeautifyScrollBar.init = function() {
var o = document.getElementsByTagName("div"),
oLen = o.length,
dumascrollClass = /\bdumascroll\b/,
oArr = [],
oArrLen = oArr.length;
for(var i=0; i

我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸
我是第一个被渲染的,真不幸

我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!

我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!
我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!
我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!
我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!
我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!
我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!
被渲染,我就不用你的class,拿我怎么样?哈哈哈!
我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!
我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!
我还是普通的,我不希望被渲染,我就不用你的class,拿我怎么样?哈哈哈!

22222

真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555
真倒霉啊,俺还是被嵌套渲染的,555555

笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧
笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧
笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧
笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧
笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧
笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧
笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧
笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧
笨哟你,嵌套就嵌套,你不用他class就不会被渲染,你看看我,羡慕吧

11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111
fsdfs
11111111

图片自定义滚动条3.0(Duma"自动渲染版",也许世间万物都会变,但是真挚的爱,却永远留存在心中!)

  1. 支持任意形式(包括图片自定义)的美化扩展,跨浏览器支持
  2. 支持鼠标按住上、下箭按钮实现上下滚动
  3. 支持鼠标滚轮放于"滚动条区"滚动,而不仅限放于滚动内容区才滚
  4. 支持鼠标按住滚动条(未松开)并移出滚动区域仍然能拖拽滚动
  5. 滚动条子根据左边滚动内容高与可视区域高度比例等比例,且当滚动条细到一定程度时设置最小高度值,内容过少时隐藏滚动条子
  6. 支持鼠标在滚动条子的上下空白区间点击实现上、下定位滚动(模拟windows滚动条)
  7. 支持键盘上下方向键,滚动区滚完之后才轮到页面body滚
  8. 支持页面刷新后保留滚动条滚动位置(需浏览器支持或打开cookie)
  9. 鼠标放于自定义滚动区滚动滚轮,滚动区滚完之后才轮到页面body滚
  10. 在原来几个版本基础上代码重构,这回只需在渲染的div里追加一个名为"dumascroll" 的class即可自动渲染,而不设此class的不受影响
  11. 修复了以往版本所发现的bug:以往版本

将来版本可继续扩展的功能有:

  • 增加空格键的"下方向"快速滚动支持(更好地模拟windows滚动条用户体验)
  • 增加页面body的渲染支持
  • 增加textarea的渲染支持
  • 增加嵌套div的渲染支持(目前代码嵌套时有滚动的bug,被嵌套的div的滚动高度算法到这个版本时将大幅修改)
  • 增加同时出现横向滚动条的支持(当有这方面需求时可以扩展)

期待大家帮忙寻找新bug并提出宝贵建议,相信下一版本将做的更好,谢谢(QQ:149561420,gTalk:dumachuixuf@gmail.com)。

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

(0)

相关推荐

  • 自定义滚动条3.0

    支持任意形式(包括图片自定义)的美化扩展,跨浏览器支持 支持鼠标按住上.下箭按钮实现上下滚动 支持鼠标滚轮放于"滚动条区"滚动,而不仅限放于滚动内容区才滚 支持鼠标按住滚动条(未松开)并移出滚动区域仍然能拖拽滚动 滚动条子根据左边滚动内容高与可视区域高度比例等比例,且当滚动条细到一定程度时设置最小高度值,内容过少时隐藏滚动条子 支持鼠标在滚动条子的上下空白区间点击实现上.下定位滚动(模拟windows滚动条) 支持键盘上下方向键,滚动区滚完之后才轮到页面body滚 支持页面刷新后保留滚

  • JavaScript限定范围拖拽及自定义滚动条应用(3)

    两个对象:div1 和 div2,其中div1是div2的父元素,div2只能在div1的范围内拖拽 图中,红点是鼠标的位置,两个绿色箭头相减的结果就是disX,最后oEvent.clientX - disX 就是绿色箭头的部分,这个长度就是判断是否"出格"的依据,也就是这个短的绿色箭头范围应该在0 ~ div2.offsetWidth - div1.offsetWidth之间! <!DOCTYPE html> <html> <head> <m

  • JS实现的页面自定义滚动条效果

    本文实例讲述了JS实现的页面自定义滚动条效果.分享给大家供大家参考,具体如下: 这里演示网页上用的滚动条效果,是一个自定义的滚动条代码,除了上下两个箭头以外,滚动条和一般的浏览器基本差不多,鼠标滚轮滚动,滚动条滚动.html结构很简单,mainBox是外层div,content是内容,滚动条div是js动态生成的. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-web-zdy-scroll-style-codes/ 具体代码如下: <!D

  • 原生JS实现自定义滚动条效果

    本文实例为大家分享了JS实现自定义滚动条的具体代码,供大家参考,具体内容如下 实现思路: 1.外层设置一个div,在外层的div里面设置一个特别高的div(高度为外层5个div的高度),在高的div里面设置5个div,每个div的高度,都和父级的高度相同 2.在外层div的右侧边框以里自定义一个滚动条,(本人用div设置样式作为滚动条) 3.最外层的div添加onmousewheel事件,使用e.wheelDelta来获取每次滑动的距离,若为正数则向上滑动,将每次增加的数,赋给滚动条的top值,

  • JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴

    这是我自己做的一个轮播图,大家可以看看 ,我还没进行优化.有改进的地方可以私聊 布局什么的你们自己搞定吧 <div class="slider" id="circle"> <a href=""><img src="img/6p.jpg" alt="" /></a> ` <ul class="circle" > <li on

  • jQuery实现的自定义滚动条实例详解

    本文实例讲述了jQuery实现的自定义滚动条.分享给大家供大家参考,具体如下: 可以自由的给滚动条定义背景,上下按钮,当然不仅仅是颜色,连图片当背景也可以.支持鼠标滚轮,点击滚动条滚轴定位,上下按钮久按加速,兼容 ie,firefox,chrome. 调用方法: $("#a").jscroll(); demo: <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset=

  • jquery自定义滚动条插件示例分享

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="

  • jQuery自定义滚动条完整实例

    本文实例讲述了jQuery自定义滚动条实现方法.分享给大家供大家参考,具体如下: 很多时候,由于美观上的考虑,往往需要自定义各种各样的滚动条,因此,本人做了一个demo 运行效果截图如下: 以下是代码部分: <html> <head> <script type="text/javascript" src="jquery-1.9.1.min.js"></script> <script> $(function(

  • jQuery leonaScroll 1.1 自定义滚动条插件(推荐)

    leonaScroll-1.1最新版 leonaScroll-1.1.js 欢迎使用leonaScroll-1.1.js,如您在使用过程中发现更多问题,欢迎指正! 更新:1.1版本 1.修复了前面初始版本中的一些bug,比如不能自适应用户的文本内容,css文件繁杂 2.用户只需调用一个方法即可使用该插件,无需按照原来的class类名去添加和定义你的滚动条文本域及外层元素,显得更为自由 3.增设了滚动条宽度.上下微调按钮高度,滚动文本区域的设置 4.增设了文本内容未超出时是否显示滚动条可选设置选项

  • JS自定义滚动条效果简单实现代码

    本文实例为大家分享了JS自定义滚动条效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>自定义滚动条</title> <style type="text/css"> #div1 { width: 20px; height: 400px; position: relative;

随机推荐