Ngăn thanh cuộn thêm vào Chiều rộng của trang trên Chrome


125

Tôi gặp một vấn đề nhỏ khi cố gắng giữ cho các trang .html của mình có chiều rộng nhất quán trên Chrome, Ví dụ: tôi có một trang (1) có nhiều nội dung vượt quá chiều cao của khung nhìn (từ phải không?), Vì vậy có một thanh cuộn dọc trên trang đó (1). Ở trang (2), tôi có cùng một bố cục (menu, div, ... vv) nhưng ít nội dung hơn, vì vậy không có thanh cuộn dọc ở đó.

Vấn đề là trên trang (1) các thanh cuộn dường như hơi đẩy các phần tử sang trái (tăng thêm chiều rộng?) Trong khi mọi thứ xuất hiện đều ở giữa trang (2)

Tôi vẫn là người mới bắt đầu về HTML / CSS / JS và tôi khá tin rằng điều này không quá khó, nhưng tôi không may mắn tìm ra giải pháp. Nó hoạt động như dự định trên IE10 và FireFox (thanh cuộn không gây nhiễu), tôi chỉ gặp điều này trên Chrome.

Câu trả lời:


42

Bạn có thể lấy kích thước thanh cuộn và sau đó áp dụng lề cho vùng chứa.

Một cái gì đó như thế này:

var checkScrollBars = function(){
    var b = $('body');
    var normalw = 0;
    var scrollw = 0;
    if(b.prop('scrollHeight')>b.height()){
        normalw = window.innerWidth;
        scrollw = normalw - b.width();
        $('#container').css({marginRight:'-'+scrollw+'px'});
    }
}

CSS để loại bỏ thanh cuộn h:

body{
    overflow-x:hidden;
}

Hãy thử xem phần này: http://jsfiddle.net/NQAzt/


1
Giải pháp thông minh, tôi không hiểu điều kiện trong 'nếu' mặc dù!
Acemad,

3
ScrollHeight là tổng chiều cao của một phần tử. Những gì bạn thấy và những gì bị ẩn. Ví dụ: Cửa sổ của bạn giống như chiều cao 500px, nội dung có nội dung là 900px. 500px được hiển thị nhưng 400px còn lại bị ẩn và thanh cuộn sẽ xuất hiện để hiển thị pixel làm lại này. Vì vậy, điều kiện giống như "nếu chiều cao của tất cả nội dung lớn hơn chiều cao của điểm quan sát, thêm lề vào nội dung". Xin lỗi vì tiếng xấu của tôi
Lwyrn

Tôi đã hiểu ngay bây giờ, cảm ơn vì lời giải thích rõ ràng, tôi đã thử giải pháp này và nhận được thêm một thanh cuộn ngang, không biết tại sao.
Acemad

2
Tôi đã thêm một đoạn css nhỏ để ngăn chặn nó trong thư trả lời :)
Lwyrn

4
Giải pháp này vô hiệu hóa tính năng cuộn
avalanche1

117

TUYÊN BỐ TỪ CHỐI : lớp phủ không được dùng nữa .
Bạn vẫn có thể sử dụng điều này nếu bạn hoàn toàn phải làm như vậy, nhưng hãy cố gắng không.

Điều này chỉ hoạt động trên trình duyệt WebKit , nhưng tôi rất thích nó. Sẽ hoạt động như autotrên các trình duyệt khác.

.yourContent{
   overflow-y: overlay;
}

Điều này sẽ làm cho thanh cuộn chỉ xuất hiện dưới dạng lớp phủ , do đó không ảnh hưởng đến chiều rộng của phần tử của bạn!


Nó không hoạt động cho IE11. Có bất kỳ công việc nào xung quanh để giá trị lớp phủ hoạt động trong IE.
Anvesh Reddy

không xa như tôi biết, bạn sẽ phải thực hiện với các tùy chọn khác được đề xuất trong chuỗi này cho IE
simonDos

Yêu cầu nhiều! Tôi đã mất hơn nửa giờ để xem tôi đã làm sai cái quái gì với điểm đánh dấu của mình. Tôi đã lạm dụng phong cách nào? Điều này cũng nên được mặc định.
kushalvm

3
Nhưng nó không được dùng nữa
Akash Yellappa vào

1
Tôi đã cập nhật giải pháp để phản ánh điều đó. Kinda buồn: P
simonDos

57

Tất cả những gì bạn cần làm là thêm:

html {
    overflow-y: scroll;
}

Trong tệp css của bạn vì nó sẽ có cuộn cho dù nó có cần thiết hay không mặc dù bạn sẽ không thể cuộn

Điều này có nghĩa là khung nhìn sẽ có cùng chiều rộng cho cả hai


4
vì vậy, tôi bắt buộc phải thêm thanh cuộn vào cả hai? không có cách nào để bỏ qua chiều rộng của thanh cuộn dọc? Cảm ơn bạn !
Acemad,

Therer có cách nào để bỏ qua nó mà tôi biết nhưng những gì tôi đã nói công trình một điều trị @ Rockr90
Hive7

@ d3c0y điều này đúng và tôi đã đề cập đến nó trong câu trả lời nhưng đây là phương pháp dễ nhất để làm như vậy. Tôi không biết nếu điều đó đã thay đổi trong quá khứ 3 năm tuy nhiên
Hive7

@aks. nó buộc các trình duyệt để nghĩ rằng bạn có thể di chuyển để cho phép để thanh cuộn và cuộn y là scroller bên
Hive7

1
tràn-y: cuộn; sẽ thêm / hiển thị thanh cuộn trong tất cả các chế độ xem ngay cả khi không có phần tử nào có thể cuộn được.
Abhilash

35

Có lẽ

html {
    width: 100vw;
}

chỉ là những gì bạn muốn.


1
Điều này hoạt động hiệu quả cho usecase của tôi: gist.github.com/bmcminn/1ab50da18bde75f39bc88e8292a5a847 Tôi đang sử dụng calc()để xác định chiều rộng của chế độ xem nội dung chính để điều hướng cố định ngoài màn hình có thể chiếm bên trái của màn hình trên máy tính cuộn trên điện thoại di động.
bmcminn

3
Tôi đã lộn xộn với các thanh cuộn của mình trong 36 giờ qua. Tôi đã có một số giải pháp khác nhau có hiệu quả, nhưng lại làm nảy sinh các vấn đề khác. Đây là giải pháp đầu tiên vừa hoạt động vừa cho phép tôi sử dụng thanh cuộn bình thường ở nơi khác. Cảm ơn bạn.
kosher

Không có gì! Nhưng phiền xung quanh với html's chiều rộng theo vws là một chút hacky , vì vậy hãy thực hiện một số thận trọng!
Neurotransmitter

Điều này hoạt động tuyệt vời, ai đó có thể giải thích cách hoạt động của nó không?
Zeus

1
Giải pháp không tồi, nhưng nó có thể thêm cuộn ngang.
FDisk

18

Các trình duyệt Webkit như Safari và Chrome trừ chiều rộng thanh cuộn cho chiều rộng trang hiển thị khi tính chiều rộng: 100% hoặc 100vw. Thông tin thêm tại DM Rutherford's Scrolling and Page Width .

Hãy thử sử dụng overflow-y: overlaythay thế.


9
Vui lòng không đăng các câu trả lời giống hệt nhau cho nhiều câu hỏi. Đăng một câu trả lời hay, sau đó bình chọn / gắn cờ để đóng các câu hỏi khác là trùng lặp. Nếu câu hỏi không trùng lặp, hãy điều chỉnh câu trả lời của bạn cho phù hợp với câu hỏi.
Paul Roub

Điều này sẽ hoạt động, nhưng lớp phủ chưa phải là tiêu chuẩn và nó không được hỗ trợ trong tất cả các trình duyệt.
Zia Ul Rehman Mughal

Trục trặc nhanh chóng: trong Safari, điều này khiến trang ngừng cuộn
joshfindit

13

Tôi thấy tôi có thể thêm

::-webkit-scrollbar { 
display: none; 
}

trực tiếp đến css của tôi và nó sẽ làm cho thanh cuộn vô hình, nhưng vẫn cho phép tôi cuộn (ít nhất là trên Chrome). Phù hợp khi bạn không muốn có một thanh cuộn gây mất tập trung trên trang của mình!


5
Nó là hơi mạo hiểm và không giải pháp qua trình duyệt mặc dù stackoverflow.com/questions/9251354/...
Alex Pyzhianov

4

Đối với các vùng chứa có chiều rộng cố định, giải pháp trình duyệt chéo CSS thuần túy có thể được thực hiện bằng cách gói vùng chứa vào một div khác và áp dụng cùng một chiều rộng cho cả hai div.

#outer {
  overflow-y: auto;
  overflow-x: hidden;
  /*
   * width must be an absolute value otherwise the inner divs width must be set via
   * javascript to the computed width of the parent container
   */
  width: 200px;
}

#inner {
  width: inherit;
}

Nhấp vào đây để xem ví dụ về Codepen


3

Có vẻ như câu trả lời khác của tôi không hoạt động tốt vào lúc này (nhưng tôi sẽ tiếp tục cố gắng để nó hoạt động).

Nhưng về cơ bản những gì bạn cần làm và những gì nó đang cố gắng thực hiện động, là đặt chiều rộng của nội dung nhỏ hơn một chút so với chiều rộng của ngăn chính, có thể cuộn.
Vì vậy, khi thanh cuộn xuất hiện, nó không ảnh hưởng đến nội dung.

VÍ DỤ này cho thấy một cách khó khăn hơn để đạt được mục tiêu đó, bằng cách mã hóa cứng widththay vì cố gắng yêu cầu trình duyệt thực hiện điều đó cho chúng ta padding.
Nếu điều này là khả thi thì đây là giải pháp đơn giản nhất nếu bạn không muốn có một thanh cuộn vĩnh viễn.


Đó là một giải pháp tốt, tuy nhiên tôi đang làm việc trên một trang web đáp ứng bằng Bootstrap và điều quan trọng là phải tự động hóa chiều rộng và tất cả, bạn nói gì?
Acemad,

trừ khi (theo thứ tự có khả năng đánh lừa): ai đó tìm ra cách làm cho câu trả lời khác của tôi hoạt động (có đệm hoặc lề); bằng cách nào đó bạn có thể sử dụng truy vấn phương tiện để áp dụng đệm một cách chọn lọc; hoặc biểu thức css được triển khai trong các trình duyệt hiện đại để áp dụng một cách chọn lọc phần đệm. Tôi nghĩ rằng chỉ có một thanh cuộn vĩnh viễn hoặc sử dụng JS để phát hiện thanh cuộn là con đường để đi
Hashbrown

1

CHỈNH SỬA: câu trả lời này không hoàn toàn đúng vào lúc này, hãy tham khảo câu trả lời khác của tôi để xem tôi đã cố gắng làm gì ở đây. Tôi đang cố gắng sửa nó, nhưng nếu bạn có thể cung cấp hỗ trợ, hãy làm như vậy trong phần nhận xét, cảm ơn!

Việc sử dụng padding-rightsẽ giảm thiểu sự xuất hiện đột ngột của thanh cuộn

THÍ DỤ

chrome devtools hiển thị phần đệm không di chuyển

Như bạn có thể thấy từ các dấu chấm, văn bản sẽ đến cùng một điểm trong trang trước khi gói lại, bất kể có thanh cuộn hay không.
Điều này là do khi thanh cuộn được giới thiệu, phần đệm ẩn đằng sau nó, vì vậy thanh cuộn không đẩy lên văn bản!


3
Chiều rộng thanh cuộn có thể thay đổi tùy thuộc vào Hệ điều hành và Trình duyệt bạn đang sử dụng. Nó có thể đo 20px cũng như 40px
Lwyrn

2
cũng bạn muốn sử dụng tối đa của tất cả các giá trị có thể
Hashbrown

1
Một số thiết bị / cuộn trình duyệt của hệ điều hành thậm chí không có chiều rộng.
Sergey Goliney

0
.modal-dialog {
   position: absolute;
   left: calc(50vw - 300px);
}

trong đó 300 px là một nửa chiều rộng cửa sổ hộp thoại của tôi.

Đây thực sự là điều duy nhất làm việc cho tôi.


0

Tôi gặp sự cố tương tự trên Chrome. Nó chỉ xảy ra với tôi khi thanh cuộn luôn hiển thị. (tìm thấy trong cài đặt chung) Tôi có một phương thức và khi mở phương thức, tôi nhận thấy rằng ...

body {
    padding-left: 15px;
}

được thêm vào cơ thể. Để ngăn điều này xảy ra, tôi đã thêm

body {
    padding-left: 0px !important;
}

0

Tôi không thể thêm nhận xét cho câu trả lời đầu tiên và đã lâu ... nhưng bản demo đó có vấn đề:

if(b.prop('scrollHeight')>b.height()){
    normalw = window.innerWidth;
    scrollw = normalw - b.width();
    $('#container').css({marginRight:'-'+scrollw+'px'});
}

b.prop ('scrollHeight') luôn bằng b.height (),

Tôi nghĩ nó phải như thế này:

if(b.prop('scrollHeight')>window.innerHeight) ...

Cuối cùng, tôi đề xuất một phương pháp:

html {
 overflow-y: scroll;
}

:root {
  overflow-y: auto;
  overflow-x: hidden;
}

:root body {
  position: absolute;
}

body {
 width: 100vw;
 overflow: hidden;
}
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.