為用戶創造價值的開發公司

    始終追求工匠精神,是您靠譜的H5開發、小程序開發、微信開發供應商

    藍暢首頁 >> 動態

    H5開發中遇到常見問題的和解決方案

    時間:2019-07-07 00:00:00 | 來源:

    手機共通問題


    問題一:用同等比例的圖片在PC機上很清楚,但是手機上很模糊,原因是什么呢?

    經研究發現是devicePixelRatio作怪,因為手機分辨率太小,如果按照分辨率來顯示網頁字會非常小,所以蘋果就把iPhone 4的960640分辨率在網頁里只顯示了480320,這樣devicePixelRatio=2;現在android比較亂,有1.5/2/3等,想讓圖片在手機里顯示更為清晰必須使用2x的背景圖來代替img標簽(一般情況都是用2倍),例如一個div的寬高是100100,背景圖必須得200200,然后background-size:contain;,這樣顯示出來的圖片就比較清晰了;代碼如下:

    background:url(../images/icon/all.png) no-repeat center center;-webkit-background-size:50px 50px;background-size: 50px 50px;display:inline-block; width:100%; height:50px;

    問題二:防止手機中網頁放大和縮小

    這點是手機站開發者都應該知道的,就是設置meta中的viewport;有些手機站有如下聲明:

    <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">

    設置DTD的方式是XHTML的寫法,假如頁面運用的是h5可以不用設置DTD,直接聲明

    使用viewport使頁面禁止縮放,通常把user-scalable設置為0來關閉用戶對頁面視圖縮放的行為

    <metaname="viewport"content="user-scalable=0" />

    為了更好的兼容,我們使用完整的viewport設置

    <metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />

    問題三:如何設置Web應用以全屏模式運行

    apple-mobile-web-app-capable是設置Web應用是否以全屏模式運行;語法:

    <meta name="apple-mobile-web-app-capable" content="yes"> //content設置為yesWeb應用會以全屏模式運行,反之則不會;content的默認值是no,表示正常顯示,可以通過只讀屬性window.navigator.standalone來確定網頁是否以全屏模式顯示

    問題四:如何啟動或禁用自動識別頁面中的電話號碼

    html5提供了自動調用撥號的標簽,只要在a標簽的href中添加tel:就可以了

    <ahref="tel:10010">10010</a>

    format-detection可以啟動或禁用自動識別頁面中的電話號碼;語法:

    <meta name="format-detection" content="telephone=no"> //默認情況下設備會自動識別任何可能是電話號碼的字符串,設置telephone=no可以禁用這項功能,設置不識別郵箱和地址也同理

    問題五:h5網站input設置為type=number的問題

    h5網頁input的type設置為number一般會產生三個問題:

    問題1:maxlength屬性不好用

    解決,我目前用的是js

    <input type="number" oninput="checkTextLength(this ,10)"><scripttype="text/javascript">functioncheckTextLength(obj, length) {        if(obj.value.length > length)  {            obj.value = obj.value.substr(0, length);        }    }</script>

    問題2:form提交的時候默認取整

    因為form提交默認做了表單驗證,step默認是1,要設置step屬性,假如保留2位小數,寫法如下:

    <input type="number" step="0.01" /> //input中type=number一般會自動生成一個上下箭頭,點擊上箭頭默認增加一個step,點擊下箭頭默認會減少一個step;number中默認step是1,也就是step=0.01可以允許輸入2位小數,并且點擊上下箭頭分別增加0.01和減少0.01;step和min一起使用時數值必須在min和max之間

    問題3:部分安卓手機出現樣式問題

    去除input中這些默認樣式:

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

    去除input默認樣式的方法:

    input,textarea {    border: 0;    -webkit-appearance: none; //可同時屏蔽輸入框怪異的內陰影,解決iOS下無法修改按鈕樣式,測試還發現,加了此屬性后,iOS下默認還是有圓角的,不過可以用border-radius屬性修改}

    問題六:select下拉選擇設置問題

    問題1:右對齊實現

    設置如下屬性

    selectoption {    direction: rtl;}

    問題2:喚起select的option展開

    zepto方式:

    $(sltElement).trrgger("mousedown");

    原生js方式:

    function showDropdown(sltElement) {    varevent;    event = document.createEvent('MouseEvents');    event.initMouseEvent('mousedown', true, true, window);    sltElement.dispatchEvent(event);};

    問題3:禁用select默認箭頭

    ::-ms-expand修改表單控件下拉箭頭,設置隱藏并使用背景圖片來修飾

    select::-ms-expand { display:none; }

    問題4:使用appearance改變webkit瀏覽器的默認外觀

    input,select { -webkit-appearance:none; appearance: none; }

    問題七:移動端click事件延遲的問題

    移動端的點擊事件都會有300ms延遲,是因為瀏覽器在等待你是否執行雙擊,但此延遲導致用戶體驗不好,解決這個問題,我們的方案如下:

    1.盡量都使用touch事件來替換click事件,例如用touchend事件(推薦)

    2.用preventDefault阻止a標簽的click

    3.用script標簽引入fastclick庫去除延遲,實驗證明fastclick比tap要快

    4.zepto的touch模塊,tap事件也是可以解決在click的延遲問題

    5.延遲一定的時間(300ms+)來處理事件(不推薦)

    6.以上一般都能解決,實在不行就換成click事件

    7.觸摸事件的響應順序為touchstart-->touchmove-->touchend-->click,也可以通過綁定ontouchstart事件,加快對事件的響應,解決300ms延遲問題

    8.若移動設備兼容性正常的話(IE/Firefox/Safari(IOS 9.3)及以上)只需加上下面meta標簽即可把viewport設置成設備的實際像素,就不會有300ms的延遲

    <metaname="viewport"content="width=device-width">

    click事件的延遲會導致移動端點透問題

    案例如下:

    <divid="haorooms">事件測試</div><ahref="#">www.xxx.com</a>

    div是絕對定位的蒙層且z-index高于a,我們給div綁定tap事件:

    $('#haorooms').on('tap',function(){    $('#haorooms').hide();});

    我們點擊蒙層時div正常消失,但是當我們在a標簽上點擊蒙層時,發現a鏈接被觸發,這就是所謂的點透事件

    原因:touchstart早于touchend早于click,即click的觸發是有300ms左右延遲的,也就是說tap觸發之后蒙層隱藏click沒有觸發,300ms之后由于蒙層消失click觸發到了下面的a鏈接上;解決方案同上面的click事件延遲

    問題八:移動端HTML5 audio autoplay失效問題

    由于自動播放網頁中的音頻或視頻會給用戶帶來困擾或不必要的流量消耗,所以蘋果系統和安卓系統通常都會禁止自動播放和使用JS的觸發播放,必須由用戶來觸發才播放;解決方法思路:先通過用戶touchstart觸碰觸發播放并暫停(讓音頻開始加載),后面用JS再操作就沒問題了;解決代碼:

    document.addEventListener('touchstart', function () {    document.getElementsByTagName('audio')[0].play();    document.getElementsByTagName('audio')[0].pause();});

    問題九:移動端樣式兼容處理

    當今的手機端,屏幕分辨率各有不同,為了讓頁面可以兼容各款手機,解決方案如下:

    1.設置meta標簽viewport屬性,使其無視設備的真實分辨率,直接通過dpi在物理尺寸和瀏覽器之間重設分辨率,從而達到能有統一的分辨率的效果,并且禁止掉用戶縮放

    <metaname="viewport"content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />

    2.使用rem進行屏幕適配,設置好root元素的font-size大小,然后在開發的時候所有與像素有關的布局統一換成rem單位;針對不同的手機使用媒體查詢對root元素font-size進行調整

    問題十:CSS動畫頁面閃白,動畫卡頓,圖片錯亂的問題

    解決方法:

    1.盡可能地使用合成屬性transform和opacity來設計CSS3動畫,不使用position的left和top來定位

    2.開啟硬件加速

    -webkit-transform: translate3d(0, 0, 0);-moz-transform: translate3d(0, 0, 0);-ms-transform: translate3d(0, 0, 0);transform: translate3d(0, 0, 0); //可以觸發硬件加速,從而讓瀏覽器在渲染動畫時從CPU轉向GPU

    目前像Chrome/Filefox/Safari/IE9+以及最新版本Opera都支持硬件加速,當檢測到某個DOM元素應用了某些CSS規則時就會自動開啟,從而解決頁面閃白,保證動畫流暢

    3.各種應用的webview(例如微信)在遇到有大量圖片時會出現img和background-image互相錯亂的情況,6和6plus更為嚴重,目前暫時的解決方法也是動態給所有用到圖片的元素加上-webkit-transform:translate3d(0,0,0)

    4.頁面中的滑動刷新在某些手機中出現卡頓滑不動的情況,以下給出可行的解決方案:

    a.關閉probeType屬性(傳說是因為這個啟用監聽滾動狀態的很耗性能,關閉這個屬性滑動就會流暢很多)

    document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);

    b.給scroll元素增加css樣式:-webkit-transform:translate3d(0,0,0);

    問題十一:浮動子元素撐開父元素盒子高度

    解決方法如下:

    1.父元素設置為 overflow: hidden;

    2.父元素設置為 display: inline-block;

    這里兩種方法都是通過設置css屬性將浮動元素的父元素變成BFC(塊級格式化上下文)元素,使子元素高度可以撐開父元素;不過最好使用方法1,因為inline-block元素本身會自帶一些寬高度撐開其本身

    BFC產生的條件:

    1.html根元素

    2.float的值不為none

    3.display的值為inline-block/table-cell/table-caption

    4.position的值為absolute或fix

    5.overflow的值不為visible

    BFC約束規則:

    1.生成BFC元素的子元素會一個接一個的放置;垂直方向上他們的起點是一個包含塊的頂部,倆個相鄰子元素之間垂直距離取決于元素margin特性,在BFC中相鄰的塊級元素外邊距會折疊

    2.生成BFC元素的子元素中每個子元素的外邊距和包含塊的左邊界相接觸(對于從右到左的格式化,右外邊距和右邊界相接觸),除非這個子元素也創建一個新的BFC(如它自身也是一個浮動元素)

    3.BFC的區域不會與float的元素區域重疊

    4.計算BFC高度時浮動元素也參與計算

    5.BFC就是頁面上一個隔離的獨立容器,容器里面的子元素不會影響到外面元素,反之亦然

    我們在寫css常見的一些問題都可以由上面兩條推出,例如:

    1.Block元素與父元素同寬,所以Block元素豎直方向上垂直排列。

    2.豎直方向上有的Block元素margin會重疊,水平方向不會。

    3.浮動元素會盡量接近左上方或右上方。

    4.為父元素設置overflow:hidden或浮動父元素,則父元素會包含其浮動的子元素。

    BFC有很多實際的用處,例如防止相鄰block的豎直margin重疊(塌陷)

    問題十二:往返緩存問題

    點擊瀏覽器的回退有時候不會自動執行js,特別是在mobilesafari中;這與往返緩存(bfcache)有關系,解決方法:

    window.onunload = function(){};

    問題十三:定位的坑

    1.fixed定位

    ios下fixed元素容易定位出錯,軟鍵盤彈出時影響fixed元素定位,而android下不會;ios4下不支持position:fixed

    解決方案:使用[Iscroll],如:

    <divid="wrapper"><ul><li></li>               .....        </ul></div><scriptsrc="iscroll.js"></script><script>var myscroll;    functionloaded(){        myscroll=new iScroll("wrapper");    }    window.addEventListener("DOMContentLoaded",loaded,false);</script>

    2.position定位

    Android下彈出軟鍵盤彈出時影響absolute元素定位;解決方案如下:

    var ua = navigator.userAgent.indexOf('Android');if(ua>-1){    $('.ipt').on('focus', function(){        $('.css').css({'visibility':'hidden'})    }).on('blur', function(){        $('.css').css({'visibility':'visible'})    })}

    3.安卓手機端軟鍵盤彈出頂起頁面布局

    BODY被頂起的解決辦法:

    $('body').height($('body')[0].clientHeight);

    問題十四:audio元素和video元素在ios和andriod中播放問題

    問題1:音頻/視頻寫法

    <audiosrc="music/bg.mp3"autoplayloopcontrols>你的瀏覽器還不支持哦</audio> //音頻,寫法一<audiocontrols="controls"> //音頻,寫法二       <sourcesrc="music/bg.ogg"type="audio/ogg"></source><sourcesrc="music/bg.mp3"type="audio/mpeg"></source> //優先播放音樂bg.ogg,不支持在播放bg.mp3    </audio>

    問題2:ios系統手機無法自動播放音頻/視頻

    這個是蘋果系統限制默認不允許自動播放音頻/視頻,需要點一下觸發play()事件才能播放;那么我們可以在頁面onload后觸發播放事件:

    document.getElementById('music').play();

    到這里一般都可以播放音樂了,如果還不行很有可能是微信的限制

    問題3:微信的限制

    如果是微信的限制,這時需要調用微信接口,頁面先引入:

    <scriptsrc="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

    然后JS寫入微信事件:

    document.addEventListener("WeixinJSBridgeReady", function() {    document.getElementById('music').play();}, false);

    小結

    1.audio元素的autoplay屬性在IOS及Android上無法使用,在PC端正常

    2.audio元素沒有設置controls時,在IOS及Android會占據空間大小,而在PC端Chrome是不會占據任何空間

    問題4:Safari瀏覽器自動播放

    document.addEventListener('touchstart', function(){       audio.play();}, false);

    問題5:ios系統不支持動畫暫停樣式(animation-play-state)

    H5頁面一般都會有BGM,也會提供一個旋轉的音樂圖標供用戶開啟關閉音樂;我們希望當用戶點擊音樂按鈕時圖標停止旋轉,再點圖標順著之前停止的位置繼續跑動畫;animation-play-state是最簡便的方式,然而ios不支持

    目前的解決方案是:音樂圖標負責跑動畫,圖標父級元素負責記錄停止時的轉動值

    問題6:ios系統搖一搖播放音效事件無效

    在實現搖晃(引用了封裝好的shake.js)手機觸發某一音效這個需求時,發現在微信中音效沒有被觸發;后面找到原因:在ios里并沒有把自定義搖晃事件shake當成交互動作,而要播放音效需要用戶有交互動作;沒有交互音效就沒被加載,那么我們先加載音效,結合上面的微信接口:

    document.addEventListener("WeixinJSBridgeReady", function () {shakeMusic.load();}, false);

    load()過之后再調用play()即可聽到音效

    問題十五:防止長按頁面元素被選中

    解決:加入樣式可禁止用戶進行復制,ios和一般的安卓都可以解決,唯獨小米自帶瀏覽器還有問題

    -webkit-touch-callout:none;  //系統默認菜單被禁用;可以實現頁面因為長按彈出各種操作窗口-webkit-user-select:none; //webkit瀏覽器  -khtml-user-select:none; //早期瀏覽器 -moz-user-select:none; //火狐 -ms-user-select:none; //IE10 user-select:none; 

    添加完這段代碼后在IOS上會有問題,這時發現input框無法正在輸入內容了;造成這個原因是-webkit-user-select:none;這個屬性,解決方法就是在css文件中同時設置一下input的屬性,如下:

    input {           -webkit-user-select:auto; //webkit瀏覽器    }

    問題十六:html5碰到上下拉動滾動條時卡頓/慢怎么解決

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

    overflow-x:auto在iOS有兼容問題,解決方法:

    -webkit-overflow-scrolling: touch;

    問題十七:點擊元素產生背景或邊框怎么去掉

    ios用戶點擊一個鏈接會出現一個半透明灰色遮罩,如果想要禁用可設置-webkit-tap-highlight-color的alpha值為0去除灰色半透明遮罩

    android用戶點擊一個鏈接會出現一個邊框或者半透明灰色遮罩,不同生產商定義出來效果不一樣,可設置-webkit-tap-highlight-color的alpha值為0去除部分機器自帶的效果

    winphone系統點擊標簽產生的灰色半透明背景能通過設置去掉

    特殊說明:有些機型去除不了,如小米2,對于按鈕類還有個辦法,不使用a或input標簽,直接用div標簽

    a,button,input,textarea{     -webkit-tap-highlight-color: rgba(0,0,0,0);     -webkit-user-modify:read-write-plaintext-only; //-webkit-user-modify有個副作用,就是輸入法不再能夠輸入多個字符}或a,button,input,textarea{ -webkit-tap-highlight-color: rgba(0,0,0,0); } 

    在winphone下使用如下代碼

    <metaname="msapplication-tap-highlight"content="no">

    問題十八:瀏覽器后退不刷新

    這種情況是以前遇到的,這里也說下;主要會發生在webview里多一點,當點擊后退時頁面以緩存形式出現,而不是刷新后的,很多情況下這不是你預期的效果,解決方法是用js:

    window.onpageshow = function(evt){  if(evt.persisted){      document.body.style.display ="none";     location.reload();  }};

    onpageshow每次頁面加載都會觸發,無論是從緩存中加載還是正常加載,這是他和onload的區別;persisted判斷頁面是否從緩存中讀出

    問題十九:部分機型存在type為search的input自帶close按鈕樣式修改方法

    有些機型的搜索input控件會自帶close按鈕(一個偽元素),而通常為了兼容所有瀏覽器我們會自己實現一個,此時去掉原生close按鈕的方法為

    #Search::-webkit-search-cancel-button{    display: none;  }

    如果想使用原生close按鈕又想使其符合設計風格,可以對這個偽元素的樣式進行修改

    問題二十:input的placeholder文本位置偏上的情況

    input的placeholder會出現文本位置偏上的情況:PC端設置line-height等于height能夠對齊,而移動端仍然是偏上,解決方案時是設置css line-height:normal;

    問題二十一:transition清除閃屏

    -webkit-transform-style: preserve-3d; //設置內嵌的元素在 3D 空間如何呈現:保留3D-webkit-backface-visibility:hidden; //設置進行轉換的元素的背面在面對用戶時是否可見:隱藏-webkit-perspective: 1000;

    問題二十二:頂部狀態欄背景色

    <metaname="apple-mobile-web-app-status-bar-style"content="black" />

    說明:除非你先使用apple-mobile-web-app-capable指定全屏模式,否則這個meta標簽不會起任何作用;如果content設置為default,則狀態欄正常顯示;如果設置為blank,則狀態欄會有一個黑色的背景;如果設置為blank-translucent,則狀態欄顯示為黑色半透明;如果設置為default或blank,則頁面顯示在狀態欄的下方,即狀態欄占據上方部分;頁面占據下方部分,二者沒有遮擋對方或被遮擋;如果設置為blank-translucent,則頁面會充滿屏幕,其中頁面頂部會被狀態欄遮蓋住(會覆蓋頁面20px高度,而iphone4和itouch4的Retina屏幕為40px);默認值是default。



    上海藍暢信息技術有限公司成功為多家世界財富500強企業以及其他著名品牌提供優質服務,是您靠譜的互聯網開發供應商。

    服務客戶遍及北京、上海、杭州、深圳、廣州、天津、青島、南京、寧波、蘇州、無錫、廈門、重慶、西安等大中型城市及地區    主要業務:H5開發,H5外包,微信開發外包,網站開發外包,H5游戲開發,小程序開發外包,APP開發外包,視頻后期制作等




    本文地址:
    更多內容推薦:
    專欄最新閱讀:
    更多文章閱讀請至:技術專欄
    Tips: 為您提供 微信開發H5開發微信小程序開發微信定制開發網站開發小程序商城開發SEO網站優化視頻后期制作等定制化開發服務
    国产精品久久网| 精品国产毛片一区二区无码| 精品国产免费一区二区三区香蕉| 国产99视频精品免费专区| 国产成人精品免费视频动漫 | 精品国产一区二区三区不卡 | 最近中文字幕mv免费高清视频7| 亚洲精品一品区二品区三品区| 99精品视频在线观看re| 国产精品毛片一区二区| 亚洲国产精品日韩在线观看| 国产中老年妇女精品| 国产精品福利片免费看 | 久久se精品一区精品二区| 久久精品无码免费不卡| 无码精品久久久天天影视| 欧美精品免费在线| 亚洲精品尤物yw在线影院| .精品久久久麻豆国产精品| 精品久久久久久久中文字幕| 无码人妻精品一区二区三18禁 | 久久久久久噜噜精品免费直播| 亚洲精品无码久久久影院相关影片| 国产精品福利网站导航| 日本精品自产拍在线观看中文| 久久国产精品成人片免费| 国产精品一区三区| 麻豆亚洲AV永久无码精品久久| 99久久国产综合精品成人影院| 影音先锋5566av| 日韩欧美精品不卡| 老司机午夜在线视频免费观| 日韩一级精品视频在线观看| 一本久久a久久精品亚洲| 99久久国产热无码精品免费久久久久| 亚洲国产精品无码久久久秋霞2| 国产精品∧v在线观看| 爽爽精品dvd蜜桃成熟时电影院| 国产精品极品| 久久精品www人人爽人人| 欧美成人精品网站播放|