前端好用API之getBoundingClientRect
前情
在前端开发需求中,经常需要获取元素的尺寸位置相关的属性,以往的做法是调用不同api获取相关属性的。
getBoundingClientRect介绍
getBoundingClientRect()方法返回元素的大小及其相对于视口的位置。
标准盒子模型:元素的尺寸等于width/height + padding + border-width的总和。如果box-sizing: border-box,则元素的的尺寸等于 width/height。
top, left, right, bottom属性是使用对象的其他属性的值来计算获得的,Object.keys()查找时将失败,Object.assign()无法复制返回的属性
调用方式:
domRect = element.getBoundingClientRect();
domRect对象介绍
| domRect | 这个对象是由该元素的 getClientRects()方法返回的一组矩形的集合 |
|---|---|
| left | 元素左边距离浏览器可视窗左边的距离 |
| right | 元素右边距离浏览器视可视窗左边的距离 |
| top | 元素顶边距离浏览器视可视窗顶边的距离 |
| bottom | 元素底边距离浏览器视可视窗顶边的距离 |
| width | 元素自身的宽 |
| height | 元素自身的高 |
| x | 元素左边距离浏览器可视窗左边的距离 |
| y | 元素顶边距离浏览器可视窗顶边的距离 |
考虑到兼容性问题,尽量仅使用
left,top,right, 和bottom属性是最安全的
使用示例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<style>
*{
padding: 0;
margin: 0;
}
.container{
width: 300px;
height: 300px;
overflow:auto;
}
.item{
width: 600px;
height: 60px;
text-align: left;
line-height: 60px;
margin: 60px 0 0 60px;
color: white;
background-color: blue;
}
.tips{
padding: 10px;
}
.rect_detail{
padding: 10px;
color: green;
}
</style>
</head>
<body>
<div class="container">
<div class="item">DOM0</div>
<div class="item">DOM1</div>
<div class="item">DOM2</div>
<div class="item">DOM3</div>
</div>
<p class="tips">拖动滚动条查看值变化:</p>
<div class="rect_detail">
DOM2元素:
</div>
<script>
var doms = document.querySelectorAll('.item');
var container = document.querySelector('.container');
var result = document.querySelector('.rect_detail');
container.addEventListener('scroll', function() {
var donRect = doms[2].getBoundingClientRect();
result.innerHTML = "DOM2元素:<br />" +
"left:"+donRect.left + "<br />" +
"right:"+donRect.right + "<br />" +
"top:"+donRect.top + "<br />" +
"bottom:"+donRect.bottom + "<br />" +
"width:"+donRect.width + "<br />" +
"height:"+donRect.height + "<br />" +
"x:"+donRect.x + "<br />" +
"y:"+donRect.y;
}, false);
</script>
</body>
</html>
演示地址:https://jsbin.com/wozabey/1/edit?html,css,js,output
前端好用API之getBoundingClientRect的更多相关文章
- 前端调用百度API
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 那些前端二进制操作API
一直以来,前端的工作主要涉及的是字符串操作,而对二进制的数据接触较少.但是这种需求却一直存在着,尤其是HTML5之后,随着web应用越来越复杂,File,Blob,TypedArray这些API的出现 ...
- 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_02-我的课程-前端页面与Api说明
我的课程列表使用element 的card组件,如下: 前端页面代码 点击新增到了一个新增课程的页面 新增课程的界面 下面的card是循环遍历的代码 写死的card的静态数据 请求服务端的接口拿到数据 ...
- 前端好用API之Fullscreen
前情 在前端开发需求中,特别网页有视频需求时,需要做视频全屏功能,或者在某些可视化大屏项目也要做全屏. Fullscreen介绍 让你可以简单地控制浏览器,使得一个元素与其子元素,如果存在的话,可以占 ...
- JavaScript前端最全API集锦
一.节点1.1 节点属性Node.nodeName //返回节点名称,只读Node.nodeType //返回节点类型的常数值,只读Node.nodeValue //返回Text或Comme ...
- 前后端分离开发之前端自己的API(DB)---- (1)
Creating demo APIs for Front-End Developer 心理准备 Tool-1 开发工具/编辑器:Visual Studio Code , 即 VSCode官网: htt ...
- 总结一下公司项目使用各种较新的前端技术和 Api 的一些经验。
关于 ES6: 需要注意 ES6 的一些特性和 API 是需要一个 200k 的 Polyfill 才能得到支持的,特性如 for ... of 循环,generator,API 如 Object.a ...
- ABP .Net Core API和Angular前端APP集成部署
前言:在ABP官网(https://aspnetboilerplate.com)生成的.Net Core + Angular项目前后端是两个独立的项目,我们可以分开部署,也可以将前端和Web API一 ...
- 前端API层架构,也许你做得还不够
上午好,今天为大家分享下个人对于前端API层架构的一点经验和看法.架构设计是一条永远走不完的路,没有最好,只有更好.这个道理适用于软件设计的各个场景,前端API层的设计也不例外,如果您觉得在调用接口时 ...
随机推荐
- Spring源码-IOC部分-Xml Bean解析注册过程【3】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- 「ZJOI2014」璀灿光华
「ZJOI2014」璀灿光华 实际上,可以不用建水晶立方体... 因为,发光水晶的方向都要枚举一遍. 只需知道发光水晶每个方向有哪些水晶就可以了. 对于一个发光水晶,将它连接的水晶标号. 从该水晶bf ...
- 防火墙——firewalld
介绍 firewald是对于iptables的一个封装,可以让你更容易地管理iptables规则.firewalld是iptables前端控制器,用于实现持久地网络流量规则. 一.对比 firewal ...
- js演示面向对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 认识BufferedReader的readLine、ready,以及InputStream的available
最近,同学做实验的时候,在读取服务器端返回的时候,使用了BufferedReader类的readLine,他是这么写的,while(reader.ready()) {//执行读取操作,即readLin ...
- Ansible之roles模块--lnmp分布式部署
Ansible之roles模块--lnmp分布式部署 目录 Ansible之roles模块--lnmp分布式部署 1. role模块的作用 2. roles的目录结构 3. roles内个目录含义解释 ...
- 关于 BSGS 以及 ExBSGS 算法的理解
BSGS 引入 求解关于\(X\)的方程, \[A^X\equiv B \pmod P \] 其中\(Gcd(A,P)=1\) 求解 我们令\(X=i*\sqrt{P}-j\),其中\(0<=i ...
- 用Java实现生成图片验证码
通过代码实现生成一个随机验证码图片,且生成后自动打开: package day_12_17; import javax.imageio.ImageIO; import java.awt.*; impo ...
- Pandas常用操作 - 新增数据列
初始化测试数据 df = pd.DataFrame({'stu_name': ['Nancy', 'Tony', 'Tim', 'Jack', 'Lucy'], 'stu_age': [17, 16, ...
- Ubuntu18修改/迁移mysql5.7数据存放路径
1.停止mysql服务 sudo service mysql stop 2.修改mysql配置文件,一般是 /etc/mysql/my.cnf,或者/etc/mysql/mysql.conf.d/my ...