Элемент: метод getClientRects()
Базовая линия Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузера. Она доступна во всех браузерах с июля 2015 года.
Метод getClientRects() интерфейса Element возвращает коллекцию объектов DOMRect, которые указывают на ограничительные прямоугольники для каждого блока CSS в клиентском окне.
У большинства элементов есть только один блок CSS, но многострочный элемент поточного типа (например, многострочный элемент <span>) имеет блок CSS вокруг каждой строки.
Синтаксис
getClientRects()
Параметры
Нет.
Возвращаемое значение
Возвращаемое значение — коллекция объектов DOMRect, по одному для каждого блока CSS, связанного с элементом. Каждый объект DOMRect описывает блок CSS в пикселях, где верхний левый угол отсчитывается от верхнего левого угла области просмотра. Для таблиц с подписью, подпись включается, даже если она находится вне блока CSS таблицы. При вызове на элементах SVG, кроме внешнего <svg>, область просмотра, к которой относятся полученные прямоугольники, — это область просмотра, устанавливаемая внешним <svg>, (и, для ясности, прямоугольники также преобразуются с помощью преобразования внешнего <svg> , если таковое имеется).
При вычислении прямоугольников учитывается прокрутка области просмотра (или любого другого элемента со скроллингом).
Возвращаемые прямоугольники не включают границы каких-либо дочерних элементов, которые могут быть вне области.
Для элементов HTML <area>, элементов SVG, которые сами ничего не рендерят, элементов display:none и, в общем, любых элементов, которые не рендерятся напрямую, возвращается пустой список.
Прямоугольники возвращаются даже для блоков CSS с пустыми блоками границ. Координаты left, top, right, и bottom всё ещё могут быть значимыми.
Возможны дробные пиксельные смещения.
Примеры
В этих примерах прямоугольники области просмотра рисуются разными цветами. Обратите внимание, что функция JavaScript, которая рисует прямоугольники области просмотра, связана с разметкой через класс withClientRectsOverlay.
HTML
Пример 1: Этот HTML создаёт три абзаца с <span> внутри, каждый из которых встроен в блок <div>. Прямоугольники области просмотра рисуются для абзаца во втором блоке и для элемента <span> в третьем блоке.
<h3>A paragraph with a span inside</h3>
<p>
Both the span and the paragraph have a border set. The client rects are in
red. Note that the p has only one border box, while the span has multiple
border boxes.
</p>
<div>
<strong>Original</strong>
<p>
<span>Paragraph that spans multiple lines</span>
</p>
</div>
<div>
<strong>p's rect</strong>
<p class="withClientRectsOverlay">
<span>Paragraph that spans multiple lines</span>
</p>
</div>
<div>
<strong>span's rect</strong>
<p>
<span class="withClientRectsOverlay"
>Paragraph that spans multiple lines</span
>
</p>
</div>
Пример 2: Этот HTML создаёт три упорядоченных списка. Прямоугольники области просмотра рисуются для <ol> во втором блоке и для каждого элемента <li> в третьем блоке.
<h3>A list</h3>
<p>
Note that the border box doesn't include the number, so neither do the client
rects.
</p>
<div>
<strong>Original</strong>
<ol>
<li>Item 1</li>
<li>Item 2</li>
</ol>
</div>
<div>
<strong>ol's rect</strong>
<ol class="withClientRectsOverlay">
<li>Item 1</li>
<li>Item 2</li>
</ol>
</div>
<div>
<strong>each li's rect</strong>
<ol>
<li class="withClientRectsOverlay">Item 1</li>
<li class="withClientRectsOverlay">Item 2</li>
</ol>
</div>
Пример 3: Этот HTML создаёт две таблицы с подписями. Прямоугольники области просмотра рисуются для <table> во втором блоке.
<h3>A table with a caption</h3>
<p>
Although the table's border box doesn't include the caption, the client rects
do include the caption.
</p>
<div>
<strong>Original</strong>
<table>
<caption>
caption
</caption>
<thead>
<tr>
<th>thead</th>
</tr>
</thead>
<tbody>
<tr>
<td>tbody</td>
</tr>
</tbody>
</table>
</div>
<div>
<strong>table's rect</strong>
<table class="withClientRectsOverlay">
<caption>
caption
</caption>
<thead>
<tr>
<th>thead</th>
</tr>
</thead>
<tbody>
<tr>
<td>tbody</td>
</tr>
</tbody>
</table>
</div>
CSS
CSS рисует рамки вокруг абзаца и <span> внутри каждого блока <div> для первого примера, вокруг <ol> и <li> для второго примера, и вокруг <table>, <th>, и <td> для третьего примера.
strong {
text-align: center;
}
div {
display: inline-block;
width: 150px;
}
div p,
ol,
table {
border: 1px solid blue;
}
span,
li,
th,
td {
border: 1px solid green;
}
JavaScript
Код JavaScript рисует прямоугольники области просмотра для всех элементов HTML, которым назначен класс withClientRectsOverlay.
function addClientRectsOverlay(elt) {
/* Absolutely position a div over each client rect so that its border width
is the same as the rectangle's width.
Note: the overlays will be out of place if the user resizes or zooms. */
const rects = elt.getClientRects();
for (const rect of rects) {
const tableRectDiv = document.createElement("div");
tableRectDiv.style.position = "absolute";
tableRectDiv.style.border = "1px solid red";
const scrollTop =
document.documentElement.scrollTop || document.body.scrollTop;
const scrollLeft =
document.documentElement.scrollLeft || document.body.scrollLeft;
tableRectDiv.style.margin = tableRectDiv.style.padding = "0";
tableRectDiv.style.top = `${rect.top + scrollTop}px`;
tableRectDiv.style.left = `${rect.left + scrollLeft}px`;
// We want rect.width to be the border width, so content width is 2px less.
tableRectDiv.style.width = `${rect.width - 2}px`;
tableRectDiv.style.height = `${rect.height - 2}px`;
document.body.appendChild(tableRectDiv);
}
}
(() => {
/* Call function addClientRectsOverlay(elt) for all elements with
assigned class "withClientRectsOverlay" */
const elts = document.getElementsByClassName("withClientRectsOverlay");
for (const elt of elts) {
addClientRectsOverlay(elt);
}
})();
Результат
Спецификации
| Спецификация |
|---|
| CSSOM View Module # dom-element-getclientrects |
Совместимость браузеров
| Десктоп | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
getClientRects |
2 | 12 | 3 | 9.5 | 4 | 18 | 4 | 10.1 | 3.2 | 1.0 | 2 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects