100vw powodujące przepełnienie w poziomie, ale tylko jeśli więcej niż jeden?


101

Powiedz, że masz to:

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

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

Dostaniesz coś, co wypełni ekran, bez pasków przewijania. Ale dodaj kolejny:

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

Otrzymujesz nie tylko pionowe paski przewijania (oczekiwane), ale lekkie przewijanie w poziomie.

Zdaję sobie sprawę, że możesz pominąć szerokość lub ustawić ją na szerokość: 100%, ale jestem ciekawy, dlaczego tak się dzieje. Czy 100vw nie powinno być „100% szerokości widocznego obszaru”?


unikaj przepełnienia ukrytego w html i body to nie jest dobre rozwiązanie, jeśli chcesz użyć pozycji sticky na którymkolwiek z jego elementów podrzędnych… max-width wydaje się być dobrym sposobem !!!
NeueDeutsche

Odpowiedzi:


156

Jak już wyjaśniono w wf4, przewijanie poziome jest obecne dzięki przewijaniu pionowemu. które możesz rozwiązać, dając max-width: 100%.

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

Working Fiddle


3
Dzięki, to działa dobrze, aby rozwiązać problem, ale nadal uważam, że jest to trochę nieintuicyjne zachowanie domyślne.
phocks

2
O byciu nieintuicyjnym: według caniuse.com jest to błąd przeglądarki. caniuse.com/#feat=viewport-units -> Znany problem 8: Obecnie wszystkie przeglądarki oprócz Firefoksa błędnie traktują 100vw jako całą szerokość strony, w tym pionowy pasek przewijania, który może powodować poziomy pasek przewijania, gdy ustawiono przepełnienie: auto .
Jacob van Lingen

48
Jeśli max-width: 100%jest to szerokość rzutni bez pasków przewijania, to 100vww pierwszej kolejności nie potrzebowałeś :-) Mogłeś po prostu użyć, width: 100%ponieważ element nie ma żadnego przodka, więc jego odniesieniem jest ciało.
Capsule

8
To niczego nie rozwiązuje! max-width działa tylko dlatego, że element jest bezpośrednią deklinacją ciała! W każdym przypadku w świecie rzeczywistym, w którym użyłbyś 100 vw zamiast 100% (na przykład element wewnątrz kontenera), to nie zadziała.
Eliezer Berlin

2
Nie mogę użyć szerokości 100%, ponieważ mój element div znajduje się w kontenerze, którego nie znam szerokości ani dopełnienia. To cały powód, aby używać 100vw zamiast 100%, więc ta odpowiedź jest bezcelowa. Dzieje się tak również na Macu, jeśli Twoim ustawieniem jest zawsze wyświetlanie pasków przewijania, nawet jeśli nie ma paska przewijania.
Curtis,

38

paski przewijania zostaną uwzględnione w vwprzewijaniu, więc zostanie dodane przewijanie poziome, aby można było zobaczyć pod przewijaniem pionowym.

Gdy masz tylko 1 pudełko, ma 100% szerokości i 100% wysokości. Gdy dodasz 2, jego 100% szerokość x 200% wysokość, co spowoduje uruchomienie pionowego paska przewijania. Uruchomienie pionowego paska przewijania powoduje wyzwolenie poziomego paska przewijania.

Możesz dodać overflow-x:hiddendobody

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
W ten sposób zawartość pojawi się poniżej paska przewijania. jsfiddle.net/NBzVV/1 Aby było to odpowiednie obejście, musisz dodać odpowiednie wypełnienie.
James Donnelly

1
Tak, dobrze zauważony. Dodanie max-width:100%do .boxtego zapobiegnie.
wf4

4
„więc poziomy zwój zostanie dodany, abyś mógł zobaczyć pod zwojem pionowym” <- to zdanie pomogło mojemu mózgowi zrozumieć wizualnie, co się naprawdę dzieje. +1
Ivan Durst,

Po prostu uwaga o overflowtym, że nawet jeśli dodasz to do, xnic postition: stickynie zadziała.
T.Chmelevskij,

14

Miałem podobny problem i wymyśliłem następujące rozwiązanie przy użyciu zmiennych JS i 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 to wartość rezerwowa.


1
Kocham to. całkiem elegancki
andrevenancio

Jest to idealne rozwiązanie, ponieważ jest wtedy dostępne na całym świecie. Dziękuję Ci.
fvaldez421

To świetna technika, dziękujemy za udostępnienie! Jedynym problemem jest to, że ten skrypt musi zostać uruchomiony po załadowaniu domeny do początkowej zmiany rozmiaru, więc umieść go w stopce lub dodaj zdarzenie DOMContentLoaded.
wykopano

2

Aktualizacja: od wersji Chrome 66 nie mogę już odtwarzać zachowania zgłaszanego w pytaniu. Wydaje się, że żadne obejście nie jest potrzebne.


Oryginalna odpowiedź

W rzeczywistości jest to błąd zgłoszony w tej odpowiedzi i w komentarzach powyżej.

Chociaż obejście w zaakceptowanej odpowiedzi (dodawanie .box {max-width: 100%;}) generalnie działa, uważam za godne uwagi, że obecnie nie działa display:table(testowane w Chrome). W takim przypadku jedynym rozwiązaniem, które znalazłem, jest użycie width:100%zamiast tego.


Uhm, czy przyjęta odpowiedź uległa zmianie? Sugerujesz to samo, co zaakceptowana odpowiedź. Dlatego odpowiedzi powinny być same w sobie kompletne.
Kissaki

Zaakceptowana odpowiedź proponuje dodanie max-width: 100%. Zaproponowałem zmianę width: 100vwna width: 100%. Zaktualizowałem odpowiedź, aby była samodzielna.
Cornflex

1
Oprócz Chrome istnieją inne przeglądarki, a niektóre inaczej radzą sobie z paskiem przewijania.
LocalPCGuy

1

aby pozbyć się szerokości paska przewijania zawartej w vw musiałem to zrobić:

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

Świetnie, inne rozwiązania nie rozwiązały problemu, ale to pomogło. (Zmiana szerokości na 100% zmniejszyła szerokość obiektów, ponieważ nie były już rozciągnięte do pełnej szerokości widoku).
subjord

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

6
Ukrywanie problemu nie rozwiązuje go. Chociaż twoje podejście rzeczywiście usuwa przepełnienie, po prostu je ukrywa. Może to powodować problemy, gdy treść powinna być wyświetlana na zewnątrz (z jakiegokolwiek powodu)
Daniel Steiner

3
Hej, użytkowniku13149444! Odpowiedzi w postaci samego kodu mogą rozwiązać problem, ale są one znacznie bardziej przydatne, jeśli wyjaśnisz, jak go rozwiązują. Społeczność potrzebuje teorii i kodu, aby w pełni zrozumieć twoją odpowiedź.
RBT
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.