1、移動端與PC端的區別
- PC考慮的是瀏覽器的兼容性,而移動端開發考慮的更多的是手機兼容性,因為目前不管是android手機還是ios手機,一般瀏覽器使用的都是webkit內核,所以說做移動端開發,更多考慮的應該是手機分辨率的適配,和不同操作系統的略微差異化;
- 在部分事件的處理上,移動端多出來的事件是觸屏事件,而缺少的是hover事件。 另外包括移動端彈出的手機鍵盤的處理,這樣的問題在PC端都是遇不到的;
- 在布局上,移動端開發一般是要做到布局自適應的;
- 在動畫處理上,PC端由於要考慮IE的兼容性,所以通常使用JS做動畫的通用性會更好一些,但是CSS3做了很大的犧牲, 而在手機端,如果要做一些動畫、特效等,第一選擇肯定是CSS3, 既簡單、效率又高;
- 一般pc端用jquery,移動端用zepto,因為移動端的流量還是比較重要的, 所以引入的資源或者插件,能小則小,一個30k的資源和一個80k的資源,在移動端的差別還是挺大的;(而未壓縮的jquery是262kb, 壓縮的jquey是83kb,可見兩者的差別之大。)
- 比如在手機上的300ms的延遲,這在PC端是沒有的;
2、如何解決移動端click屏幕產生200-300ms的延遲響應問題?
- 產生的原因:
當用戶一次點擊屏幕之后,瀏覽器並不能立刻判斷用戶是要進行雙擊縮放,還是想要進行單擊操作。因此,iOS Safari 就等待 300 毫秒,以判斷用戶是否再次點擊了屏幕。
於是,300 毫秒延遲就這么誕生了。
- 造成的問題:按鈕點擊延遲或者按鈕點擊失效;
- 解決方案:
-
禁用縮放 meta標簽
-
更改默認的視口寬度
- fastClick.js (常見)
步驟一:引入js文件:
步驟二:引入下面任何一種js代碼
//第一種 最好在body前面引入下面的代碼 if ('addEventListener' in document) { document.addEventListener('DOMContentLoaded', function() { FastClick.attach(document.body); }, false); } //第二種:引入jquery組件 $(function() { FastClick.attach(document.body); }) //第三種 window.addEventListener( "load", function() { FastClick.attach( document.body ); }, false );
-
-
-
touch.js
-
zepto (做移動端的DOM操作 但是做移動端事件的時候非常不建議用zepto里面的touch模塊,即用tap事件來取代click事件,因為tap事件會有 “點透” 問題)jquery是作用於pc端 277kbzepto作用於移動端 56kb
- 點透:https://www.cnblogs.com/cdwp8/p/4307855.html
- 概念:列表頁面上創建一個彈出層,彈出層有個關閉按鈕,你點了這個按鈕關閉彈出層后后,這個按鈕正下方的內容也會執行點擊事件(或打開鏈接)。
- 出現的原因:
可以看出zepto的tap通過兼聽綁定在document上的touch事件來完成tap事件的模擬的,及tap事件是冒泡到document上觸發的, 再點擊完成時的tap事件(touchstart\touchend)需要冒泡到document上才會觸發,而在冒泡到document之前,用戶手的接觸屏幕(touchstart)
和離開屏幕(touchend)是會觸發click事件的,因為click事件有延遲觸發(這就是為什么移動端不用click而用tap的原因)(大概是300ms,
為了實現safari的雙擊事件的設計),所以在執行完tap事件之后,彈出來的選擇組件馬上就隱藏了,此時click事件還在延遲的300ms之中,
當300ms到來的時候,click到的其實不是完成而是隱藏之后的下方的元素,如果正下方的元素綁定的有click事件此時便會觸發,
如果沒有綁定click事件的話就當沒click,但是正下方的是input輸入框(或者select選擇框或者單選復選框),點擊默認聚焦而彈出輸入鍵盤,
也就出現了上面的點透現象。 - 解決方法:
- 用click事件取代tap事件,在引入fastclick.js解決300ms延遲;(終極方案)
- 來得很直接github上有個fastclick可以完美解決https://github.com/ftlabs/fastclick
- 引入fastclick.js,因為fastclick源碼不依賴其他庫所以你可以在原生的js前直接加上;
window.addEventListener( "load", function() { FastClick.attach( document.body ); }, false );
- 或者有zepto或者jqm的js里面加上;
$(function() { FastClick.attach(document.body); });
- 當然require的話就這樣;
var FastClick = require(‘fastclick‘); FastClick.attach(document.body, options);
- 引入fastclick.js,因為fastclick源碼不依賴其他庫所以你可以在原生的js前直接加上;
-
touchend代替tap事件並阻止掉touchend的默認行為preventDefault();
$("#cbFinish").on("touchend", function (event) { //很多處理比如隱藏什么的 event.preventDefault(); });
- 延遲一定的時間(300ms+)來處理事件;
$("#cbFinish").on("tap", function (event) { setTimeout(function(){ //很多處理比如隱藏什么的 },320); });
- 點透:https://www.cnblogs.com/cdwp8/p/4307855.html
-