标题有些绕,其实就是很简单的问题,很多人应该都遇到过,最近优化自动完成的插件,发现在下拉框内容多时出现滚动条的情况下,如果页面本身也有滚动条,就很容易出现两边都滚动的情况,体验非常之差。因为之前没有考虑过此类问题,自信想了下,应该可以通过技术手段避免。
一开始想过监听scroll事件,但是发现这样的想法本身就有误区,因为滚动某个元素本身,而要去屏蔽window的滚动,根本说不通,那么换一种思路,既然滚动通常是鼠标操作,何不操作处理滚轮事件?
简单查了下,的确有类似的文章,我们都知道,jQuery插件默认是不支持鼠标中轮滚轮事件的,现在我们可以用于添加跨浏览器的鼠标滚轮支持可以使用jQuery的Mousewheel插件,具体插件大家可以搜jquery.mousewheel.js找到,这里不再额外贴地址。
另外要注意的就是,mousewheel事件的delta。通过参数delta可以获取鼠标滚轮的方向和速度。如果delta的值是负的,那么滚轮就是向下滚动,正的就是向上,如此以来,我们只用给特定元素绑定鼠标滚动事件,鼠标滚动时始终阻止事件,同时可以根据delta参数调整当前元素的scrollTop,实现滚动效果,看起来很简单,外加jQuery的Mousewheel插件,基本上大家应该知道怎么写了,这里就不赘述了。
下面抛开jQuery插件,提供一份直接屏蔽Mousewheel事件的代码,测试兼容常用浏览器(IE仅测到8.0版本)。
var preventScroll = function(dom){ if(dom.jquery){ dom = dom.get(0); } if(navigator.userAgent.indexOf('Firefox') >= 0){ //firefox dom.addEventListener('DOMMouseScroll',function(e){ dom.scrollTop += e.detail > 0 ? 60 : -60; e.preventDefault(); },false); }else{ dom.onmousewheel = function(e){ e = e || window.event; dom.scrollTop += e.wheelDelta > 0 ? -60 : 60; return false; }; } };上一篇: 结合HTML5、CSS3、JS模拟微信摇一摇开发小记 下一篇: 初识Kotlin