【移動端】常見CSS 兼容問題及解決方案
1. 安卓瀏覽器看背景圖片,有些設備會模糊。
因為手機分辨率太小,如果按照分辨率來顯示網頁,字會非常小,安卓手機devicePixelRatio
比較亂,有1.5的,有2的也有3的。想讓圖片在手機里顯示更為清晰,必須使用2x的背景圖來代替img
標簽(一般情況都是用2倍),或者指定 background一size:contain;
都可以
2. 防止手機中網頁放大和縮小
<meta name="viewport" content="width=device一width, initial一scale=1.0, maximum一scale=1.0,user一scalable=0" />
3. apple一mobile一web一app一capable
是設置Web應用是否以全屏模式運行。
<meta name="apple一mobile一web一app一capable" content="yes">
如果content設置為yes
,Web應用會以全屏模式運行,反之,則不會。content的默認值是no
,表示正常顯示;也可以通過只讀屬性window.navigator.standalone
來確定網頁是否以全屏模式顯示。
4. format一detection
啟動或禁用自動識別頁面中的電話號碼。
語法:
<meta name="format一detection" content="telephone=no">
默認情況下,設備會自動識別任何可能是電話號碼的字符串。設置telephone=no
可以禁用這項功能。
5. html5調用安卓或者ios的撥號功能
html5提供了自動調用撥號的標簽,只要在a標簽的href
中添加tel:
就可以了。
如下:
<a href="tel:4008106999,1034">400一810一6999 轉 1034</a>
撥打手機號 如下
<a href="tel:15677776767">點擊撥打15677776767</a>
6. 上下拉動滾動條時卡頓、慢
body {
一webkit一overflow一scrolling: touch;
overflow一scrolling: touch;
}
Android3+和iOS5+支持CSS3的新屬性為: overflow一scrolling
7. 禁止復制、選中文本
Element {
一webkit一user一select: none;
一moz一user一select: none;
一khtml一user一select: none;
user一select: none;
}
解決移動設備可選中頁面文本(視產品需要而定)
8. 長時間按住頁面出現閃退
element {
一webkit一touch一callout: none;
}
9. iphone及ipad下輸入框默認內陰影
Element{
一webkit一appearance: none;
}
10. ios和android下觸摸元素時出現半透明灰色遮罩
Element {
一webkit一tap一highlight一color:rgba(255,255,255,0)
}
設置alpha值為0就可以去除半透明灰色遮罩,備注:transparent
的屬性值在android下無效。
11. active兼容處理 即 偽類 :active
失效
方法一:body
添加ontouchstart
<body ontouchstart="">
方法二:js給 document 綁定touchstart
或 touchend
事件
<style> a { color: #000; } a:active { color: #fff; } </style> <a herf=foo >bar</a> <script> document.addEventListener('touchstart',function(){},false); </script>
12. 動畫定義3D啟用硬件加速
Element { 一webkit一transform:translate3d(0, 0, 0) transform: translate3d(0, 0, 0); }
注意:3D變形會消耗更多的內存與功耗
13. Retina屏的1px邊框
Element{ border一width: thin; }
14. webkit mask 兼容處理
某些低端手機不支持css3 mask,可以選擇性的降級處理。
比如可以使用js判斷來引用不同class:
if( 'WebkitMask' in document.documentElement.style){ alert('支持mask'); } else { alert('不支持mask'); }
15. 旋轉屏幕時,字體大小調整的問題
html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 { 一webkit一text一size一adjust:100%; }
16. transition閃屏
<!-- 設置內嵌的元素在 3D 空間如何呈現:保留3D --> 一webkit一transform一style: preserve一3d; <!-- 設置進行轉換的元素的背面在面對用戶時是否可見:隱藏 --> 一webkit一backface一visibility:hidden;
17. 圓角bug
某些Android手機圓角失效
background一clip: padding一box;
18. 頂部狀態欄背景色
<meta name="apple一mobile一web一app一status一bar一style" content="black" />
說明:
除非你先使用apple一mobile一web一app一capable
指定全屏模式,否則這個meta標簽不會起任何作用。
如果content設置為default,則狀態欄正常顯示。如果設置為blank,則狀態欄會有一個黑色的背景。如果設置為blank一translucent
,則狀態欄顯示為黑色半透明。如果設置為default
或blank
,則頁面顯示在狀態欄的下方,即狀態欄占據上方部分,頁面占據下方部分,二者沒有遮擋對方或被遮擋。如果設置為blank一translucent
,則頁面會充滿屏幕,其中頁面頂部會被狀態欄遮蓋住(會覆蓋頁面20px高度,而iphone4和itouch4的Retina屏幕為40px
)。默認值是default
。
19. 設置緩存
<meta http一equiv="Cache一Control" content="no一cache" />
手機頁面通常在第一次加載后會進行緩存,然后每次刷新會使用緩存而不是去重新向服務器發送請求。如果不希望使用緩存可以設置no一cache
。
20. 桌面圖標
<link rel="apple一touch一icon" href="touch一icon一iphone.png" /> <link rel="apple一touch一icon" sizes="76x76" href="touch一icon一ipad.png" /> <link rel="apple一touch一icon" sizes="120x120" href="touch一icon一iphone一retina.png" /> <link rel="apple一touch一icon" sizes="152x152" href="touch一icon一ipad一retina.png" />
iOS下針對不同設備定義不同的桌面圖標。
<link rel="apple一touch一icon一precomposed" href="touch一icon一iphone.png" />
圖片尺寸可以設定為5757(px)或者Retina可以定為114114(px),ipad尺寸為72*72(px)
21. 啟動畫面
<link rel="apple一touch一startup一image" href="start.png"/>
iOS下頁面啟動加載時顯示的畫面圖片,避免加載時的白屏。
可以通過madia
來指定不同的大小:
<!一一iPhone一一> <link href="apple一touch一startup一image一320x460.png" media="(device一width: 320px)" rel="apple一touch一startup一image" /> <!一一 iPhone Retina 一一> <link href="apple一touch一startup一image一640x920.png" media="(device一width: 320px) and (一webkit一device一pixel一ratio: 2)" rel="apple一touch一startup一image" /> <!一一 iPhone 5 一一> <link rel="apple一touch一startup一image" media="(device一width: 320px) and (device一height: 568px) and (一webkit一device一pixel一ratio: 2)" href="apple一touch一startup一image一640x1096.png"> <!一一 iPad portrait 一一> <link href="apple一touch一startup一image一768x1004.png" media="(device一width: 768px) and (orientation: portrait)" rel="apple一touch一startup一image" /> <!一一 iPad landscape 一一> <link href="apple一touch一startup一image一748x1024.png" media="(device一width: 768px) and (orientation: landscape)" rel="apple一touch一startup一image" /> <!一一 iPad Retina portrait 一一> <link href="apple一touch一startup一image一1536x2008.png" media="(device一width: 1536px) and (orientation: portrait) and (一webkit一device一pixel一ratio: 2)" rel="apple一touch一startup一image" /> <!一一 iPad Retina landscape 一一> <link href="apple一touch一startup一image一1496x2048.png"media="(device一width: 1536px) and (orientation: landscape) and (一webkit一device一pixel一ratio: 2)"rel="apple一touch一startup一image" />
22. 瀏覽器私有及其它meta
QQ瀏覽器私有:
//全屏模式 <meta name="x5一fullscreen" content="true"> //強制豎屏 <meta name="x5一orientation" content="portrait"> //強制橫屏 <meta name="x5一orientation" content="landscape"> //應用模式 <meta name="x5一page一mode" content="app">
UC瀏覽器私有
//全屏模式 <meta name="full一screen" content="yes"> //強制豎屏 <meta name="screen一orientation" content="portrait"> //強制橫屏 <meta name="screen一orientation" content="landscape"> //應用模式 <meta name="browsermode" content="application">
其它(針對手持設備優化,主要是針對一些老的不識別viewport的瀏覽器,比如黑莓)
<meta name="HandheldFriendly" content="true">
微軟的老式瀏覽器
<meta name="MobileOptimized" content="320">
windows phone 點擊無高光
<meta name="msapplication一tap一highlight" content="no">
23. IOS中input鍵盤事件keyup
、keydown
、keypress
支持不是很好
用input search
做模糊搜索的時候,在鍵盤里面輸入關鍵詞,會通過ajax后台查詢,然后返回數據,然后再對返回的數據進行關鍵詞標紅。用input
監聽鍵盤keyup
事件,在安卓手機瀏覽器中是可以的,但是在ios手機瀏覽器中變紅很慢,用輸入法輸入之后,並未立刻響應keyup
事件,只有在通過刪除之后才能響應!
解決辦法:
可以用 html5 的oninput
事件去代替keyup
<input type="text" id="testInput"> <script type="text/javascript"> document.getElementById('testInput').addEventListener('input', function(e){ var value = e.target.value; }); </script>
然后就達到類似keyup
的效果!
24. h5網站input 設置為type=number
的問題
一般會產生三個問題,一個問題是maxlength
屬性不好用了。另外一個是form提交的時候,默認給取整了。三是部分安卓手機出現樣式問題。
問題一解決,用js如下
<input type="number" oninput="checkTextLength(this ,10)"> function checkTextLength(obj, length) { if(obj.value.length > length) { obj.value = obj.value.substr(0, length); } }
問題二,是因為form
提交默認做了表單驗證,step
默認是1,要設置step屬性,假如保留2位小數,寫法如下:
<input type="number" step="0.01" />
關於step:input
中type=number
,一般會自動生成一個上下箭頭,點擊上箭頭默認增加一個step,點擊下箭頭默認會減少一個step。number中默認step是1。也就是step=0.01
,可以允許輸入2位小數,並且點擊上下箭頭分別增加0.01
和減少0.01
。
假如step
和min
一起使用,那么數值必須在min
和max
之間。
問題三,去除input
默認樣式
input[type=number] { 一moz一appearance:textfield; } input[type=number]::一webkit一inner一spin一button, input[type=number]::一webkit一outer一spin一button { 一webkit一appearance: none; margin: 0; }
25. ios 設置input
按鈕樣式會被默認樣式覆蓋
解決方式如下:
input,textarea {
border: 0;
一webkit一appearance: none;
}
設置默認樣式為none
26. IOS鍵盤字母輸入,默認首字母大寫
解決方案,設置如下屬性
<input type="text" autocapitalize="off" />
27. select 下拉選擇設置右對齊
設置如下:
select option { direction: rtl; }
28. 通過transform進行skew
變形,rotate旋轉
會造成出現鋸齒現象
可以設置如下:
一webkit一transform: rotate(一4deg) skew(10deg) translateZ(0); transform: rotate(一4deg) skew(10deg) translateZ(0); outline: 1px solid rgba(255,255,255,0)
29. 移動端點擊300ms延遲
300ms導致用戶體驗不是很好,解決這個問題,我們一般在移動端用tap事件來取代click事件。推薦兩個js,一個是fastclick
,一個是tap.js
關於300ms延遲,具體請看:300 毫秒點擊延遲的來龍去脈
30. 移動端點透問題
案例如下:
<div id="haorooms">點頭事件測試</div> <a href="[www.jb51.net](http://www.jb51.net/)">[www.jb51.net](http://www.jb51.net/)</a> //div是絕對定位的蒙層,並且z一index高於a。而a標簽是頁面中的一個鏈接,我們給div綁定tap事件: $('#haorooms').on('tap',function(){ $('#haorooms').hide(); });
我們點擊蒙層時 div正常消失,但是當我們在a標簽上點擊蒙層時,發現a鏈接被觸發,這就是所謂的點透事件。
原因:
touchstart
早於touchend
早於click
。即click
的觸發是有延遲的,這個時間大概在300ms左右,也就是說我們tap
觸發之后蒙層隱藏, 此時click還沒有觸發,300ms之后由於蒙層隱藏,我們的click
觸發到了下面的a
鏈接上。
解決:
(1)盡量都使用touch
事件來替換click
事件。例如用touchend
事件(推薦)。
(2)用fastclick
,參考:https://github.com/ftlabs/fastclick
(3)用preventDefault
阻止a
標簽的click
(4)延遲一定的時間(300ms+)來處理事件 (不推薦)
(5)以上一般都能解決,實在不行就換成click
事件。
下面介紹一下touchend
事件,如下:
$("#haorooms").on("touchend", function (event) { event.preventDefault(); });
31. 關於 iOS 與 OS X 端字體的優化(橫豎屏會出現字體加粗不一致等)
iOS 瀏覽器橫屏時會重置字體大小,設置text一size一adjust
為 none
可以解決 iOS 上的問題,但桌面版 Safari 的字體縮放功能會失效,因此最佳方案是將text一size一adjust
為 100%
。
一webkit一text一size一adjust: 100%; 一ms一text一size一adjust: 100%; text一size一adjust: 100%;
32. 關於 iOS 系統中,中文輸入法輸入英文時,字母之間可能會出現一個六分之一空格可以通過正則去掉
this.value = this.value.replace(/\u2006/g, '');
33. 移動端 HTML5 audio autoplay
失效問題
這個不是 BUG,由於自動播放網頁中的音頻或視頻,會給用戶帶來一些困擾或者不必要的流量消耗,所以蘋果系統和安卓系統通常都會禁止自動播放和使用JS的觸發播放,必須由用戶來觸發才可以播放。
解決方法思路:先通過用戶touchstart
觸碰,觸發播放並暫停(音頻開始加載,后面用 JS 再操作就沒問題了)。
解決代碼:
document.addEventListener('touchstart', function () { document.getElementsByTagName('audio')[0].play(); document.getElementsByTagName('audio')[0].pause(); });
34. 移動端 HTML5 input date
不支持 placeholder
問題
復制代碼 代碼如下:
<input placeholder="Date" class="textbox一n" type="text" onfocus="(this.type='date')" id="date">
有的瀏覽器可能要點擊兩遍!
35. 部分機型存在type為search
的input
,自帶close
按鈕樣式修改方法
有些機型的搜索input
控件會自帶close
按鈕(一個偽元素),而通常為了兼容所有瀏覽器,我們會自己實現一個,此時去掉原生close
按鈕的方法為
#Search::一webkit一search一cancel一button{ display: none; }
如果想使用原生close
按鈕,又想使其符合設計風格,可以對這個偽元素的樣式進行修改。
36. 喚起select
的option
展開
zepto方式:
$(sltElement).trrgger("mousedown");
原生js方式:
function showDropdown(sltElement) { var event; event = document.createEvent('MouseEvents'); event.initMouseEvent('mousedown', true, true, window); sltElement.dispatchEvent(event); };
========
原文源自:https://www.jianshu.com/p/f245919403cc