最近在一個項目中使用了iScroll4模擬滾動效果,調試過程中發現一個表單頁中的所有表單項都無法點擊聚焦, 如<select>、<input>、<textarea>。這是因為iScroll要監聽整個頁面事件,為了達到 最優效果,它默認禁用了所有元素的默認事件(但也有例外,如<a>默認事件不受影響),所以才造成這些表單元素點擊沒有反應,無法正常聚焦。
我們打開 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();}},
這樣,input及textarea可以正常聚焦了,但是發現select點擊還是沒有彈出下拉列表框。
這是因為 iscroll 默認使用的是css的transform變形中的translate3d實現區域滾動,每次滾動實際是改變translate3d中的y軸值,實際的 dom位置並沒有發生變化。translate3d會導致頁面的焦點錯誤,系統級下拉菜單的顯示則會導致其出現顯示偏離。
控制滾動模式的代碼默認是:useTransform: true。好在iscroll提供了另一種滾動方式,基於絕對定位位置變化的滾動。修改為useTransform: false之后,iscroll就會使用對定位位方式來實現滾動,該方式是我們在web開發中模擬動畫的最常用方式,滾動之后dom的實際位置也同步發生 了變化,不會出現錯位偏離現象。