- HTML DOM getBoundingClientRect()方法概述
getBoundingClientRect()方法是一种可以返回元素大小及相对于视口左上角的位置的方法。其中,左上角是(0, 0)。这个方法会返回一个包含四个属性(left, top, right, bottom)的 DOMRect 对象,表示元素低左角和右上角的坐标。如果一个元素可以滚动,返回的坐标是相对与视口的。
- getBoundingClientRect()方法用法
使用 getBoudingClientRect() 方法可以获取元素的位置、高度和宽度并存储在一个对象中以进行程序控制。下面拟定一个使用场景:在一个装满图片和文字的容器div中进行图片在全图中的定位。
HTML文件:
<div
class="image-container"
style="
height: 200px;
border: 2px solid black;
position: relative;
"
>
<img src="https://img.example.com/cat.jpg" alt="小猫咪" id="img" style="max-width: 75%; max-height: 75%;"/>
<p>这是一只可爱的小猫咪</p>
</div>
Javascript文件:
var myImage = document.getElementById("img");
console.log(myImage.getBoundingClientRect());
/*
Output:
{top: 14, right: 269, bottom: 154, left: 5, width: 264, height: 140}
*/
以上的代码中,我们使用了getElementById获取img元素,然后运用getBoundingClientRect获取了这个元素的位置与大小信息。 这个对象包含4个属性:top、left、right、bottom存储元素位置的上下左右的距离,width和height分别表示元素的宽度和高度。
现在,我们试试将图片放置为容器div中间:
var img = document.getElementById("img");
var imgWidth = img.getBoundingClientRect().width;
var imgHeight = img.getBoundingClientRect().height;
var containerWidth = img.parentNode.getBoundingClientRect().width;
var containerHeight = img.parentNode.getBoundingClientRect().height;
img.style.left = (containerWidth - imgWidth) / 2 + "px";
img.style.top = (containerHeight - imgHeight) / 2 + "px";
- 使用getBoundingClientRect()方法进行D3JS图表定位
D3是一个数据可视化库,用于将数据点集映射到可视图形。可以借助 D3 的方法来创建图表,但很常见的是需要细微粒度的控制。为了处理这些细节,需要使用getBoundingClientRect()来指定图表的位置。
下面是一种使用getBoundingClientRect()方法的例子,在正方形元素上附加一个图表。
HTML文件:
<div id="block-container" style="background-color: #f9b384; height: 500px;">
<!-- 这是一个正方形的元素 -->
<div id="block" style="background-color: #fff;height: 200px;width: 200px;position: relative;"></div>
</div>
Javascript文件:
var data = [60, 50, 80, 100, 200];
var x = d3.scaleLinear()
.domain([0, d3.max(data)])
.range([0, 200]);
var chart = d3.select("#block")
.append("svg")
.attr("width", 200)
.attr("height", 200);
var bars = chart.selectAll(".bar")
.data(data)
.enter()
.append("g")
.attr("transform", function (d, i) {
return "translate(0," + i * 16 + ")";
});
bars.append("rect")
.attr("fill", "steelblue")
.attr("width", function (d) {
return x(d);
})
.attr("height", 12);
bars.append("text")
.attr("fill", "white")
.attr("x", function (d) {
return x(d) - 3;
})
.attr("y", 6) // y-偏移值是基于底边水平线的
.attr("text-anchor", "end")
.text(function (d) {
return d;
});
// 计算图表的高度 - 这是从上一步中得到的正方形元素的高度
var chartHeight = chart.node().getBoundingClientRect().height;
// 计算用于垂直居中图表的偏移量
// (使用视口高度减去图表高度再除以 2)
var chartOffset = (window.innerHeight - chartHeight) / 2;
// 将这个偏移量设置为 SVG 元素的样式之一
chart.style("top", chartOffset + "px");
这里,我们使用 getBoundingClientRect() 方法来获得 SVG 图表本身的高度。我们将视图的高度(window.innerHeight)减去图表高度,然后除以 2,以获得在图表垂直居中时应该使用的偏移量。最后,我们立即将偏移值作为样式设置。这样就可以很容易地将图表放置于元素表面的中央。