ป้องกันไม่ให้แถบเลื่อนเพิ่มขึ้นในความกว้างของหน้าบน Chrome


125

ฉันมีปัญหาเล็กน้อยในการพยายามทำให้หน้า. html ของฉันมีความกว้างที่สม่ำเสมอบน Chrome ตัวอย่างเช่นฉันมีหน้า (1) ที่มีเนื้อหาจำนวนมากที่ล้นความสูงของวิวพอร์ต (คำขวา?) ดังนั้นจึงมีแถบเลื่อนแนวตั้ง ในหน้านั้น (1) ในหน้า (2) ฉันมีเค้าโครงเหมือนกัน (เมนู, div, ... ฯลฯ ) แต่มีเนื้อหาน้อยกว่าจึงไม่มีแถบเลื่อนแนวตั้งอยู่ในนั้น

ปัญหาคือในหน้า (1) แถบเลื่อนดูเหมือนจะดันองค์ประกอบไปทางซ้ายเล็กน้อย (เพิ่มความกว้าง?) ในขณะที่ทุกอย่างปรากฏตรงกลางหน้า (2)

ฉันยังคงเป็นมือใหม่ใน HTML / CSS / JS และฉันค่อนข้างเชื่อว่านี่ไม่ใช่เรื่องยาก แต่ฉันไม่มีโชคในการหาวิธีแก้ปัญหา มันทำงานได้ตามที่ตั้งใจไว้ใน IE10 และ FireFox (แถบเลื่อนที่ไม่รบกวน) ฉันพบสิ่งนี้ใน Chrome เท่านั้น

คำตอบ:


42

คุณจะได้รับขนาดแถบเลื่อนจากนั้นใช้ระยะขอบกับคอนเทนเนอร์

สิ่งนี้:

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 สำหรับลบ h-scrollbar:

body{
    overflow-x:hidden;
}

ลองดูสิ่งนี้: http://jsfiddle.net/NQAzt/


1
วิธีแก้ปัญหาที่ชาญฉลาดฉันไม่เข้าใจเงื่อนไขใน 'if' ว่า!
Acemad

3
scrollHeight คือความสูงทั้งหมดขององค์ประกอบ สิ่งที่คุณเห็นและสิ่งที่ซ่อนอยู่ ตัวอย่าง: หน้าต่างของคุณมีความสูง 500px เนื้อหามีเนื้อหาสำหรับ 900px แสดง 500px แต่อีก 400px ซ่อนอยู่และแถบเลื่อนจะปรากฏขึ้นเพื่อแสดงพิกเซลที่สร้างใหม่นี้ ดังนั้นเงื่อนไขจึงเป็นเช่น "ถ้าความสูงของเนื้อหาทั้งหมดมากกว่าความสูงของมุมมองให้เพิ่มระยะขอบให้กับเนื้อหา" ขอโทษสำหรับภาษาอังกฤษที่ไม่ดีของฉัน
Lwyrn

ฉันเข้าใจแล้วขอบคุณสำหรับคำอธิบายที่ชัดเจนฉันลองวิธีแก้ปัญหานี้และได้รับแถบเลื่อนแนวนอนเพิ่มเติมไม่รู้ว่าทำไม
Acemad

2
ฉันได้เพิ่ม css เล็กน้อยเพื่อป้องกันในการตอบกลับ :)
Lwyrn

4
โซลูชันนี้ปิดใช้งานการเลื่อน
avalanche1

117

หมายเหตุ : การซ้อนทับได้รับการเลิกใช้
คุณยังสามารถใช้สิ่งนี้ได้หากจำเป็นจริงๆ แต่พยายามอย่าทำ

สิ่งนี้ใช้ได้กับเบราว์เซอร์ WebKitเท่านั้น แต่ฉันชอบมันมาก จะทำงานเหมือนautoบนเบราว์เซอร์อื่น ๆ

.yourContent{
   overflow-y: overlay;
}

สิ่งนี้จะทำให้แถบเลื่อนปรากฏเป็นภาพซ้อนทับเท่านั้นจึงไม่ส่งผลต่อความกว้างขององค์ประกอบของคุณ!


มันใช้ไม่ได้กับ IE11 มีวิธีแก้ไขสำหรับค่าโอเวอร์เลย์ในการทำงานใน IE หรือไม่
Anvesh Reddy

ไม่เท่าที่ฉันรู้คุณจะต้องทำกับตัวเลือกอื่น ๆ ที่เสนอในหัวข้อนี้สำหรับ IE
simonDos

จำเป็นมาก! ฉันใช้เวลากว่าครึ่งชั่วโมงเพื่อดูว่าฉันทำอะไรผิดกับมาร์กอัปของฉัน ฉันใช้สไตล์อะไรมากเกินไป ซึ่งควรเป็นค่าเริ่มต้นด้วย
kushalvm

3
แต่เลิกใช้แล้ว
Akash Yellappa

1
ฉันอัปเดตโซลูชันเพื่อให้สอดคล้องกับสิ่งนั้น น่าเศร้า: P
simonDos

57

สิ่งที่คุณต้องทำคือเพิ่ม:

html {
    overflow-y: scroll;
}

ในไฟล์ css ของคุณเนื่องจากจะมี scroller ว่าจำเป็นหรือไม่แม้ว่าคุณจะไม่สามารถเลื่อนได้

ซึ่งหมายความว่าวิวพอร์ตจะมีความกว้างเท่ากันสำหรับทั้งสองอย่าง


4
ดังนั้นฉันจำเป็นต้องเพิ่มแถบเลื่อนให้กับทั้งสอง? ไม่มีวิธีที่จะเพิกเฉยต่อความกว้างของแถบเลื่อนแนวตั้งหรือไม่? ขอบคุณ !
Acemad

ไม่มีทางที่จะเพิกเฉยต่อสิ่งที่ฉันรู้ แต่สิ่งที่ฉันบอกว่าใช้ได้ผล @ Rockr90
Hive7

@ d3c0y นี่เป็นความจริงและฉันได้พูดถึงมันในคำตอบ แต่เป็นวิธีที่ง่ายที่สุดในการทำเช่นนั้น ฉันไม่รู้ว่าในช่วง 3 ปีที่ผ่านมามีการเปลี่ยนแปลงหรือไม่
Hive7

@aks มันบังคับให้เบราว์เซอร์คิดว่าคุณสามารถเลื่อนได้ดังนั้นจึงเปิดใช้งานแถบเลื่อนและเลื่อน y เป็นตัวเลื่อนด้านข้าง
Hive7

1
ล้น -y: เลื่อน; จะเพิ่ม / แสดงแถบเลื่อนในวิวพอร์ตทั้งหมดแม้ว่าจะไม่มีองค์ประกอบที่เลื่อนได้ก็ตาม
Abhilash

35

อาจ

html {
    width: 100vw;
}

เป็นเพียงสิ่งที่คุณต้องการ


1
สิ่งนี้ใช้งานได้ดีสำหรับกรณีใช้งานของฉัน: gist.github.com/bmcminn/1ab50da18bde75f39bc88e8292a5a847 ฉันใช้calc()เพื่อกำหนดความกว้างของมุมมองเนื้อหาหลักเพื่อให้การนำทางนอกหน้าจอคงที่สามารถครอบครองด้านซ้ายของหน้าจอบนเดสก์ท็อปทั้งหมดในขณะที่รักษาเนทีฟ เลื่อนบนมือถือ
bmcminn

3
ฉันยุ่งกับแถบเลื่อนของฉันตลอด 36 ชั่วโมงที่ผ่านมา ฉันมีวิธีแก้ปัญหาที่แตกต่างกันสองสามวิธีที่ได้ผล แต่มีปัญหาอื่น ๆ นี่เป็นวิธีแก้ปัญหาแรกที่ทั้งสองใช้งานได้และอนุญาตให้ฉันใช้แถบเลื่อนปกติที่อื่น ขอบคุณ.
kosher

ยินดีต้อนรับ! แต่การยุ่งกับhtmlความกว้างของนิ้วvwนั้นค่อนข้างแฮ็คดังนั้นโปรดใช้ความระมัดระวัง!
Neurotransmitter

วิธีนี้ได้ผลดีใครช่วยอธิบายวิธีการทำงานนี้ได้ไหม
Zeus

1
วิธีแก้ปัญหาไม่เลว แต่สามารถเพิ่มการเลื่อนแนวนอนได้
FDisk

19

เบราว์เซอร์ Webkit เช่น Safari และ Chrome จะลบความกว้างของแถบเลื่อนออกจากความกว้างของหน้าที่มองเห็นได้เมื่อคำนวณความกว้าง: 100% หรือ 100vw เพิ่มเติมได้ที่DM รัทเทอร์ฟอร์ดและเลื่อนหน้ากว้าง

ลองใช้overflow-y: overlayแทน


9
โปรดอย่าโพสต์คำตอบที่เหมือนกันสำหรับคำถามหลายข้อ โพสต์คำตอบที่ดีหนึ่งคำตอบจากนั้นโหวต / ตั้งค่าสถานะเพื่อปิดคำถามอื่นที่ซ้ำกัน หากคำถามไม่ซ้ำกันให้ปรับแต่งคำตอบของคุณให้เหมาะกับคำถามนั้น
Paul Roub

สิ่งนี้ควรใช้งานได้ แต่การวางซ้อนยังไม่เป็นมาตรฐานและยังไม่ได้รับการสนับสนุนในทุกเบราว์เซอร์
Zia Ul Rehman Mughal

อาการสะอึกอย่างรวดเร็ว: ใน Safari ทำให้หน้าหยุดเลื่อน
joshfindit

13

ฉันพบว่าฉันสามารถเพิ่มได้

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

ไปที่ css ของฉันโดยตรงและมันจะทำให้แถบเลื่อนมองไม่เห็น แต่ก็ยังอนุญาตให้ฉันเลื่อนได้ (อย่างน้อยใน Chrome) เหมาะสำหรับเมื่อคุณไม่ต้องการให้แถบเลื่อนเสียสมาธิบนหน้าเว็บของคุณ!


5
มันค่อนข้างเสี่ยงและไม่ใช่วิธีแก้ปัญหาข้ามเบราว์เซอร์แม้ว่าstackoverflow.com/questions/9251354/…
Alex Pyzhianov

4

สำหรับคอนเทนเนอร์ที่มีความกว้างคงที่โซลูชันเบราว์เซอร์ข้าม CSS แบบบริสุทธิ์สามารถทำได้โดยการรวมคอนเทนเนอร์ไว้ใน div อื่นและใช้ความกว้างเดียวกันกับทั้งสอง 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;
}

คลิกที่นี่เพื่อดูตัวอย่างCodepen


3

ดูเหมือนว่าคำตอบอื่นของฉันจะไม่ได้ผลในขณะนี้ (แต่ฉันจะพยายามทำให้มันใช้งานได้ต่อไป)

แต่โดยพื้นฐานแล้วสิ่งที่คุณต้องทำและสิ่งที่พยายามทำแบบไดนามิกคือตั้งค่าความกว้างของเนื้อหาให้น้อยกว่าของบานหน้าต่างหลักที่เลื่อนได้เล็กน้อย
ดังนั้นเมื่อแถบเลื่อนปรากฏขึ้นจะไม่มีผลกับเนื้อหา

นี้ตัวอย่างที่แสดงให้เห็นวิธี hacky มากขึ้นของการบรรลุเป้าหมายนั้นโดย hardcoding widths paddingแทนการพยายามที่จะได้รับเบราว์เซอร์ที่จะทำเพื่อเราผ่านทาง
หากเป็นไปได้นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุดหากคุณไม่ต้องการแถบเลื่อนแบบถาวร


นั่นเป็นทางออกที่ดี แต่ฉันกำลังทำงานบนเว็บไซต์ที่ตอบสนองโดยใช้ Bootstrap และสิ่งสำคัญคือการทำให้ความกว้างเป็นไปโดยอัตโนมัติคุณจะพูดว่าอย่างไร?
Acemad

ดีเว้นแต่ (ตามลำดับความน่าจะเป็นที่หลอกลวง) อย่างใดอย่างหนึ่ง: มีคนคิดหาวิธีที่จะได้รับคำตอบอื่น ๆ ของฉันในการทำงาน (ด้วยช่องว่างภายในหรือระยะขอบ); คุณสามารถใช้แบบสอบถามสื่อเพื่อใช้ช่องว่างภายในแบบเลือกได้ หรือนิพจน์ cssถูกนำไปใช้ในเบราว์เซอร์สมัยใหม่เพื่อเลือกใช้ padding ฉันคิดว่ามีเพียงแถบเลื่อนถาวรหรือใช้ JS เพื่อตรวจจับแถบเลื่อนเท่านั้นที่เป็นวิธีที่จะไป
Hashbrown

1

แก้ไข:คำตอบนี้ไม่ถูกต้องในขณะนี้โปรดดูคำตอบอื่นของฉันเพื่อดูว่าฉันพยายามทำอะไรที่นี่ ฉันกำลังพยายามแก้ไข แต่ถ้าคุณสามารถให้ความช่วยเหลือได้โปรดแสดงความคิดเห็นขอบคุณ!

การใช้padding-rightจะช่วยลดการปรากฏขึ้นอย่างกะทันหันของแถบเลื่อน

ตัวอย่าง

เครื่องมือ Chrome devtools แสดงช่องว่างภายในไม่ขยับ

ดังที่คุณเห็นจากจุดข้อความจะทำให้เป็นจุดเดียวกันในหน้าก่อนที่จะตัดไม่ว่าจะมีแถบเลื่อนอยู่หรือไม่ก็ตาม
เนื่องจากเมื่อมีการแนะนำแถบเลื่อนช่องว่างภายในจะซ่อนอยู่ด้านหลังดังนั้นแถบเลื่อนจึงไม่ดันข้อความ!


3
ความกว้างของแถบเลื่อนสามารถเปลี่ยนแปลงได้ขึ้นอยู่กับระบบปฏิบัติการและเบราว์เซอร์ที่คุณใช้ สามารถวัดได้ 20px และ 40px
Lwyrn

2
คุณจะใช้ค่าสูงสุดที่เป็นไปได้ทั้งหมด
Hashbrown

1
การเลื่อนเบราว์เซอร์ของอุปกรณ์ / ระบบปฏิบัติการบางอย่างไม่มีความกว้างด้วยซ้ำ
Sergey Goliney

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

โดยที่ 300 px เป็นครึ่งหนึ่งของความกว้างหน้าต่างโต้ตอบของฉัน

นี่เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉัน


0

ฉันมีปัญหาเดียวกันใน Chrome มันเกิดขึ้นสำหรับฉันเมื่อแถบเลื่อนปรากฏอยู่เสมอ (พบในการตั้งค่าทั่วไป) ฉันมีโมดอลและเมื่อฉันเปิดโมดอลฉันสังเกตเห็นว่า ...

body {
    padding-left: 15px;
}

ถูกเพิ่มเข้าไปในร่างกาย เพื่อไม่ให้สิ่งนี้เกิดขึ้นฉันได้เพิ่ม

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

0

ฉันไม่สามารถเพิ่มความคิดเห็นสำหรับคำตอบแรกได้และเป็นเวลานานแล้ว ... แต่การสาธิตนั้นมีปัญหา:

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

b.prop ('scrollHeight') จะเท่ากับ b.height () เสมอ

ฉันคิดว่ามันควรจะเป็นแบบนี้:

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

ในที่สุดฉันขอแนะนำวิธีการ:

html {
 overflow-y: scroll;
}

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

:root body {
  position: absolute;
}

body {
 width: 100vw;
 overflow: hidden;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.