移動端互動優化
阿新 • • 發佈:2019-02-01
1 點選:移動端的click事件有300ms的延遲
目的:區分單擊與雙擊事件(300ms內點選一次是單擊,點選2次是雙擊)
解決方案:引入移動框架如zepto,用tab事件代替click
tab:不是原生事件,touchstart\touchmove\touchend模擬出來的事件
基本條件
1、從觸控到離開時間間隔短
2、從起點到終點的距離小
點選態
給使用者明確的點選反饋,提升使用者體驗
方案1:使用:active偽類
缺點:滾動的時候也會觸發樣式
方案2:js模型點選態(推薦)
//點選事件帶點選態
$el.on('tap',function(e){
var $target=$(e.target);
$target.addClass('active');
setTimeout(function(){
$target.removeClass('active');
},150);
});
2 滾動
1 彈性滾動
全域性滾動:滾動條在dom節點或更頂層
區域性滾動:滾動條在body下的某一個dom節點上
彈性滾動:
IOS:全域性滾動:預設支援
區域性滾動:預設沒有滾動條,且滾動起來乾澀
IOS區域性滾動啟動彈性滾動效果
body{-webkit-overflow-scrolling:touch;}
區域性滾動的dom節點
.scroll-el{overflow:auto;}
建議:將屬性掛在body上,可以避免很多奇怪的bug
Android:
定製版本較多,瀏覽器表現各異
預設沒有彈性滾動效果
-webkit-overflow-scrolling:預設瀏覽器不支援,android上的chrome版本支援
2 出界
什麼時候觸發出界
IOS:全域性滾動:滾動帶頁面頂部(或底部)時繼續向下(向上)滑動,就會出現
區域性滾動:滾動帶頁面頂部(或底部)時,手指離開停下,再繼續向下(向上)滑動,就會出現
IOS解決方案
區域性滾動:使用scrollFix
if(startTopScroll<=0)
elem.scrollTop=1;
if(startTopScroll+elem.offsetHeight>=elem.scrollHeight)
elem.scrollTop=elem.scrollHeight-elem.scrollHeight-1;
頁面的固定區域禁止touchmove預設事件
全域性滾動
暫時沒有好的解決辦法,可以考慮將全域性滾動改為區域性滾動
好訊息:從IOS8開始safari的出界部分的背景色和body的背景色保持一致
Adroid解決方案(使用全域性滾動)
流暢滾動的N條軍規
1 body上加上-webkit-overflow-scrolling:touch;
2 IOS儘量使用區域性滾動
3 IOS使用scrollFix避免出界
4 IOS下帶有滾動條且position:absolute的節點不要設定背景色
5 Android下儘量使用全域性滾動
1)儘量不用overflow:auto
2)使用min-height:100%代替height:100%
3 定製軟鍵盤樣式:
配置input節點的type型別
電子郵件input型別:<input type="email" name="email">
URL input 型別:<input type="url" name="url">
電話號碼input型別:<input type="tel" name="tel">
數字input型別:<input type="number" name="number">
日期input型別:<input type="date" name="date">
時間input型別:<input type="time" name="time">
日期和時間input型別:<input type="datetime" name="datetime">
月份input型別:<input type="month" name="month">
搜尋input型別:<input type="search" name="search">注:用一個form包圍起來,在onsubmit事件裡面阻止預設行為
純數字鍵盤:<input type="text" pattern="[0-9]*" />注:其他pattern屬性值並不支援
定製軟鍵盤行為:
配置節點的autocapitalize=off(on)、autocorrect=off(on)屬性
IOS基本支援,Android不同系統版本不同定製版本支援情況不一樣(不支援情況下,彈出預設鍵盤樣式)
目的:區分單擊與雙擊事件(300ms內點選一次是單擊,點選2次是雙擊)
解決方案:引入移動框架如zepto,用tab事件代替click
tab:不是原生事件,touchstart\touchmove\touchend模擬出來的事件
基本條件
1、從觸控到離開時間間隔短
2、從起點到終點的距離小
點選態
給使用者明確的點選反饋,提升使用者體驗
方案1:使用:active偽類
缺點:滾動的時候也會觸發樣式
方案2:js模型點選態(推薦)
//點選事件帶點選態
$el.on('tap',function(e){
var $target=$(e.target);
$target.addClass('active');
setTimeout(function(){
$target.removeClass('active');
},150);
});
2 滾動
1 彈性滾動
全域性滾動:滾動條在dom節點或更頂層
區域性滾動:滾動條在body下的某一個dom節點上
彈性滾動:
IOS:全域性滾動:預設支援
區域性滾動:預設沒有滾動條,且滾動起來乾澀
IOS區域性滾動啟動彈性滾動效果
body{-webkit-overflow-scrolling:touch;}
區域性滾動的dom節點
.scroll-el{overflow:auto;}
建議:將屬性掛在body上,可以避免很多奇怪的bug
Android:
定製版本較多,瀏覽器表現各異
預設沒有彈性滾動效果
-webkit-overflow-scrolling:預設瀏覽器不支援,android上的chrome版本支援
2 出界
什麼時候觸發出界
IOS:全域性滾動:滾動帶頁面頂部(或底部)時繼續向下(向上)滑動,就會出現
區域性滾動:滾動帶頁面頂部(或底部)時,手指離開停下,再繼續向下(向上)滑動,就會出現
IOS解決方案
區域性滾動:使用scrollFix
if(startTopScroll<=0)
elem.scrollTop=1;
if(startTopScroll+elem.offsetHeight>=elem.scrollHeight)
elem.scrollTop=elem.scrollHeight-elem.scrollHeight-1;
頁面的固定區域禁止touchmove預設事件
全域性滾動
暫時沒有好的解決辦法,可以考慮將全域性滾動改為區域性滾動
好訊息:從IOS8開始safari的出界部分的背景色和body的背景色保持一致
Adroid解決方案(使用全域性滾動)
流暢滾動的N條軍規
1 body上加上-webkit-overflow-scrolling:touch;
2 IOS儘量使用區域性滾動
3 IOS使用scrollFix避免出界
4 IOS下帶有滾動條且position:absolute的節點不要設定背景色
5 Android下儘量使用全域性滾動
1)儘量不用overflow:auto
2)使用min-height:100%代替height:100%
3 定製軟鍵盤樣式:
配置input節點的type型別
電子郵件input型別:<input type="email" name="email">
URL input 型別:<input type="url" name="url">
電話號碼input型別:<input type="tel" name="tel">
數字input型別:<input type="number" name="number">
日期input型別:<input type="date" name="date">
時間input型別:<input type="time" name="time">
日期和時間input型別:<input type="datetime" name="datetime">
月份input型別:<input type="month" name="month">
搜尋input型別:<input type="search" name="search">注:用一個form包圍起來,在onsubmit事件裡面阻止預設行為
純數字鍵盤:<input type="text" pattern="[0-9]*" />注:其他pattern屬性值並不支援
定製軟鍵盤行為:
配置節點的autocapitalize=off(on)、autocorrect=off(on)屬性
IOS基本支援,Android不同系統版本不同定製版本支援情況不一樣(不支援情況下,彈出預設鍵盤樣式)