Я ищу способ получить виртуальную ограничивающую рамку, которая обернет все элементы DOM.
Например, 2 деления с 100X100 px
размерами с position absolute
один размещен в top:0 left :0
, а другой в top:700px left:700px
приведет к 800X800
прямоугольнику (изображение 1):
![enter image description here](https://i.stack.imgur.com/UDqqe.jpg)
При прокрутке я ожидаю, что все ещеполучить 800X800
прямоугольник со смещением прокручиваемого расстояния (изображение 2):
Я думаю об итерациях по DOM, получении всех ограничивающих клиентских прямоугольников и вычислениивручную, что-то вроде этого:
document.querySelectorAll("*").forEach((el)=>{
let r = el.getBoundingClientRect();
//calculate
})
Однако это кажется не очень эффективным. Любая помощь будет оценена.
Обновление: Этот код пока что, любые идеи будут оценены:
function getDocumentVisualBoundingBox() {
return Array.prototype.reduce.call(document.querySelectorAll("*"), (res, el) => {
//Looking at BODY element, Absolute positioned elements and ignoring elements within scrollable containers.
if (el.tagName === 'BODY' || (el.parentElement && getComputedStyle(el.parentElement).overflow === 'visible' && getComputedStyle(el).position === 'absolute')) {
let rect = el.getBoundingClientRect();
res.offsetLeft = Math.min(res.offsetLeft, rect.left);
res.offsetTop = Math.min(res.offsetTop, rect.top);
res.width = Math.max(res.width, rect.width + Math.abs(res.offsetLeft) + rect.left);
res.height = Math.max(res.height, rect.height + Math.abs(res.offsetTop) + rect.top);
}
return res;
}, {
offsetLeft: 0,
offsetTop: 0,
width: 0,
height: 0
});
}