100vw yatay taşmaya neden oluyor, ancak yalnızca birden fazla olması durumunda?


97

Bunun sende olduğunu söyle:

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

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

Kaydırma çubukları olmadan ekranı dolduran bir şey alacaksınız. Ama bir tane daha ekleyin:

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

Yalnızca dikey kaydırma çubuklarını (beklenen) değil, aynı zamanda hafif bir yatay kaydırma da elde edersiniz.

Genişliği atlayabileceğinizi veya genişlik olarak ayarlayabileceğinizi fark ettim:% 100, ama bunun neden olduğunu merak ediyorum. 100vw'nin "görüntü alanı genişliğinin% 100'ü" olması gerekmiyor mu?


html ve body'de gizli olan taşmayı önleyin, eğer konum yapışkanını alt öğelerinden herhangi birinde kullanmak istiyorsanız, bu iyi bir çözüm değildir ... max-width iyi bir yol gibi görünüyor !!!
NeueDeutsche

Yanıtlar:


148

Daha önce wf4'te açıklandığı gibi, dikey kaydırma nedeniyle yatay kaydırma mevcuttur. vererek çözebilirsin max-width: 100%.

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

Çalışma Keman


3
Teşekkürler, bu sorunu çözmek için iyi çalışıyor, ancak yine de biraz sezgisel olmayan varsayılan bir davranış olduğunu düşünüyorum.
phocks

2
Sezgisel olmama hakkında: caniuse.com'a göre bu bir tarayıcı hatasıdır. caniuse.com/#feat=viewport-units -> Bilinen sorun 8: Şu anda Firefox dışındaki tüm tarayıcılar yanlış bir şekilde 100vw'yi dikey kaydırma çubuğu dahil tüm sayfa genişliği olarak kabul ediyor, bu da taşma olduğunda yatay bir kaydırma çubuğuna neden olabilir: otomatik ayarlandığında .
Jacob van Lingen

46
Eğer max-width: 100%kaydırma çubukları olmadan görüntü alanının genişliği, o zaman gerek yoktu 100vwilk etapta :-) sadece kullanımı olabilir width: 100%eleman herhangi konumlandırılmış atası olmadığı için referans organıdır yüzden.
Kapsül

7
Bu hiçbir şeyi çözmez! max-width, yalnızca eleman vücudun doğrudan bir belirleyicisi olduğu için çalışır! % 100 yerine 100vw kullanacağınız herhangi bir gerçek dünya durumunda (bir kabın içindeki bir öğe gibi), bu işe yaramaz.
Eliezer Berlin

2
Div'im genişliğini veya dolgusunu bilmediğim bir kapsayıcıda olduğundan genişliği% 100 kullanamıyorum. % 100 yerine 100vw kullanmanın tek nedeni budur, bu yüzden bu cevap anlamsızdır. Ve Mac'te, kaydırma çubuğu olmasa bile ayarınız her zaman kaydırma çubuklarını gösterecekse de olur.
Curtis

37

Kaydırma çubukları vw, dikey kaydırmanın altını görmenizi sağlamak için yatay kaydırma eklenecek şekilde eklenecektir.

Yalnızca 1 kutunuz olduğunda,% 100 geniş x% 100 boyundadır. 2 eklediğinizde,% 100 genişliğinde x% 200 yüksekliğinde, dolayısıyla dikey kaydırma çubuğunu tetikler. Dikey kaydırma çubuğu tetiklendiğinde, bu daha sonra yatay kaydırma çubuğunu tetikler.

Sen ekleyebilir overflow-x:hiddeniçinbody

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
Bunu yapmak, içeriğin kaydırma çubuğunun altında görünmesine neden olur. jsfiddle.net/NBzVV/1 Bunun uygun bir geçici çözüm olması için doğru dolgu eklemeniz gerekir.
James Donnelly

1
Evet, iyi tespit edildi. Ekleme max-width:100%için .boxbu önleyecektir.
wf4

4
"böylece dikey kaydırma altında görmenizi sağlamak için yatay kaydırma eklenecek" <- bu cümle beynimin gerçekte neler olup bittiğini görsel olarak anlamasına yardımcı oldu. +1
Ivan Durst

Sadece bir not ekleseniz overflowbile xhiçbir postition: stickyşey işe yaramayacaktır.
T.Chmelevskij

8

Benzer bir sorun yaşadım ve JS ve CSS değişkenlerini kullanarak aşağıdaki çözümü buldum.

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 bir geri dönüş değeridir.


Bunu sev. oldukça zarif
andrevenancio

Bu mükemmel çünkü o zaman dünya çapında mevcut. Teşekkür ederim.
fvaldez421

2

Güncelleme: Chrome 66 sürümünden itibaren, soru tarafından bildirilen davranışı artık yeniden oluşturamıyorum. Çözüm gerekli görünmüyor.


Orijinal Cevap

Bu aslında bu cevapta ve yukarıdaki yorumlarda bildirilen bir hatadır .

Kabul edilen cevaptaki (ekleme .box {max-width: 100%;}) geçici çözüm genel olarak işe yarasa da, şu anda çalışmadığını kayda değer buluyorum display:table(Chrome'da test edilmiştir). Bu durumda, bulduğum tek çözüm width:100%bunun yerine kullanmaktır .


Uhm, kabul edilen cevap değişti mi? Kabul edilen cevapla aynı şeyi öneriyorsun. Bu nedenle cevaplar kendi başlarına tamamlanmalıdır.
Kissaki

Kabul edilen cevap eklemeyi önerir max-width: 100%. Ben değişen önerdi width: 100vwetmek width: 100%. Cevabımı kendi kendine yetecek şekilde güncelledim.
Cornflex

Chrome dışında başka tarayıcılar da var ve bazıları kaydırma çubuğunu farklı şekilde ele alıyor.
LocalPCGuy

1

vw'de bulunan kaydırma çubuğu genişliğinden kurtulmak için şunu yapmam gerekiyordu:

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

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

5
Bir sorunu gizlemek onu çözmez. Yaklaşımınız taşmayı gerçekten ortadan kaldırsa da, onu basitçe gizler. Bu, içeriğin dışarıda görüntülenmesi gerektiğinde sorunlara neden olabilir (nedeni ne olursa olsun)
Daniel Steiner

2
Hey user13149444! Yalnızca kod yanıtları sorunu çözebilir, ancak nasıl çözdüklerini açıklarsanız çok daha yararlıdır. Toplum, cevabınızı tam olarak anlamak için hem teori hem de kod gerektirir.
MHK
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.