[轉(zhuǎn)]移動端常見面試題一:移動端兼容解決方案

文章來源:移動端常見面試題一:移動端兼容解決方案

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)容大部分都沒測試過,使用前請先測試

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容