文章來(lái)源:移動(dòng)端常見(jiàn)面試題一:移動(dòng)端兼容解決方案
1玖像、安卓瀏覽器看背景圖片搅吁,有些設(shè)備會(huì)模糊
因?yàn)槭謾C(jī)分辨率太小簸呈,如果按照分辨率來(lái)顯示網(wǎng)頁(yè)冕茅,字會(huì)非常小,安卓手機(jī)devicePixoRadio比較亂蛹找,有1.5的姨伤,有2的也有3的。想讓圖片在手機(jī)里顯示更為清晰庸疾,必須使用2x的背景圖來(lái)代替img標(biāo)簽(一般情況下都是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、防止手機(jī)中頁(yè)面放大和縮小
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
3届慈、上下拉動(dòng)滾動(dòng)條時(shí)卡頓徒溪、慢
body
{
-webkit-overflow-scrolling:touch;
overflow-scrolling:touch;
}
Android3+和iOSi5+支持CSS3的新屬性為overflow-scrolling
4、長(zhǎng)時(shí)間按住頁(yè)面出現(xiàn)閃退
element
{
-webkit-touch-callout:none;
}
5金顿、iphone及ipad下輸入框默認(rèn)內(nèi)陰影
element
{
-webkit-appearance:none;
}
6臊泌、ios和android下觸摸元素時(shí)出現(xiàn)半透明灰色遮罩
element
{
-webkit-tap-highlight-color:rgba(255,255,255,0);
}
設(shè)置alpha值為0就可以去除本透明灰色遮罩,備注:transparent的屬性值在android下無(wú)效揍拆。
7渠概、active兼容處理 即 偽類(lèi):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邊框
在移動(dòng)端中嫂拴,如果給元素設(shè)置一個(gè)像素的邊框的話播揪,那么在手機(jī)上看起來(lái)是會(huì)比一個(gè)像素粗的。
解決方法:使用偽類(lèi)元素模擬邊框筒狠,使用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兼容處理
某些低端手機(jī)不支持css3mask,可以選擇性的進(jìn)降級(jí)處理
比如可以使用js判斷來(lái)引用不同class:
if('WebkitMask' in documnet.documentElement.style)
{
alert('支持 mask')
}
else
{
alert('不支持 mask')
}
10辩恼、pc端與移動(dòng)端字體大小的問(wèn)題
html,body,form,fieldset,p,div,h1,h2,h3,h4,h5,h6
{
-webkit-text-size-adjust:100%;
}
pc端字體正常顯示雇庙,但ios真機(jī)就出現(xiàn)谓形,h1、span等標(biāo)簽字體比較大状共。
html
{
-webkit-text-size-adjust:100%;/*ios端谷歌瀏覽器測(cè)試有效套耕,Android端未測(cè)試*/
}
11.transiton閃屏
/*設(shè)置內(nèi)聯(lián)的元素在3D空間如何呈現(xiàn):保留3D*/
-webkit-transform-style:preserve-3D;
/*設(shè)置進(jìn)行轉(zhuǎn)換的元素的背面在面對(duì)用戶時(shí)是否課件:隱藏*/
-webkit-backface-visibility:hidden;
12.圓角bug
某些Android手機(jī)圓角失效 background-clip:padding-box;
13.click的300ms延遲問(wèn)題
在移動(dòng)端中,click事件是生效的峡继,但是冯袍,點(diǎn)擊之后會(huì)有300ms的延遲響應(yīng)
原因:safari是最早做出這個(gè)機(jī)制的,因?yàn)樵谝苿?dòng)端里碾牌,瀏覽器需要等待一段時(shí)間來(lái)判斷此次用戶操作是單擊還是雙擊康愤,所以就有click300ms的延遲機(jī)制,Android也很快就有了
不用click舶吗,用自定義事件tap
tap是需要自定義的:如果用戶執(zhí)行了touchstart在很短的時(shí)間又觸發(fā)了touchend,且兩次的距離很小征冷,而且不能
引入fastclick庫(kù)來(lái)解決
14.響應(yīng)式圖片
在移動(dòng)端中,圖片的處理應(yīng)該是很謹(jǐn)慎的誓琼,假設(shè)有一張圖片本身的尺寸是X寬检激,設(shè)置和包裹它的div一樣寬,如果是div寬度小于圖片寬度沒(méi)有問(wèn)題腹侣,但是如果div寬度大于圖片的寬度叔收,圖片被拉伸失真
解決方法:讓圖片最大只能是自己的寬度
img{
max-width: 100%;
display: block;
margin: 0 auto;
}
15.點(diǎn)透bug的產(chǎn)生
例如:
<div id="haorooms">點(diǎn)頭事件測(cè)試</div>
<a href="www.jb51.net">www.jb51.net</a>
div是絕對(duì)定位的蒙層,并且z-index高于a傲隶。而a標(biāo)簽是頁(yè)面中的一個(gè)鏈接饺律,我們給div綁定tap事件:
$('#haorooms').on('tap',function(){
$('#haorooms').hide();
})
我們點(diǎn)擊蒙層時(shí)div正常消失,但是當(dāng)我們?cè)赼標(biāo)簽上點(diǎn)擊蒙層時(shí)跺株,發(fā)現(xiàn)a鏈接被觸發(fā)复濒,這就是所謂的點(diǎn)透事件。
原因:
touchstart早于touchend早于click乒省。即click的觸發(fā)是由延遲的巧颈,這個(gè)時(shí)間大概在300ms左右,也就是說(shuō)我們tap觸發(fā)之后蒙層隱藏袖扛。此時(shí)click還沒(méi)有觸發(fā)洛二,300ms之后由于蒙層隱藏,我們的click觸發(fā)到了下面的a鏈接攻锰。
解決:
1.盡量都使用touch事件來(lái)替換click事件晾嘶。例如用touchend事件(推薦)
2.用fastclick
3.用preventDefault阻止a標(biāo)簽的click
內(nèi)容大部分都沒(méi)測(cè)試過(guò),使用前請(qǐng)先測(cè)試