D3.js: Як отримати обчислену ширину та висоту для довільного елемента?


120

Мені потрібно точно знати ширину та висоту для довільного gелемента в моєму, SVGоскільки мені потрібно намалювати маркер вибору, коли користувач натисне на нього.

Те , що я бачив в інтернеті що - щось на кшталт: d3.select("myG").style("width"). Проблема полягає в тому, що елемент не завжди матиме явний атрибут ширини. Наприклад, коли я створю коло всередині g, він матиме радіо ( r), встановлений замість ширини. Навіть якщо я використовую window.getComputedStyleметод на a circle, він повернеться "auto".

Чи є спосіб обчислити ширину довільного svgвідбору в D3?

Дякую.

Відповіді:


225

Для елементів SVG

Використовуючи щось на кшталт, selection.node().getBBox()ви отримуєте такі цінності, як

{
    height: 5, 
    width: 5, 
    y: 50, 
    x: 20
} 

Для елементів HTML

Використовуйте selection.node().getBoundingClientRect()


36
Для елементів HTML використовуйте getBoundingClientRect()замість SVG-лише getBBox(). Як ось так:d3.select("body").node().getBoundingClientRect().width
Тоф

1
Не могли б допомогти трохи більше інформації. Для елементів SVG або HTML? Це лише питання Firefox? Щось повідомляється в консолі? Що таке повернене значення? Чи є у вас мінімальний приклад коду (jsfiddle), який продемонстрував проблему?
Крістофер Хакетт

29

.getBoundingClientRect () повертає розмір елемента та його положення відносно вікна перегляду. Ми можемо легко отримати наступне

  • ліво право
  • верх, низ
  • висота ширина

Приклад:

var element = d3.select('.elementClassName').node();
element.getBoundingClientRect().width;

1

Одного разу я зіткнувся з проблемою, коли я не знав, який елемент на даний момент зберігається в моїй змінній (svg або html), але мені потрібно було отримати ширину і висоту. Я створив цю функцію і хочу поділитися нею:

function computeDimensions(selection) {
  var dimensions = null;
  var node = selection.node();

  if (node instanceof SVGElement) { // check if node is svg element
    dimensions = node.getBBox();
  } else { // else is html element
    dimensions = node.getBoundingClientRect();
  }
  console.log(dimensions);
  return dimensions;
}

Маленька демонстрація у прихованому фрагменті внизу. Ми обробляємо натискання на синій div та на червоний круг svg з тією ж функцією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.