微信H5頁面前端開發,大多數人都會遇到的幾個兼容性坑

最近給公司微信公衆號,寫了微信h5業務頁面,總結分享一下前端開發過程當中的幾個兼容性坑,項目直接拿的公司頁面,因此下文涉及圖片都模糊處理了。前端

一、ios端兼容input光標高度vue

問題詳情描述:input輸入框光標,在安卓手機上顯示沒有問題,可是在蘋果手機上
當點擊輸入的時候,光標的高度和父盒子的高度同樣。例以下圖,左圖是正常所期待的輸入框光標,右邊是ios的input光標。
圖片描述
出現緣由分析:一般咱們習慣用height屬性設置行間的高度和line-height屬性設置行間的距離(行高),當點擊輸入的時候,光標的高度就自動和父盒子的高度同樣了。(谷歌瀏覽器的設計原則,還有一種可能就是當沒有內容的時候光標的高度等於input的line-height的值,當有內容時,光標從input的頂端到文字的底部ios

解決辦法:高度height和行高line-height內容用padding撐開web

例如:小程序

.content{
      float: left;
      box-sizing: border-box;
      height: 88px;
      width: calc(100% - 240px); 
      .content-input{
        display: block;
        box-sizing: border-box;
        width: 100%;
        color: #333333;
        font-size: 28px;
        //line-height: 88px;
        padding-top: 20px;
        padding-bottom: 20px;
      }
     }

二、ios端微信h5頁面上下滑動時卡頓、頁面缺失後端

問題詳情描述:在ios端,上下滑動頁面時,若是頁面高度超出了一屏,就會出現明顯的卡頓,頁面有部份內容顯示不全的狀況,例以下圖,右圖是正常頁面,邊是ios上下滑動後,卡頓致使如左圖下面部分丟失。跨域

圖片描述

出現緣由分析:瀏覽器

籠統說微信瀏覽器的內核,Android上面是使用自帶的WebKit內核,iOS裏面因爲蘋果的緣由,使用了自帶的Safari內核,Safari對於overflow-scrolling用了原生控件來實現。對於有-webkit-overflow-scrolling的網頁,會建立一個UIScrollView,提供子layer給渲染模塊使用。【有待考證】緩存

解決辦法:只須要在公共樣式加入下面這行代碼微信

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

But,這個屬性是有bug的,好比若是你的頁面中有設置了絕對定位的節點,那麼該節點的顯示會錯亂,固然還有會有其餘的一些bug。

拓展知識: -webkit-overflow-scrolling:touch是什麼?

MDN上是這樣定義的:

-webkit-overflow-scrolling 屬性控制元素在移動設備上是否使用滾動回彈效果. auto: 使用普通滾動, 當手指從觸摸屏上移開,滾動會當即中止。 touch: 使用具備回彈效果的滾動,
當手指從觸摸屏上移開,內容會繼續保持一段時間的滾動效果。繼續滾動的速度和持續的時間和滾動手勢的強烈程度成正比。同時也會建立一個新的堆棧上下文。

三、ios鍵盤喚起,鍵盤收起之後頁面不歸位

問題詳情描述:

輸入內容,軟鍵盤彈出,頁面內容總體上移,可是鍵盤收起,頁面內容不下滑

出現緣由分析:

固定定位的元素 在元素內 input 框聚焦的時候 彈出的軟鍵盤佔位 失去焦點的時候軟鍵盤消失 可是仍是佔位的 致使input框不能再次輸入 在失去焦點的時候給一個事件

解決辦法:

<div class="list-warp">
  <div class="title"><span>投·被保險人姓名</span></div>
   <div class="content">
     <input class="content-input" 
            placeholder="請輸入姓名"
            v-model="peopleList.name"
           @focus="changefocus()"
           @blur.prevent="changeBlur()"/>    </div>
 </div>

changeBlur(){
      let u = navigator.userAgent, app = navigator.appVersion;
      let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
      if(isIOS){
        setTimeout(() => {
          const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0
          window.scrollTo(0, Math.max(scrollHeight - 1, 0))
          }, 200)
      }
    }

拓展知識: position: fixed的元素在ios裏,收起鍵盤的時候會被頂上去,特別是第三方鍵盤

四、安卓彈出的鍵盤遮蓋文本框

問題詳情描述:

安卓微信H5彈出軟鍵盤後擋住input輸入框,以下左圖是期待喚起鍵盤的時候樣子,右邊是實際喚起鍵盤的樣子

圖片描述

出現緣由分析:待補充

解決辦法:給input和textarea標籤添加focus事件,以下,先判斷是否是安卓手機下的操做,固然,能夠不用判斷機型,Document 對象屬性和方法,setTimeout延時0.5秒,由於調用安卓鍵盤有一點遲鈍,致使若是不延時處理的話,滾動就失效了

changefocus(){
  let u = navigator.userAgent, app = navigator.appVersion;
  let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
  if(isAndroid){
    setTimeout(function() {
     document.activeElement.scrollIntoViewIfNeeded();
     document.activeElement.scrollIntoView();
    }, 500);       
  }
},

拓展知識:

Element.scrollIntoView()方法讓當前的元素滾動到瀏覽器窗口的可視區域內。而Element.scrollIntoViewIfNeeded()方法也是用來將不在瀏覽器窗口的可見區域內的元素滾動到瀏覽器窗口的可見區域。但若是該元素已經在瀏覽器窗口的可見區域內,則不會發生滾動

五、Vue中路由使用hash模式,開發微信H5頁面分享時在安卓上設置分享成功,可是ios的分享異常

問題詳情描述:

ios當前頁面分享給好友,點擊進來是正常,若是二次分享,則跳轉到首頁;使用vue router跳轉到第二個頁面後在分享時,分享設置失敗;以上安卓分享都是正常

圖片描述

出現緣由分析:jssdk是後端進行簽署,前端校驗,可是有時跨域,ios是分享之後會自動帶上 from=singlemessage&isappinstalled=0 以及其餘參數,分享朋友圈參數還不同,貌似系統不同參數也不同,可是每次獲取url並不能獲取後面這些參數

解決辦法:

(1)可使用改頁面this.$router.push跳轉,爲window.location.href去跳轉,而不使用路由跳轉,這樣可使地址欄的地址與當前頁的地址同樣,能夠分享成功(適合分享的頁面很少的狀況下,做爲一個單單頁運用,這樣刷新頁面跳轉,仍是..)

(2)把入口地址保存在本地,等須要獲取簽名的時候 取出來,注意:sessionStorage.setItem(‘href’,href); 只在剛進入單應用的時候保存!【該方法未驗證】

題外話:若是能用小程序寫的頁面,儘可能上小程序吧,H5開發在微信開發者工具裏看頁面效果可能看不出問題,由於不能喚起軟鍵盤。避免頻繁線上發佈,能夠用花生殼或者idcfengye,作內網穿透,搭建一個能夠經過域名訪問的開發環境的h5頁面,在手機上看看效果,對了微信內置瀏覽器緩存機制。會致使剛提交的代碼(特別是js)效果要半個小時左右才生效。

最後:微信H5頁面其實不少知識,登錄受權,jssdk受權,這裏就只作了分享,固然還有上傳圖片、微信支付等功能,均可能會遇到坑,以上幾個坑也是比較常遇到的,若是有更好的解決方案的話,歡迎在留言區分享。

相關文章
相關標籤/搜索