100vw引起水平溢出,但仅当一个以上时?


97

说你有这个:

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

<div class="box">Screen 1</div>

您会得到充满整个屏幕的内容,没有滚动条。但添加另一个:

<div class="box">Screen 1</div>
<div class="box">Screen 2</div>

您不仅会获得垂直滚动条(预期的),而且还会获得轻微的水平滚动条。

我知道您可以忽略宽度,或将其设置为width:100%,但是我很好奇为什么会这样。是不是100vw应该是“视口宽度的100%”?


避免隐藏在html和body上的溢出,如果要在其任何子元素上使用位置粘性,这不是一个好的解决方案……max-width似乎是一个好方法!
NeueDeutsche

Answers:


149

如wf4所解释的,由于垂直滚动而存在水平滚动。您可以通过给出解决max-width: 100%

.box {
    width: 100vw;
    height: 100vh;
    max-width:100%;  /* added */
}

工作小提琴


3
谢谢,这很好地解决了这个问题,但是我仍然认为这是有点不直观的默认行为。
2014年

2
关于不直观:根据caniuse.com,这是一个浏览器错误。caniuse.com/#feat=viewport-units- >已知问题8:当前,除Firefox之外,所有浏览器均不正确地将100vw视为整个页面宽度,包括垂直滚动条,当溢出时会导致水平滚动条:设置为auto 。
雅各布·范·林根

45
如果max-width: 100%是没有滚动条的视口的宽度,那么您一开始就不需要100vw:-)您可以使用它,width: 100%因为该元素没有任何定位的祖先,因此它的引用是正文。
2013年

1
@kissaki我的评论仍然是正确的。最初的问题是关于一个元素覆盖100%的可用宽度。如果您的元素是body的直接子代,那么您仍然不需要vw单元来实现。在强制将其可见时减去滚动条是有道理的,因为视口总是在没有可用滚动条宽度的情况下,但是是的,并不理想。
胶囊

6
这什么也解决不了!max-width只起作用,因为该元素是身体的直接后代!在任何实际情况下,您都将使用100vw而不是100%(例如容器中的某个元素),则此操作将无效。
Eliezer Berlin

37

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

当您只有1个盒子时,它的宽度为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}

http://jsfiddle.net/NBzVV/


1
这样做会使内容显示在滚动条下方。jsfiddle.net/NBzVV/1要使其成为一种合适的解决方法,您需要添加正确的填充。
James Donnelly 2014年

1
是的,发现得很好。添加max-width:100%.box会阻止。
wf4 2014年

4
“所以将添加水平滚动条,以便您可以在垂直滚动条下看到”。+1
伊万·杜斯特

只是关于笔记overflow,即使你把它添加到x无的postition: sticky东西会工作。
T.Chmelevskij

8

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

JS:

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

setVw();
window.addEventListener('resize', setVw);

CSS:

width: calc((var(--vw, 1vw) * 100);

1vw是后备值。


喜欢这个。非常优雅
andrevenancio

这是完美的,因为它随后可以在全球范围内使用。谢谢。
fvaldez421

2

更新:从Chrome版本66开始,我不再能够重现问题所报告的行为。似乎不需要任何解决方法。


原始答案

这实际上是此答案和以上注释中报告的错误。

尽管.box {max-width: 100%;}通常可以接受的答案(添加)中的解决方法起作用,但我注意到它目前不起作用display:table(在Chrome中测试),这一点值得注意。在这种情况下,我发现的唯一解决方法是width:100%改用。


嗯,接受的答案有变化吗?您建议与接受的答案相同。这就是为什么答案应该自己完成的原因。
Kissaki

接受的答案建议加max-width: 100%。我建议更改width: 100vwwidth: 100%。我将答案更新为独立的。
Cornflex

除了Chrome浏览器外,还有其他浏览器,其中一些浏览器的处理方式有所不同。
LocalPCGuy

1

为了摆脱大众汽车中包括的滚动条宽度,我必须这样做:

html, body {
    overflow-x: hidden;
    height: 100vh;
}

1
*,
html,
body {
  margin: 0;
  padding: 0;
  overflow: hidden;/*add This*/ 
}
/*and enjoy ^_^ */

5
隐藏问题并不能解决问题。尽管您的方法确实消除了溢出,但只是将其隐藏了。当内容应显示在外面时(由于任何原因),这可能会导致问题
Daniel Steiner

2
嘿user13149444!纯代码的答案可以解决问题,但是如果您解释它们的解决方法,它们将更加有用。社区需要理论和代码,才能充分理解您的答案。
RBT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.