js 事件对象 鼠标滚轮效果演示说明

Mouse Wheel Data

.slider
{
width:50px;
height:180px;
background:#eee;
padding:10px 0;
cursor:n-resize;
}
.slider-slot
{
width:16px;
margin:0 auto;
height:180px;
background:#eee;
border:1px solid gray;
border-color:#999 white white #999;
position:relative;
}
.slider-trigger
{
width:14px;
height:18px;
font:1px/0 arial;
border:1px solid gray;
border-color:white #999 #999 white;
background:#ccc;
position:absolute;
}
.slider-trigger b
{
display:block;
margin:1px 3px;
border-top:1px solid #999;
border-bottom:1px solid white;
}

文本框增加/减少值

文本框获得焦点后滚动鼠标滚轮

鼠标滚动缩放图片

鼠标滚动控制滑块移动





var $ = function(i)
{
return document.getElementById( i );
}
//取得滚动值
function getWheelValue( e )
{
e = e||event;
return ( e.wheelDelta ? e.wheelDelta/120 : -( e.detail%3 == 0 ? e.detail/3 : e.detail ) ) ;
}
function stopEvent(e)
{
e = e||event;
if( e.preventDefault )e.preventDefault();
e.returnValue = false;
}
//绑定事件,这里对mousewheel做了判断,注册时统一使用mousewheel
function addEvent( obj,type,fn )
{
var isFirefox = typeof document.body.style.MozUserSelect != 'undefined';
if( obj.addEventListener )
obj.addEventListener( isFirefox ? 'DOMMouseScroll' : type,fn,false );
else
obj.attachEvent( 'on'+type,fn );
return fn;
}
//移除事件,这里对mousewheel做了兼容,移除时统一使用mousewheel
function delEvent( obj,type,fn )
{
var isFirefox = typeof document.body.style.MozUserSelect != 'undefined';
if( obj.removeEventListener )
obj.removeEventListener( isFirefox ? 'DOMMouseScroll' : type,fn,false );
else
obj.detachEvent( 'on'+type,fn );
}
/*限制范围函数,
参数是三个数字,如果num 大于 max, 则返回max, 如果小于min,则返回min,如果在max和min之间,则返回num
*/
function range( num, max,min )
{
return Math.min( max, Math.max( num,min ) );
}
/* ------------ */
/*

文本框增加/减少值

*/
$( 'txt' ).onfocus = function()
{
//保存txt自己的引用
var me = this,
//onfocus之后注册滚轮事件
handler = addEvent( me,'mousewheel',function(e)
{
stopEvent( e );
var delta = getWheelValue(e);
/*
+me.value 将me.value转换成数字,
然后使用isNaN检查转换后的数字是否为NaN
如果是,重新赋值me.value=0;
*/
if( isNaN( +me.value ) ) me.value = 0;
//递增(或递减)
me.value = +me.value + delta;
//选中me里的文字
me.select();
});
//失去焦点时,把mousewheel事件移除,重置window.onblur和handler引用为null
this.onblur = function()
{
//移除掉mousewheel事件
delEvent( me,'mousewheel',handler );
window.onblur = handler = null;
}
//为了防止浏览器失焦后,文本框重复触发focus,在onblur时,让文本框同时失焦
window.onblur = function()
{
me.blur();
//把自己清理掉
this.onblur = null;
}
}
/*

鼠标滚动缩放图片

*/
addEvent( $('img'),'mousewheel',function(e)
{
stopEvent( e );
var delta = getWheelValue(e);
//每次递增(或递减)10px,使用了范围限制,保证图片不会过大过小
var img = $('img'); //没有修复ie的this指向,所以这里只好重新获取img
img.style.width = range( img.offsetWidth + ( delta * 10 ),550,100) + 'px';
return false;
});
/*

鼠标滚动控制滑块移动

*/
addEvent( $('slider'), 'mousewheel',function(e)
{
stopEvent( e );
var delta = getWheelValue(e),
tar = $('sliderTrigger');
//杯具的反转,因为tar.offsetTop 越大,滑块就越往下,所以delta又需要反转回来,向上是负的,向下是正的,所以乘以-1
tar.style.top = range( tar.offsetTop + ( -1 * delta * 10 ),160,0 ) + 'px';
});

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

先来看看各个浏览器的兼容情况

IE 6,7,8
注册事件使用 onmousewheel
取得滚动的值使用 event.wheelDelta
滚动步长 120
向下是负值,向上是正值
当鼠标在一个同一个坐标,并且滚轮不间断滚动时,wheelDelta会按步长递增
(比如 -240 -360 )

Firefox 3.5
注册事件有两个MozMousePixelScroll,DOMMouseScroll,但是它们不能使用element.onDOMMouseScroll方式注册,必须使用addEventLinstener来监听事件
Firefox没有event.wheelDelta,它使用event.detail 来获取滚动的信息(Firefox这点做的很奇怪)
event.detail 本身是用来记录一个事件在原地(鼠标坐标不发生变化的情况下)执行了多少次的信息
而在DOMMouseScroll事件发生的时候,它的值通常是 3 和 -3
但是它的取值和IE正好相反, 向上是负,向下是正( 这个问题在代码中需要做统一 )
为什么说它的值通常是 3和-3呢,因为当你按住ctrl ,alt, shift 之后,再滑动鼠标滚轮,detail 的值就会成为 1和-1
而按住别的键,则正值有时还会变成6
总之在我看来是有点乱糟糟,

MozMousePixelScroll 据Mozilla说,是几乎跟DOMMouseScroll一样的事件,只不过更精确(到像素)
但是这个事件的detail值返回的非常奇怪,默认是51和-51,按住ctrl ,alt, shift 变成了 +- 17. @_@,所以它被华丽的无视了,我们不打算使用它

Chrome 和IE保持一致,但是它考虑到了横向鼠标滚轮设备的情况,所以增加了两个鼠标来分别获取值

事件 onmousewheel
wheelDelta {number}
wheelDeltaX {number}
wheelDeltaY {number}

这次 Opera 又是集大成者,既有detail 取值也一样是3,-3,又有wheelDelta,不过表现上倒是很一致
事件 onmousewheel
detail = {number}
wheelDelta = {number}

本来我们应该从Firefox支持的event.detail或者IE等支持的event.wheelDelta的取值中,选择一个,然后把另一个通过计算做成统一的,
但是实际上我们只能通过这些值知道 是向上滚 还是向下滚,
所以为了方便,我们两个都不取,通过计算把他们统一成 +1 和 -1.(这样做也是为了实际应用中的运算方便);

对于IE,Chrome来说,直接除以120就可以搞定

Opera 同时支持wheelDelta和detail ,但是detail没有wheelDelta同一位置递增的能力,所以
我们首先优先判断wheelDelta是否存在,如果存在,就使用wheelDelta,如果不存在再使用detail

由于firefox的键盘干扰,我们还需要对detail做一些过滤
首先用这个值跟3做取模运算 value % 3
说它是3的倍数,那么返回值是0,我们就用value除以3后返回( 保证返回的值是+1 -1 )
如果返回值不是0,那说明这个值不是1就是-1,那就直接返回这个值

最后,由于Firefox返回值的规则是向上是负 向下是正,与平时的习惯不同,我们要将正负反转过来,方法也很简单,计算结果前面加一个负号就可以搞定
话说回来,对滚轮事件的支持情况firefox真是有点闷.

好了,分析了一大堆,其实代码就几句:


代码如下:

function getWheelValue( e )
{
e = e||event;
return ( e.wheelDelta ? e.wheelDelta/120 : -( e.detail%3 == 0 ? e.detail : e.detail/3 ) );
}

最后说说未来的滚轮事件和API
在DOM3 Event 中
滚轮事件变得更为复杂(也支持更多的东西)
注册的事件并没有变,依然叫mousewheel
专门增加了两枚滚轮事件对象
MouseWheelEvent
WheelEvents
而且支持了x,y,z三个轴向的滚轮值( 真复杂>_< )
感兴趣可以瞧瞧这里
http://www.w3.org/TR/DOM-Level-3-Events/#events-mousewheelevents

(0)

相关推荐

  • JS图片切换的具体方法(带缩略图版)

    复制代码 代码如下: <!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=&qu

  • 最简单的js图片切换效果实现代码

    无意中在网上发现的,代码非常的简单,一看就明白! 复制代码 代码如下: <script language =javascript > var curIndex=0; //时间间隔 单位毫秒 var timeInterval=5000; var arr=new Array(); arr[0]="1.jpg"; arr[1]="2.jpg"; arr[2]="3.jpg"; arr[3]="4.jpg"; arr[4]

  • JavaScript实现鼠标滚轮控制页面图片切换功能示例

    本文实例讲述了JavaScript实现鼠标滚轮控制页面图片切换功能.分享给大家供大家参考,具体如下: 鼠标上的滚轮是一个不错的东东,为什么这么说,因为它能帮助我们快速的浏览网页,快速的进行长篇文章的阅读.对于web前端的我们来说又怎么能不注重这个鼠标滚轮呢,那么它能如何让用户更好的浏览网页呢? 最常见就是图片的切换了,能通过滚动滚轮进行图片的浏览,省得用户还要去点下一张,做这种繁琐的步骤.来看个简单的例子吧. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML

  • 纯js实现背景图片切换效果代码

    html代码 复制代码 代码如下: <!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> <title>背景切

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

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

  • js鼠标点击图片切换效果实现代码

    本文实例讲述了js鼠标点击图片切换效果实现代码.分享给大家供大家参考.具体如下: 运行效果截图如下: 具体代码如下: html代码: <div id="menuWrapper" class="menuWrapper bg1"> <ul class="menu" id="menu"> <li class="bg1" style="background-position:

  • js捕获鼠标滚轮事件代码

    之前看到一个人人网高级前端面试的笔试题 要求手写代码,其中有个题是做一个图片展示 类似百度图片最下面小缩略图那个展示栏 然后要求有个鼠标滚轮滚动变大变小的要求 这个我还真不知道怎么做,在网上找了找资料 发现可以捕获onmousewheel的事件 然后根据event.wheelDelta值的正负来判断是前滚还是后滚 随便写了个小例子,顺便捕获下键盘的按键,不太美观没有换行 因为用textNode做的,加不进去html代码 说到这里是不是可以用这种方法来防止xss注入呢? 复制代码 代码如下: <b

  • js实现鼠标滚轮控制图片缩放效果的方法

    本文实例讲述了js实现鼠标滚轮控制图片缩放效果的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <!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/xhtm

  • javascript实现图片切换的幻灯片效果源代码

    网页上有许多图片切换的幻灯片效果,它们大多用flash实现,那javascript能不能实现他们呢,当然可以,我自己写了一个,和大家一同分享 废话少说,看代码 复制代码 代码如下: sx.activex.imagefade={ init:function(imga,fadeint,fadeoutt){ var ti=new Array(); for(var i=0;i<imga.length;i++){ ti[i]=new Image(); ti[i].src=imga[i] } var div

  • js+div实现文字滚动和图片切换效果代码

    本文实例讲述了js+div实现文字滚动和图片切换效果代码.分享给大家供大家参考.具体如下: 这里演示js+div文字滚动和图片切换代码,为了演示方便,去掉了图片调用,用数字代替了,用时候再加上就可以了,本效果实现了两种效果,Div切换,TAB切换,和文字滚动,鼠标移上后文字停止滚动,两种功能可任意剥离出来,这不影响代码使用. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-div-txt-pic-scroll-cha-style-codes

  • javascript监听鼠标滚轮事件浅析

    我们都见到过这些效果,用鼠标滚轮实现某个表单内的数字增加减少操作,或者滚轮控制某个按钮的左右,上下滚动.这些都是通过js对鼠标滚轮的事件监听来实现的.今天这里介绍的是一点简单的js对于鼠标滚轮事件的监听. 不同浏览器不同的事件 首先,不同的浏览器有不同的滚轮事件.主要是有两种,onmousewheel(firefox不支持)和DOMMouseScroll(只有firefox支持),关于这两个事件这里不做详述,想要了解的朋友请移步:鼠标滚轮(mousewheel)和DOMMouseScroll事件

随机推荐