为什么位置绝对会使页面溢出?

Sti*_*ers 11 html css css-position

我的理解是,一旦元素定位为绝对(即使具有负位置值),它将完全脱离正常的内容流.但为什么它仍然使页面溢出?当你在下面运行代码片段时,会出现水平滚动条,我认为它不应该存在.

.relative {
  position: relative;
  background: pink;
}
.absolute {
  position: absolute;
  top: 0;
  right: -100px;
  width: 200px;
  height: 100px;
  background: rgba(0,0,0,.5);
}
Run Code Online (Sandbox Code Playgroud)
<div class="relative">
  Placeholder <div class="absolute"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

Lar*_*rsW 11

absolute:元素从文档流中移除,其他元素的行为就像它甚至不存在一样,而所有其他位置属性都可以在它上面工作.
CSS-技巧

这意味着页面的布局以及其他元素的大小和位置不会改变.正如我们所见,页面的宽度确实发生了变化,但这并不称为布局.

页面布局是图形设计的一部分,用于处理页面上视觉元素的排列.它通常涉及组成维基百科的组织原则

当宽度改变时,元素的组成不会改变(至少在这种情况下),因此布局不会改变.宽度确实会改变,但这应该发生.如果你现在问自己:"但为什么?",请阅读下一篇文章.

关于"为什么"的问题:并不总是一个真正的原因; 这是它的方式,你要么使用它,要么静坐不动并质疑它.这也不是问题.元素无法溢出窗口,这将是一个问题.更多关于"为什么"的问题.我并不是说所有"为什么"的问题都不好,但如果你问某个特征是否应该存在,可能就没有一个好的答案,只有一个好的或充分的解决方案.

解决方案:添加overflow-x:hidden到正文的CSS.当你添加它时.relative,它的另一部分.absolute也会被切割,因为它.absolute有更多的高度.

当您添加全宽overflow-x:hidden以外的所有内容时body将是不可见的,因此它不会拉伸页面.

body {
  overflow-x:hidden;
}
.relative {
  position: relative;
}
.absolute {
  position: absolute;
  right: -100px;
  width: 200px;
  height: 100px;
  background: grey;
}
Run Code Online (Sandbox Code Playgroud)
<div class="relative">
  <div class="absolute"></div>
</div>
Run Code Online (Sandbox Code Playgroud)


ket*_*tan 8

您可以通过两种方式获得您期望的结果。要么 make body { overflow-x: hidden; },要么将更改.absolute <div>position:fixed

现在回答你的问题。

为什么它仍然使页面可滚动?

因为position:absolute相对于最近的定位祖先定位。

如果position:absolute <div>区域溢出到右侧/底部,则 a将使区域可滚动到右侧或底部。

检查小提琴

相反,position:fixed相对于视口定位。它不会在任何一侧溢出。小提琴

这里有一些解释position 的链接。

绝对定位:这将滚动,但超出页面流。通常从原始位置移动。

固定定位:这不会滚动,并且不流畅。通常从原始位置移动。

参考

body { 
  overflow-x: hidden; 
}

.relative {
  position: relative;
  background: pink;
}
.absolute {
  position: absolute;
  top: 0;
  right: -100px;
  width: 200px;
  height: 100px;
  background: rgba(0,0,0,.5);
}
Run Code Online (Sandbox Code Playgroud)
<div class="relative">
  Placeholder <div class="absolute"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。


Joo*_*stS 7

我想我知道这个问题来自哪里.当人们想要一个没有水平滚动条的元素离开屏幕时,你必须对屏幕左侧使用(负)绝对定位的人感到困惑.这是滑块,菜单和模态的常用技术.

问题是负的LEFT对齐不会在身体上显示溢出,而负向右对齐也会显示溢出.不太合乎逻辑......我知道.

为了说明这一点,我在左边创建了一个带有绝对元素的笔:left: -100px; http://codepen.io/anon/pen/vGRxdJ和带右边绝对元素的笔:right: -100px; http://codepen.io/anon/pen/jqzBZd.

我希望这会消除你的困惑.

至于为什么会发生这种情况:我一直都知道屏幕的左上角是x:0,y:0:坐标系的原点只包含正值(在RTL情况下水平镜像).此坐标系中的负值是"非画布",因此不需要滚动条,而"画布上"元素则不需要.换句话说:on-canvas元素将放大页面并使视图自动滚动(除非另有说明),而非画布元素则不会.


Mar*_*c J 5

我已经通读了 CSS 2.1 文档(CSS3 没有更改视觉格式部分),这是我所能找到的最明确的。

第 2.3.1 节

对于所有媒体,术语画布描述“呈现格式结构的空间”。画布对于空间的每个维度都是无限的,但渲染通常发生在画布的有限区域内,由用户代理根据目标介质建立。

第 9.1 节

连续媒体的用户代理通常为用户提供一个视口(屏幕上的窗口或其他查看区域),用户通过该视口查阅文档。

当视口小于呈现文档的画布区域时,用户代理应提供滚动机制。

因此,当您添加绝对定位元素时,即使它没有增加其包含块的宽度,也会增加画布的大小。浏览器然后提供滚动机制以允许您查看整个画布。

需要明确的是,滚动不会因为<div class="relative">变得更宽而发生,甚至不会因为<body>其他块变得更宽。这是因为渲染文档的底层画布变大了。