d3.js 但相对于整个文档

kknvjkwl  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(160)

除了offset之外,是否有方法可以获取相对于文档的元素的 client rectgetBoundingClientRect()获取相对于客户端浏览器的值。
我使用的是D3,*jQuery的 * height()width()都能正常工作(我甚至尝试过使用window.load()),但是offset()不行。javascripts也不行。offset

return [$e.offset().top + $e.height()/2, $e.offset().left + $e.width()/2]

$e.height()$e.width()都返回0
这是一个 SVG 元素,我只是用它来编辑我的 SVG。用D3加载/处理SVG要容易得多。这个项目与数据无关,它只是一个Map。

7hiiyaii

7hiiyaii1#

使用element.getBoundingClientRect()本身返回相对于视窗的topleft值,如您所发现的。如果您希望它们相对于文档(并且不受滚动位置的影响),您可以使用window.scrollYwindow.scrollX添加滚动位置,如下所示:

const rect = element.getBoundingClientRect()

rect.left                   // (relative to viewport)
rect.top                    // (relative to viewport)
rect.left + window.scrollX  // (relative to document)
rect.top + window.scrollY   // (relative to document)

Source

8tntrjer

8tntrjer2#

下面是一个ES6方法,它返回与getBoundingClientRect()相同的所有属性,但相对于整个文档。

const getOffsetRect = (el) =>

  let rect   = el.getBoundingClientRect();

  // add window scroll position to get the offset position
  let left   = rect.left   + window.scrollX;
  let top    = rect.top    + window.scrollY;
  let right  = rect.right  + window.scrollX;
  let bottom = rect.bottom + window.scrollY;

  // polyfill missing 'x' and 'y' rect properties not returned
  // from getBoundingClientRect() by older browsers
  let x = rect.x === undefined ? left : rect.x + window.scrollX;
  let y = rect.y === undefined ? top : rect.y + window.scrollY;

  // width and height are the same
  let width  = rect.width;
  let height = rect.height;

  return { left, top, right, bottom, x, y, width, height };
};

注意:它还对xy属性进行多边形填充,旧版浏览器不会从getBoundingClientRect()返回这些属性

相关问题