1. 程式人生 > >移動端相容和適配問題

移動端相容和適配問題

  • 安卓瀏覽器看背景圖片,有些裝置會模糊

  • 解決方案:將背景圖片放大為div的2X倍(一般為兩倍),背景圖儘量高清且大於目標div的尺寸
/*原背景(div寬高都為100px)*/
.div{
    background:url(../../XX.png) no-repeat center center;
    background-size: 100px 100px;display:inline-block;
}
/*相容後的背景*/
.div{
    background:url(../../XX.png) no-repeat center center;
    background-size: 200px 200px;display:inline-block;
}
/*或者*/
.div{
    background:url(../../XX.png) no-repeat center center;
    background-size: contain;
}

  • 圖片載入很慢

  • 解決方案:1.使用Canvas繪製圖片進行預載入;
    2.使用Lazy Load外掛
/*方案1*/
 /*  獲取圖片的base64碼
        * @param {obj}img圖片dom物件
         * */
        function getBase64Image(img) {
          let canvas = document.createElement("canvas");
          canvas.width = img.width;
          canvas.height = img.height;
          let ctx = canvas.getContext("2d");
          ctx.drawImage(img, 0, 0, img.width, img.height);  //繪製相同圖片
          return canvas.toDataURL("image/png"); //轉換成base64資料
        }
        <!--需要預載入的圖片-->
    <save-img-base64>
      <img src="../../assets/1.png"/>
      <img src="../../assets/2.png"/>
      <img src="../../assets/3.png"/>
    </save-img-base64>
    
    
/*方案2*/
/*載入Lazy Load外掛,其為jQuery的一個庫因此也要載入jQuery外掛*/
<script src="jquery.js" type="text/javascript"></script>
<script src="jquery.lazyload.js" type="text/javascript"></script>
<img src="img/grey.gif" data-original="img/example.jpg" width="640" heigh="480">
$("img.lazy").lazyload(threshold : 200);

/*當用戶禁用JavaScript時預設顯示的影象
<img src="img/grey.gif" data-original="img/example.jpg" width="640" heigh="480"> 
<noscript><img src="img/example.jpg" width="640" heigh="480"></noscript>
<script type="text/javascript"></script>$("img.lazy").show().lazyload();</script>
    

  • 3.手機中網頁的放大和縮小

  • 解決方案:禁用使用者的縮放功能
    <meta name="viewport" content="user-scalable=0"/>

  • 4.格式的自動識別

  • 解決方案:禁用自動識別頁面中的格式
    <meta name="format-detection" content="telephone=no">

  • 5.移動端Gps定位

  • 解決方啊:引用百度地圖的api
    <html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
        body, html {
            width: 100%;
            height: 100%;
            margin: 0;
            font-family: "微軟雅黑";
            font-size: 14px;
        }

        #allmap {
            width: 100%;
            height: 500px;
        }
    </style>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=wqBXfIN3HkpM1AHKWujjCdsi"></script>
    <title>獲取當前所在地址,不顯示地圖</title>
</head>
<body>
    <!--<div id="allmap"></div>-->
    <!--不顯示地圖-->
    <div id="allmap" style="display:none"></div>
</body>
</html>
<script type="text/javascript">
    $(function () {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(showPosition, locationError);
        } else {
            alert("你的瀏覽器不支援 GeoLocation.");
        }
    });

    //定位成功時,執行的函式
    function showPosition(position) {
        // 百度地圖API功能
        var map = new BMap.Map("allmap");
        var point = new BMap.Point(116.331398, 39.897445);
        map.centerAndZoom(point, 12);
        var geoc = new BMap.Geocoder();

        translateCallback = function (res) {
            alert(res.points.length);
            $.each(res.points, function (index, val) {
                var point = val;
                alert(point.lng + "," + point.lat);
                var marker = new BMap.Marker(point);
                map.addOverlay(marker);
                map.setCenter(point);
                geoc.getLocation(point, function (rs) {
                    var addComp = rs.addressComponents;
                    alert(addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber);
                    //var infoWindow = new BMap.InfoWindow(sContent);
                    //map.openInfoWindow(infoWindow, point);
                });
            });
            
        }//(point);
        var convertor = new BMap.Convertor();
        var points = new Array();
        points.push(point);
        //translate(points: Array<BMap.Point>, from: number, to: number, callback: function)//callback返回是一個物件Object,TranslateResults型別
        //TranslateResults:status,points
        //參照:JavaScript API-服務類 Convertor TranslateResults http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html#a7b49
        //其中狀態碼可參照:WEB服務API-座標轉換API http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
        convertor.translate(points, 1, 5, translateCallback);
    }

    // 定位失敗時,執行的函式
    function locationError(error) {
        switch (error.code) {
            case error.PERMISSION_DENIED:
                alert("User denied the request for Geolocation.");
                break;
            case error.POSITION_UNAVAILABLE:
                alert("Location information is unavailable.");
                break;
            case error.TIMEOUT:
                alert("The request to get user location timed out.");
                break;
            case error.UNKNOWN_ERROR:
                alert("An unknown error occurred.");
                break;
        }
    }
</script>

  • 6.上下拉動滾動條時卡頓、慢

body {
        -webkit-overflow-scrolling:touch;
        overflow-scrolling: touch;
}

  • 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)

}

  • 11、active相容處理 即 偽類 :active 失效

  • 解決方案:js給 document 繫結 touchstart 或 touchend 事件
document.addEventListener('touchstart',function(){},false);

  • 12.webkit mask 相容處理

if('WebkitMask'indocument.documentElement.style){

    /*支援*/

}
else{

    /*不支援*/

}

  • 13.旋轉螢幕時,字型大小自動調整的問題

html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6{

-webkit-text-size-adjust:100%;

}

  • 14.transition閃屏

/設定內嵌的元素在3D 空間如何呈現:保留3D /

-webkit-transform-style: preserve-3d;

/ 設定進行轉換的元素的背面在面對使用者時是否可見:隱藏 /

-webkit-backface-visibility:hidden;

  • 15.圓角bug

background-clip: padding-box;

  • 16.h5網站input 設定為type=number的問題

  • 解決方案:解決max-length和部分手機樣式問題
functioncheckTextLength(obj, length) {

if(obj.value.length > length)  {

obj.value = obj.value.substr(0, length);

}

}
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;

}

    1. IOS移動端click事件300ms的延遲響應
      -解決方案:使用fastclick
window.addEventListener( "load", function() {
FastClick.attach( document.body );
}, false );

  • 18.點選穿透問題

  • 解決方案:使用touch替代click,避免混用.

  • 19.h5底部輸入框被鍵盤遮擋問題

<script src="jquery.js" type="text/javascript"></script>
var oHeight = $(document).height(); //瀏覽器當前的高度
   
   $(window).resize(function(){
 
        if($(document).height() < oHeight){
         
        $("#footer").css("position","static");
    }else{
         
        $("#footer").css("position","absolute");
    }
        
   });

  • 20.自動適應螢幕寬度

 <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=0">

  • 21.在pc端的基礎上手動調節移動端的佈局

/*max-width:最大寬度以下的佈局為..min-width:最小寬度以上的佈局為: 具有覆蓋效果*/
@media (max-width: 720px)
html {
font-size: 62.5%;
}

參考文件
https://www.cnblogs.com/mazhaokeng/p/8461260.html
https://blog.csdn.net/dengboblog/article/details/53156570
https://blog.csdn.net/diqi77/article/details/54692920
https://www.cnblogs.com/zr123/p/8178740.html