JS技术

javascript教程_Mousewheel事件:鼠标滚轮放大页面字体_Javascript教程

字号+ 作者:H5之家 来源:H5之家 2015-09-17 17:15 我要评论( )

javascript教程_Mousewheel事件:鼠标滚轮放大页面字体,学习javascript教程_Mousewheel事件:鼠标滚轮放大页面字体,javascript教程_Mousewheel事件:鼠标滚轮放大页

当需要制作转动鼠标滚轮放大页面字体这样的交互效果时,会用到 Mousewheel 事件。其实在大多数浏览器(IE6, IE7, IE8, Opera 10+, Safari 5+)中,都提供了 “mousewheel” 事件。但杯具的是 Firefox 3.5+ 却不支持此事件,不过庆幸 Firefox 3.5+ 中提供了另外一个等同的事件:”DOMMouseScroll” (事件和事件属性的测试案例)。

OK,我们现在已经知道了不同浏览器之间实现的差别,兼容代码如下:

var addEvent = (function(){
        if (window.addEventListener) {
            return function(el, sType, fn, capture) {
                el.addEventListener(sType, fn, (capture));
            };
        } else if (window.attachEvent) {
            return function(el, sType, fn, capture) {
                el.attachEvent("on" + sType, fn);
            };
        } else {
            return function(){};
        }
    })(),
    // isFirefox 是伪代码,大家可以自行实现
    mousewheel = isFirefox ? "DOMMouseScroll" : "mousewheel";
// object 也是伪代码,你需要注册 Mousewheel 事件的元素
addEvent(object, mousewheel, function(event){
    event = window.event || event;
    // todo something
}, false);

我们再回到要实现的交互效果上,现在还有其他一些问题需要来解决:

  • 页面字体到底是放大还是缩小呢? ==> 鼠标滚轮是向上滚动还是向下滚动呢?
  • 页面字体缩放的倍数到底是多少呢? ==> 鼠标滚轮滚动的幅度大小是多少呢?
  • 还好,我们可以通过 event 的某些属性值得到这些信息:

    注:上面第三点,在《The onmousewheel event of JavaScript》一文中有这样一段批注:

    In Opera, “detail” returns the same value as it does in FF, so for the big O you should rely on “detail” instead of “wheelDelta”, which depending on the Opera version may return a different value than in IE’s.

    但经测试, Opera 9+ 和 Opera 10+ 中的 event.wheelDelta 属性与其他浏览器中的表现完全一致,未发现异常与错误,从接口角度来说,代码中应优先使用 “event.wheelDelta” 属性。

    此时代码如下:

    var addEvent = (function(){
            if (window.addEventListener) {
                return function(el, sType, fn, capture) {
                    el.addEventListener(sType, fn, (capture));
                };
            } else if (window.attachEvent) {
                return function(el, sType, fn, capture) {
                    el.attachEvent("on" + sType, fn);
                };
            } else {
                return function(){};
            }
        })(),
        stopEvent: function(event) {
            if (event.stopPropagation) {
                event.stopPropagation();
            } else {
                event.cancelBubble = true;
            }
            if (event.preventDefault) {
                event.preventDefault();
            } else {
                event.returnValue = false;
            }
        },
        zoomIn = function(){},
        zoomOut = function(){},
        // isFirefox 是伪代码,大家可以自行实现
        mousewheel = isFirefox ? "DOMMouseScroll" : "mousewheel";
    // object 是伪代码,你需要注册 Mousewheel 事件的元素
    addEvent(object, mousewheel, function(event){
        var delta = 0;
        event = window.event || event;
        stopEvent(event);
        delta = event.wheelDelta ? (event.wheelDelta / 120) : (- event.detail / 3);
        // zoomIn, zoomOut 是伪代码,需要实现的缩放事件
        delta > 0 ? zoomIn(delta): zoomOut(Math.abs(delta));
    } , false);

    事件和事件属性的测试案例:

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    网友点评