鼠标滚轮事件和Mac触控板双指事件
因为下一阶段要做的一个工作是开发一个WEB端的K线图,所以这一周一直在研究这方面的东西,其中涉及到的一个知识点是鼠标滚轮事件和Mac的触控板双指事件,发现这里面还是有一些坑的。
1. 用哪个事件
The wheel event fires when the user rotates a wheel button on a potg 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(wdow,document) { var prefix = "", _addEventListener, onwheel, support; // detect event model if ( wdow.addEventListener ) { _addEventListener = "addEventListener"; } else { _addEventListener = "attachEvent"; prefix = "on"; } // detect available wheel event support = "onwheel" document.createElement("div") ? "wheel" : // 各个厂商的高版本浏览器都支持"wheel" document.onmousewheel !== undefed ? "mousewheel" : // Webkit 和 IE一定支持"mousewheel" "DOMMouseScroll"; // 低版本firefox wdow.addWheelListener = function( elem, callback, useCapture ) { _addWheelListener( elem, support, callback, useCapture ); // handle MozMousePixelScroll older Firefox if( support == "DOMMouseScroll" ) { _addWheelListener( elem, "MozMousePixelScroll", callback, useCapture ); } }; function _addWheelListener( elem, eventName, callback, useCapture ) { elem[ _addEventListener ]( prefix + eventName, support == "wheel" ? callback : function( origalEvent ) { !origalEvent && ( origalEvent = wdow.event ); // create a normalized event object var event = { // keep a ref to the origal event object origalEvent: origalEvent, target: origalEvent.target || origalEvent.srcElement, type: "wheel", deltaMode: origalEvent.type == "MozMousePixelScroll" ? 0 : 1, deltaX: 0, deltaZ: 0, preventDefault: function() { origalEvent.preventDefault ? origalEvent.preventDefault() : origalEvent.returnValue = false; } }; // calculate deltaY (and deltaX) aordg to the event if ( support == "mousewheel" ) { event.deltaY = - 1/40 origalEvent.wheelDelta; // Webkit also support wheelDeltaX origalEvent.wheelDeltaX && ( event.deltaX = - 1/40 origalEvent.wheelDeltaX ); } else { event.deltaY = origalEvent.detail; } // it's time to fire the callback return callback( event ); }, useCapture || false ); } })(wdow,document);
这个是上推荐的兼容写法,可以看到这几个事件的顺序是 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: origalEvent.ctrlKey || false,
这个问题解决了,之后会抽时间把K线图的代码整理一下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
网站设计
- 静宁会SEO的网站建设公司:全面提升您的网络影
- 提升在线业务的关键:选择最佳的丽水网站建设
- 浙江网站优化发展潜力如何
- 井研专业的网站建设公司:打造您的在线品牌
- 灵山SEO网站建设公司:提升您的在线业务表现
- 蒙城网站建设优化公司:提升您网站表现的理想
- 阳谷企业网站优化:提升线上业务力的关键
- 樟树专业的网站建设公司:打造您在线业务的坚
- 通河百度SEO排名的策略与技巧
- 重庆百度快照排名如何进行精准的客户引流
- 重庆百度快照排名
- 常宁便宜的建站公司:助您轻松打造在线业务
- 巫溪百度网站优化:提升网站曝光率与流量的关
- 湖北整站优化怎么做才能放大客户需求
- 闸北网站建设多少钱?全面解析与预算规划
- 辽宁企业网站优化怎么做电话营销