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を省略したり、width:100%に設定したりできると思いますが、なぜこれが発生するのか興味があります。100vwは「ビューポート幅の100%」ではありませんか?


HTMLと本文に隠されたオーバーフローを回避します。子要素のいずれかにスティッキーな位置を使用する場合は、適切な解決策ではありません。max-widthは良い方法のようです!!!
NeueDeutsche

回答:


149

wf4ですでに説明したように、垂直スクロールのために水平スクロールが存在します。を与えることで解決できますmax-width: 100%

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

ワーキングフィドル


3
おかげで、これは問題を修正するためにうまく機能しますが、それでも少し直感的でないデフォルトの動作だと思います。
phocks 2014年

2
直感的でないことについて:caniuse.comによると、これはブラウザのバグです。caniuse.com/#feat=viewport-units- >既知の問題8:現在、Firefoxを除くすべてのブラウザは、100vwを垂直スクロールバーを含むページ幅全体と誤って見なしているため、オーバーフロー時に水平スクロールバーが発生する可能性があります:自動が設定されている。
Jacob van Lingen 2015

45
max-width: 100%がスクロールバーのないビューポートの幅である場合、そもそも必要ありませんでした100vw:-)width: 100%要素には配置された祖先がないため、使用することができます。そのため、その参照は本体です。
カプセル

1
@Kissaki私のコメントはまだ正しいです。元の質問は、使用可能な幅の100%をカバーする要素を持つことについてでした。あなたの要素が体の直接の子であるならば、あなたはまだそれを達成するためにvwユニットを必要としません。ビューポートは常にスクロールバーの幅がないので、スクロールバーが強制的に表示されるようになっているときにスクロールバーを差し引くのは理にかなっていますが、理想的ではありません。
カプセル

6
これは何も解決しません!max-widthは、要素が本体の直接の子孫であるためにのみ機能します。100%ではなく100vwを使用する実際のケース(コンテナ内の要素など)では、これは機能しません。
エリエゼルベルリン

37

スクロールバーが含まれるvwため、水平スクロールが追加され、垂直スクロールの下に表示されます。

ボックスが1つしかない場合は、幅100%x高さ100%になります。2を追加すると、幅100%x高さ200%になるため、垂直スクロールバーがトリガーされます。垂直スクロールバーがトリガーされると、水平スクロールバーがトリガーされます。

あなたはに追加overflow-x:hiddenすることができますbody

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これを適切な回避策にするには、適切なパディングを追加する必要があります。
ジェームズドネリー

1
うん、よく発見された。に追加max-width:100%する.boxと、それを防ぐことができます。
wf4 2014

4
「したがって、水平スクロールが追加され、垂直スクロールの下を見ることができるようになります」<-この文は、私の脳が実際に何が起こっているのかを視覚的に理解するのに役立ちました。+1
Ivan Durst 2015

ちょうどに関する注意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 2018年

受け入れられた回答は、を追加することを提案していmax-width: 100%ます。に変更width: 100vwすることを提案しましたwidth: 100%。私は自分の答えを自己完結型に更新しました。
コーンフレーク2018年

Chrome以外にもブラウザがあり、スクロールバーの扱いが異なるものもあります。
LocalPCGuy

1

vwに含まれているスクロールバーの幅を取り除くには、これを行う必要がありました。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.