Slider 滑动条效果

这个滑动条(拖动条)效果,一开始是参考了BlueDestiny的sliderApple产品展示的样式,做了程序的原型。
在做了拖放效果之后,我想应该可以做一个更好的了,所以重做一遍,完善和扩展了一些功能。
碍于时间没有做得很强大,都是一些基本功能,希望各位多提意见!

效果预览

预览效果1:

这个是仿Apple滑动条产品展示效果
除了原来的效果(包括点击缓动滑移、拖动滑移),我还加入了本程序特有的滚轮和键盘控制,滑动条两端鼠标放上去会自动滑动,滑动到两边还会自动换一个表示停止的图案。

1. 图片切割
2. 图片切换展示
3. 图片变换效果
4. 无刷新上传
5. 图片滑动展示


预览效果2:

这里是稍微模拟了一下滚动条,当然离真正的滚动条还差很远。
滑动条除了水平还支持垂直方向的滑动,在内容显示部分按上下方向(需要先点击选中一下)或使用鼠标滚轮也能控制滑动。

预览效果3:

这里主要是滑动条关于值方面的应用,可以应用在度量计算等方面。

当前值:
当前百分比:%
状态:未开始
设置最小值: 设置最大值:
移动到:

 
程序说明

首先需要一个容器,滑动范围就在这个容器里面,还有是容器里面的绝对定位的滑块,基本就是这两部分。
滑块拖放的部分请参考拖放效果,这里我把拖放程序扩展了一个设置滑块位置的SetPos方法方便程序使用。

水平和垂直滑动

程序支持水平和垂直滑动,设置Horizontal属性为true就是水平滑动(默认),为false就是垂直滑动。
这个属性只能在实例化时设置,初始化之后会就不要修改了。
程序初始化时就根据这个属性锁定拖放的方向:

this._drag[this._horizontal ? "LockY" : "LockX"= true;


程序支持两个方向的滑动,如果每次都判断一下再分别设置参数会很麻烦,
所以程序中每次滑动都计算两个方向的位置参数,并把参数直接交给_drag来处理。
由于_drag在实例化时已经做了范围限制和方向锁定,已经带了位置参数修正,所以可以直接交给它处理。
这样虽然效率差点,但就能大大降低复杂度,我想还是值得的。

自动滑移

运行Run自动滑移程序后,就会自动滑移,参数可以设置滑移的方向(true为右/下,false为左/上)。
步长是根据百分比来设置的

var percent = this.GetPercent() + (bIncrease ? 1 : -1* this.RunStep / 100;
this.SetPos((this.Container.clientWidth - this.Bar.offsetWidth) * percent, (this.Container.clientHeight - this.Bar.offsetHeight) * percent);


然后通过位置属性判断是否到了极限值,不是的话就用一个定时器继续滑动:

Code

 

缓动滑移

除了SetPos还有一个EasePos缓动滑移程序可以设置滑块位置。
如果Ease属性是false时,EasePos跟SetPos一样直接设置位置,为true时就会缓动(减速)设置位置。
其中缓动的效果请参考图片切换展示效果 ,程序中如果目标值超过极限值时不能直接判断是否到达目标值,不过可以用_IsMid属性(参考位置判断部分)来判断没有到极限值。
注意,因为要跟offset取的值比较,而offset取的值是整数,所以参数必须转换成整数(程序用Math.round处理了),否则如果是小数那就永远都不会相等(死循环)了。

ps:程序只在鼠标点击控制和设置百分比位置中使用了EasePos,其它情况比较适合用SetPos。

百分比和值

这个是基本功能了,先看看GetPercent获取百分比程序,这个百分比就是滑块左边距离跟滑动区域的比例:

return this._horizontal ? this.Bar.offsetLeft / (this.Container.clientWidth - this.Bar.offsetWidth)
        : 
this.Bar.offsetTop / (this.Container.clientHeight - this.Bar.offsetHeight)


注意滑动区域是容器的clientWidth减去滑块的offsetWidth(关于这两个属性详细请看这里)。

对应的有SetPercent设置百分比位置程序,就是根据百分比参数设置滑块的位置:

this.EasePos((this.Container.clientWidth - this.Bar.offsetWidth) * value, (this.Container.clientHeight - this.Bar.offsetHeight) * value);


滑动条更多的应用是在于值的运用。程序中属性MinValue和MaxValue分别设置最小值和最大值。
ps:虽然说是最大值,但不一定就比较大的,不过这样写起来比较方便。
当设置了这两个属性(值)就能GetValue获取当前值了:

return this.MinValue + this.GetPercent() * (this.MaxValue - this.MinValue);


对应的SetValue设置值位置程序:

this.SetPercent((value- this.MinValue)/(this.MaxValue - this.MinValue));


这个很简单,懂点数学应该都明白了。

位置状态

程序中有位置程序onMin(最小值时)、onMax(最大值时)和onMid(中间值时)分别在各自位置时执行。
ps:onMid指的是除最小值最大值外的中间部分,不是中心值。
程序是在Move滑动程序中通过百分比来判断当前位置的(0时为最小值,1时为最大值,其他为中间值)。
由于Move程序并不会因为到了极限值就停止,如果仅仅根据百分比来判断那么到了极限值,值虽然不变但程序就会一直被触发。
而我需要的是当值不变的时候,对应位置程序仅仅触发一次。根据需求就衍生出三个位置状态属性_IsMin(最小值状态)、_IsMax(最大值状态)和_IsMid(中间值状态)。
用这几个状态属性和百分比就能实现需要的效果了:

Code


这三个位置状态属性在其他程序中也用来判断是否到了极限值。

鼠标拖动控制

鼠标拖动控制,就是通过拖动滑块来设置定位。
这个就跟滚动条意思差不多,主要是通过_drag本身的拖放效果来实现的(详细看这里拖放效果)。

鼠标点击控制

鼠标点击控制,就是当点击容器的时候能定位到点击的位置。
一般来说只要把ClickCtrl鼠标点击控制程序绑定容器的click事件中就可以了。
但这里有个问题,滑块的点击(拖动控制)跟容器的点击会发生冲突,具体表现是拖放结束后就“顺便”触发了容器的click。
这个本来在滑块的点击事件中取消冒泡就可以:

addEventHandler(this.Bar, "click", BindAsEventListener(thisfunction(e){ e.stopPropagation(); }));


但ie的click机制有点问题,测试下面的点击:

 

Code


里面的div取消冒泡,点击它不会触发外面div的onclick,但如果在里面的div点,然拖动到外面的div放,就会触发了,而ff是不会的。
ps:从外面拖到里面也是一样的情况。
经过测试,我觉得是因为ie认为点击的点和放只要是发生在同一个元素的内部(包括内部的其他元素),那个这个点击就是有效的;而ff则认为点击的点和放必须在同一个元素内才有效(w3c标准应该也是这样)。
这个导致的问题是,当拖放结束时如果放开鼠标的地方是容器上,那么就会发生冲突了。

那对于ie的这个现象,解决方法其实也很多,我用的方法很简单,设一个属性_ondrag来表示是否拖放中。
具体就是在DragStart开始拖放滑动程序中把_ondrag设为true,并在DragStop结束拖放滑动程序中把它设为false:

setTimeout(Bind(thisfunction(){ this._ondrag = false; }), 10);


这里用了setTimeout,因为拖放结束后才会触发容器的click,所以设一个延时,使这个值在容器的click触发后才修改。
这样就可以通过这个_ondrag来判断是否应该执行ClickCtrl了:

addEventHandler(this.Container, "click", BindAsEventListener(thisfunction(e){ this._ondrag || this.ClickCtrl(e);}));


接着看ClickCtrl鼠标点击控制程序,首先获取容器的相对文档的位置:

var o = this.Container, iLeft = o.offsetLeft, iTop = o.offsetTop;
while (o.offsetParent) { o = o.offsetParent; iLeft += o.offsetLeft; iTop += o.offsetTop; }


注意,要逐级向上获取才能取得相对相对文档的位置。
然后通过pageX(pageY)和滑块(这里是要设置到滑块的中间位置所以取一半)得到要设置的位置:

this.EasePos(e.pageX - iLeft - this.Bar.offsetWidth / 2, e.pageY - iTop - this.Bar.offsetHeight / 2);


这里要用pageX(pageY)来取值,而不是clientX(clientY),因为后者是没有计算滚动条的。
ps:ie没有pageX(pageY),不过在Event程序中已经给window.event添加了这个属性:

oEvent.pageX = oEvent.clientX + document.documentElement.scrollLeft;
oEvent.pageY 
= oEvent.clientY + document.documentElement.scrollTop;


鼠标滚轮控制

鼠标滚轮控制,就是通过鼠标滚轮滚动来控制滑块的滑动。
首先ie绑定滚轮事件用的是mousewheel,ff用的是DOMMouseScroll,所以在WheelBind绑定鼠标滚轮程序中是这样设置的:

addEventHandler(o, isIE ? "mousewheel" : "DOMMouseScroll", BindAsEventListener(thisthis.WheelCtrl));


接着看WheelCtrl鼠标滚轮控制程序,通过event的detail属性可以获取鼠标滚动的距离(值大小)和方向(正负)。
利用它来设置要滑动的位置:

var i = this.WheelSpeed * e.detail;
this.SetPos(this.Bar.offsetLeft + i, this.Bar.offsetTop + i);


但ie没有detail,对应的有wheelDelta,wheelDelta的数值刚好是detail的40倍,而且方向相反(正负相反),所以Event程序中是这样给window.event添加detail的:

oEvent.detail = oEvent.wheelDelta / (-40);


为了防止触发其他滚动条,这里用了preventDefault取消默认动作。
注意不是用取消冒泡(貌似滚屏是事件的默认动作)。

方向键控制

方向键控制,就是通过键盘的左右(上下)方向键来控制滑块的滑动。
首先用KeyBind方向键绑定程序把KeyCtrl方向键控制程序绑定到对象的keydown事件中:

addEventHandler(o, "keydown", BindAsEventListener(thisthis.KeyCtrl));


在KeyCtrl中,通过event的keyCode属性获取键盘的按键(左37、上38、右39、下40)并进行相应的操作:

Code


同样为了防止触发其他滚动条,也用了preventDefault取消默认动作。

focus和tabIndex

在KeyBind程序中,除了绑定对象的keydown事件,还不够的,可以在ff测试下面的代码:

<div style="width:100px; height:100px; background-color:#CCC;" onkeydown="alert(1)"></div>


无论怎样都触发不了onkeydown事件(ie可以触发),那就奇怪了,按照一般的思路应该是可以的啊。
这个可以从w3c关于KeyboardEvent的部分中找到原因:
Keyboard events are commonly directed at the element that has the focus.
大概就是说键盘按键事件一般指向能获取焦点的元素,就是不能获取焦点的元素就不能触发键盘按键事件了。

难道div就不能获取焦点?用下面的代码测试(ff):

<div id="test" style="width:100px; height:100px; background-color:#CCC;" onfocus="alert(1)"></div>
<script>document.getElementById("test").focus();</script>


还真的不行,那问题就在于怎么使div能获取焦点了(当然这个是转了不少弯才想出来的)。

最后发现给元素设置tabIndex就能让元素能获取焦点了,如果不需要详细了解的话下面可以略过。
首先看看w3c关于onfocus的部分
The onfocus event occurs when an element receives focus either by the pointing device or by tabbing navigation.
This attribute may be used with the following elements: A, AREA, LABEL, INPUT, SELECT, TEXTAREA, and BUTTON.
当元素通过指定(点击)或tab导航(Tabbing navigation)获得焦点,onfocus事件就会触发。
该属性会使用在以下元素(就是说默认可以获取焦点的元素):A, AREA, LABEL, INPUT, SELECT, TEXTAREA, and BUTTON.
测试下面的代码:

<a href="#" onfocus="alert(1)" onkeydown="alert(2)">focus</a>


果然两个事件都可以执行。

接着看Tabbing navigation的部分
Those elements that do not support the tabindex attribute or support it and assign it a value of "0" are navigated next. These elements are navigated in the order they appear in the character stream.
这里看得不太明白,关键的意思是给元素设置tabindex为0就可以被导航到了(能获取焦点了)。
测试下面的代码(ff):

<div tabindex="0" style="width:100px; height:100px; background-color:#CCC;" onfocus="alert(1)" onkeydown="alert(2)"></div>


果然两个事件都能触发了。

不过w3c说得很模糊,msdn上倒是很清楚:
An element can have focus if the tabIndex property is set to any valid negative or positive integer.
Elements that receive focus can fire the onblur and onfocus events as of Internet Explorer 4.0, and the onkeydown, onkeypress, and onkeyup events as of Internet Explorer 5.
只要元素的tabIndex属性设置成任何有效的整数那么该元素就能取得焦点。元素在取得焦点后就能触发onblur,onfocus,onkeydown, onkeypress和onkeyup事件。

不同tabIndex值在tab order(Tabbing navigation)中的情况:
Objects with a positive tabIndex are selected in increasing iIndex order and in source order to resolve duplicates.
Objects with an tabIndex of zero are selected in source order.
Objects with a negative tabIndex are omitted from the tabbing order.
tabIndex值是正数的对象根据递增的值顺序和代码中的位置顺序来被选择
tabIndex值是0的对象根据在代码中的位置顺序被选择
tabIndex值是负数的对象会被忽略

这个不知道是否符合标准,但貌似ff跟ie是一样的(不同的地方后面会说)。
那么设置一个负的tabIndex值应该是最理想的了。

ps:如果对ff的tabindex有兴趣的话,推荐看看Test cases for tabindex bugs in Firefox,里面有更详细更专业的分析。

那ie通过一开始的测试,是不是就说明不需要了呢?我们换一个元素测试:

<ul style="width:100px; height:100px; background-color:#CCC;" onfocus="alert(1)" onkeydown="alert(2)"></ul>


换成ul就又不能触发事件了,怎么搞的。

再看看msdn,里面有一段:
The following elements can have focus by default but are not tab stops. .略. applet, div, frameSet, span, table, td.
下面的元素默认能获取焦点但不能tab导航:applet, div, frameSet, span, table, td.
看来ie真是“为程序员着想”,但其他元素总不能漏了啊,还是全部都设置tabIndex好了。

终于回到程序上来,首先设置tabIndex:

o.tabIndex = -1;


ff元素获得焦点后会出现一个虚线框,去掉会美观一点:

isIE || (o.style.outline = "none");


ps:如果tabIndex设为0或以上的话ie也会出现虚线框。

绑定了keydown之后,点击一下容器(获取焦点)后就能用方向键控制方向了,但如果(没有获得焦点时)点击滑块,还是触发不了事件。
因为滑块在拖动效果中ie的鼠标捕获和ff的取消默认动作导致容器不能获得焦点,那手动设置可以吗?
是可以的,ff中就是直接在滑块的mousedown事件中执行容器的focus方法获得焦点。
ie本来也是可以的,但ie中当对象执行focus方法时,如果该对象有部分在滚动条外就会自动滚动到适当的位置(还好点击不会这样)。
为了降低影响,程序中把滑块也绑定了键盘控制,这样点击滑块时只要执行滑块的focus方法获得焦点就可以了:

var oFocus = isIE ? (this.KeyBind(this.Bar), this.Bar) : this.Container;
addEventHandler(
this.Bar, "mousedown"function(){ oFocus.focus(); });


ps:由于focus并不会冒泡(w3c标准),所以不用担心滑块的focus导致容器获得焦点。
ps2:w3c的文档还真是难读,还是msdn的易懂。

样式设置

程序没有对margin之类的样式进行处理,所以尽量使用“干净”的元素,如果用ul那些,请先“清理”好。

在仿Apple滑动条产品展示效果中,像那样横排的展示,最好是放在table里才能保证不换行,否则就要放一个很长很长的副容器来放内容。
里面还有一个样式比较特别的,细心的话可以看到滑块是突出了一个半圆,而且是刚好能嵌在两端的。
这里主要是滑块两边的两个层(两个半圆)使用了绝对定位,设置了负的位置值(左边是负的left,右边是负的right)。
还有就是到达两端时对应的层会自动换一个背景图,但其实是同一张图:

这里是用了变换背景图位置的方法,这个方法也不新鲜了,这里要说说的是,虽然只是换垂直方向的坐标,但backgroundPositionY只是ie的方法,所以还是要用backgroundPosition。

应用技巧

在仿Apple滑动条产品展示效果中,可以看到MaxValue设成了内容容器的scrollWidth和clientWidth之差:

MaxValue: $("idContent").scrollWidth - $("idContent").clientWidth,


其实这个值就是内容容器scrollLeft的最大值,这样在滑动时要设置的内容容器的scrollLeft刚好就是GetValue方法的值了(预览效果2也一样):

onMove: function(){ $("idContent").scrollLeft = this.GetValue(); }

 
预览效果2中,滑块的高度也特别设置过:

$("idBar2").style.height = $("idSlider2").clientHeight * Math.min($("idContent2").clientHeight / $("idContent2").scrollHeight, 1- 4 + "px";


其实就是使内容跟内容容器的高度之比等于滑块跟滑动容器之比,当然这个比不能大于1,否则就滑块高度就超过容器高度了,里面的4是边框宽度。
这样的好处是滑块会根据实际内容自动设置大小,就像一般的滚动条,内容越多滚动条就越小,反之就越大,这利于用户体验。
ps:仿Apple那个为了突出效果所以没有设置,实际应用中也应该这样设置一下。

预览效果3中,从GetValue和GetPercent取得的数有可能是很长的小数,所以显示时必须处理一下。
这里看到程序中parseInt使用了两个参数,而且第二个参数是10,是不是多余的呢?
不是的,因为手册上说了:
如果没有提供,则前缀为 '0x' 的字符串被当作十六进制,前缀为 '0' 的字符串被当作八进制。所有其它字符串都被当作是十进制的。
而对于手动输入的数字,前面加了个0也是很普通的情况,这样无意间就会变成八进制了。

 

使用说明

首先实例化一个滑动条对象,需要两个参数,分别是滑动容器和滑块(滑块要在容器里面哦):

var sld = new Slider("idSlider""idBar")

 
有以下这些可选参数和属性:
属性:默认值//说明
MinValue: 0,//最小值
MaxValue: 100,//最大值
WheelSpeed: 5,//鼠标滚轮速度,越大越快(0则取消鼠标滚轮控制)
KeySpeed:  50,//方向键滚动速度,越大越慢(0则取消方向键控制)
Horizontal: true,//是否水平滑动
RunTime: 20,//自动滑移的延时时间,越大越慢
RunStep: 2,//自动滑移每次滑动的百分比
Ease:  false,//是否缓动
EaseStep: 5,//缓动等级,越大越慢
onMin:  function(){},//最小值时执行
onMax:  function(){},//最大值时执行
onMid:  function(){},//中间值时执行
onDragStart:function(){},//拖动开始时执行
onDragStop: function(){},//拖动结束时执行
onMove:  function(){}//滑动时执行

 

程序代码

Code

 


下载完整测试代码

转载请注明出处:http://www.cnblogs.com/cloudgamer/

如有任何建议或疑问,欢迎留言讨论。

如果觉得文章不错的话,欢迎点一下右下角的推荐。

程序中包含的js工具库CJL.0.1.min.js,原文在这里

posted @ 2008-12-24 08:27 cloudgamer 阅读(51968) 评论(138) 编辑 收藏

评论共2页: 上一页 1 2 
 回复 引用 查看   
#39楼 2008-12-25 08:30 李战      
先收下,后研究
 回复 引用 查看   
#40楼 2008-12-25 10:06 zhwily      
厉害!先收下.
 回复 引用 查看   
#41楼[楼主] 2008-12-25 10:36 cloudgamer      
@MOO
@joylee
@名刘天下
@zhwily
谢谢支持

@xuzx
谁不是从初学者开始的呢
加油

@李战
下面这个只是我的推测:
"经过测试,我觉得是因为ie认为点击的点和放只要是发生在同一个元素的内部(包括内部的其他元素),那个这个点击就是有效的;"
不知李大哥同不同意

 回复 引用 查看   
#42楼 2008-12-25 11:54 ξσ Dicky σξ      
强悍,留个记号
 回复 引用   
#43楼 2008-12-25 16:56 苏打小鱼[未注册用户]
向你学习!
 回复 引用 查看   
#44楼 2009-01-03 09:59 施杨      
楼主搞js这么投入,真的很是佩服。
我虽然也很喜欢js特效,但是没有楼主搞的这么有激情。

顶了。

 回复 引用   
#45楼 2009-01-05 14:45 CodingMouse[未注册用户]
楼主的JS技术很牛啊
 回复 引用   
#46楼 2009-01-06 14:09 小笨象[未注册用户]
好强大。学习了。
 回复 引用   
#47楼 2009-01-07 16:52 神说[未注册用户]
--引用--------------------------------------------------
yuejianjun: 美图虽好
效果更佳
--------------------------------------------------------

 回复 引用 查看   
#48楼 2009-01-19 14:58 david.lee      
js狂人日记
 回复 引用   
#49楼 2009-01-22 18:08 夜雪[未注册用户]
首先感谢LZ提供了这么多js效果 赞一句:lz的js真的很强

我是一个js初学者,lz的js代码能看懂一点点

不知道现在怎样去看lz的代码

我感觉自己的的js语法不行

如:var i=function(){}
function i(){} 我只知道这一种
i: function(){}
这三种有什么不同,有什么相同。
还有这个
var Class = {
create: function() {
return function() { this.initialize.apply(this, arguments); }//返回的这个函数到底是什么?
}
}

var Slider = Class.create();
Slider.prototype = {
//容器对象,滑块
initialize: function(container, bar, options) {}
这两者感觉很模糊

lz能介绍一些能提高js技术的资料吗?

 回复 引用 查看   
#50楼[楼主] 2009-01-22 19:25 cloudgamer      
@ξσ Dicky σξ
@苏打小鱼
@施杨
@CodingMouse
@小笨象
@神说
@david.lee
谢谢支持

 回复 引用 查看   
#51楼[楼主] 2009-01-22 19:38 cloudgamer      
@夜雪
这个你要先弄清楚this apply的用法
对对象有多一点认识才好理解
我觉得要提高无非就是多看书多实践
书的话建议看看 JavaScript高级程序设计

 回复 引用   
#52楼 2009-03-19 13:34 cikeorg[未注册用户]
有哥么说见图就知道楼主是谁了

果然有效

 回复 引用   
#53楼 2009-05-20 09:50 haiyang
帅 这个牛X
 回复 引用   
#54楼 2009-05-26 11:18 躲猫猫[未注册用户]
T T。。。完全看不懂的说
 回复 引用   
#55楼 2009-06-04 14:57 gurrbly[未注册用户]
试着改写了下Bind函数,想改成传参数的样式,但是为什么会有问题了
var Bind = function(object, fun) {
var args = Array.prototype.slice.call(arguments).slice(2);
return function() {
return fun.apply(object,[].concat(args));
}
}

 回复 引用 查看   
#56楼[楼主] 2009-06-04 21:09 cloudgamer      
@cikeorg
@haiyang
@躲猫猫
谢谢支持

 回复 引用 查看   
#57楼[楼主] 2009-06-04 21:10 cloudgamer      
@gurrbly
换这个看看
var Bind = function(object, fun) {
var args = Array.prototype.slice.call(arguments).slice(2);
return function() {
return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
}
}

 回复 引用   
#58楼 2009-06-17 18:17 六翼[未注册用户]
有一个小问题,这个和Prototype.js好像会有冲突,先调用prototype.js再调用drag.js,在IE下会报一个错,但不影响正常使用,在FF下又没报错,找了我N久。
我个人怀疑是因为“$”以及其他一些方法覆盖了prototype.js里的同名方法造成的:(

 回复 引用 查看   
#59楼[楼主] 2009-06-18 08:23 cloudgamer      
@六翼
你看一下代码就知道我的代码中有$啦
如果是prototype.js的话直接去掉就行了

 回复 引用   
#60楼 2009-06-18 09:45 六翼[未注册用户]
我去掉了那个$,然后就不运行了:(
后来换了下顺序,先写drag.js后写prototype.js,目前正常了……
再次感谢LZ

 回复 引用 查看   
#61楼[楼主] 2009-06-18 11:15 cloudgamer      
@六翼
你可以去掉我程序里面的$
直接用prototype.js的$应该都可以的

 回复 引用   
#62楼 2009-06-18 14:22 六翼[未注册用户]
真的不行……现在的状态就是:
你的$去掉 + 你的程序放前面 = 正常
你的$去掉 + 你的程序放后面 = 报错
你的$不去掉 + 你的程序放前面 = 正常
你的$不去掉 + 你的程序放后面 = 报错
但每一种都可以正常运行=_=
现在出现的新问题是,你这个控件可以设定初始值的么?貌似只能设最大最小而不能设定初始滑块位置?

 回复 引用   
#63楼 2009-06-18 14:23 六翼[未注册用户]
哎哎,傻了,有个函数赋值的=_=
无视我吧……

 回复 引用 查看   
#64楼[楼主] 2009-06-18 14:28 cloudgamer      
@六翼
这个具体你自己调试吧
$本身很简单,如果只是这个冲突你就改其他名就是了

 回复 引用   
#65楼 2009-06-19 10:55 六翼[未注册用户]
LZ我又来了……
不知道是哪里的算法有点小问题,比如最大值设成1000,然后指定实际值为100,点击按钮后显示的当前值却是102……:(最大值再大点的话,偏移值更多。比如我最大设定了1000000,然后实际值是3000,显示当前值为……3413
在源代码里找了半天也没找到怎么回事,实在不行我只好换东东了:(

 回复 引用 查看   
#66楼[楼主] 2009-06-19 11:08 cloudgamer      
@六翼
这是精度问题
例如宽10px,长度是50
那25相当于5px,13是2.6px
但px是没有小数的那就只能取3px
这时候再根据3px获取长度就是15了,跟原来差了2

 回复 引用   
#67楼 2009-06-19 16:16 六翼[未注册用户]
嗯,其实自己算一下就行了,只怪LZ你的接口写得太顺手了,忍不住就想用,于是就出了错,嘿嘿
 回复 引用 查看   
#68楼[楼主] 2009-06-19 16:51 cloudgamer      
@六翼
这个精度暂时还没办法解决
硬件问题

 回复 引用   
#69楼 2009-07-07 15:06 boyrichie[未注册用户]
好强大,赞一个
 回复 引用 查看   
#70楼 2009-07-20 22:43 argb      
效果确实不错
 回复 引用   
#71楼 2009-07-27 14:23 macwor[未注册用户]
我想修改示例1为示例2那样的竖排,所有形式不变仅改成上下拉动,竟然没改成功,惭愧,楼主改一个行吗?
 回复 引用 查看   
#72楼[楼主] 2009-07-27 14:43 cloudgamer      
@macwor
你可以在2的基础上改改看

@argb
@boyrichie
谢谢支持

 回复 引用 查看   
#73楼 2009-08-10 12:43 空逸云      
LZ..
你太猛了..
在你身上留下精神烙印了.
别想跑了.

 回复 引用 查看   
#74楼[楼主] 2009-08-10 13:52 cloudgamer      
@空逸云
谢谢支持
呵呵

 回复 引用   
#75楼 2009-08-25 21:41 macwor[未注册用户]
在FF下显示一个警告: getElementById()被传递了空字符串参数。
在IE6下有时不能使用,请问是那里传递了空字符串?如何解决?

 回复 引用 查看   
#76楼[楼主] 2009-08-25 21:48 cloudgamer      
@macwor
你是用下载的实例测试的吗

 回复 引用   
#77楼 2009-08-25 22:09 macwor[未注册用户]
是的,即便是你的博客网页也会显示这个警告,但是ff没有标示具体是那一行代码,IE显示的是 行204,字符1,错误:参数无效,代码0
 回复 引用   
#78楼 2009-08-25 22:26 macwor[未注册用户]
经过多次查看,出错的这一行应是这句:


$("idBar").style.height = $("idSlider").clientHeight * Math.min($("idContent").clientHeight / $("idContent").scrollHeight, 1) + 2 + "px";

 回复 引用 查看   
#79楼[楼主] 2009-08-25 23:24 cloudgamer      
@macwor
是不是浏览器把滑动条当ad屏蔽了
我这里没测出来哦

 回复 引用   
#80楼 2009-08-28 14:52 kll[未注册用户]
http://topic.csdn.net/u/20090828/13/0a65cb47-485f-4151-b78c-9d7cc87eee43.html
如何在这上面加一滚动条呢?

 回复 引用 查看   
#81楼[楼主] 2009-08-28 15:04 cloudgamer      
@kll
这个自己去研究吧

 回复 引用   
#82楼 2009-09-01 12:31 独白[未注册用户]
你的东西真是太好了
 回复 引用 查看   
#83楼 2009-09-10 12:05 wtcsy      
拜读完了

键盘控制和鼠标滚轮写的相当好 pf.
鼠标滚轮控制看的有点不大懂e.detail ...alert出来是undefined
这是未什么了(ps:undefined是指我自己的程序测试的时候)
另外有个小bug 先点击,在滑块滑动的过程中去拖动,会出现问题........

 回复 引用 查看   
#84楼[楼主] 2009-09-10 13:57 cloudgamer      
@独白
谢谢支持

 回复 引用 查看   
#85楼[楼主] 2009-09-10 13:59 cloudgamer      
@wtcsy
ie的event没有detail
在滑块滑动的过程中去拖动?
这个是怎么样操作呢

 回复 引用 查看   
#86楼 2009-09-10 14:27 wtcsy      
ie下没有e.detail
那你那个滚动条在ie下怎么实现的鼠标滚轮滑动了???
就是先点击,当滑动条滑动的时候,按住滑动条,进行拖动,尽量快点结束拖动,最后的位置还是在点击的位置,不是在拖动后的位置
(Ps:当然你觉得这个不是bug也是可以的。。。。。。嘿嘿)

 回复 引用 查看   
#87楼[楼主] 2009-09-10 14:36 cloudgamer      
@wtcsy
ie没有detail但有wheelDelta
这个确实有问题
在DragStart加上this.Stop();应该就行了

 回复 引用   
#88楼 2009-09-11 13:19 huisheng[未注册用户]
我将你的代码完整的复制到aspx 文件中,就提示:
Line:5
Char:2
Code:0
Error:缺少标识符、字符串或数字
网址:http://localhost:4489/WEB/Slider/Slider4.aspx

Line:91
Char:2
Code:0
Error:'Drag' 未定义
网址:http://localhost:4489/WEB/Slider/Slider4.aspx

但是我将其复制成asp文件有没有出错。。
希望告诉要怎么进行修改??

 回复 引用 查看   
#89楼[楼主] 2009-09-11 13:57 cloudgamer      
@huisheng
我的实例中还链接了一个Drag.js的啊
<script type="text/javascript" src="Drag.js"></script>

 回复 引用   
#90楼 2009-09-16 10:51 huisheng[未注册用户]
你好。我是将HTML中的内容直接复制过去的。文件也在同一目录中。很是奇怪了。
 回复 引用 查看   
#91楼[楼主] 2009-09-16 11:04 cloudgamer      
@huisheng
如果下载的实例没问题的话
只能你自己调试了

 回复 引用   
#92楼 2009-10-27 11:41 耀行天下[未注册用户]
博主,我是js新手。今天看到博主写的这篇,兴奋不已。我下载源码之后,放在我页面里就不能用了。 我分析了一下,是我的页面编码是utf8的。而原来的是gb2312的。 请教博主,怎么才可以在utf8的页面使用博主代码?在线等。
 回复 引用 查看   
#93楼[楼主] 2009-10-28 08:37 cloudgamer      
@耀行天下
你打开一个utf文档
复制我的代码进去应该就行了

 回复 引用 查看   
#94楼 2010-01-06 10:21 郝建卫      
强悍...顶
 回复 引用 查看   
#95楼 2010-03-03 11:26 徐培华      
楼主太帅了
想知道楼主学js到做成这样的地步用了多少时间?
是否至少一天都要做一个js方面的项目

 回复 引用 查看   
#96楼[楼主] 2010-03-03 11:41 cloudgamer      
@郝建卫
谢谢支持

 回复 引用 查看   
#97楼[楼主] 2010-03-03 11:42 cloudgamer      
@徐培华
不是啊
将来不知道
目前还是业余阶段

 回复 引用 查看   
#98楼 2010-04-14 19:06 fengye2010      
so good
 回复 引用 查看   
#99楼 2010-04-14 19:53 fengye2010      
博主你好,我想使用你那个仿apple滑动条,但下面的滑动快不知如何定位,请给予一点点指导,也许问题太过于肤浅,但是我对JS了解的实在太少,请你拨冗给予解答,先行谢过。
 回复 引用 查看   
#100楼[楼主] 2010-04-14 21:02 cloudgamer      
@fengye2010
实例中就是默认中间位置
你可以参考一下

 回复 引用 查看   
#101楼 2010-04-14 21:14 fengye2010      
恩,非常感谢你,对你的崇拜犹如滔滔江水连绵不绝,以后学习中有不懂的地方还要多多请教,刚才通过对你文章的不断研习,问题终于解决了。真诚的感谢你无私的奉献你的知识,网路因为有你更精彩。
 回复 引用 查看   
#102楼[楼主] 2010-04-14 21:35 cloudgamer      
@fengye2010
呵呵
谢谢支持

 回复 引用 查看   
#103楼 2010-04-15 10:20 fengye2010      
你好,再次来打扰你,我发现一个小小的问题,如果那个拖动按钮在中间的话会导致两边的图片都不能完全的显示,不知道把拖动按钮调到最左边,改动大不?如果改动不大的话,请问修改哪个参数?
 回复 引用 查看   
#104楼[楼主] 2010-04-15 10:31 cloudgamer      
@fengye2010
设置
sld.SetPercent(.5);
这样就是对应的位置了

 回复 引用 查看   
#105楼 2010-04-15 10:38 fengye2010      
呵呵,原来这么简单,看来我要认真看下去,也就发现了,再次谢谢您。
@程序缘
别逼我鄙视你。

 回复 引用 查看   
#107楼[楼主] 2010-04-25 20:33 cloudgamer      
@别逼我鄙视你
不用这么激动

 回复 引用 查看   
#108楼 2010-04-29 16:36 z s k      
鼠标中键滚动在Chrome中有问题。
 回复 引用 查看   
#109楼[楼主] 2010-04-29 17:21 cloudgamer      
@z s k
写的时候还没有chrome
有空检查一下

 回复 引用 查看   
#110楼 2010-04-29 17:25 z s k      
@cloudgamer

可以看一下这里,可能有点帮助:

http://www.cnblogs.com/zsk526/articles/1724126.html

 回复 引用 查看   
#111楼[楼主] 2010-04-29 17:33 cloudgamer      
@z s k
这里的 鼠标滚动缩放
http://www.cnblogs.com/cloudgamer/archive/2010/04/01/ImageZoom.html
也有差不多的研究

 回复 引用   
#112楼 2010-05-11 10:12 360[未注册用户]
写的真不错,值得学习。谢谢
 回复 引用 查看   
#113楼 2010-07-27 11:35 海洋之 心      
楼主,很不错哦,加油吧
 回复 引用 查看   
#114楼 2010-09-09 14:32 2233      
我是新手,请多多指教。
 回复 引用 查看   
#115楼[楼主] 2010-09-10 15:13 cloudgamer      
@2233
@海洋之 心
@360
谢谢支持

 回复 引用   
#116楼 2010-10-05 01:45 灿[未注册用户]
第一个效果,我同一个页面引用了两个,第二个就无法正确的执行了。
我是在第一个正确的情况下更改的第二个ID号等。。
请指点一下。


<script>
var sld = new Slider("idSlider", "idBar", {
MaxValue: $("idContent").scrollWidth - $("idContent").clientWidth,
onMove: function(){ $("idContent").scrollLeft = this.GetValue(); }
});

sld.SetPercent(0);
sld.Ease = true;

$("idSliderLeft").onmouseover = function(){ sld.Run(false); }
$("idSliderLeft").onmouseout = function(){ sld.Stop(); }

$("idSliderRight").onmouseover = function(){ sld.Run(true); }
$("idSliderRight").onmouseout = function(){ sld.Stop(); }

//这里是第二个,
var sld2 = new Slider("idSlider2", "idBar2", {
MaxValue2: $("dpC").scrollWidth - $("dpC").clientWidth,
onMove2: function(){ $("dpC").scrollLeft = this.GetValue(); }
});

sld2.SetPercent(0);
sld2.Ease = true;

$("idSliderLeft2").onmouseover = function(){ sld2.Run(false); }
$("idSliderLeft2").onmouseout = function(){ sld2.Stop(); }

$("idSliderRight2").onmouseover = function(){ sld2.Run(true); }
$("idSliderRight2").onmouseout = function(){ sld2.Stop(); }
</script>

 回复 引用   
#117楼 2010-10-19 09:49 lujaho[未注册用户]
高手,,来看看..学习了
 回复 引用   
#118楼 2010-10-19 09:49 mr.ing官方[未注册用户]
呵呵..帮我解决了个大问题
 回复 引用 查看   
#119楼[楼主] 2010-10-19 09:56 cloudgamer      
@
看不出来
自己调试一下那里出错吧

 回复 引用 查看   
#120楼[楼主] 2010-10-19 09:56 cloudgamer      
@mr.ing官方
@lujaho
谢谢支持

 回复 引用 查看   
#121楼 2010-12-14 10:43 长刀似雪      
请教博主一个问题,Apple产品展示中,有四个文字说明的效果如何实现呢?鼠标拖动滚动条,在文字上经过的时候,为什么不会没有掩盖文字,如果文字所在的层在滚动条上面,为什么鼠标还可以拖动滚动条?我刚刚看了看人家写的js,可怜没有看懂- -!
你写的注释很详细,感想分享!

 回复 引用 查看   
#122楼[楼主] 2010-12-14 11:05 cloudgamer      
@长刀似雪
很简单
你相对定位在容器上面就行了

 回复 引用 查看   
#123楼 2010-12-14 13:24 长刀似雪      
@cloudgamer
谢谢
仔细看了看,原来Apple产品展示的那个滚动条是两个div

 回复 引用   
#124楼 2010-12-30 21:36 llin123232[未注册用户]
和jquery冲突怎么解决呢?只要在页面中引入<script src="js/jquery.js" type="text/javascript"></script>就会出错
Line:33
Char:9
Code:0
Error:'this.Drag.style' 为空或不是对象
网址:http://localhost:3737/SCDA/Default4.aspx

 回复 引用 查看   
#125楼[楼主] 2010-12-30 22:35 cloudgamer      
@llin123232
你把$换成其他符号就行

 回复 引用   
#126楼 2010-12-30 23:26 llin123232[未注册用户]
@cloudgamer
该怎么换呢?

 回复 引用 查看   
#127楼[楼主] 2010-12-31 09:53 cloudgamer      
@llin123232
直接替换

 回复 引用 查看   
#128楼 2011-04-12 20:43 noyobo      
楼主写的 js库 能和 JQ共存么
 回复 引用 查看   
#129楼 2011-04-12 20:49 noyobo      
@noyobo
看到了 125 楼的回复。 我先试试。

 回复 引用 查看   
#130楼 2011-08-29 15:51 093      
不错挺受用
 回复 引用 查看   
#131楼 2011-08-30 14:54 潺潺水      
楼主牛X,超级支持,不过我有个疑问,FF5.0,ie8,ie7下都没什么问题,
可到了oprea11.50,chorme13.0.782.215,safari5.0.5这三个浏览器里鼠标滚轮滚动没有效果,这个是因为浏览器差异导致的吗,可能我吹毛求疵了,楼主这样的高人能解释解释原因吗?

 回复 引用 查看   
#132楼 2011-09-01 16:47 恋冰魍魉魑魅      
楼主 DD

能不能用纯 JS 写啊。 不要用 js带的库。。。

不好看懂啊。。。。。
小生在此认真请教。。。

在这学习了。

 回复 引用 查看   
#133楼 2011-09-05 14:26 潺潺水      
@恋冰魍魉魑魅
根本就没链接库,你看完.js文件再说好不,
唉,等楼主回复我的问题啊

 回复 引用 查看   
#134楼 2011-09-05 14:46 潺潺水      
this.Ease = !!this.options.Ease;
这里面的!!是什么意思啊?网上找不到这信息……

 回复 引用 查看   
#135楼 2011-09-26 11:23 恋冰魍魉魑魅      
楼主,我想问下,这里做的平滑效果,就是缓动移动,是否可以单独提出来,单独提出来怎么提?使用?
IE下滑动 不用JQ怎么平滑。

 回复 引用   
#136楼 2011-10-17 15:33 annie0000[未注册用户]
lz高手,我做网站正好需要用到滑动条,就从lz这里取经了。
但是发现一个问题,下载的测试版本 ie6下不能用哦,
但是这个页面在ie6下滑动条是可以用的?
lz帮我解答一下吧

 回复 引用 查看   
#137楼 2011-12-09 16:33 Cherishxue      
留个QQ交流下把~~
我想学习 看你挺强的!!
530902406
加我时候 注明一下 slider博客园!
谢谢了~

 回复 引用 查看   
#138楼 2011-12-09 16:40 Cherishxue      
我最近在做一个slider遇到点儿问题!!想请教下!!
评论共2页: 上一页 1 2 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1360988 CsJECq2L/Wk=