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的标签,在书写文 ...
随机推荐
- vue.js(2)--v-cloak v-text v-html
v-cloak v-text v-html的使用 (1)实例 <!DOCTYPE html> <html lang="en"> <head> ...
- Day03-jS
javaScript概述 什么是javaScript:javaScript是一种直译式脚本语言.直接解释执行的语言. 什么是脚本语言? . java源代码--->编译成.class文件 ---& ...
- 多线程之继承Thread类及多线程内存分析
*创建多线程的一种方式:继承Thread类 * java.lang.Thread是描述多线程的类,要实现多线程程序,一种方式就是继承Thread类 * 1.创建一个类Mythread让其extends ...
- 使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写
1. 首先我们按照List或数组等处理方式来处理Map,看看效果 1.1 在服务端的接口中添加以下方法 /** * 查询所有班级信息加上对应的学生列表 * * @return */ public Ma ...
- 目标检测数据库 PASCAL 格式的 Ground Truth 的解析函数
最近在做一个目标检测算法,训练时用到了 bootstrap 策略,于是我将PASCAL的 Ground Truth 格式的读取函数从 Matlab 改写为 C++.PASCAL 的标注格式为: # P ...
- linux如何配置使用sendEmail发送邮件
sendEmail是一个轻量级.命令行的SMTP邮件客户端.如果你需要使用命令行发送邮件,那么sendEmail是非常完美的选择.使用简单并且功能强大.这个被设计用在php.bash.perl和web ...
- kloxo增加了域名,怎么不能访问?如何重启web服务?
kloxo增加了域名,怎么不能访问?这是因为需要重新启动web服务. 有时候网站打不开,也可以尝试重启web服务. 重启web服务方法: 登录kloxo后台-->左边栏:服务器linux --& ...
- JDBC实现最简单的增删改查
好久没写博客了,今天刚进入一家公司实习,在实习这段期间想把自己所学的东西通过博客记录下来 今天上午简单回顾了一下用JDBC实现最简单的增删改查 废话不多说,接下来就说明怎么用JDBC实现最简单的增删改 ...
- 认识JWT(转)
1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...
- Java并发编程实战 第14章 构建自定义的同步工具
状态依赖性 定义:只有满足特定的状态才能继续执行某些操作(这些操作依赖于固定的状态,这些状态需要等待别的线程来满足). FutureTask,Semaphroe,BlockingQueue等,都是状态 ...