Spec-Zone.ru › Web APIs

Элемент: метод 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

См. также

  • Element.getBoundingClientRect()

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API