天天看點

項目中遇到的的相容性問題及解決方法總結

1、華為、OPPO手機點選圖檔(需求是點選圖檔進入文章詳情頁)會先放大圖檔,關閉後才進入詳情頁。

解決辦法:在标簽裡加上οnclick="return false"即可。

2、使用h5的video标簽在移動端播放視訊的時候,視訊總是浮在最上層,優先級最高遮蓋所有dom操作。

解決方法:

(1)根據需求采用絕對定位固定上下位置。

(2)操作dom的時候隐藏視訊,操作結束顯示視訊,這樣也不會影響視訊的正常播放。

3、h5的video标簽,如果不設定controls屬性,那麼在移動端視訊無法加載。

解決方法:

(1)在頁面上加一個按鈕,點選按鈕順序調用方法.load()和.play()。注意:此方法需要在頁面手動觸發調用,在vue生命周期裡自動調用無效。

(2)給video标簽加上設定controls屬性值為真。

4、元素與元素之間盡量少使用margin,可以給元素設定padding-top來達到想要的元素間間隔距離效果。否則各個浏覽器渲染出來差别太大。

5、寫動畫最好使用requestAnimationFrame,而不是setTimeout和setInterval。

原因:

①JavaScript是單線程的,是以定時器的實作是在目前任務隊列完成後再執行定時器的回調的,如果目前隊列任務執行時間大于定時器設定的延遲時間,那麼定時器就不那麼可靠了。

②使用setTimeout和setInterval,動畫會出現抖動和卡頓現象。大多數電腦顯示器的重新整理頻率是60Hz,即每秒60次,事件間隔為16.7ms(1000/60),而由于setTimeout的設定的事件間隔不一定和螢幕重新整理的時間相同。

setTimeout和setInterval缺點:

①無法無額定正确的時間間隔(浏覽器、機器硬體的性能各不相同)。

②毫秒不精确。

③無法避免過度渲染(渲染頻率太高、tab不可見等)

requestAnimationFrame實作原理:

①注冊回調函數。

②浏覽器更新時觸發animate。

③animate會觸發所有注冊過的callback。

這裡的工作機制可以了解為所有權的轉移,把觸發幀更新的時間所有權交給浏覽器核心,與浏覽器的更新保持同步。這樣做既可以避免浏覽器更新與動畫幀更新的不同步,又可以給予浏覽器足夠大的優化空間。

requestAnimationFrame優點:

①采用系統時間間隔,保持最佳繪制效率,不會因為間隔時間過短,造成過度繪制,增加開銷;也不會因為間隔時間太長,使用動畫卡頓不流暢,讓各種網頁動畫效果能夠有一個統一的重新整理機制,進而節省系統資源,提高系統性能,改善視覺效果。

②requestAnimationFrame會把每一幀中的所有DOM操作集中起來,在一次重繪或回流中就完成,并且重繪或回流的時間間隔緊緊跟随浏覽器的重新整理頻率。

③在隐藏或不可見的元素中,requestAnimationFrame将不會進行重繪或回流,這當然就意味着更少的CPU、GPU和記憶體使用量④requestAnimationFrame是由浏覽器專門為動畫提供的API,在運作時浏覽器會自動優化方法的調用,并且如果頁面不是激活狀态下的話,動畫會自動暫停,有效節省了CPU開銷。

使用方法:

項目中遇到的的相容性問題及解決方法總結

6、僞元素 :hover在iPhone上會失效

解決辦法:

監聽元素點選事件,添加class名。如下:

$('.do-item1-content1').on('touchstart', touchstart)
$('.do-item1-content1').on('touchend', touchEnd)
       function touchstart(event) {
          $(this).addClass('touchDiv')
      }
      function touchEnd(event) {
          $(this).removeClass('touchDiv')
      }
           

7、擷取滾動條高度

浏覽器擷取滾動條高度的方法:

項目中遇到的的相容性問題及解決方法總結

親測:Chrome 和 Firefox隻能通過document.documentElement.scrollTop擷取,通過document.body.scrollTop擷取的永遠是0.

封裝:

function getScrollTop ( ) {
   let scroll_top = 0;
   if (document.documentElement && document.documentElement.scrollTop) {
         scroll_top = document.documentElement.scrollTop
}else if (document.body) {
  scroll_top = document.body.scrollTop
}
 return scroll_top
}
           

8、擷取某個div元素的高度

$('.className')[0].clentHeight
           

例如:

<div class="contact-content-right">
        <p>11111</p>
        <div>222222222</div>
</div>
           
height = $('.contact-content-right')[0].clientHeight
           

9、

XHTML中用 document.documentElement.clientHeight 代替

document.body.clientHeight

https://my.oschina.net/zhenguoguan/blog/138603

JS 擷取螢幕、浏覽器、頁面的高度寬度

https://segmentfault.com/a/1190000010443608

繼續閱讀