鼠标滚轮事件和Mac触控板双指事件


Posted in HTML / CSS onDecember 23, 2019

因为下一阶段要做的一个工作是开发一个WEB端的K线图,所以这一周一直在研究这方面的东西,其中涉及到的一个知识点是鼠标滚轮事件和Mac的触控板双指事件,发现这里面还是有一些坑的。

1. 用哪个事件

The wheel event fires when the user rotates a wheel button on a pointing device (typically a mouse). This event replaces the non-standard deprecated mousewheel event.

以前常使用的mousewheel事件已经逐渐被官方废弃了,改用wheel事件代替,所以这里会优先使用wheel,并向下兼容。

另外,即使是wheel事件,各浏览器的表现也可能不尽相同,都是各大浏览器自己的规范,官方并没有一个标准,虽然我也不知道为什么。

2. 兼容写法

// creates a global "addWheelListener" method
// example: addWheelListener( elem, function( e ) { console.log( e.deltaY ); e.preventDefault(); } );
(function(window,document) {

    var prefix = "", _addEventListener, onwheel, support;

    // detect event model
    if ( window.addEventListener ) {
        _addEventListener = "addEventListener";
    } else {
        _addEventListener = "attachEvent";
        prefix = "on";
    }

    // detect available wheel event
    support = "onwheel" in document.createElement("div") ? "wheel" : // 各个厂商的高版本浏览器都支持"wheel"
              document.onmousewheel !== undefined ? "mousewheel" : // Webkit 和 IE一定支持"mousewheel"
              "DOMMouseScroll"; // 低版本firefox

    window.addWheelListener = function( elem, callback, useCapture ) {
        _addWheelListener( elem, support, callback, useCapture );

        // handle MozMousePixelScroll in older Firefox
        if( support == "DOMMouseScroll" ) {
            _addWheelListener( elem, "MozMousePixelScroll", callback, useCapture );
        }
    };

    function _addWheelListener( elem, eventName, callback, useCapture ) {
        elem[ _addEventListener ]( prefix + eventName, support == "wheel" ? callback : function( originalEvent ) {
            !originalEvent && ( originalEvent = window.event );

            // create a normalized event object
            var event = {
                // keep a ref to the original event object
                originalEvent: originalEvent,
                target: originalEvent.target || originalEvent.srcElement,
                type: "wheel",
                deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1,
                deltaX: 0,
                deltaZ: 0,
                preventDefault: function() {
                    originalEvent.preventDefault ?
                        originalEvent.preventDefault() :
                        originalEvent.returnValue = false;
                }
            };
            
            // calculate deltaY (and deltaX) according to the event
            if ( support == "mousewheel" ) {
                event.deltaY = - 1/40 * originalEvent.wheelDelta;
                // Webkit also support wheelDeltaX
                originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );
            } else {
                event.deltaY = originalEvent.detail;
            }

            // it's time to fire the callback
            return callback( event );

        }, useCapture || false );
    }

})(window,document);

这个是MDN 上推荐的兼容写法,可以看到这几个事件的顺序是 wheel > mousewheel > DOMMouseScroll。如果使用wheel事件,event不做处理。否则,重新封装了event。

3. 方向判断

鼠标滚轮的话,只有上、下两个方向,但是如果是触摸板的双指行为的话,除了上、下以外,还有左、右方向,以及双指向内收缩、向外扩张四种情况,接下来,就对这几种情况做判断处理。
 

function wheelEvent (e) {
    if (Math.abs(e.deltaX) !== 0 && Math.abs(e.deltaY) !== 0) return console.log('没有固定方向');
    if (e.deltaX < 0) return console.log('向右');
    if (e.deltaX > 0) return console.log('向左');
    if (e.ctrlKey) {
        if (e.deltaY > 0) return console.log('向内');
        if (e.deltaY < 0) return console.log('向外');
    } else {
        if (e.deltaY > 0) return console.log('向上');
        if (e.deltaY < 0) return console.log('向下');
    }
}

经过测试,delta是用来判断方向最好的一个值,wheelDelta和detail都有各自的兼容等问题。

deltaX是左右方向的滑动,deltaY是上下方向。

向里收缩是和向下滚动相同,向外扩张是和向上滚动相同。这是正常的用户习惯,但是麻烦的是事实刚好和我们的习惯相反,这样单纯依靠deltaY来判断是区分不开的。

经过测试ctrlKey这个字段只有在双指方向不一致时,才会为true。这样就能区分开了,从而产生了6种情况,逐一处理。

所以上面的兼容写法还需要将ctrlKey返回。

ctrlKey: originalEvent.ctrlKey || false,

这个问题解决了,之后会抽时间把K线图的代码整理一下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
移动Web—CSS为Retina屏幕替换更高质量的图片
Dec 24 HTML / CSS
css图标制作教程制作云图标
Jan 19 HTML / CSS
使用css3实现超炫的loading加载动画效果
May 07 HTML / CSS
利用CSS3的transition属性实现滑动效果
Aug 05 HTML / CSS
利用CSS3实现单选框动画特效示例代码
Sep 26 HTML / CSS
如何用border-image实现文字气泡边框的示例代码
Jan 21 HTML / CSS
详解background属性的8个属性值(面试题)
Nov 02 HTML / CSS
HTML5 device access 设备访问详解
May 24 HTML / CSS
HTML5 画布canvas使用方法
Mar 18 HTML / CSS
AmazeUI 图标的示例代码
Aug 13 HTML / CSS
z-index不起作用
Mar 31 HTML / CSS
CSS3实现指纹特效代码
Mar 17 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
Dec 23 #HTML / CSS
html5利用canvas实现颜色容差抠图功能
Dec 23 #HTML / CSS
HTML5 客户端数据库简易使用:IndexedDB
Dec 19 #HTML / CSS
吃透移动端 Html5 响应式布局
Dec 16 #HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
Dec 17 #HTML / CSS
吃透移动端 1px的具体用法
Dec 16 #HTML / CSS
关于html字符串正则判断和匹配的具体使用
Dec 12 #HTML / CSS
You might like
php将html转为图片的实现方法
2017/05/19 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
使用js正则控制input标签只允许输入的值
2013/07/29 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
BootStrap selectpicker
2016/06/20 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
React Router基础使用
2017/01/17 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
python中os包的用法
2020/06/01 Python
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
美国第一香水网站:Perfume.com
2017/01/23 全球购物
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
出纳岗位职责模板
2013/11/27 职场文书
财政局长自荐信范文
2013/12/22 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
2014年检验科工作总结
2014/11/22 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书