遇到的几个浏览器兼容性问题

数字游侠
• 阅读 5450

背景
解决浏览器的兼容性问题是一件很烦的事情,其中并没有太多高深的技巧,但是开发需要,也不得不去解决它,最近在开发项目中也遇到一些兼容性的问题,希望把这些问题的解决方式记录下来,下次遇到就直接拿过来用,也希望对他人有一些帮助。

兼容性问题及解决方式

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

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
VS2019编译 当前最新版chromium
之前编译过webrtc和chromium,由于长时间没用,被我删除了,最近在最新版本的google浏览器上遇到了播放器兼容性问题,老版本的google浏览器是没问题,IE,火狐浏览器也没问题,通过看google浏览器的打印日志和chromium媒体层的代码,排查下来,是ffmpeg调用解码器解码AAC失败了,有个别数据解码失败,我们是使用的lib
Stella981 Stella981
3年前
Echarts 数据视图 生成Excel的方法
一、生成Excel,两大方向:1后台生成Excel  查询数据库,使用NOPI生成Excel。2前台js生成Excel三种方式1)jquery.table2excel.js\采用,优势:兼容IE和Chrome。2)handsontable0.32.0问题:不兼容IE。3)手写js有兼容性问题。问题:浏览器兼容
Stella981 Stella981
3年前
Linux C++ 应用二进制兼容实践
本文将介绍一些在开发多Linux平台C应用时可能遇到的兼容性问题和相关的解法。虽然是以C为讲述对象,但兼容性这个问题,在没有VM帮你做这些脏活累活的情况下,是所有Clike语言(比如Go、Rust等)都可能遇到的。受个人经验所限,本文所讨论内容仅限于x86架构下,但相信相关的原理和规则在其他架构下也是相通的,可作
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
融云IM即时通讯 融云IM即时通讯
9个月前
融云IM干货丨 IMKit 升级过程中遇到兼容性问题怎么办?
在升级IMKitSDK过程中遇到兼容性问题时,可以采取以下措施来解决:检查新版本的变更日志:确保检查新版本的变更日志,了解有哪些API变更、功能差异以及安全机制的更新,并测试所有功能以确保兼容性。运行时判断系统版本:在应用运行时判断当前系统版本,并根据版本