手機端頁面在項目中遇到的一些問題及解決辦法


1.解決頁面使用 overflow: scroll 在 iOS 上滑動卡頓的問題?

首先你可能會給頁面的 html 和 body 增加了 height: 100%, 然後就可能造成 IOS 上頁面滑動的卡頓問題。解決方案是:

(1) 看是否能把 body 和 html 的 height: 100% 去除掉。

(2) 在滾動的容器中增加:-webkit-overflow-scrolling: touch 或者給 body 增加:body {overflow-x: hidden}。

2.ios 頁面橡皮彈回效果遮擋頁面選項卡?

(1) 有時 body 和 html 的 height: 100% 去除掉問題可能就沒有了。

(2) 到達臨界值的時候在阻止事件默認行爲

  1. var startY,endY;

  2. //記錄手指觸摸的起點座標

  3. $('body').on('touchstart',function (e) {

  4.     startY = e.touches[0].pageY;

  5. });

  6. $('body').on('touchmove',function (e) {

  7.     endY = e.touches[0].pageY;  //記錄手指觸摸的移動中的座標

  8.     //手指下滑,頁面到達頂端不能繼續下滑

  9.     if(endY>startY&& $(window).scrollTop()<=0){

  10.         e.preventDefault();

  11.     }

  12.   //手指上滑,頁面到達底部能繼續上滑

  13.     if(endY<startY&& $(window).scrollTop()+

  14.         $(window).height()>=$('body')[0].scrollHeight){

  15.         e.preventDefault();

  16.     }

  17. })

有時也會碰見彈窗出來後兩個層的橡皮筋效果出現問題,我們可以在彈出彈出時給底層頁面加上一個類名,類名禁止頁面滑動這樣下層的橡皮筋效果就會被禁止,就不會影響彈窗層。

3.IOS 機型 margin 屬性無效問題?

(1) 設置 html body 的高度爲百分比時,margin-bottom 在 safari 裏失效

(2) 直接 padding 代替 margin

4.Ios 綁定點擊事件不執行?

(1) 添加樣式 cursor :pointer。點擊後消除背景閃一下的 css:-webkit-tap-highlight-color:transparent;

5.Ios 鍵盤換行變爲搜索?

  • 首先,input 要放在 form 裏面。

  • 這時 "換行" 已經變成 “前往”。

  • 如果想變成 “搜索”,input 設置 type="search"。


6.Jq 對 a 標籤點擊事件不生效?

出現這種情況的原因不明,有的朋友解釋:我們平時都是點擊的 A 標籤中的文字了。 所以要想用 JS 模擬點擊 A 標籤事件,就得先往 A 標籤中的文字添加能被 JS 捕獲的元素,然後再用 JS 模擬點擊該元素即可。但是我覺得不合理,雖然找不到原因但是解決辦法還是有的。

(1)document.getElementById("abc").click();

(2)$("#abc")[0].click();

7.有時因爲服務器或者別的原因導致頁面上的圖片沒有找到?

這是我們想需要用一個本地的圖片代替沒有找的的圖片

  1. <script type="text/javascript">

  2. function nofind(){

  3. var img=event.srcElement;

  4. img.src="images/logoError.png";

  5. img.onerror=null; 控制不要一直跳動

  6. }

  7. </script>

  8. <img src="images/logo.png" onerror="nofind();" />

8.transform 屬性影響 position:fixed?

(1) 規範中有規定:如果元素的 transform 值不爲 none,則該元素會生成包含塊和層疊上下文。CSS Transforms Module Level 1 不只在手機上,電腦上也一樣。除了 fixed 元素會受影響之外,z-index(層疊上下文)值也會受影響。絕對定位元素等和包含塊有關的屬性都會受到影響。當然如果 transform 元素的 display 值爲 inline 時又會有所不同。最簡單的解決方法就是 transform 元素內部不能有 absolute、fixed 元素.

9.ios 對 position: fixed 不太友好,有時我們需要加點處理?

在安卓上面,點擊頁面底部的輸入框,軟鍵盤彈出,頁面移動上移。 而 ios 上面,點擊頁面底部輸入框,軟鍵盤彈出,輸入框看不到了。。。查資料說什麼的都有,iscroll,jquery-moblie,absolute,fixe,static 都非常複雜,要改很多。。。 讓他彈出時讓滾動條在最低部

  1. var u = navigator.userAgent, app = navigator.appVersion;

  2. var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端

  3. if (isiOS) {

  4.    $('textarea').focus(function () {

  5.        window.setTimeout('scrollBottom()', 500);

  6.    });

  7. }

  8. function scrollBottom() {

  9.    window.scrollTo(0, $('body').height());

  10. }

10.jq validate 插件驗證問題?

(1) 所以的 input 必須有 name 不然會出錯

11.有時手機會出現斷網的情況,我沒可能會對斷網的情況做一些處理?

(1)navigator.onLine 可判斷是否是脫機狀態.

12.判斷對象的長度?

(1) 用 Object.keys,Object.keys 方法返回的是一個數組,數組裏面裝的是對象的屬性。

  1. var person = {

  2.    "name" : "zhangshan",

  3.    "sex" : "man",

  4.    "age" : "50",

  5.    "height" : "180",

  6.    "phone" : "1xxxxxxxxxx",

  7.    "email" : "[email protected]"

  8. };

  9. var arr = Object.keys(person);

  10. console.log(arr.length);

(2)Object.getOwnPropertyNames(obj).length

13.上一題我們用到了 Object.keys 與 Object.getOwnPropertyNames 他們的區別?

Object.keys 定義:返回一個對象可枚舉屬性的字符串數組;

Object.getOwnPropertyNames 定義:返回一個對象可枚舉、不可枚舉屬性的名稱; 屬性的可枚舉性、不可枚舉性:定義:可枚舉屬性是指那些內部 “可枚舉” 標誌設置爲 true 的屬性,對於通過直接的賦值和屬性初始化的屬性,該標識值默認爲即爲 true,對於通過 Object.defineProperty 等定義的屬性,該標識值默認爲 false。

  1. var obj = { "prop1": "v1" };

  2. Object.defineProperty(obj, "prop2", { value: "v2", enumerable: false });

  3. console.log(Object.keys(obj).length);           //output:1

  4. console.log(Object.getOwnPropertyNames(obj).length);    //output:2

  5. console.log(Object.keys(obj));           //output:Array[1] => [0: "prop1"]

  6. console.log(Object.getOwnPropertyNames(obj));    //output:Array[2] => [0: "prop1", 1: "prop2"]

綜合實例:

  1. var obj = { "prop1": "v1" };

  2. Object.defineProperty(obj, "prop2", { value: "v2", enumerable: false});

  3. console.log(obj.hasOwnProperty("prop1")); //output: true

  4. console.log(obj.hasOwnProperty("prop2")); //output: true

  5. console.log(obj.propertyIsEnumerable("prop1")); //output: true

  6. console.log(obj.propertyIsEnumerable("prop2")); //output: false

  7. console.log('prop1' in obj);    //output: true

  8. console.log('prop2' in obj);    //output: true

  9. for (var item in obj) {

  10.    console.log(item);

  11. }

  12. //output:prop1

  13. for (var item in Object.getOwnPropertyNames(obj)) {

  14.    console.log(Object.getOwnPropertyNames(obj)[item]);

  15. }

  16. //ouput:[prop1,prop2]

14.移動開發不同手機彈出數字鍵盤問題?

(1)type="tel"

iOS 和 Android 的鍵盤表現都差不多

(2)type="number"

優點是 Android 下實現的一個真正的數字鍵盤

缺點一:iOS 下不是九宮格鍵盤,輸入不方便

缺點二:舊版 Android(包括微信所用的 X5 內核)在輸入框後面會有超級雞肋的小尾巴,好在 Android 4.4.4 以後給去掉了。 不過對於缺點二,我們可以用 webkit 私有的僞元素給 fix 掉:

  1. input[type=number]::-webkit-inner-spin-button,  

  2. input[type=number]::-webkit-outer-spin-button {

  3.        -webkit-appearance: none;

  4.        appearance: none;

  5.        margin: 0;

  6. }

(3)pattern 屬性

pattern 用於驗證表單輸入的內容,通常 HTML5 的 type 屬性,比如 email、tel、number、data 類、url 等,已經自帶了簡單的數據格式驗證功能了,加上 pattern 後,前端部分的驗證更加簡單高效了。

顯而易見,pattern 的屬性值要用正則表達式。

實例 簡單的數字驗證

數字的驗證有兩個:

  1. <input type="number" pattern="d">

  2. <input type="number" pattern="[0-9]*">

15.input[number] 類型輸入非數字字符

js 獲取的值是空;比如 - 12,+123 等

16.Javascript:history.go() 和 history.back() 的用法與區別?

簡單的說就是:go(-1): 返回上一頁,原頁面表單中的內容會丟失;back(): 返回上一頁,原頁表表單中的內容會保留。history.go(-1): 後退 + 刷新 history.back(): 後退

之所以注意到這個區別,是因爲不同的瀏覽器後退行爲也是有區別的,而區別就跟 javascript:history.go() 和 history.back() 的區別類似。 Chrome 和 ff 瀏覽器後退頁面,會刷新後退的頁面,若有數據請求也會提交數據申請。類似於 history.go(-1);

而 safari(包括桌面版和 ipad 版)的後退按鈕則不會刷新頁面,也不會提交數據申請。類似於 javascript:history.back();

17.Meta 基礎知識:

  1. <meta  />

  2. // width    設置viewport寬度,爲一個正整數,或字符串‘device-width’

  3. // height   設置viewport高度,一般設置了寬度,會自動解析出高度,可以不用設置

  4. // initial-scale    默認縮放比例,爲一個數字,可以帶小數

  5. // minimum-scale    允許用戶最小縮放比例,爲一個數字,可以帶小數

  6. // maximum-scale    允許用戶最大縮放比例,爲一個數字,可以帶小數

  7. // user-scalable    是否允許手動縮放

  8. 空白頁基本meta標籤

  9. <!-- 設置縮放 -->

  10. <meta  />

  11. <!-- 可隱藏地址欄,僅針對IOS的Safari(注:IOS7.0版本以後,safari上已看不到效果) -->

  12. <meta  />

  13. <!-- 僅針對IOS的Safari頂端狀態條的樣式(可選default/black/black-translucent ) -->

  14. <meta  />

  15. <!-- IOS中禁用將數字識別爲電話號碼/忽略Android平臺中對郵箱地址的識別 -->

  16. <meta  />

  17. 其他meta標籤

  18. <!-- 啓用360瀏覽器的極速模式(webkit) -->

  19. <meta >

  20. <!-- 避免IE使用兼容模式 -->

  21. <meta http-equiv="X-UA-Compatible" content="IE=edge">

  22. <!-- 針對手持設備優化,主要是針對一些老的不識別viewport的瀏覽器,比如黑莓 -->

  23. <meta >

  24. <!-- 微軟的老式瀏覽器 -->

  25. <meta >

  26. <!-- uc強制豎屏 -->

  27. <meta >

  28. <!-- QQ強制豎屏 -->

  29. <meta >

  30. <!-- UC強制全屏 -->

  31. <meta >

  32. <!-- QQ強制全屏 -->

  33. <meta >

  34. <!-- UC應用模式 -->

  35. <meta >

  36. <!-- QQ應用模式 -->

  37. <meta >

  38. <!-- windows phone 點擊無高光 -->

  39. <meta >

18.移動端如何定義字體 font-family?

@ -------------------------------------- 中文字體的英文名稱 @ 宋體 SimSun @ 黑體 SimHei @ 微信雅黑 Microsoft Yahei @ 微軟正黑體 Microsoft JhengHei @ 新宋體 NSimSun @ 新細明體 MingLiU @ 細明體 MingLiU @ 標楷體 DFKai-SB @ 仿宋 FangSong @ 楷體 KaiTi @ 仿宋GB2312 FangSongGB2312 @ 楷體GB2312 KaiTiGB2312 @ @ 說明:中文字體多數使用宋體、雅黑,英文用 Helvetica

  1. body {font-family: Microsoft Yahei,SimSun,Helvetica;}

19.打電話發短信寫郵件怎麼實現?

  1. // 一、打電話

  2. <a href="tel:0755-10086">打電話給:0755-10086</a>

  3. //  二、發短信,winphone系統無效

  4. <a href="sms:10086">發短信給: 10086</a>

  5. // 三、寫郵件

  6. <a href="mailto:[email protected]">點擊我發郵件</a>

  7. //2.收件地址後添加?cc=開頭,可添加抄送地址(Android存在兼容問題)

  8. <a href="mailto:[email protected][email protected]">點擊我發郵件</a>

  9. //3.跟着抄送地址後,寫上&bcc=,可添加密件抄送地址(Android存在兼容問題)

  10. <a href="mailto:[email protected][email protected]&[email protected]">點擊我發郵件</a>

  11. //4.包含多個收件人、抄送、密件抄送人,用分號(;)隔開多個郵件人的地址

  12. <a href="mailto:[email protected];[email protected]">點擊我發郵件</a>

  13. //5.包含主題,用?subject=

  14. <a href="mailto:[email protected]?subject=郵件主題">點擊我發郵件</a>

  15. //6.包含內容,用?body=;如內容包含文本,使用%0A給文本換行

  16. <a href="mailto:[email protected]?body=郵件主題內容%0A騰訊誠信%0A期待您的到來">點擊我發郵件</a>

  17. //7.內容包含鏈接,含http(s)://等的文本自動轉化爲鏈接

  18. <a href="mailto:[email protected]?body=http://www.baidu.com">點擊我發郵件</a>

  19. //8.內容包含圖片(PC不支持)

  20. <a href="mailto:[email protected]?body=<img src='images/1.jpg' />">點擊我發郵件</a>

  21. //9.完整示例

  22. <a href="mailto:[email protected];[email protected][email protected]&[email protected]&subject=[郵件主題]&body=騰訊誠邀您參與%0A%0Ahttp://www.baidu.com%0A%0A<img src='images/1.jpg' />">點擊我發郵件</a>

20.移動端 touch 事件(區分 webkit 和 winphone)?

  1. // 以下支持 webkit

  2. touchstart——當手指觸碰屏幕時候發生。不管當前有多少隻手指

  3. touchmove——當手指在屏幕上滑動時連續觸發。通常我們再滑屏頁面,會調用 event preventDefault() 可以阻止默認情況的發生:阻止頁面滾動

  4. touchend——當手指離開屏幕時觸發

  5. touchcancel——系統停止跟蹤觸摸時候會觸發。例如在觸摸過程中突然頁面 alert() 一個提示框,此時會觸發該事件,這個事件比較少用

  6. //TouchEvent 說明:

  7. touches:屏幕上所有手指的信息

  8. targetTouches:手指在目標區域的手指信息

  9. changedTouches:最近一次觸發該事件的手指信息

  10. touchend 時,touches targetTouches 信息會被刪除,changedTouches 保存的最後一次的信息,最好用於計算手指信息

  11. // 參數信息 (changedTouches[0])

  12. clientXclientY 在顯示區的座標

  13. target:當前元素

  14. // 事件響應順序

  15. ontouchstart > ontouchmove > ontouchend > onclick

21.點擊元素產生背景或邊框怎麼去掉

  1. //ios用戶點擊一個鏈接,會出現一個半透明灰色遮罩, 如果想要禁用,可設置-webkit-tap-highlight-color的alpha值爲0去除灰色半透明遮罩;

  2. //android用戶點擊一個鏈接,會出現一個邊框或者半透明灰色遮罩, 不同生產商定義出來額效果不一樣,可設置-webkit-tap-highlight-color的alpha值爲0去除部分機器自帶的效果;

  3. //winphone系統,點擊標籤產生的灰色半透明背景,能通過設置<meta >去掉;

  4. //特殊說明:有些機型去除不了,如小米2。對於按鈕類還有個辦法,不使用a或者input標籤,直接用div標籤

  5. a,button,input,textarea {

  6.    -webkit-tap-highlight-color: rgba(0,0,0,0);

  7.    -webkit-user-modify:read-write-plaintext-only; //-webkit-user-modify有個副作用,就是輸入法不再能夠輸入多個字符

  8. }  

  9. // 也可以

  10. * { -webkit-tap-highlight-color: rgba(0,0,0,0); }

  11. //winphone下

  12. <meta >

22.美化表單元素

  1. // 一、使用 appearance 改變 webkit 瀏覽器的默認外觀

  2. input,select {-webkit-appearance:none; appearance: none;}

  3. // 二、winphone 下,使用僞元素改變表單元素默認外觀

  4. //1.禁用 select 默認箭頭,::-ms-expand 修改表單控件下拉箭頭,設置隱藏並使用背景圖片來修飾

  5. select::-ms-expand {display:none;}

  6. //2.禁用 radio 和 checkbox 默認樣式,::-ms-check 修改表單複選框或單選框默認圖標,設置隱藏並使用背景圖片來修飾

  7. input[type=radio]::-ms-check,

  8. input[type=checkbox]::-ms-check { display:none; }

  9. //3.禁用 pc 端表單輸入框默認清除按鈕,::-ms-clear 修改清除按鈕,設置隱藏並使用背景圖片來修飾

  10. input[type=text]::-ms-clear,

  11. input[type=tel]::-ms-clear,

  12. input[type=number]::-ms-clear { display:none; }

23.移動端字體單位 font-size 選擇 px 還是 rem?

  1. // 如需適配多種移動設備,建議使用 rem。以下爲參考值:

  2. html {font-size: 62.5%;} //10*16 = 62.5%

  3. // 設置 12px 字體 這裏注意在 rem 前要加上對應的 px 值,解決不支持 rem 的瀏覽器的兼容問題,做到優雅降級

  4. body {font-size:12px; font-size:1.2rem;}

24.input 標籤添加上 disable 屬性在 ios 端字體顏色不兼容的問題?

  1. input[disabled],input:disabled,input.disabled{

  2.    color: #3e3e3e;  

  3.    -webkit-text-fill-color: #3e3e3e;  

  4.    -webkit-opacity:1;  

  5.    opacity: 1;  

  6. }

25.IOS 的光標大小問題

IE:不管該行有沒有文字,光標高度與 font-size 一致。

FF:該行有文字時,光標高度與 font-size 一致。該行無文字時,光標高度與 input 的 height 一致。

Chrome:該行無文字時,光標高度與 line-height 一致;該行有文字時,光標高度從 input 頂部到文字底部 (這兩種情況都是在有設定 line-height 的時候),如果沒有 line-height,則是與 font-size 一致。

IOS 中情況和 Chrome 相似。

設置字體大小和行高一致,然後通過 padding 撐開大小,只給 IE 瀏覽器設置 line-height:-ms-line-height:40px;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章