获取元素大小和位置的五种方式

简介: 一、直接获取元素样式属性值运用之前在JS如何获取元素样式?这篇文章中提到的三种获取元素样式方法便可获取元素大小和位置,但前提是该元素得事先定义了相应样式。

一、直接获取元素样式属性值

运用之前在JS如何获取元素样式?这篇文章中提到的三种获取元素样式方法便可获取元素大小和位置,但前提是该元素得事先定义了相应样式。例如:

<div id="container" style="position: relative; margin: 10px; padding: 10px; border: 5px solid #f00;">
  <div id="box" style="width: 100px; height: 100px; margin: 10px; padding: 10px; border: 5px solid #f00;"></div>
</div>
var box = document.getElementById("box");
console.log(box.style.width); //100px

以上是简单地获取了元素的宽度,返回的是一个字符串,若要转化成数字,可使用parseInt()方法。

console.log(parseInt(box.style.width)); //100

二、offsetWidth和offsetHeight、offsetLeft和offsetTop

1. offsetWidth和offsetHeight

用于获取元素在屏幕上占用的所有可见的空间大小,具体包括以下几个方面:

内容区域+内边距+边框

拿offsetWidth举个例子(offsetHeight同理):

console.log(box.offsetWidth); //130
console.log(typeof box.offsetWidth);  //'number'

示例中具体计算是这样的:

box.offsetWidth = 100(内容区域宽度) + 20(左右内边距) + 10(左右边框) = 130

从示例中也可以看出,使用offsetWidth获取到的元素宽度是一个数字而不是一个带有单位的字符串,这也是与直接获取样式之间存在的重要区别之一。

2. offsetLeft和offsetTop

用于获取元素的外边框至距离最近的已定位祖先元素的内边框之间的距离,例如:

console.log(box.offsetLeft);  // 20

由于box的父级是container,且具有position: relative这样的定位样式,所以这里的offsetLeft具体计算是这样的:

box.offsetLeft = 10(box左外边距) + 10(container左内边距) = 20

三、clientWidth和clientHeight、clientLeft和clientTop

1. clientWidth和clientHeight

用于获取元素内容及其内边距所占据的大小空间,简单来说就是:

内容区域+内边距(注意不包含滚动条,若有则需减去该部分大小)

拿clientWidth举个例子:

console.log(box.clientWidth); //120

这里的计算很简单:

box.clientWidth = 100(内容区域宽度) + 20(左右内边距) = 120

但是如果该元素存在滚动条,那么情况就不一样了,比如给box样式中加上overflow: scroll;之后:

console.log(box.clientWidth); //103

这是因为,PC端浏览器滚动条默认大小为17px,所以这时:

box.clientWidth = 100(内容区域宽度) + 20(左右内边距) - 17(浏览器纵向滚动条宽度) = 103

2. clientLeft和clientTop

这两个属性其实获取的就是元素的边框宽度,比如:

console.log(box.clientLeft); //5

这里获取的就是box左边框的宽度。

四、scrollWidth和scrollHeight、scrollLeft和scrollTop

1. scrollWidth和scrollHeight

用于获取包含滚动内容的元素的大小,事实上通过该属性获取的元素大小值与clientWidth和clientHeight获取的值是一样的。例如:

console.log(box.scrollWidth); //120

加上滚动条之后:

console.log(box.scrollWidth); //103

2. scrollLeft和scrollTop

用于获取元素当前滚动位置,当然也可以设置元素的滚动位置。其中,scrollLeft可获取隐藏在内容区域左侧的像素数,scrollLeft可获取隐藏在内容区域上方的像素数。

五、getBoundingClientRect()

该方法非常方便实用,可直接获取元素与浏览器视口之间的距离

使用该方法会返回一个矩形对象,包含left、top、right和bottom四个属性,这些属性给出了元素在页面中相对于视口的位置。具体用法很简单,我们来看下面的例子:

console.log(box.getBoundingClientRect().left);   // 与视口左侧的距离
console.log(box.getBoundingClientRect().top);   // 与视口顶部的距离
console.log(box.getBoundingClientRect().right);   // 与视口右侧的距离
console.log(box.getBoundingClientRect().bottom);   // 与视口底部的距离

通过以上获取到的元素方位,我们也可以计算出该元素的大小。

console.log(box.getBoundingClientRect().right - box.getBoundingClientRect().left);  //130

可以看出,该大小值与通过offsetWidth属性获取的值是一样的。

结束语:本文所讲内容都是非常实用的,可能经常都会用到,另外注意其中除了style、scrollLeft和scrollTop是可读可写之外,其他均是只读的。

相关文章
|
1月前
|
存储 算法 C语言
找到数组位置
找到数组位置
|
3月前
|
前端开发 Java
java前端:删除数组中指定元素的方法
java前端:删除数组中指定元素的方法
|
11天前
|
索引
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
|
11天前
|
算法
递归淘汰List集合头部数据,获取最终集合的起始坐标
递归淘汰List集合头部数据,获取最终集合的起始坐标
|
1月前
在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置
|
3月前
|
算法 Java C++
请实现一个队列,支持以下操作:添加元素、删除第一个元素、获取第一个元素。
请实现一个队列,支持以下操作:添加元素、删除第一个元素、获取第一个元素。
15 0
|
10月前
|
算法 安全 Swift
LeetCode - #34 在排序数组中查找元素的第一个和最后一个位置(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
11月前
|
存储 编译器 C++
【c++】:list模拟实现“任意位置插入删除我最强ƪ(˘⌣˘)ʃ“
【c++】:list模拟实现“任意位置插入删除我最强ƪ(˘⌣˘)ʃ“
69 0
找出数组中单独的元素
此类题目需要非常熟悉位操作及位运算,同时要画图思考,才能将思路整理得很清楚。 或许有很多读者对我提出疑问,他们会认为这只是针对我举例的数组,才会有这种结果。而我想说:你们可以有时间尝试换一换数组中的元素,并且打乱顺序,也是可以做到的。本篇博客的目的主要是阐明逻辑,因为思路很重要!
100 0
找出数组中单独的元素