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.