移動(dòng)端web開發(fā)的小技巧以及適配問題

1:小bug處理

安卓手機(jī)上點(diǎn)擊a標(biāo)簽會(huì)有陰影出現(xiàn),處理的方式為在body和element上加上下面這幾句css樣式

body{
     -webkit-tap-highlight-color:rgba(0, 0, 0, 0);
     -moz-tap-highlight-color:rgba(0, 0, 0, 0);
     -ms-tap-highlight-color:rgba(0, 0, 0, 0);
     -o-tap-highlight-color:rgba(0, 0, 0, 0);
     tap-highlight-color:rgba(0, 0, 0, 0);
   }
 Element {
     -webkit-tap-highlight-color:rgba(255,255,255,0);
  }

移動(dòng)端禁止頁面縮放

<meta name="viewpoint" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

禁止頁面把數(shù)字當(dāng)成電話號(hào)碼

<meta name="format-detection" content="telephone=no" />

禁止微信瀏覽器調(diào)整頁面字體大小

body{

    /*禁止微信內(nèi)置瀏覽器調(diào)整字體大小*/
    -webkit-text-size-adjust: 100% !important;
    -moz-user-select: none; /*火狐*/
    -webkit-user-select: none; /*webkit瀏覽器*/
    -ms-user-select: none; /*IE10*/
    -khtml-user-select: none; /*早期瀏覽器*/
    user-select: none;

}

禁止用戶選中頁面文字

body{
    -moz-user-select: none; /*火狐*/
    -webkit-user-select: none; /*webkit瀏覽器*/
    -ms-user-select: none; /*IE10*/
    -khtml-user-select: none; /*早期瀏覽器*/
    user-select: none;
}
<body onselectstart="return false;"></body>

在iphone關(guān)閉長按圖片保存圖片彈窗

img {
    -webkit-touch-callout: none;
  }

設(shè)置輸入框placeholder字體樣式

::-moz-placeholder { color: #A9A9A9; font-family: "PingFangTC-Light";}
::-webkit-input-placeholder { color:#A9A9A9; font-family: "PingFangTC-Light";}
::-ms-input-placeholder { color:#A9A9A9; font-family: "PingFangTC-Light";}

在ios中 輸入框的光標(biāo)發(fā)生位移,上移或者下移,解決方法是不要設(shè)置line-height

2:在微信瀏覽器中,鏈接到appstore的跳轉(zhuǎn)全都被屏蔽了

解決辦法一是通過跳轉(zhuǎn)到騰訊的微應(yīng)用(應(yīng)用寶)中,才能通過它接著跳轉(zhuǎn)到appstore,但是應(yīng)用寶規(guī)定,必須把a(bǔ)pp上傳到他們平臺(tái)審核通過后才能有這個(gè)功能,和蘋果商店類似,但是如果沒有安卓版本的app,只有ios版本的話也不可以。也就是說要在應(yīng)用寶上傳安卓和蘋果的app才能用應(yīng)用包的這個(gè)功能。

解決辦法二是當(dāng)用戶點(diǎn)擊下載按鈕之后提示用戶在瀏覽器中打開,只要不是微信瀏覽器,其他瀏覽器都可以跳轉(zhuǎn)到appstore下載app?,F(xiàn)在大部分的公司是這樣做的。

解決辦法三是掃描二維碼進(jìn)行跳轉(zhuǎn),這在微信瀏覽器中是可以的,把鏈接生成二維碼的網(wǎng)站一大堆,隨便百度一個(gè)就可以了,當(dāng)用戶點(diǎn)擊下載按鈕之后,彈出二維碼供用戶掃描。但是問題來了,如果圖片不大的話,長按圖片是出不來掃描圖中二維碼那個(gè)按鈕的。解決辦法就是再設(shè)置一個(gè)全屏的二維碼,讓它的透明度為0,當(dāng)用戶長按時(shí),其實(shí)是點(diǎn)的大的二維碼,這樣隨便按哪都會(huì)彈出來掃描圖中的二維碼那個(gè)按鈕。。。(本人也是這樣做的)

3:

在ios移動(dòng)端瀏覽器中,如果給視頻video不設(shè)置controller的話,視頻播放控件依舊會(huì)顯示出來,很丑,解決辦法就是用一個(gè)蒙版蓋住視頻,自己寫播放按鈕在上面,讓視頻的透明度為0,給包裹video標(biāo)簽的div設(shè)置背景圖片,當(dāng)點(diǎn)擊播放時(shí),才讓視屏的透明度為1,這樣就好看多了。?!,F(xiàn)在一些大的科技公司就是有自己的播放器插件,也就是模擬視頻播放器,這樣就可以隨心所欲的改變視頻播放器的樣式了。

4:(不同的手機(jī)屏幕適配問題)

我相信身為一名前端開發(fā)攻城獅剛開始最頭疼的應(yīng)該是手機(jī)適配問題了,怎樣才能讓自己寫的頁面在各種手機(jī)上都能達(dá)到一致效果沒有固定的解決方法,各位童鞋可以根據(jù)自己的需要來進(jìn)行適配,下面分別為幾種適配方法:
(1)使用媒體查詢的方式,在頁面的css中加入以下代碼:

@media only screen and (min-width: 1024px){
  body{zoom:3.2;}
}
@media only screen and (min-width: 768px) and (max-width: 1023px) {
  body{zoom:2.4;}
}
@media only screen and (min-width: 640px) and (max-width: 767px) {
  body{zoom:2;}
}
@media only screen and (min-width: 540px) and (max-width: 639px) {
  body{zoom:1.68;}
}
@media only screen and (min-width: 480px) and (max-width: 539px) {
  body{zoom:1.5;}
}
@media only screen and (min-width: 414px) and (max-width: 479px) {
  body{zoom:1.29;}
}
@media only screen and (min-width: 400px) and (max-width: 413px) {
  body{zoom:1.25;}
}
@media only screen and (min-width: 375px) and (max-width: 413px) {
  body{zoom:1.17;}
}
@media only screen and (min-width: 360px) and (max-width:374px) {
  body{zoom:1.125;}
}
`
但是對(duì)于橫屏是不好處理,判斷橫豎屏的媒體查詢?yōu)椋?`@media all and (orientation : landscape) {
  h2{color:red;}/*橫屏?xí)r字體紅色*/
}
@media all and (orientation : portrait){
  h2{color:green;}/*豎屏?xí)r字體綠色*/
}

(2)使用百分比布局:
不同的手機(jī)有著不同的分辨率,這時(shí)再用我們pc端布局常用的px就不合適了。使用百分比布局要時(shí)時(shí)刻刻清楚其父元素,因?yàn)樽釉氐陌俜直雀叨仁歉鶕?jù)父元素的高度來確定的,當(dāng)父元素的高度為不確定值時(shí),或者說父元素的高度未定義時(shí),子元素的高度百分比將沒有用(沒有參照物)。所以只有設(shè)置了父元素的高度,子元素的高度百分比才會(huì)有用。
通常使用百分比布局的人不多,因?yàn)橛?jì)算太麻煩了。

(3)單位使用em與rem
em是根據(jù)相對(duì)單位,不是固定的,他會(huì)繼承父級(jí)元素的字體大小,若沒有父級(jí)則em的相對(duì)基準(zhǔn)點(diǎn)為瀏覽器的字體大小,瀏覽器的字體默認(rèn)為16px,因此若無父級(jí)元素,相對(duì)于瀏覽器大小:Xem=X*16px; rem是css3新增屬性,是完全相對(duì)于HTML根元素大小設(shè)定的,默認(rèn)為10px,因此無論父級(jí)字體大小,1rem=10px。所以可以根據(jù)屏幕的大小來動(dòng)態(tài)的改變html的字體大小,然后使用rem為單位就可以進(jìn)行適配了,改變?yōu)g覽器字體的代碼為:

function resetHtmlFont(){//改變?yōu)g覽器字體大小
    var HTML= document.getElementsByTagName('html')[0];
    var deviceWidth = document.documentElement.clientWidth;
    var scale = deviceWidth/640;
    HTML.style.fontSize =( 100 \* scale)+'px';//乘以100的目的是瀏覽器最小的字體大小為12px,所以會(huì)出現(xiàn)屏幕過小會(huì)不執(zhí)行,這樣就可以按照正常的px大小除以100就是rem的值了
}
function resize(){
 if (window.orientation == 90 || window.orientation == -90) {
      //ipad、iphone豎屏;Andriod橫屏
     resetHtmlFont();
      orientation = 'landscape';
       return false;
} else if (window.orientation == 0 || window.orientation == 180) {
       //ipad、iphone橫屏;Andriod豎屏 
       resetHtmlFont();
      orientation = 'portrait';
      return false;
    }
}
//window.addEventListener("orientationchange",function(){//手機(jī)橫屏或者豎屏事件
//  resize();
//});
window.onresize = window.onorientationchange = function(){
  resize();
}
resize();

但是這個(gè)如果在電腦端打開的話,屏幕多大就會(huì)多大,如果需求是在PC端打開也和移動(dòng)端一樣的話,用這種方法還得加一個(gè)判斷,就是:
if (deviceWidth >=750) {//如果屏幕寬度大于750px的話,讓deviceWidth為750 deviceWidth = 750; }
把這段加到resetHtmlFont這個(gè)函數(shù)里就可以了。

(4)柵格布局&&彈性布局
box-sizing:border-box;可以改變盒子模型的計(jì)算方式方便你設(shè)置寬進(jìn)行自適應(yīng)流式布局。
彈性布局為CSS3新出現(xiàn)的屬性,簡單的用法看下面一個(gè)例子:

<ul class="flex-container">
   <li class="flex-item">![](/images/1.jpg)</li>
   <li class="flex-item">![](/images/2.jpg)</li>
   <li class="flex-item">![](/images/3.jpg)</li>
   <li class="flex-item">![](/images/4.jpg)</li>
</ul>

上面的html結(jié)構(gòu)為一個(gè)彈性布局的ul標(biāo)簽內(nèi)包含了4張400*400的圖片,css代碼為:

.flex-container {
  list-style: none;

   display: flex;
   flex-direction: row;
   flex-wrap: wrap;
}

.flex-item {
   padding: 5px;
}

關(guān)于css3的彈性布局這里不必多說,具體的可以產(chǎn)靠這篇博文,寫的不錯(cuò)。
深入理解css3彈性盒布局

(5)動(dòng)態(tài)的改變頁面的zoom值(和第三個(gè)類似)

開發(fā)者也可以根據(jù)屏幕的大小來動(dòng)態(tài)的改變頁面的zoom值來進(jìn)行適配,具體的思路和第三個(gè)方法類似,就是動(dòng)態(tài)的控制頁面的縮放,具體的代碼為:

function resetHtmlFont(){//改變?yōu)g覽器字體大小
    var deviceWidth = document.documentElement.clientWidth;//獲取設(shè)備寬度
    var scale = deviceWidth/640;//640是psd設(shè)計(jì)圖寬度
    document.body.style.zoom = scale;
}
function resize(){
 if (window.orientation == 90 || window.orientation == -90) {
      //ipad、iphone豎屏;Andriod橫屏
     resetHtmlFont();
      orientation = 'landscape';
       return false;
} else if (window.orientation == 0 || window.orientation == 180) {
       //ipad、iphone橫屏;Andriod豎屏 
       resetHtmlFont();
      orientation = 'portrait';
      return false;
    }
}
//window.addEventListener("orientationchange",function(){//手機(jī)橫屏或者豎屏事件
//  resize();
//});
window.onresize = window.onorientationchange = function(){
  resize();
}
resize();

(6)動(dòng)態(tài)的改變頁面的viewport來進(jìn)行適配
個(gè)人覺得動(dòng)態(tài)的改變頁面的viewport值來進(jìn)行適配是比較好的解決方案,包括本人以及很多大公司都在使用這種方法,這種方法的具體思路是通過js動(dòng)態(tài)的改變頁面的viewport來控制頁面的顯示區(qū)域進(jìn)行適配,我們公司有個(gè)大神寫了一個(gè)基于jquery的動(dòng)態(tài)改變viewport的插件,通熟易懂,引入完jq再引入這個(gè)文件就可以適配了,無需進(jìn)行別的操作,其它的布局什么的直接按照PC端的來寫就可以了,下面來貼出代碼:

+function(){
    adaptUILayout()
    function adaptUILayout(){

        var deviceWidth,
            devicePixelRatio,
            targetDensitydpi,
            //meta,
            initialContent,
            head,
            viewport,
            ua;

        ua = navigator.userAgent.toLowerCase();
        //whether it is the iPhone or iPad
        isiOS = ua.indexOf('ipad') > -1 || ua.indexOf('iphone') > -1;

        //設(shè)置像素比
        devicePixelRatio = window.devicePixelRatio;
        devicePixelRatio < 1.5 ? 2  : devicePixelRatio;

        if(window.orientation == 0 || window.orientation == 180){//ios的橫屏,安卓的豎屏
            if(window.screen.width < window.screen.height){
                deviceWidth = window.screen.width; 
            }else{
                deviceWidth = window.screen.height; 
            }
        }else{//ios的豎屏,安卓的橫屏
            if(window.screen.width > window.screen.height){
                deviceWidth = window.screen.width; 
            }else{
                deviceWidth = window.screen.height; 
            }
        }
        //動(dòng)態(tài)的改變像素比
        if(devicePixelRatio==2 && (deviceWidth==320 || deviceWidth==360 || deviceWidth==592 || deviceWidth==640)){
            deviceWidth*=2;
        }

        if(devicePixelRatio==1.5 && (deviceWidth==320)){
            deviceWidth*=2;
            devicePixelRatio = 2;
        }
        if(devicePixelRatio==1.5 && (deviceWidth==750)){
            devicePixelRatio = 2;
        }

        //設(shè)置設(shè)備的獨(dú)立像素比api
        targetDensitydpi = 750 / deviceWidth * devicePixelRatio * 160;
        創(chuàng)建meta標(biāo)簽
        initialContent   = isiOS 
            ? 'width=' + 750 + 'px, user-scalable=no, minimal-ui'
            : 'target-densitydpi=' + targetDensitydpi + ', width='+ 750 +', user-scalable=no';

        $("#viewport").remove();
        var head = document.getElementsByTagName('head');
        var viewport = document.createElement('meta');
        viewport.name = 'viewport';
        viewport.id = 'viewport';
        viewport.content = initialContent;

        head.length > 0 && head[head.length - 1].appendChild(viewport);
    }

    $(window).bind( 'orientationchange', function(e){
        adaptUILayout()
    });
}();

(7)使用css3的transiform的scale來改變頁面的縮放值
對(duì)于一般的web展示頁面,dom結(jié)構(gòu)不算復(fù)雜的話可以使用css3的scale來動(dòng)態(tài)的收縮頁面,比我上面提到的動(dòng)態(tài)的改變zoom值要流暢很多,騰訊里面的好多簡單頁面就是采用的這種方法,具體的思路和代碼為:

var autoScale = function() {
    var ratio = 320/504, //原設(shè)計(jì)稿的寬高比(504是iPhone5的高度去掉標(biāo)題欄高度)
        winW = document.documentElement.clientWidth,
        winH = document.documentElement.clientHeight,
        ratio2 = winW/winH,
        scale;

    if (ratio < ratio2) {
        scale = (winH/504).toString().substring(0, 6);
    }else{
        scale = (winH/504).toString().substring(0, 6);
    }
    var cssText = "-webkit-transform: scale("+ scale +"); -webkit-transform-origin:top; opacity:1;";
    $("body").attr('style', cssText);//如果給body添加不可以,就給一個(gè)最外層的div添加
};

//設(shè)定一定時(shí)間保證獲取頁面寬高正確
setTimeout(function(){
    if (document.documentElement.clientWidth/document.documentElement.clientHeight !== 320/504) {
        autoScale();
    }
},300);

//橫屏豎屏切換
window.addEventListener('onorientationchange' in window ? 'orientationchange' : 'resize', autoScale, false);

具體的可以參考:騰訊ISUX

更新于2017-3-10

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

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,090評(píng)論 1 92
  • 剛開始做移動(dòng)端web開發(fā)的同學(xué)應(yīng)該都碰到過頁面適配問題,為什么我在開發(fā)手機(jī)上調(diào)試好的頁面在其他手機(jī)會(huì)有這樣或那樣的...
    留七七閱讀 19,757評(píng)論 5 80
  • 我們第一次接觸移動(dòng)web的時(shí)候,直觀印象樣應(yīng)該是:屏幕比pc小很多,所以對(duì)pc端設(shè)計(jì)的界面,不一定(或者說不完全)...
    Scaukk閱讀 17,137評(píng)論 6 46
  • 原文鏈接: http://www.crazygaze.com/blog/2016/03/17/how-strand...
    whosemario閱讀 8,814評(píng)論 0 4
  • 天氣漸涼,一件變成兩件,兩件變成三件。今早,雨停了。昨晚,熬夜寫作業(yè),不出所料,早上起床遲了。小區(qū)的綠植一如既往的...
    木妤閱讀 379評(píng)論 0 1

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