100vw gây tràn ngang, nhưng chỉ khi nhiều hơn một?


98

Giả sử bạn có cái này:

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

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

Bạn sẽ nhận được thứ gì đó lấp đầy màn hình, không có thanh cuộn. Nhưng thêm một cái khác:

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

Bạn không chỉ nhận được thanh cuộn dọc (dự kiến), mà còn có một cuộn ngang nhẹ.

Tôi nhận ra rằng bạn có thể bỏ qua chiều rộng hoặc đặt nó thành chiều rộng: 100%, nhưng tôi tò mò tại sao điều này lại xảy ra. Không phải 100vw phải là "100% chiều rộng khung nhìn"?


tránh tràn ẩn trên html và nội dung nó không phải là một giải pháp tốt nếu bạn muốn sử dụng vị trí dính trên bất kỳ phần tử con nào của nó… max-width dường như là một cách tốt !!!
NeueDeutsche

Câu trả lời:


150

Như đã được giải thích bởi wf4, cuộn ngang hiện diện vì cuộn dọc. mà bạn có thể giải quyết bằng cách đưa ra max-width: 100%.

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

Làm việc Fiddle


3
Cảm ơn, cách này hoạt động tốt để khắc phục sự cố, nhưng tôi vẫn nghĩ rằng đó là một hành vi mặc định hơi không trực quan.
phocks

2
Về việc không trực quan: theo caniuse.com, đây là một trình duyệt. caniuse.com/#feat=viewport-units -> Vấn đề đã biết 8: Hiện tại tất cả các trình duyệt nhưng Firefox đều coi 100vw là toàn bộ chiều rộng trang không chính xác, bao gồm cả thanh cuộn dọc, có thể gây ra thanh cuộn ngang khi tràn: auto được đặt .
Jacob van Lingen

48
Nếu max-width: 100%là chiều rộng của khung nhìn không có thanh cuộn, thì ngay từ đầu bạn đã không cần 100vw:-) Bạn chỉ có thể sử dụng width: 100%vì phần tử không có tổ tiên định vị nào, vì vậy tham chiếu của nó là phần thân.
Capsule

8
Điều này không giải quyết được bất cứ điều gì! max-width chỉ hoạt động vì phần tử là con trực tiếp của body! Trong bất kỳ trường hợp thực tế nào mà bạn sử dụng 100vw thay vì 100%, (Chẳng hạn như một phần tử bên trong vùng chứa), điều này sẽ không hoạt động.
Eliezer Berlin

2
Tôi không thể sử dụng chiều rộng 100% vì div của tôi nằm trong một vùng chứa mà tôi không biết chiều rộng hoặc phần đệm của nó. Đó là toàn bộ lý do để sử dụng 100vw thay vì 100%, vì vậy câu trả lời này là vô nghĩa. Và nó cũng xảy ra trên Mac nếu cài đặt của bạn là luôn hiển thị thanh cuộn, mặc dù không có thanh cuộn.
Curtis

37

thanh cuộn sẽ được bao gồm trong vwvì vậy cuộn ngang sẽ được thêm vào để cho phép bạn xem bên dưới cuộn dọc.

Khi bạn chỉ có 1 hộp, nó có kích thước rộng 100% x cao 100%. Khi bạn thêm 2, chiều rộng 100% x chiều cao 200% của nó, do đó sẽ kích hoạt thanh cuộn dọc. Khi thanh cuộn dọc được kích hoạt, sau đó sẽ kích hoạt thanh cuộn ngang.

Bạn có thể thêm overflow-x:hiddenvàobody

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
Làm điều này khiến nội dung xuất hiện bên dưới thanh cuộn. jsfiddle.net/NBzVV/1 Để đây trở thành một giải pháp phù hợp, bạn cần thêm phần đệm phù hợp.
James Donnelly

1
Vâng, được phát hiện tốt. Thêm max-width:100%vào .boxsẽ ngăn chặn điều đó.
wf4

4
"vì vậy cuộn ngang sẽ được thêm vào để cho phép bạn nhìn thấy bên dưới cuộn dọc" <- câu này đã giúp não tôi hình dung ra những gì đang thực sự diễn ra. +1
Ivan Durst

Chỉ cần một ghi chú về overflowngay cả khi bạn thêm nó vào xkhông có postition: stickynội dung nào sẽ hoạt động.
T.Chmelevskij

9

Tôi đã gặp sự cố tương tự và đã đưa ra giải pháp sau bằng cách sử dụng các biến JS và 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 là giá trị dự phòng.


1
Thích cái này. khá thanh lịch
andrevenancio

Điều này là hoàn hảo vì sau đó nó có sẵn trên toàn cầu. Cảm ơn bạn.
fvaldez421 Ngày

2

Cập nhật: Kể từ phiên bản Chrome 66, tôi không thể tái tạo hành vi được báo cáo theo câu hỏi nữa. Không có giải pháp thay thế nào dường như là cần thiết.


Câu trả lời gốc

Đây thực sự là một lỗi như được báo cáo trong câu trả lời này và các nhận xét ở trên.

Mặc dù cách giải quyết trong câu trả lời được chấp nhận (thêm .box {max-width: 100%;}) thường hoạt động, tôi thấy đáng chú ý là nó hiện không hoạt động cho display:table(được thử nghiệm trong Chrome). Trong trường hợp đó, cách giải quyết duy nhất mà tôi tìm thấy là sử dụng width:100%thay thế.


Uhm, câu trả lời được chấp nhận có thay đổi không? Bạn đang đề xuất điều tương tự như câu trả lời được chấp nhận. Đây là lý do tại sao câu trả lời phải được hoàn thành bởi chính họ.
Kissaki

Câu trả lời được chấp nhận đề xuất thêm max-width: 100%. Tôi đã đề xuất thay đổi width: 100vwthành width: 100%. Tôi đã cập nhật câu trả lời của mình để sống khép kín.
Cornflex

Có những trình duyệt khác ngoài Chrome và một số trình duyệt khác xử lý với thanh cuộn.
LocalPCGuy

1

để loại bỏ chiều rộng thanh cuộn có trong vw, tôi phải làm điều này:

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

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

6
Ẩn một vấn đề không giải quyết được nó. Mặc dù cách tiếp cận của bạn thực sự loại bỏ được phần tràn, nhưng nó chỉ đơn giản là ẩn nó. Điều này có thể gây ra vấn đề khi nội dung sẽ được hiển thị bên ngoài (vì bất cứ lý do)
Daniel Steiner

3
Xin chào người dùng13149444! Câu trả lời chỉ có mã có thể giải quyết vấn đề nhưng chúng hữu ích hơn nhiều nếu bạn giải thích cách chúng giải quyết nó. Cộng đồng yêu cầu cả lý thuyết cũng như mã để hiểu câu trả lời của bạn một cách đầy đủ.
RBT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.