发布一个兼容所有浏览器自定义垂直滚动条组件(已能使用),并希望高手能帮我解决一个问题 本帖最后由 iori_wen 于 2009-08-12 15:00:37 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 注释把代码注掉了,哎,重发一下<!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="Content-Type" content="text/html; charset=utf-8" /><title>发布一个兼容所有浏览器的自定义滚动条组件</title><link rel="stylesheet" type="text/css" media="screen" href="http://files.cnblogs.com/shuicaituya/test.css" /><script type="text/javascript" charset="utf-8" src="http://files.cnblogs.com/shuicaituya/mootools.js"></script><script type="text/javascript">var BlockWithCustomSlider = new Class({ options:{ offset:-1, //滑动块与容器的偏离量,单位'px moveOffset:1, //进入箭头区后滑动块滑动一次的滑动量,单位'px' movePerTime:30, //进入箭头区后每做一次滑动的时间,单位'毫秒' speedMultiples:3, //点击箭头时,滚动速度增加或降低的倍数 sliderContainerClass:'sliderContainer', //滚动条容器(包含箭头)的样式 arrowUpClass:'arrowUp', //上箭头的样式 arrowDownClass:'arrowDown', //下箭头的样式 sliderBarClass:'sliderBar', //滚动条容器(不包含箭头)的样式 knobClass:'knob', //滚动块的样式 onChange:$empty, //滑动块改变位置触发事件,第一个参数为滑动块在容器位置的百分比 onClickArrow:$empty, //点击箭头触发事件,第一个参数为点击上箭头返回'up',点击下箭头返回'down' onInsertOrDelete:$empty //需要改,请关注//当内容框里有元素插入或删除时触发该事件 }, initialize:function(blockElement,options){ this.setOptions(options); this.blockElement = $(blockElement); this.sliderContent = this.blockElement.clone([true]).removeProperty('style').addClass('sliderContent'); this.blockElement.empty().grab(this.sliderContent); this.knob = new Element('div').addClass(this.options.knobClass); this.sliderBar = new Element('dt').addClass(this.options.sliderBarClass).grab(this.knob); //给上箭头添加鼠标事件 this.arrowUp = new Element('dd').addClass(this.options.arrowUpClass).addEvent('mouseenter',function(){ this.moveSliderBar('up'); }.bind(this)).addEvent('mouseleave',function(){ $clear(this.timer); }.bind(this)).addEvent('mousedown',function(){ this.fireEvent('clickArrow','up'); this.speedUpOrDown('up'); }.bind(this)).addEvent('mouseup',function(){ this.speedUpOrDown('down'); }.bind(this)); //给下箭头添加鼠标事件 this.arrowDown = new Element('dd').addClass(this.options.arrowDownClass).addEvent('mouseenter',function(){ this.moveSliderBar('down'); }.bind(this)).addEvent('mouseleave',function(){ $clear(this.timer); }.bind(this)).addEvent('mousedown',function(){ this.fireEvent('clickArrow','down'); this.speedUpOrDown('up'); }.bind(this)).addEvent('mouseup',function(){ this.speedUpOrDown('down'); }.bind(this)); this.sliderContainer = new Element('div').addClass(this.options.sliderContainerClass).grab(new Element('dl').adopt(this.arrowUp,this.sliderBar,this.arrowDown)); this.blockElement.grab(this.sliderContainer,'bottom').setStyles({ 'overflow':'hidden' }); if(this.sliderContent.scrollHeight - this.sliderContent.clientHeight > 0){ this.scroll = new Fx.Scroll(this.sliderContent); this.knob.setStyle('height',this.sliderContent.clientHeight * (this.sliderContainer.clientHeight + 2 * this.options.offset) / this.sliderContent.scrollHeight); this.slider = new Slider(this.sliderBar, this.knob,{ mode:'vertical', wheel:true, offset:this.options.offset, onChange:function(pos){ this.fireEvent('change',pos); this.scroll.set(0,pos * (this.sliderContent.scrollHeight - this.sliderContent.clientHeight) / 100); }.bind(this) }).set(0); } else{ this.sliderContainer.setStyle('display','none'); this.sliderContent.setStyle('width',this.sliderContent.getStyle('width').toInt() + this.sliderBar.getStyle('width').toInt() + 'px'); } this.chlidNodeLength = this.sliderContent.childNodes.length; this.startCatch(); }, moveSliderBar:function(direction){ //direction 可为 'down' or 'up' var incremental = (direction == 'down'?1:-1) * this.options.moveOffset; this.slider.set(this.slider.step + incremental); this.timer = this.moveSliderBar.delay(this.options.movePerTime,this,direction); }, speedUpOrDown:function(operate){ //operate 可为 'down' or 'up' this.options.movePerTime = eval(this.options.movePerTime + (operate == 'down'?'*':'/') + this.options.speedMultiples); },//需要改,请关注start startCatch:function(){ //这个函数是为了模拟删除或添加元素的事件捕获,但我并不想用50毫秒一次的捕获这么浪费性能的脚本,希望各位高手能帮忙解决下,最好能自定义事件捕获。 if(this.sliderContent.childNodes.length != this.chlidNodeLength){ this.chlidNodeLength = this.sliderContent.childNodes.length; //有删除或添加元素,接下来干我想干的事,比如:调整滚动条的高度或者滚到特殊位置等等 this.fireEvent('insertOrDelete'); } this.startCatch.delay(50,this); }});//需要改,请关注endBlockWithCustomSlider.implement(new Events,new Options);</script></head><body> <ul id="box1" style="margin:100px;"> <li>start</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> <li>13</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> <li>21</li> <li>22</li> <li>22</li> <li>23</li> <li>24</li> <li>25</li> <li>26</li> <li>27</li> <li>28</li> <li>29</li> <li>30</li> <li>31</li> <li>32</li> <li>33</li> <li>34</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> <li>13</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> <li>21</li> <li>22</li> <li>22</li> <li>23</li> <li>24</li> <li>25</li> <li>26</li> <li>27</li> <li>28</li> <li>29</li> <li>30</li> <li>31</li> <li>32</li> <li>33</li> <li>34</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> <li>21</li> <li>22</li> <li>22</li> <li>23</li> <li>24</li> <li>25</li> <li>26</li> <li>27</li> <li>28</li> <li>29</li> <li>30</li> <li>31</li> <li>32</li> <li>33</li> <li>34</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> <li>21</li> <li>22</li> <li>22</li> <li>23</li> <li>24</li> <li>25</li> <li>26</li> <li>27</li> <li>28</li> <li>29</li> <li>30</li> <li>31</li> <li>32</li> <li>33</li> <li>34</li> <li>end</li> </ul> <input type="button" value="插入元素" id="btn1"/> <script type="text/javascript"> var box1 = new BlockWithCustomSlider($('box1'),{ onInsertOrDelete:function(){ alert("有删除或添加元素") } }); window.addEvent('domready',function(){ box1.sliderContent.scrollTop = 0;//为了解决刷新页面,windows自带的滚动条不重置这个问题。我曾尝试在类里写这句话,可惜不管用,大家帮忙看看在类里写哪管用,最好肯定是封装在类里。//需要改,请关注start $('btn1').addEvent('click',function(){ new Element('li',{text:'sfgsgdsgfds'}).inject($$('.sliderContent')[0],'bottom'); });//需要改,请关注end }); </script></body></html> 是啊,windows自带的都看烦了,很有意义。 求大神查看一下这段代码有什么问题? 怎么用Js把这个导航的下拉菜单实现啊 如果实现这样方法———document.getElementById("UserName").getValue(); 如何取div样式里面的宽度 jqGrid 分页总页数不显示 js数据间转换 建立了一个正则表达式后,可使用它来干那些事情?怎么使用?不好意思,没分了 页面有n个复选匡,其中两个是互斥的,该怎么解决 有谁用过雨点的下载系统! 函数在自身原型上定义自身是什么意思 请帮忙解决一个对象赋值的问题,只有几行代码。 jquery uploadify 插件上传图片问题
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>发布一个兼容所有浏览器的自定义滚动条组件</title>
<link rel="stylesheet" type="text/css" media="screen" href="http://files.cnblogs.com/shuicaituya/test.css" />
<script type="text/javascript" charset="utf-8" src="http://files.cnblogs.com/shuicaituya/mootools.js"></script>
<script type="text/javascript">
var BlockWithCustomSlider = new Class({
options:{
offset:-1, //滑动块与容器的偏离量,单位'px
moveOffset:1, //进入箭头区后滑动块滑动一次的滑动量,单位'px'
movePerTime:30, //进入箭头区后每做一次滑动的时间,单位'毫秒'
speedMultiples:3, //点击箭头时,滚动速度增加或降低的倍数
sliderContainerClass:'sliderContainer', //滚动条容器(包含箭头)的样式
arrowUpClass:'arrowUp', //上箭头的样式
arrowDownClass:'arrowDown', //下箭头的样式
sliderBarClass:'sliderBar', //滚动条容器(不包含箭头)的样式
knobClass:'knob', //滚动块的样式
onChange:$empty, //滑动块改变位置触发事件,第一个参数为滑动块在容器位置的百分比
onClickArrow:$empty, //点击箭头触发事件,第一个参数为点击上箭头返回'up',点击下箭头返回'down'
onInsertOrDelete:$empty //需要改,请关注//当内容框里有元素插入或删除时触发该事件
},
initialize:function(blockElement,options){
this.setOptions(options);
this.blockElement = $(blockElement);
this.sliderContent = this.blockElement.clone([true]).removeProperty('style').addClass('sliderContent');
this.blockElement.empty().grab(this.sliderContent);
this.knob = new Element('div').addClass(this.options.knobClass);
this.sliderBar = new Element('dt').addClass(this.options.sliderBarClass).grab(this.knob);
//给上箭头添加鼠标事件
this.arrowUp = new Element('dd').addClass(this.options.arrowUpClass).addEvent('mouseenter',function(){
this.moveSliderBar('up');
}.bind(this)).addEvent('mouseleave',function(){
$clear(this.timer);
}.bind(this)).addEvent('mousedown',function(){
this.fireEvent('clickArrow','up');
this.speedUpOrDown('up');
}.bind(this)).addEvent('mouseup',function(){
this.speedUpOrDown('down');
}.bind(this));
//给下箭头添加鼠标事件
this.arrowDown = new Element('dd').addClass(this.options.arrowDownClass).addEvent('mouseenter',function(){
this.moveSliderBar('down');
}.bind(this)).addEvent('mouseleave',function(){
$clear(this.timer);
}.bind(this)).addEvent('mousedown',function(){
this.fireEvent('clickArrow','down');
this.speedUpOrDown('up');
}.bind(this)).addEvent('mouseup',function(){
this.speedUpOrDown('down');
}.bind(this));
this.sliderContainer = new Element('div').addClass(this.options.sliderContainerClass).grab(new Element('dl').adopt(this.arrowUp,this.sliderBar,this.arrowDown));
this.blockElement.grab(this.sliderContainer,'bottom').setStyles({
'overflow':'hidden'
});
if(this.sliderContent.scrollHeight - this.sliderContent.clientHeight > 0){
this.scroll = new Fx.Scroll(this.sliderContent);
this.knob.setStyle('height',this.sliderContent.clientHeight * (this.sliderContainer.clientHeight + 2 * this.options.offset) / this.sliderContent.scrollHeight);
this.slider = new Slider(this.sliderBar, this.knob,{
mode:'vertical',
wheel:true,
offset:this.options.offset,
onChange:function(pos){
this.fireEvent('change',pos);
this.scroll.set(0,pos * (this.sliderContent.scrollHeight - this.sliderContent.clientHeight) / 100);
}.bind(this)
}).set(0);
}
else{
this.sliderContainer.setStyle('display','none');
this.sliderContent.setStyle('width',this.sliderContent.getStyle('width').toInt() + this.sliderBar.getStyle('width').toInt() + 'px');
}
this.chlidNodeLength = this.sliderContent.childNodes.length;
this.startCatch(); },
moveSliderBar:function(direction){ //direction 可为 'down' or 'up'
var incremental = (direction == 'down'?1:-1) * this.options.moveOffset;
this.slider.set(this.slider.step + incremental);
this.timer = this.moveSliderBar.delay(this.options.movePerTime,this,direction);
},
speedUpOrDown:function(operate){ //operate 可为 'down' or 'up'
this.options.movePerTime = eval(this.options.movePerTime + (operate == 'down'?'*':'/') + this.options.speedMultiples);
},
//需要改,请关注start
startCatch:function(){ //这个函数是为了模拟删除或添加元素的事件捕获,但我并不想用50毫秒一次的捕获这么浪费性能的脚本,希望各位高手能帮忙解决下,最好能自定义事件捕获。
if(this.sliderContent.childNodes.length != this.chlidNodeLength){
this.chlidNodeLength = this.sliderContent.childNodes.length;
//有删除或添加元素,接下来干我想干的事,比如:调整滚动条的高度或者滚到特殊位置等等
this.fireEvent('insertOrDelete');
}
this.startCatch.delay(50,this);
}});
//需要改,请关注end
BlockWithCustomSlider.implement(new Events,new Options);
</script>
</head>
<body>
<ul id="box1" style="margin:100px;">
<li>start</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
<li>13</li>
<li>14</li>
<li>15</li>
<li>16</li>
<li>17</li>
<li>18</li>
<li>19</li>
<li>20</li>
<li>21</li>
<li>22</li>
<li>22</li>
<li>23</li>
<li>24</li>
<li>25</li>
<li>26</li>
<li>27</li>
<li>28</li>
<li>29</li>
<li>30</li>
<li>31</li>
<li>32</li>
<li>33</li>
<li>34</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
<li>13</li>
<li>14</li>
<li>15</li>
<li>16</li>
<li>17</li>
<li>18</li>
<li>19</li>
<li>20</li>
<li>21</li>
<li>22</li>
<li>22</li>
<li>23</li>
<li>24</li>
<li>25</li>
<li>26</li>
<li>27</li>
<li>28</li>
<li>29</li>
<li>30</li>
<li>31</li>
<li>32</li>
<li>33</li>
<li>34</li>
<li>14</li>
<li>15</li>
<li>16</li>
<li>17</li>
<li>18</li>
<li>19</li>
<li>20</li>
<li>21</li>
<li>22</li>
<li>22</li>
<li>23</li>
<li>24</li>
<li>25</li>
<li>26</li>
<li>27</li>
<li>28</li>
<li>29</li>
<li>30</li>
<li>31</li>
<li>32</li>
<li>33</li>
<li>34</li>
<li>14</li>
<li>15</li>
<li>16</li>
<li>17</li>
<li>18</li>
<li>19</li>
<li>20</li>
<li>21</li>
<li>22</li>
<li>22</li>
<li>23</li>
<li>24</li>
<li>25</li>
<li>26</li>
<li>27</li>
<li>28</li>
<li>29</li>
<li>30</li>
<li>31</li>
<li>32</li>
<li>33</li>
<li>34</li>
<li>end</li>
</ul>
<input type="button" value="插入元素" id="btn1"/> <script type="text/javascript">
var box1 = new BlockWithCustomSlider($('box1'),{
onInsertOrDelete:function(){
alert("有删除或添加元素")
} });
window.addEvent('domready',function(){
box1.sliderContent.scrollTop = 0;//为了解决刷新页面,windows自带的滚动条不重置这个问题。我曾尝试在类里写这句话,可惜不管用,大家帮忙看看在类里写哪管用,最好肯定是封装在类里。
//需要改,请关注start
$('btn1').addEvent('click',function(){
new Element('li',{text:'sfgsgdsgfds'}).inject($$('.sliderContent')[0],'bottom');
});
//需要改,请关注end
});
</script>
</body>
</html>