文章來源:移動端常見面試題一:移動端兼容解決方案
1、安卓瀏覽器看背景圖片,有些設(shè)備會模糊
因為手機分辨率太小,如果按照分辨率來顯示網(wǎng)頁,字會非常小,安卓手機devicePixoRadio比較亂,有1.5的,有2的也有3的。想讓圖片在手機里顯示更為清晰,必須使用2x的背景圖來代替img標簽(一般情況下都是2倍的),或者指定background-size:contain;都可以
用-webkit-min-device-pixel-ratio可以做到不同倍數(shù)不同尺寸的圖片:
.icon-logo
{
background-image: url(src/assets/logo.png);
width: 24px;
height: 24px;
background-size: contain;
}
@media screen and (-webkit-min-device-pixel-ratio: 2)
{
.icon-logo { background-image: url(src/assets/logo@2.png); }
}
@media screen and (-webkit-min-device-pixel-ratio: 3)
{
.icon-logo { background-image: url(src/assets/logo@3.png); }
}
@media screen and (-webkit-min-device-pixel-ratio: 4)
{
.icon-logo { background-image: url(src/assets/logo@4.png); }
}
2、防止手機中頁面放大和縮小
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
3、上下拉動滾動條時卡頓、慢
body
{
-webkit-overflow-scrolling:touch;
overflow-scrolling:touch;
}
Android3+和iOSi5+支持CSS3的新屬性為overflow-scrolling
4、長時間按住頁面出現(xiàn)閃退
element
{
-webkit-touch-callout:none;
}
5、iphone及ipad下輸入框默認內(nèi)陰影
element
{
-webkit-appearance:none;
}
6、ios和android下觸摸元素時出現(xiàn)半透明灰色遮罩
element
{
-webkit-tap-highlight-color:rgba(255,255,255,0);
}
設(shè)置alpha值為0就可以去除本透明灰色遮罩,備注:transparent的屬性值在android下無效。
7、active兼容處理 即 偽類:active失效
方法一:body添加ontouchstart
<body ontouchstart=''>
方法二:js給document綁定touchstart或touchend事件
<style>
a
{
color:#000;
}
a:active
{
color:#fff;
}
</style>
<a href=foo>bar</a>
<script>
document.addEventListentener('touchstart',function(){},false);
</script>
8、1px邊框
在移動端中,如果給元素設(shè)置一個像素的邊框的話,那么在手機上看起來是會比一個像素粗的。
解決方法:使用偽類元素模擬邊框,使用transform縮放
.button
{
height: 36px;
line-height: 36px;
font-size: 14px;
padding: 0px;
margin: 0px;
padding-left: 16px;
padding-right: 16px;
background-color: white;
border: none;
outline: none;
box-sizing: border-box;
border-radius: 5px;
position: relative;
-webkit-user-select: none;
-ms-user-select: none;
-moz-user-select: none;
text-decoration: none;
display: block;
}
.button:after
{
content: '';
z-index: 1;
position: absolute;
border: 1px solid rgba(0,0,0,0.23);
pointer-events: none;
box-sizing: border-box;
transform-origin: 0 0;
transform: scale(calc(1/1));
top: 0px;
left: 0px;
width: calc(100% * 1);
height: calc(100% * 1);
border-radius: calc(5px * 1);
transition: all ease-in-out 150ms;
background-color: rgba(0,0,0,0);
}
.button:active:after
{
background-color: rgba(0,0,0,0.1);
}
.button.button-blue
{
background-color: #3F51B5;
color: white;
}
.button.button-blue:active:after
{
background-color: rgba(0,0,0,0.15);
}
@media screen and (-webkit-min-device-pixel-ratio: 2)
{
.button:after
{
border-radius: calc(5px * 2);
width: calc(100% * 2);
height: calc(100% * 2);
transform: scale(calc(1/2));
}
}
@media screen and (-webkit-min-device-pixel-ratio: 3)
{
.button:after
{
border-radius: calc(5px * 3);
width: calc(100% * 3);
height: calc(100% * 3);
transform: scale(calc(1/3));
}
}
@media screen and (-webkit-min-device-pixel-ratio: 4)
{
.button:after
{
border-radius: calc(5px * 4);
width: calc(100% * 4);
height: calc(100% * 4);
transform: scale(calc(1/4));
}
}
9、webkit mask兼容處理
某些低端手機不支持css3mask,可以選擇性的進降級處理
比如可以使用js判斷來引用不同class:
if('WebkitMask' in documnet.documentElement.style)
{
alert('支持 mask')
}
else
{
alert('不支持 mask')
}
10、pc端與移動端字體大小的問題
html,body,form,fieldset,p,div,h1,h2,h3,h4,h5,h6
{
-webkit-text-size-adjust:100%;
}
pc端字體正常顯示,但ios真機就出現(xiàn),h1、span等標簽字體比較大。
html
{
-webkit-text-size-adjust:100%;/*ios端谷歌瀏覽器測試有效,Android端未測試*/
}
11.transiton閃屏
/*設(shè)置內(nèi)聯(lián)的元素在3D空間如何呈現(xiàn):保留3D*/
-webkit-transform-style:preserve-3D;
/*設(shè)置進行轉(zhuǎn)換的元素的背面在面對用戶時是否課件:隱藏*/
-webkit-backface-visibility:hidden;
12.圓角bug
某些Android手機圓角失效 background-clip:padding-box;
13.click的300ms延遲問題
在移動端中,click事件是生效的,但是,點擊之后會有300ms的延遲響應(yīng)
原因:safari是最早做出這個機制的,因為在移動端里,瀏覽器需要等待一段時間來判斷此次用戶操作是單擊還是雙擊,所以就有click300ms的延遲機制,Android也很快就有了
不用click,用自定義事件tap
tap是需要自定義的:如果用戶執(zhí)行了touchstart在很短的時間又觸發(fā)了touchend,且兩次的距離很小,而且不能
引入fastclick庫來解決
14.響應(yīng)式圖片
在移動端中,圖片的處理應(yīng)該是很謹慎的,假設(shè)有一張圖片本身的尺寸是X寬,設(shè)置和包裹它的div一樣寬,如果是div寬度小于圖片寬度沒有問題,但是如果div寬度大于圖片的寬度,圖片被拉伸失真
解決方法:讓圖片最大只能是自己的寬度
img{
max-width: 100%;
display: block;
margin: 0 auto;
}
15.點透bug的產(chǎn)生
例如:
<div id="haorooms">點頭事件測試</div>
<a href="www.jb51.net">www.jb51.net</a>
div是絕對定位的蒙層,并且z-index高于a。而a標簽是頁面中的一個鏈接,我們給div綁定tap事件:
$('#haorooms').on('tap',function(){
$('#haorooms').hide();
})
我們點擊蒙層時div正常消失,但是當我們在a標簽上點擊蒙層時,發(fā)現(xiàn)a鏈接被觸發(fā),這就是所謂的點透事件。
原因:
touchstart早于touchend早于click。即click的觸發(fā)是由延遲的,這個時間大概在300ms左右,也就是說我們tap觸發(fā)之后蒙層隱藏。此時click還沒有觸發(fā),300ms之后由于蒙層隱藏,我們的click觸發(fā)到了下面的a鏈接。
解決:
1.盡量都使用touch事件來替換click事件。例如用touchend事件(推薦)
2.用fastclick
3.用preventDefault阻止a標簽的click
內(nèi)容大部分都沒測試過,使用前請先測試