遇到的幾個瀏覽器相容性問題
阿新 • • 發佈:2018-12-11
背景解決瀏覽器的相容性問題是一件很煩的事情,其中並沒有太多高深的技巧,但是開發需要,也不得不去解決它,最近在開發專案中也遇到一些相容性的問題,希望把這些問題的解決方式記錄下來,下次遇到就直接拿過來用,也希望對他人有一些幫助。
相容性問題及解決方式
1.object-fit在ie11和edge中不相容,可以一些css hacks使用background-size和background-position替換object-fit設定圖片的樣式
<img class="loadingImage" src="url"/> .loadingImage { width: 100%; height: 100%; transition: all 1s ease; object-fit: cover; }
上述程式碼中可以修改為如下:
<div class="loadingImage"></div>
.loadingImage {
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
background-image: url(url);
}
對於視訊播放,object-fit:cover可以解決視訊不會隨著螢幕縮放的問題
<video class="video"></video> .video { width: 100%; height: auto; position: relative; left: 50%; top: 50%; transform: translate(-50%, -50%); object-fit: cover; }
可以使用如下css設定video標籤,解決object-fit不相容ie和edge的問題
<video class="video"></video>
.video {
width: 100%;
height: auto;
position: relative;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
object-fit: fill;
}
2.window.onload事件會在圖片等資源載入完成後執行方法,但是它不會檢測視訊資源是否載入完成,可以使用如下程式碼檢測視訊是否載入完成
<video id="video"></video> let video = document.getElementById('video') if (video.readyState === 4) { console.log('finish!') }
3.css的transition執行完成後會觸發transitionend事件,但是存在相容性,可以使用下面程式碼解決瀏覽器間的相容性
function checkTransitionEvent() {
var el = document.createElement('div')
var transitions = {
'transition':'transitionend',
'OTransition':'oTransitionEnd',
'MozTransition':'transitionend',
'WebkitTransition':'webkitTransitionEnd'
}
for(t in transitions){
if( el.style[t] !== undefined ){
return transitions[t];
}
}
}
4.onwheel事件相容性
support() {
let support = "onwheel" in document.createElement("div") ? "wheel" : // Modern browsers support "wheel"
document.onmousewheel !== undefined ? "mousewheel" : // Webkit and IE support at least "mousewheel"
"DOMMouseScroll";
return support
},
5.wheel事件的wheelDelta和detail屬性在不同瀏覽器下值不同,可以使用如下程式碼對其進行normalize,參考https://stackoverflow.com/que...
var wheelDistance = function(evt){
if (!evt) evt = event;
var w=evt.wheelDelta, d=evt.detail;
if (d){
if (w) return w/d/40*d>0?1:-1; // Opera
else return -d/3; // Firefox; TODO: do not /3 for OS X
} else return w/120; // IE/Safari/Chrome TODO: /3 for Chrome OS X
};
var wheelDirection = function(evt){
if (!evt) evt = event;
return (evt.detail<0) ? 1 : (evt.wheelDelta>0) ? 1 : -1;
};
6.requestAnimationFrame相容性
let cancelAnimationFrame = window.cancelAnimationFrame
|| window.mozCancelAnimationFrame
|| function(id) { clearTimeout(id) };
let requestAnimationFrame = window.requestAnimationFrame
|| window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame
|| window.msRequestAnimationFrame
|| function (callback) { return setTimeout(callback, 1000 / 60) };