最近在一个项目中使用了iScroll4模拟滚动效果,调试过程当中发现一个表单页中的全部表单项都没法点击聚焦, 如<select>、<input>、<textarea>。这是由于iScroll要监听整个页面事件,为了达到 最优效果,它默认禁用了全部元素的默认事件(但也有例外,如<a>默认事件不受影响),因此才形成这些表单元素点击没有反应,没法正常聚焦。css
咱们打开 iscroll.js ,找到这一行:
onBeforeScrollStart : function(e){ e.preventDefault(); },
将其改成:
onBeforeScrollStart : function(e){var nodeType = e.explicitOriginalTarget ? e.explicitOriginalTarget.nodeName.toLowerCase() : (e.target ? e.target.nodeName.toLowerCase() : ”);if(nodeType != ‘select’ && nodeType != ‘option’ && nodeType != ‘input’ && nodeType != ‘textarea’){e.preventDefault();}},node
这样,input及textarea能够正常聚焦了,可是发现select点击仍是没有弹出下拉列表框。web
这是由于 iscroll 默认使用的是css的transform变形中的translate3d实现区域滚动,每次滚动实际是改变translate3d中的y轴值,实际的 dom位置并无发生变化。translate3d会致使页面的焦点错误,系统级下拉菜单的显示则会致使其出现显示偏离。dom
控制滚动模式的代码默认是:useTransform: true。好在iscroll提供了另外一种滚动方式,基于绝对定位位置变化的滚动。修改成useTransform: false以后,iscroll就会使用对定位位方式来实现滚动,该方式是咱们在web开发中模拟动画的最经常使用方式,滚动以后dom的实际位置也同步发生 了变化,不会出现错位偏离现象。动画