100vw导致水平溢出,但只有多于一个?

rdo*_*720 69 css

说你有这个:

html, body {margin: 0; padding: 0}
.box {width: 100vw; height: 100vh}

<div class="box">Screen 1</div>
Run Code Online (Sandbox Code Playgroud)

你会得到一些填充屏幕的东西,没有滚动条.但添加另一个:

<div class="box">Screen 1</div>
<div class="box">Screen 2</div>
Run Code Online (Sandbox Code Playgroud)

您不仅可以获得垂直滚动条(预期),还可以获得轻微的水平滚动条.

我意识到你可以省略宽度,或者将其设置为宽度:100%,但我很好奇为什么会发生这种情况.是不是100vw应该是"100%的视口宽度"?

Mr_*_*een 103

正如wf4已经解释的那样,由于垂直滚动,存在水平滚动.你可以通过给予解决max-width: 100%.

.box {
    width: 100vw;
    height: 100vh;
    max-width:100%;  /* added */
}
Run Code Online (Sandbox Code Playgroud)

工作小提琴

  • 如果`max-width:100%`是没有滚动条的视口的宽度,那么你首先不需要`100vw` :-)你可以使用`width:100%`因为元素没有'有任何定位的祖先,所以它的参考是身体. (26认同)
  • 这解决不了任何问题!max-width 仅有效,因为该元素是 body 的直接后代!在任何实际情况下,您将使用 100vw 而不是 100%(例如容器内的元素),这将不起作用。 (13认同)
  • 谢谢,这可以很好地解决问题,但我仍然认为这是一个有点不直观的默认行为。 (4认同)
  • 关于不直观:根据 caniuse.com,这是一个浏览器错误。http://caniuse.com/#feat=viewport-units --&gt; 已知问题8:目前除Firefox外的所有浏览器都错误地认为100vw是整个页面宽度,包括垂直滚动条,溢出时会导致水平滚动条: 自动设置。 (4认同)
  • 我无法使用 100% 宽度,因为我的 div 位于一个我不知道宽度或填充的容器中。这就是使用 100vw 而不是 100% 的全部原因,所以这个答案毫无意义。如果您的设置是始终显示滚动条,即使没有滚动条,Mac 上也会发生这种情况。 (2认同)

wf4*_*wf4 28

滚动条将包含在内,vw因此将添加水平滚动以允许您在垂直滚动下查看.

当你只有一个盒子时,它是100%宽x 100%高.一旦你添加2,它的100%宽x 200%高,因此触发垂直滚动条.当触发垂直滚动条时,会触发水平滚动条.

你可以添加overflow-x:hiddenbody

html, body {margin: 0; padding: 0; overflow-x:hidden;}
.box {width: 100vw; height: 100vh; background-color:#ff0000}
.box2 {width: 100vw; height: 100vh; background-color:#ffff00}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/NBzVV/

  • 这样做会导致内容出现在滚动条下方。http://jsfiddle.net/NBzVV/1/ 为了这是一个合适的解决方法,您需要添加正确的填充。 (4认同)
  • "所以水平滚动将被添加以允许你在垂直滚动下看到"< - 这句话帮助我的大脑对正在发生的事情进行视觉感知.+1 (3认同)
  • 只需注意一下“overflow”,即使将其添加到“x”,“postition:sticky”的内容也不会起作用。 (2认同)

小智 14

我遇到了类似的问题,并使用 JS 和 CSS 变量提出了以下解决方案。

JS:

function setVw() {
  let vw = document.documentElement.clientWidth / 100;
  document.documentElement.style.setProperty('--vw', `${vw}px`);
}

setVw();
window.addEventListener('resize', setVw);
Run Code Online (Sandbox Code Playgroud)

CSS:

width: calc((var(--vw, 1vw) * 100);
Run Code Online (Sandbox Code Playgroud)

1vw 是后备值。

  • 喜欢这个。相当优雅 (2认同)