为什么绝对位置与固定位置给出不同的读数?
Why is position absolute vs fixed position giving different readings?
我正在编写一个简单的 jQuery 脚本,让我可以根据项目在视口之外的距离来偏移它。换句话说,对象 (div) 与视口的碰撞。到目前为止我放在一起的东西使用 position: fixed
可以完美地工作,但如果使用 position: absolute;
则偏移 34 像素,我认为这是由于浏览器垂直滚动条 * 2 造成的。无论是这种情况还是不是,不知道怎么弥补。
也许有人知道我该如何解决这个不同的阅读问题?
我整理了一个可以在这里查看的 jsfiddle:https://jsfiddle.net/pegues/m1zg5p4c/1/
在 jsfiddle 中,您可以在视图窗格中看到“Off-screen X: -133”。该值应为 -150。如果将第 13 行的 .box 的 css 更改为 fixed,您将看到红色框的位置正确并齐平到屏幕的底部和右侧,并且屏幕外 X 值将为 -150。
也许我遗漏或忘记了固定与绝对的工作原理?
elemCollision($('.box'));
function elemCollision(el) {
// Viewport Width and Height
var viewportW = window.innerWidth;
var viewportH = window.innerHeight;
// Element Width and Height
var width = el.innerWidth();
var height = el.innerHeight();
// Element Position: top, right, bottom, left
var top = el.offset().top;
var left = el.offset().left;
var right = (viewportW - left) + viewportW;
var bottom = (viewportH - top) + viewportH;
// Amount Element is Off Screen
var offScreenX = (viewportW - left) - width;
var offScreenY = (viewportH - top) - height;
// Position Element 100% on Screen
var placementX = (viewportW - left) - Math.abs(offScreenX);
var placementY = (viewportH - top) - Math.abs(offScreenY);
// Assign New X and Y Placement Values
$('.box').css({ bottom: placementY, right: placementX });
$('body').append(
'<div style="padding: 10px; font-size: 0.80em; line-height: 1.25em;">-----' + '<br/>' +
'Placement Top: ' + top + '<br/>' +
'Placement Right: ' + right + '<br/>' +
'Placement Bottom: ' + bottom + '<br/>' +
'Placement Left: ' + left + '<br/>' +
'Box Width: ' + width + '<br/>' +
'Box Height: ' + height + '<br/>' +
'Viewport Width: ' + viewportW + '<br/>' +
'Viewport Height: ' + viewportH + '<br/>' +
'Off-screen X: ' + offScreenX + '<br/>' +
'Off-screen Y: ' + offScreenY + '<br/>' +
'New Placement X: ' + placementX + '<br/>' +
'New Placement Y: ' + placementY + '<br/>' +
'-----</div>'
);
}
将您的 window 的宽度和高度从 innerWidth 修改为宽度和高度相同。
// Viewport Width and Height
var viewportW = window.width;
var viewportH = window.height;
和你的底部和左侧 css 到 0px
你是正确的,它是滚动条(即使它看起来不可见)。如果你 运行 这个函数 (source):
function getScrollBarWidth () {
var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo('body'),
widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
$outer.remove();
return 100 - widthWithScroll;
};
您将看到滚动条的宽度(here 是我添加函数的 jsfiddle)。如果您将 positition:absolute
保留在框上并将 overflow-y:hidden;
添加到 body,您可以看到现在 运行 调用该函数会给您一个空异常,因为滚动条不会没有任何影响 body 的宽度(它甚至不存在)。
所以回答你的问题,因为 Absolute
定位是相对于 parent (body
),并且 body
有滚动条影响宽度,你是没有得到你期望的结果。
我正在编写一个简单的 jQuery 脚本,让我可以根据项目在视口之外的距离来偏移它。换句话说,对象 (div) 与视口的碰撞。到目前为止我放在一起的东西使用 position: fixed
可以完美地工作,但如果使用 position: absolute;
则偏移 34 像素,我认为这是由于浏览器垂直滚动条 * 2 造成的。无论是这种情况还是不是,不知道怎么弥补。
也许有人知道我该如何解决这个不同的阅读问题?
我整理了一个可以在这里查看的 jsfiddle:https://jsfiddle.net/pegues/m1zg5p4c/1/
在 jsfiddle 中,您可以在视图窗格中看到“Off-screen X: -133”。该值应为 -150。如果将第 13 行的 .box 的 css 更改为 fixed,您将看到红色框的位置正确并齐平到屏幕的底部和右侧,并且屏幕外 X 值将为 -150。
也许我遗漏或忘记了固定与绝对的工作原理?
elemCollision($('.box'));
function elemCollision(el) {
// Viewport Width and Height
var viewportW = window.innerWidth;
var viewportH = window.innerHeight;
// Element Width and Height
var width = el.innerWidth();
var height = el.innerHeight();
// Element Position: top, right, bottom, left
var top = el.offset().top;
var left = el.offset().left;
var right = (viewportW - left) + viewportW;
var bottom = (viewportH - top) + viewportH;
// Amount Element is Off Screen
var offScreenX = (viewportW - left) - width;
var offScreenY = (viewportH - top) - height;
// Position Element 100% on Screen
var placementX = (viewportW - left) - Math.abs(offScreenX);
var placementY = (viewportH - top) - Math.abs(offScreenY);
// Assign New X and Y Placement Values
$('.box').css({ bottom: placementY, right: placementX });
$('body').append(
'<div style="padding: 10px; font-size: 0.80em; line-height: 1.25em;">-----' + '<br/>' +
'Placement Top: ' + top + '<br/>' +
'Placement Right: ' + right + '<br/>' +
'Placement Bottom: ' + bottom + '<br/>' +
'Placement Left: ' + left + '<br/>' +
'Box Width: ' + width + '<br/>' +
'Box Height: ' + height + '<br/>' +
'Viewport Width: ' + viewportW + '<br/>' +
'Viewport Height: ' + viewportH + '<br/>' +
'Off-screen X: ' + offScreenX + '<br/>' +
'Off-screen Y: ' + offScreenY + '<br/>' +
'New Placement X: ' + placementX + '<br/>' +
'New Placement Y: ' + placementY + '<br/>' +
'-----</div>'
);
}
将您的 window 的宽度和高度从 innerWidth 修改为宽度和高度相同。
// Viewport Width and Height
var viewportW = window.width;
var viewportH = window.height;
和你的底部和左侧 css 到 0px
你是正确的,它是滚动条(即使它看起来不可见)。如果你 运行 这个函数 (source):
function getScrollBarWidth () {
var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo('body'),
widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
$outer.remove();
return 100 - widthWithScroll;
};
您将看到滚动条的宽度(here 是我添加函数的 jsfiddle)。如果您将 positition:absolute
保留在框上并将 overflow-y:hidden;
添加到 body,您可以看到现在 运行 调用该函数会给您一个空异常,因为滚动条不会没有任何影响 body 的宽度(它甚至不存在)。
所以回答你的问题,因为 Absolute
定位是相对于 parent (body
),并且 body
有滚动条影响宽度,你是没有得到你期望的结果。