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 และเนื้อหาไม่ใช่ทางออกที่ดีหากคุณต้องการใช้ตำแหน่งที่เหนียวกับองค์ประกอบลูกใด ๆ ... ความกว้างสูงสุดดูเหมือนจะเป็นวิธีที่ดี !!!
NeueDeutsche

คำตอบ:


148

ตามที่อธิบายโดย wf4 แล้วการเลื่อนแนวนอนจะปรากฏขึ้นเนื่องจากการเลื่อนแนวตั้ง max-width: 100%ซึ่งคุณสามารถแก้ปัญหาโดยการให้

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

การทำงาน Fiddle


3
ขอบคุณวิธีนี้ใช้งานได้ดีในการแก้ไขปัญหา แต่ฉันยังคิดว่ามันเป็นพฤติกรรมเริ่มต้นที่ไม่เข้าใจง่ายเล็กน้อย
phocks

2
เกี่ยวกับการไม่เข้าใจง่าย: อ้างอิงจาก caniuse.com นี่คือ browserbug caniuse.com/#feat=viewport-units -> ปัญหาที่ทราบ 8: ขณะนี้เบราว์เซอร์ทั้งหมด แต่ Firefox ถือว่า 100vw เป็นความกว้างของหน้าทั้งหมดอย่างไม่ถูกต้องรวมถึงแถบเลื่อนแนวตั้งซึ่งอาจทำให้เกิดแถบเลื่อนแนวนอนเมื่อมีการล้น: ตั้งค่าอัตโนมัติ .
Jacob van Lingen

46
หากmax-width: 100%เป็นความกว้างของวิวพอร์ตที่ไม่มีแถบเลื่อนแสดงว่าคุณไม่จำเป็นต้อง100vwใช้ตั้งแต่แรก :-) คุณสามารถใช้งานได้width: 100%เนื่องจากองค์ประกอบไม่มีบรรพบุรุษที่อยู่ในตำแหน่งใด ๆ ดังนั้นการอ้างอิงจึงเป็นเนื้อความ
แคปซูล

7
นี่ไม่ได้แก้อะไรเลย! ความกว้างสูงสุดใช้งานได้เพราะองค์ประกอบเป็นสิ่งที่หลอกลวงโดยตรงของร่างกาย! ในกรณีใด ๆ ในโลกแห่งความเป็นจริงที่คุณจะใช้ 100vw แทน 100% (เช่นองค์ประกอบภายในคอนเทนเนอร์) สิ่งนี้จะไม่ได้ผล
Eliezer Berlin

2
ฉันไม่สามารถใช้ width 100% ได้เนื่องจาก div ของฉันอยู่ในคอนเทนเนอร์ที่ฉันไม่รู้ความกว้างหรือช่องว่างภายใน นั่นเป็นเหตุผลทั้งหมดที่ต้องใช้ 100vw แทน 100% ดังนั้นคำตอบนี้จึงไม่มีจุดหมาย และจะเกิดขึ้นบน Mac เช่นกันหากการตั้งค่าของคุณคือให้แสดงแถบเลื่อนเสมอแม้ว่าจะไม่มีแถบเลื่อนก็ตาม
Curtis

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เพื่อให้เป็นวิธีแก้ปัญหาที่เหมาะสมคุณต้องเพิ่มช่องว่างภายในที่เหมาะสม
James Donnelly

1
อ๋อเห็นดี การเพิ่มmax-width:100%เข้าไป.boxจะป้องกันไม่ให้
wf4

4
"ดังนั้นการเลื่อนแนวนอนจะถูกเพิ่มเพื่อให้คุณเห็นภายใต้การเลื่อนแนวตั้ง" <- ประโยคนี้ช่วยให้สมองของฉันเข้าใจภาพว่าเกิดอะไรขึ้นจริงๆ +1
Ivan Durst

เพียงแค่ทราบ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: 100vw width: 100%ฉันอัปเดตคำตอบของฉันเป็นแบบมีตัวตน
Cornflex

มีเบราว์เซอร์อื่น ๆ นอกเหนือจาก 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
สวัสดีผู้ใช้ 13149444! คำตอบแบบใช้รหัสเท่านั้นอาจช่วยแก้ปัญหาได้ แต่จะมีประโยชน์กว่ามากหากคุณอธิบายวิธีแก้ปัญหา ชุมชนต้องใช้ทั้งทฤษฎีและรหัสเพื่อให้เข้าใจคำตอบของคุณอย่างเต็มที่
RBT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.