getBoundingClientRect 和 requestAnimFrame 的polyfill
概述
今天在项目中用到了 getBoundingClientRect 和 requestAnimFrame ,查了下它们的polyfill,记录下来,供以后开发时参考,相信对其他人也有用。
getBoundingClientRect
getBoundingClientRect 的 polyfill如下所示:
getBoundingClientRect(element) {
const rect = element.getBoundingClientRect();
// whether the IE version is lower than 11
const isIE = navigator.userAgent.indexOf('MSIE') !== -1;
// fix ie document bounding top always 0 bug
const rectTop = isIE && element.tagName === 'HTML'
? -element.scrollTop
: rect.top;
return {
left: rect.left,
top: rectTop,
right: rect.right,
bottom: rect.bottom,
width: rect.right - rect.left,
height: rect.bottom - rectTop,
};
}
requestAnimFrame
requestAnimFrame 的 polyfill如下所示:
polyfillRAF() {
let requestAnimFrame = window.requestAnimationFrame
|| window.webkitRequestAnimationFrame
|| window.MozRequestAnimationFrame
|| window.msRequestAnimationFrame
|| window.ORequestAnimationFrame;
const getNow = Date.now || (() => +new Date());
let lastTime = getNow();
if (!requestAnimFrame) {
requestAnimFrame = (callback) => {
// How long did it take to render?
const deltaTime = getNow() - lastTime;
const delay = Math.max(0, 1000 / 60 - deltaTime);
return window.setTimeout(() => {
lastTime = getNow();
callback();
}, delay);
};
}
return requestAnimFrame;
}
值得注意的是,在移动端上requestAnimFrame可能会有性能问题,这个时候在移动端上建议不使用requestAnimFrame而使用setTimeout,代码如下:
polyfillRAF() {
let requestAnimFrame = window.requestAnimationFrame
|| window.webkitRequestAnimationFrame
|| window.MozRequestAnimationFrame
|| window.msRequestAnimationFrame
|| window.ORequestAnimationFrame;
const getNow = Date.now || (() => +new Date());
let lastTime = getNow();
// 判断移动端
if (_isMobile || !requestAnimFrame) {
requestAnimFrame = (callback) => {
// How long did it take to render?
const deltaTime = getNow() - lastTime;
const delay = Math.max(0, 1000 / 60 - deltaTime);
return window.setTimeout(() => {
lastTime = getNow();
callback();
}, delay);
};
}
return requestAnimFrame;
}
getBoundingClientRect 和 requestAnimFrame 的polyfill的更多相关文章
- polyfill for Function--源码
/** * polyfill for Function */ // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer ...
- 盒子 offsetLeft、offsetTop、offsetWidth、getBoundingClientRect等属性解释
offsetLeft 获取的是忽略 margin 当前元素距离上一级父节点(有没有设置position,有的话依据父节点,没有的话依据页面最左端这时候不管滚动条移到哪) 当前元素向左的位置 记住它会将 ...
- JavaScript中getBoundingClientRect()方法详解
获取浏览器滚动的高度: scrollTop=document.documentElement.scrollTop || document.body.scrollTop getBoundingClien ...
- js中getBoundingClientRect的作用及兼容方案
js中getBoundingClientRect的作用及兼容方案 1.getBoundingClientRect的作用 getBoundingClientRect用于获取某个html元素相对于视窗的位 ...
- JavaScriptPolyfillShim 在JavaScript中Shim和Polyfill有什么区别?
在JavaScript的世界里,有两个词经常被提到,那就是Shim和Polyfill,它们指的都是什么,又有什么区别?在本文中,将简短的给大家介绍他们之间的联系和区别.Shim一个shim就是一个库, ...
- 传说中的requestAnimFrame
//让浏览器以10ms绘制 兼容写法 window.requestAnimFrame = (function() { return ...
- 利用getBoundingClientRect方法实现简洁的sticky组件
补充于2016-03-20: 本文实现有不足,不完美的地方,请在了解本文相关内容后,移步阅读<sticky组件的改进实现>了解更佳的实现. sticky组件,通常应用于导航条或者工具栏,当 ...
- isArray polyfill
Array.isArray在ie9+浏览器上已经支持,可以放心使用.在垃圾浏览器上,可以说使用如下polyfill(出自MDN) if(!Array.isArray){ Array.isArray = ...
- CSSOM之getboundingclientrect和getclientrects
TextRectangle 对于文本对象,W3C提供了一个 TextRectangle 对象,这个对象是对文本区域的一个解释. 对于 i,span,em等display 是inline的标签,在书写文 ...
随机推荐
- 自用|DDoS防御产品集合
这是笔者对国内外的DDoS云防御产品做的一个集合,之前存在自己的文档里很久了,现在修改后发出来大家可以一起看看,有需要的也方便比较按需选择.有免费版的我会放在前面,遇到微量攻击时可以应急,并且也可以感 ...
- python-字符编码的转换
python-字符编码的转换 1.了解基础知识 ASCII 一个英文,占一个字节.只能存英文和特殊字符. gb2312 约可以存7000中文 gb1830 约可以存27000中文 gbk 默认中文, ...
- php 简单删除提示
下面是别的网友整理的,大同小异.一般通过弹出确认按钮来判断是否继续进入下面的删除页面. 第一种: <a href="javascript:if(confirm('确认删除吗?'))wi ...
- (转) IntelliJ IDEA2018激活
IntelliJ IDEA2018破解教程 破解方法:下载破解补丁→修改配置文件→输入激活码→激活成功 由于JetBrains封杀,大部分激活服务器已经不能使用,使用下面的比较麻烦的方法也可以进行破解 ...
- js常用操作
map操作:var map = {};map["a"] = 1;map["b"] = 2; console.log(Object.keys(map)); //[ ...
- bootstrap-table.min.js不同版本返回分页参数不同的问题
1.使用公司用的bootstrap-table.min.js ,刚开始bootstrap-table分页参数是这么写的 分页查询参数: 后端代码为: Result返回类的参数为list,以及total ...
- Keras class_weight和sample_weight用法
搬运: https://stackoverflow.com/questions/57610804/when-is-the-timing-to-use-sample-weights-in-keras i ...
- Java面试框架篇(8)
71,谈谈你对Struts的理解. 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServle ...
- 阿里jetcache
- DNS预读取 dns-prefetch 提升页面载入速度
DNS Prefetch,即DNS预获取,是前端优化的一部分.一般来说,在前端优化中与 DNS 有关的有两点: 一个是减少DNS的请求次数,另一个就是进行DNS预获取 . DNS 作为互联网的基础协议 ...