JavaScript 滑动条效果

这个滑动条(拖动条)效果,一开始是参考了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/
posted @ 2008-12-24 08:27 cloudgamer 阅读(13904) 评论(68)  编辑 收藏 网摘 所属分类: Javascript

  回复  引用    
#1楼2008-12-24 08:40 | fftt[未注册用户]
cool!
  回复  引用  查看    
#2楼2008-12-24 08:44 | 克隆      
让我说你什么好??你也太niub了
  回复  引用  查看    
#3楼2008-12-24 08:45 | holywolf      
JS做成这样,真牛
  回复  引用  查看    
#4楼2008-12-24 08:46 | 二叉树      
JS狂人。。。。。
  回复  引用  查看    
#5楼2008-12-24 08:49 | 不若相忘于江湖      
楼主JS功力深厚..
  回复  引用  查看    
#6楼2008-12-24 08:53 | relax      
厉害~博主的文章都仔细看过,获益匪浅
我顶你个肺
  回复  引用  查看    
#8楼2008-12-24 08:56 | Allie      
效果不错 美女更好看 哈哈!
  回复  引用    
#9楼2008-12-24 09:01 | zzticzh1[未注册用户]
用于的全是美女图片 不错
  回复  引用  查看    
#10楼2008-12-24 09:05 | yuejianjun      
美图虽好
效果更佳

  回复  引用    
#11楼2008-12-24 09:07 | 今天路过[未注册用户]
good!
  回复  引用  查看    
#12楼2008-12-24 09:13 | Benson_design....      
楼主是介于牛A和牛C这间!
  回复  引用  查看    
#13楼2008-12-24 09:18 | 代震军      
不错,先顶起来
  回复  引用  查看    
#14楼2008-12-24 09:19 | 李胜攀      
不错不错,支持。
  回复  引用  查看    
#15楼2008-12-24 09:28 | 谦虚的天下      
不错!
这人一般用于图片显示,或广告之类的,楼主这个人家一进来效果确实不错,不过如果人家第一眼看时,这个能动就更好了。就是就一打开页面,默认图片是从左到右(可设置)滚动,mouse 放上去就停下来,这样多点动感会好点
  回复  引用  查看    
#18楼[楼主]2008-12-24 09:37 | cloudgamer      
@fftt
@克隆
@holywolf
@二叉树
@不若相忘于江湖
@relax
@谁注册了我黑牛的用户名啊
@Allie
@zzticzh1
@yuejianjun
@今天路过
@Benson_design....
@代震军
@李胜攀
@谦虚的天下
@痴情客
谢谢各位支持

@提个建议,图片能滚动就好了
我觉得没这个必要吧

  回复  引用  查看    
#19楼2008-12-24 09:49 | Mien      
看来博客园做前台开发的人很少,楼主的是内容是不错,但也没到楼上诸位所惊呼的地步吧。

[给楼主提个建议,要是有精力的话,这个滚动条的JS封装起来,可以自由调用就好了(因为overflow:auto;出来的与设计太不协调了),我一直想做,可一直没有时间。]

另,ZDnet视频页的那个滚动条也不错,乍看还以为是Flash的。

  回复  引用  查看    
#20楼2008-12-24 09:54 | Leem      
为什么博主JS可以写的这么好?why???有点嫉妒!!!!!
  回复  引用  查看    
#21楼[楼主]2008-12-24 09:54 | cloudgamer      
@Mien
呵呵
虚心接受

@Leem
这个...一起努力!

  回复  引用  查看    
#22楼2008-12-24 10:25 | 越兔      
喔呵呵呵...不错哇...
  回复  引用    
#23楼2008-12-24 10:31 | Fang Leo[未注册用户]
做的不错,mark
  回复  引用  查看    
#24楼2008-12-24 10:31 | Kevin-moon      
赞个先 图中的美女真性感.....
  回复  引用  查看    
#25楼2008-12-24 10:41 | 黑羽飘舞      
一片和谐的赞扬声,我也想多说写赞扬的话,但是发现都别前边的兄弟说了,只能说些另人不快的话了,希望兄弟不要见怪。

这个仿Apple滑动条效果尚可,但是并没有把握这个滑动条应用的精髓,如果仅仅是一个滑动条的话用div自带的就可以了,没必要做的这么麻烦。Apple滑动条的精髓在于ccessories Macs Applications Servers 这4个分割点,这样可以方便用户浏览,没有分割点的滑动条除了美观些,实在是没什么实际意义。

  回复  引用  查看    
#26楼[楼主]2008-12-24 11:00 | cloudgamer      
@黑羽飘舞
那个分割点是什么意思?
是指定位还是什么?
我想实际意义还是有的,我在一个相册浏览的系统就用到了(正是有那个需求才有了写这个的想法)
而且滑动条的应用还是很多的,当然我这个或许没有jquery那些效果好
其实我更多的也不是实际应用,只是想告诉大家这个怎么做,怎么做得更好
我也不是想大家都用我的程序,而是写属于自己的程序(也不是框架的)
不过我也明白,这里的都是.net的爱好者不是js,前台的东西就是看看效果,适合就拿来用用而已,我想喜欢js的人会对我的文章更有兴趣的

效果确实没什么意义(比我好的多的是),但未必个个都有这么详细的程序说明吧
说实话,写程序说明花的时间不比写程序的少,甚至更多,因为有些理论我不想敷衍了事,而是有真凭实据。
写程序说明会使我更加注重细节,更加刨根问底,不会随便下结论(怕被拍砖),也更能提高我的技术和基础知识,如果只是写程序那写完就完,根本不用想那么多。
当然虚荣心也是写blog的一个动力,这里就要谢谢大家的支持了

以上不是拍砖,算是感悟吧。

  回复  引用  查看    
#27楼2008-12-24 11:32 | relax      
@Mien
我也喜欢摆弄JS,但没有博主对JS理解得这么透彻,很多东西都是一知半解,只知道怎么用而不知道为什么这么用,还能用哪些方法代替,博主每篇文章讲得都很清晰,用博主的话来说就是“注重细节”,我佩服的是他这种精神。

当然在博客园讲JS有点像在中文系讲数据结构一样有点与众不同。
但前台往往是我们程序员欠缺的技能,学习一下有益无害。

  回复  引用  查看    
#28楼2008-12-24 11:50 | volnet(可以叫我大V)      
不顶不行,楼主的文章就是好!图文并茂效果真实可靠!
  回复  引用  查看    
#29楼2008-12-24 13:38 | peace      
写的系列非常不错 再顶下
  回复  引用  查看    
#30楼2008-12-24 14:05 | 程序缘      
楼主就不能用正经一点的图片?
那么暴露,你以为是做黄色网站啊?

  回复  引用  查看    
#31楼[楼主]2008-12-24 14:13 | cloudgamer      
@越兔
@Fang Leo
@Kevin-moon
@relax
@volnet(可以叫我大V)
@peace
谢谢支持!

@程序缘
写程序也需要养眼啊,呵呵

  回复  引用  查看    
#32楼2008-12-24 14:20 | 程序缘      
恐怕会让人想入非非,难不成还要先意淫一番才开始研究您的大作?

你的文章确实很好,若是这用风景类型的真正养眼的图片,那不是更加完美?

望楼主三思,切莫存好心做恶事!


  回复  引用  查看    
#33楼2008-12-24 14:23 | volnet(可以叫我大V)      
不行,我要顶两下!
  回复  引用  查看    
#34楼[楼主]2008-12-24 14:32 | cloudgamer      
@程序缘
晕,这也是恶事啊
善哉善哉

@volnet(可以叫我大V)
谢谢兄弟二顶

  回复  引用    
#35楼2008-12-24 16:43 | MOO[未注册用户]
支持楼主 呵呵 那个什么程序缘肯定是60年代跑来的思想守旧的古董程序员
  回复  引用    
#36楼2008-12-24 18:09 | xuzx[未注册用户]
好文章!!!
自从看了楼主的文章后,决心学习JS了,但是不知要到何年何月才能达楼主的水平呢~~

  回复  引用  查看    
#37楼2008-12-24 21:06 | joylee      
强人强帖,收藏慢慢研究
  回复  引用  查看    
#38楼2008-12-24 22:18 | 名刘天下      
厉害!有时间得好好琢磨博主的文章。。。。
  回复  引用  查看    
#39楼2008-12-25 08:30 | 李战      
http://www.cnblogs.com/Emoticons/qface/055243188.gif" alt="" />先收下,后研究http://www.cnblogs.com/Emoticons/yoyocici/223854210.gif" alt="" />
  回复  引用  查看    
#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      
@六翼
这个精度暂时还没办法解决
硬件问题

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

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

0 1360988




相关文章:

相关链接: