本质上,我正在创建一个自定义单击和拖动选择框。问题是 div 是绝对位置的,所以它会随着页面滚动,但在调整窗口大小时它不会随着页面移动。我尝试的解决方案是听窗口调整大小,并根据更改移动 div。问题是它似乎可以工作,但它不会完全准确地移动,因此如果窗口调整缓慢,它会慢慢移出位置,或者如果窗口快速调整大小,它会迅速移出位置。似乎调整大小侦听器并未捕获每个调整大小事件。我已将代码缩小到我正在使用的概念。
尝试将此脚本注入页面(我使用的是 Chrome 控制台,并且我没有尝试过交叉兼容性,因为这将用于 Chrome 扩展程序)。它只会在滚动条不活动时尝试调整大小,以复制页面内容的行为。client 和 scoll 变量可以互换以记录维度的变化,但它们都用于测试目的。我很想看到一个使用样式属性解决这个问题的解决方案。谢谢你的帮助!
var div = document.createElement("div");
div.style.position = "absolute";
div.style.backgroundColor = "#000";
div.style.width = div.style.height = div.style.left = div.style.top = "200px";
document.body.appendChild(div);
// get the highest z index of the document
function highestZIndex() {
var elems = document.getElementsByTagName("*");
var zIndex = 0;
var elem, value;
for (var i = 0; i < elems.length; i++) {
value = parseInt(document.defaultView.getComputedStyle(elems[i], null).zIndex, 10);
if (value > zIndex) {
zIndex = value;
elem = elems[i];
}
}
return {
elem: elem,
zIndex: zIndex
};
}
// set the div on top if it is not already
var highestZ = highestZIndex();
if (highestZ.elem != div) div.style.zIndex = highestZ.zIndex + 1;
// last width & height of client & scroll to calculate the change in dimensions
var clientWidth = document.body.clientWidth;
var clientHeight = document.body.clientHeight;
var scrollWidth = document.body.scrollWidth;
var scrollHeight = document.body.scrollHeight;
// move the div when the window is being resized
function resizeListener() {
var _clientWidth = document.body.clientWidth;
var _clientHeight = document.body.clientHeight;
var _scrollWidth = document.body.scrollWidth;
var _scrollHeight = document.body.scrollHeight;
// horizontal scrollbar is not enabled
if (_scrollWidth <= _clientWidth) {
div.style.left = parseInt(div.style.left.replace(/px/, ''), 10) + (_scrollWidth - scrollWidth) / 2 + 'px';
}
// vertical scrollbar is not enabled
if (_scrollHeight <= _clientHeight) {
div.style.top = parseInt(div.style.top.replace(/px/, ''), 10) + (_scrollHeight - scrollHeight) / 2 + 'px';
}
clientWidth = _clientWidth;
clientHeight = _clientHeight;
scrollWidth = _scrollWidth;
scrollHeight = _scrollHeight;
}
window.addEventListener("resize", resizeListener);
PS:请不要使用 jQuery 解决方案。