ซ่อนแถบเลื่อน แต่ในขณะที่ยังคงสามารถเลื่อนได้


1128

ฉันต้องการที่จะเลื่อนดูทั้งหน้า แต่ไม่มีแถบเลื่อนที่แสดง

ใน Google Chrome มันคือ:

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

แต่ Mozilla Firefox และ Internet Explorer ดูเหมือนจะไม่ทำงานเช่นนั้น

ฉันยังลองใน CSS:

overflow: hidden;

มันซ่อนแถบเลื่อน แต่ฉันไม่สามารถเลื่อนได้อีก

มีวิธีที่ฉันสามารถลบแถบเลื่อนในขณะที่ยังสามารถเลื่อนหน้าทั้งหมดได้หรือไม่?

ด้วย CSS หรือ HTML

คำตอบ:


787

แค่ทดสอบซึ่งทำงานได้ดี

#parent{
    width: 100%;
    height: 100%;
    overflow: hidden;
}

#child{
    width: 100%;
    height: 100%;
    overflow-y: scroll;
    padding-right: 17px; /* Increase/decrease this value for cross-browser compatibility */
    box-sizing: content-box; /* So the width will be 100% + 17px */
}

Fiddle ทำงาน

JavaScript:

เนื่องจากความกว้างของแถบเลื่อนแตกต่างกันไปในเบราว์เซอร์ที่แตกต่างกันจึงควรจัดการกับ JavaScript หากคุณทำเช่นElement.offsetWidth - Element.clientWidthนั้นความกว้างของแถบเลื่อนที่แน่นอนจะปรากฏขึ้น

ซอทำจาวาสคริปต์ทำงาน

หรือ

การใช้Position: absolute,

#parent{
    width: 100%;
    height: 100%;
    overflow: hidden;
    position: relative;
}

#child{
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: -17px; /* Increase/Decrease this value for cross-browser compatibility */
    overflow-y: scroll;
}

Fiddle ทำงาน

ซอทำจาวาสคริปต์ทำงาน

ข้อมูล:

ขึ้นอยู่กับคำตอบนี้ฉันสร้างปลั๊กอินเลื่อนง่าย


16
ในซอ "การทำงานครั้งสุดท้าย" ของคุณฉันเคยเห็นมากเกินไป!importantดังนั้นฉันจึงลบออกทั้งหมด: jsfiddle.net/5GCsJ/954
Roko C. Buljan

2
วิธีนี้ไม่ทำงานเมื่อตั้งค่าความกว้างของเนื้อหาเป็นอัตโนมัติ เมื่อเลื่อนไปทางขวาจนสุดส่วนหนึ่งของเนื้อหายังคงมองไม่เห็น ทำไมถึงเป็นอย่างนั้น? ทางออกใด ๆ ? ชำระเงินที่นี่: jsfiddle.net/50fam5g9/7หมายเหตุ: ความกว้างของเนื้อหาไม่สามารถทราบล่วงหน้าในกรณีของฉันนั่นคือสาเหตุที่ต้องมีการตั้งค่าอัตโนมัติ
ต้นกล้า Coder

35
วิธีนี้จะไม่ครอบคลุมเบราว์เซอร์ทั้งหมดและจะเฉพาะเจาะจงมากกับเวอร์ชันของเบราว์เซอร์ที่คุณใช้งานในระหว่างการพัฒนา
Itsik Avidan

2
แล้วแถบเลื่อนแนวนอนล่ะ? คุณจะซ่อนสิ่งเหล่านั้นได้อย่างไร
www139

11
ทำไมซับซ้อนและคำนวณความกว้างของแถบเลื่อน? เพียงตั้งค่าbox-sizing: border-box; width: calc(100% + 50px);และค่าเดียวกันสำหรับการเติมเต็ม ไม่มีเบราว์เซอร์ที่มีความกว้าง / ความสูงแถบเลื่อน 50px ดังนั้นจึงควรครอบคลุมทั้งหมด ...
Robert Koritnik

361

มันง่ายใน WebKit ด้วยการใส่สไตล์ที่เป็นตัวเลือก:

html {
    overflow: scroll;
    overflow-x: hidden;
}
::-webkit-scrollbar {
    width: 0px;  /* Remove scrollbar space */
    background: transparent;  /* Optional: just make scrollbar invisible */
}
/* Optional: show position indicator in red */
::-webkit-scrollbar-thumb {
    background: #FF0000;
}

1
ลองสิ่งนี้ในcordovaแอปใช้งานได้ดี ต้องใช้overflow:scrollกับองค์ประกอบ
Kishor Pawar

41
ใช้งานไม่ได้กับ Firefox ค่อนข้างชัดเจนเพราะนี่เป็น webkit ขอบคุณ :)
Zohair

3
ทำงานได้ดีในแอพอิเล็กตรอนตามที่คาดไว้เนื่องจากมันเป็นโครเมียม +1 ขอบคุณ: D
rococo

ตั้งแต่ iOS8 สิ่งนี้จะไม่ทำงานเมื่อใช้กับ-webkit-overflow-scrolling: touch
aleclarson

4
มันใช้งานได้กับโครเมี่ยม แต่ไม่ทำงานกับ Mozilla Firefox
โรแมนติก tandel

299

สิ่งนี้ใช้ได้กับฉันด้วยคุณสมบัติ CSS อย่างง่าย:

.container {
    -ms-overflow-style: none;  /* Internet Explorer 10+ */
    scrollbar-width: none;  /* Firefox */
}
.container::-webkit-scrollbar { 
    display: none;  /* Safari and Chrome */
}

สำหรับ Firefox เวอร์ชันเก่าให้ใช้: overflow: -moz-scrollbars-none;


13
สำหรับฉันoverflow: -moz-scrollbars-noneซ่อนแถบเลื่อนใน Firebox แต่ยังปิดใช้งานการเลื่อน คุณสามารถให้ตัวอย่างที่ใช้งานได้กับคุณหรือไม่
chipit24

1
น่าเสียดายที่-moz-scrollbars-noneสถานที่นี้จะถูกลบสำหรับ Firefox เวอร์ชั่นใหม่ล่าสุด: developer.mozilla.org/en-US/docs/Web/CSS/overflow
Hristo Eftimov

2
ตั้งแต่ iOS8 สิ่งนี้จะไม่ทำงานเมื่อใช้กับ-webkit-overflow-scrolling: touch
aleclarson

3
สำหรับล้าสมัย Firefox คุณสามารถใช้-moz-scrollbars-none @-moz-document url-prefix() { .container { overflow: hidden; } }ดูstackoverflow.com/questions/952861/...
Martin Ždila

1
ฉันได้อัปเดตคำตอบของฉันด้วยการสนับสนุนล่าสุดสำหรับ Firefox :)
Hristo Eftimov

292

UPDATE:

Firefox รองรับการซ่อนแถบเลื่อนด้วย CSS ดังนั้นเบราว์เซอร์หลักทั้งหมดจึงได้รับการคุ้มครอง (Chrome, Firefox, Internet Explorer, Safari เป็นต้น)

เพียงใช้ CSS ต่อไปนี้กับองค์ประกอบที่คุณต้องการลบแถบเลื่อนออก:

.container {
    overflow-y: scroll;
    scrollbar-width: none; /* Firefox */
    -ms-overflow-style: none;  /* Internet Explorer 10+ */
}
.container::-webkit-scrollbar { /* WebKit */
    width: 0;
    height: 0;
}

นี่เป็นโซลูชันเบราว์เซอร์ข้ามแฮ็กน้อยที่สุดที่ฉันรู้อยู่ในปัจจุบัน ตรวจสอบตัวอย่าง


คำตอบเดิม:

นี่เป็นอีกวิธีที่ยังไม่ได้กล่าวถึง มันง่ายมากและมีเพียงแค่สอง divs และ CSS เท่านั้น ไม่จำเป็นต้องใช้ JavaScript หรือ CSS ที่เป็นกรรมสิทธิ์และสามารถใช้ได้กับทุกเบราว์เซอร์ ไม่จำเป็นต้องตั้งค่าความกว้างของภาชนะอย่างชัดเจนจึงทำให้เป็นของเหลว

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

สาธิตการใช้งาน:

โค้ดตัวอย่างสำหรับรุ่นแนวตั้ง:

HTML:

<div class="parent">
  <div class="child">
    Your content.
  </div>
</div>

CSS:

.parent {
  width: 400px;
  height: 200px;
  border: 1px solid #AAA;
  overflow: hidden;
}

.child {
  height: 100%;
  margin-right: -50px; /* Maximum width of scrollbar */
  padding-right: 50px; /* Maximum width of scrollbar */
  overflow-y: scroll;
}

39
ฉันรู้ว่านี่เป็นคำตอบใหม่สำหรับคำถามเก่า แต่นี่ควรเป็นคำตอบที่ยอมรับได้ในขณะนี้ ผู้ชายที่ดี
เวกเตอร์

3
นี่คือคำตอบที่ดีที่สุด ทีนี้คนเราจะดัดแปลงมันเพื่อซ่อนแถบเลื่อนแนวนอนได้อย่างไร?
CeeMoney

1
@CeeMoney ฉันได้เพิ่มการสาธิตในแนวนอน สำหรับองค์ประกอบเนื้อหาที่มีความกว้างคงที่เช่นรูปภาพควรใช้งานได้ แต่สำหรับข้อความที่คุณต้องปิดการตัดคำ
Richrd

1
@Richrd - ขอบคุณตันสำหรับตัวอย่าง - ทำงานได้อย่างสมบูรณ์แบบ ไม่รู้ว่าทำไมเราถึงทำให้มันยากเหลือเกิน แต่มันง่ายมากฉันรู้สึกงี่เง่าที่ไม่เคยทำแบบนี้มาก่อน
CeeMoney

4
ขอบคุณ @Richrd! ฉันดีใจที่ฉันเลื่อนไปที่คำตอบของคุณ ถ้าดังนั้นจะมี "คำตอบที่ยอมรับกองทัพ" ฉันจะใช้มันในตอนนี้
Martin D

78

ใช้:

<div style='overflow:hidden; width:500px;'>
   <div style='overflow:scroll; width:508px'>
      My scroll-able area
   </div>
</div>

นี่เป็นเคล็ดลับในการซ้อนทับแถบเลื่อนด้วย div ที่ทับซ้อนกันซึ่งไม่มีแถบเลื่อนใด ๆ :

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

สิ่งนี้ใช้สำหรับเบราว์เซอร์WebKitเท่านั้น... หรือคุณสามารถใช้เนื้อหา CSS เฉพาะเบราว์เซอร์ (หากมีในอนาคต) เบราว์เซอร์ทุกตัวอาจมีคุณสมบัติที่แตกต่างกันและเฉพาะเจาะจงสำหรับแถบที่เกี่ยวข้อง

สำหรับการใช้งานไมโครซอฟท์ขอบ: -ms-overflow-style: -ms-autohiding-scrollbar;หรือ-ms-overflow-style: none;เป็นต่อ MSDN

ไม่มีเทียบเท่าสำหรับ Firefox แม้ว่าจะมีปลั๊กอิน jQuery เพื่อให้บรรลุสิ่งนี้ http://manos.malihu.gr/tuts/jquery_custom_scrollbar.html


ictacademie.info/oussamaelbachiriไซต์นี้ @Oussama Dobby ใช้สื่อ = 'หน้าจอ' แล้ว ':: - webkit-scrollbar' คุณสมบัติสำหรับ css
Arpit Singh

และคุณสมบัติ CSS เฉพาะของพวกเขาคืออะไร?
Oussama el Bachiri

ทั้งเลย์เอาต์ที่แฮ็กหรือ jquery เป็นอีกทางเลือกหนึ่ง
Arpit Singh

ทางออกแรกของคุณให้ปัญหานี้กับฉัน s24.postimg.org/idul8zx9w/Naamloos.jpg และคุณหมายถึงอะไรโดยการจัดแฮ็คที่ @ArpitSingh
Oussama el Bachiri

4
ต่อไปนี้อนุญาตให้ฉันเปิดใช้งานการเลื่อนแบบเนทีฟใน Cordova ด้วย jQuery Mobile 1.4 บน iOS7 และ iOS8 // CSS ::-webkit-scrollbar { display: none; } .ui-content { -webkit-overflow-scrolling: touch; } // jQuery Mobile onMobileInit () $.mobile.touchOverflowEnabled = true;
Ryan Williams

33

คำตอบนี้ไม่รวมรหัสดังนั้นนี่คือทางออกจากหน้า :

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

สิ่งที่ดีคือคุณไม่ได้ถูกบังคับให้ใช้ความแตกต่างของการเติมเต็มหรือความกว้างเพื่อซ่อนแถบเลื่อน

นี่คือซูมปลอดภัย โซลูชันการเติมเต็ม / ความกว้างแสดงแถบเลื่อนเมื่อซูมไปที่ต่ำสุด

แก้ไข Firefox: http://jsbin.com/mugiqoveko/1/edit?output

.element,
.outer-container {
  width: 200px;
  height: 200px;
}
.outer-container {
  border: 5px solid purple;
  position: relative;
  overflow: hidden;
}
.inner-container {
  position: absolute;
  left: 0;
  overflow-x: hidden;
  overflow-y: scroll;
  padding-right: 150px;
}
.inner-container::-webkit-scrollbar {
  display: none;
}
<div class="outer-container">
  <div class="inner-container">
    <div class="element">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vehicula quam nibh, eu tristique tellus dignissim quis. Integer condimentum ultrices elit ut mattis. Praesent rhoncus tortor metus, nec pellentesque enim mattis nec. Nulla vitae turpis ut
      dui consectetur pellentesque quis vel est. Curabitur rutrum, mauris ut mollis lobortis, sem est congue lectus, ut sodales nunc leo a libero. Cras quis sapien in mi fringilla tempus condimentum quis velit. Aliquam id aliquam arcu. Morbi tristique
      aliquam rutrum. Duis tincidunt, orci suscipit cursus molestie, purus nisi pharetra dui, tempor dignissim felis turpis in mi. Vivamus ullamcorper arcu sit amet mauris egestas egestas. Vestibulum turpis neque, condimentum a tincidunt quis, molestie
      vel justo. Sed molestie nunc dapibus arcu feugiat, ut sollicitudin metus sagittis. Aliquam a volutpat sem. Quisque id magna ultrices, lobortis dui eget, pretium libero. Curabitur aliquam in ante eu ultricies.
    </div>
  </div>
</div>


สิ่งนี้จะไม่ทำงานกับเบราว์เซอร์ทั้งหมด ... เฉพาะเบราว์เซอร์ webkit คุณกำลังใช้เครื่องมือเลือกเฉพาะ webkit::-webkit-scrollbar {}
คำนำหน้า

ฉันทดสอบในเบราว์เซอร์ใหม่ทั้งหมดก่อนที่จะตอบคำถาม นอกจากนี้ FF มันเกิดการเปลี่ยนแปลงบางอย่างใน FF ไหม?
Timo Kähkönen

ฉันอัพเดตคำตอบแล้ว ดูเหมือนว่าการเพิ่มการpadding-right: 150px;แก้ไขมัน ทดสอบใน FF, Chrome, Safari และ Edge สามารถใช้งานได้ในระดับซูมที่ต่ำเนื่องจากการขยายไปทางขวาอย่างมาก
Timo Kähkönen

2
ขอบ IE 11 IE10 html { -ms-overflow-style: none;}(อาจจะลดลงนอกจากนี้ยังมีการสนับสนุน) ในเบราว์เซอร์เหล่านี้ไม่จำเป็นต้องใช้การแพ็ดแฮ็ค
Timo Kähkönen

ต้องใช้คำตอบของ @ Timo และoverflow-y: scrollเพื่อให้ได้พฤติกรรมการเลื่อน แต่ซ่อนอยู่ (เช่นเดียวกับ Chrome) เพื่อให้ทำงานบน Edge23
jojo

21

เพียงใช้สามบรรทัดต่อไปนี้และปัญหาของคุณจะได้รับการแก้ไข:

#liaddshapes::-webkit-scrollbar {
    width: 0 !important;
}

ตำแหน่งที่ liaddshapes เป็นชื่อของ div ที่มีการเลื่อน


แสดงปัญหาให้คุณเห็นในซอ
อินเดอร์

1
ง่ายและมีประโยชน์ขอบคุณ! ฉันใช้ {display: none} แทน {width: 0;} และใช้ได้เช่นกัน
Santi Nunez

2
ใช้งานไม่ได้กับ MS Edge หรือ Firefox
Dpedrinha

18

สิ่งนี้ใช้ได้กับฉันข้ามเบราว์เซอร์ อย่างไรก็ตามนี่จะไม่ซ่อนแถบเลื่อนดั้งเดิมบนเบราว์เซอร์มือถือ

ในSCSS

.hide-native-scrollbar {
  scrollbar-width: none; /* Firefox 64 */
  -ms-overflow-style: none; /* Internet Explorer 11 */
  &::-webkit-scrollbar { /** WebKit */
    display: none;
  }
}

ในCSS

.hide-native-scrollbar {
  scrollbar-width: none; /* Firefox 64 */
  -ms-overflow-style: none; /* Internet Explorer 11 */
}
.hide-native-scrollbar::-webkit-scrollbar { /** WebKit */
  display: none;
}

บล็อกซ้อนกัน ( {}) หมายถึงอะไร มันจะตีความอย่างไร และ&? อาจอธิบายรายละเอียดในคำตอบของคุณ?
Peter Mortensen

มันเป็นสิ่งที่ SASS (เห็นได้ชัดน้อยเกินไป): css-tricks.com/the-sass-ampersand
vipatron

@PeterMortensen ฉันเพิ่งเห็นความคิดเห็นของคุณตอนนี้&::-webkit-scrollbarกลายเป็น.hide-native-scrollbar::-webkit-scrollbar { }CSS
Murhaf Sousli

ทำ{ width: 0; height: 0;}เพื่อ :: - webkit-scrollbar แทนdisplay: noneสำหรับ iOS
adriendenat

ใน FF71 จะบล็อคการเลื่อนทั้งหมด
ยีน b

11

ต่อไปนี้ทำงานให้ฉันบน Microsoft, Chrome และ Mozilla สำหรับองค์ประกอบ div ที่ระบุ:

div.rightsidebar {
    overflow-y: auto;
    scrollbar-width: none;
    -ms-overflow-style: none;
}
div.rightsidebar::-webkit-scrollbar { 
    width: 0 !important;
}

โปรดทราบว่าscrollbar-width(FF เท่านั้น) ถูกตั้งค่าสถานะเป็น "ทดลอง"
cimak

ใช่ @cimak แต่ใน FF คุณสามารถซ่อนได้โดยไม่มีปัญหาใด ๆ ดังนั้นจึงเป็นเรื่องจริงที่ใช้สำหรับ Chrome เท่านั้น
Meloman

9

HTML:

<div class="parent">
    <div class="child">
    </div>
</div>

CSS:

.parent{
    position: relative;
    width: 300px;
    height: 150px;
    border: 1px solid black;
    overflow: hidden;
}

.child {
    height: 150px;   
    width: 318px;
    overflow-y: scroll;
}

ใช้ CSS ตามนั้น

ตรวจสอบที่นี่ (ทดสอบใน Internet Explorer และ Firefox)


8

ณ 11 ธันวาคม 2018 (Firefox 64 ขึ้นไป) คำตอบสำหรับคำถามนี้เป็นเรื่องง่ายมากอย่างแน่นอนเป็น Firefox 64+ ตอนนี้ดำเนินการCSS เลื่อนจัดแต่งทรงผมสเปค

เพียงใช้ CSS ต่อไปนี้:

scrollbar-width: none;

Firefox ลิงค์โน้ต 64 การเปิดตัวที่นี่


3
เป็นสิ่งที่ดีมากที่รู้! ดูเหมือนว่าเบราว์เซอร์กำลังก้าวหน้าอย่างแน่นอนฮ่า ๆ !
Oussama el Bachiri

7

ใช้:

CSS

#subparent {
    overflow: hidden;
    width: 500px;
    border: 1px rgba(0, 0, 0, 1.00) solid;
}

#parent {
    width: 515px;
    height: 300px;
    overflow-y: auto;
    overflow-x: hidden;
    opacity: 10%;
}

#child {
    width: 511px;
    background-color: rgba(123, 8, 10, 0.42);
}

HTML

<body>
    <div id="subparent">
        <div id="parent">
            <div id="child">
                <!- Code here for scroll ->
            </div>
        </div>
     </div>
</body>

ไม่แน่ใจว่าทำไมสิ่งนี้ถึงถูกลดระดับลง แต่ฉันเพิ่งอัปเกรดเพราะมันไปในทิศทางที่ถูกต้องโซลูชันอื่น ๆ ใช้งานไม่ได้ในกรณีของฉัน ล้น - x: ซ่อนอยู่; + overflow-y: เลื่อน; เป็นเคล็ดลับอะไรพร้อมกับความกว้าง> 100% (ในกรณีของฉัน 110% ทำงานได้ดีมาก)
dAngelov

1
มันเป็นเช่นเดียวกับการแก้ปัญหา upvoted ที่สุด: พยายามซ่อนแถบเลื่อน นี้ไม่เหมาะเพราะมันแตกต่างกันกับเบราว์เซอร์
MWM

6

ใช้

function reloadScrollBars() {
    document.documentElement.style.overflow = 'auto';  // Firefox, Chrome
    document.body.scroll = "yes"; // Internet Explorer only
}

function unloadScrollBars() {
    document.documentElement.style.overflow = 'hidden';  // firefox, chrome
    document.body.scroll = "no"; // Internet Explorer only
}

เรียกใช้ฟังก์ชันเหล่านี้ในทุกจุดที่คุณต้องการโหลดหรือยกเลิกการโหลดหรือโหลดแถบเลื่อนใหม่ มันยังคงเลื่อนได้ใน Chrome เมื่อฉันทดสอบใน Chrome แต่ฉันไม่แน่ใจเกี่ยวกับเบราว์เซอร์อื่น


6

สิ่งนี้ใช้ได้กับฉัน:

scroll-content {
    overflow-x: hidden;
    overflow-y: scroll;
}

scroll-content::-webkit-scrollbar {
    width: 0;
}

5

บนเบราว์เซอร์สมัยใหม่คุณสามารถใช้wheel event:

// Content is the element you want to apply the wheel scroll effect to
content.addEventListener('wheel', function(e) {
    const step = 100; // How many pixels to scroll

    if (e.deltaY > 0) // Scroll down
        content.scrollTop += step;
    else // Scroll up
        content.scrollTop -= step;
});

นี่คือคำตอบที่ฉันต้องการ ขอบคุณ ฉันใช้overflow: hiddenและรหัสนี้สำหรับmat-card-content(ในเชิงมุม 5) ที่จะเลื่อนและสิ่งเหล่านี้แก้ไขปัญหาของฉัน หมายเหตุ: ฉันใช้e.deltaYเป็นของฉันstepและทำงานเหมือนการเลื่อนตามปกติดังนั้นฉันจึงคิดว่าการเลื่อนตามปกติ แต่ด้วยการซ่อนแถบเลื่อนนี่คือการจับคู่ที่ดีที่สุด
imans77

1
หน้าที่ลิงก์มาที่นี่เตือนว่าวิธีนี้ไม่เหมาะสมหรือ
jnnnnn

5

ปัญหาของฉัน: ฉันไม่ต้องการสไตล์ในเนื้อหา HTML ของฉัน ฉันต้องการให้ร่างกายของฉันเลื่อนได้โดยตรงโดยไม่มีแถบเลื่อนใด ๆ และมีเพียงเลื่อนแนวตั้งเท่านั้นที่ทำงานกับกริด CSSสำหรับทุกขนาดหน้าจอ

กล่องขนาดผลกระทบค่า padding หรือคิดเป็นอัตราการแก้ปัญหาที่พวกเขาทำงานร่วมกับกล่องปรับขนาด: เนื้อหากล่อง

ฉันยังต้องการคำสั่ง "-moz-scrollbars-none" และเช่นเดียวกับ gdoron และ Mr_Green ฉันต้องซ่อนแถบเลื่อน ฉันพยายาม-moz-transformและ-moz-padding-startมีผลกระทบกับ Firefox เท่านั้น แต่มีผลข้างเคียงที่ตอบสนองซึ่งต้องการการทำงานมากเกินไป

วิธีนี้ใช้ได้กับเนื้อหาเนื้อหา HTML ที่มีสไตล์ "display: grid" และตอบสนองได้ดี

/* Hide HTML and body scroll bar in CSS grid context */
html, body {
  position: static; /* Or relative or fixed ... */
  box-sizing: content-box; /* Important for hidding scrollbar */
  display: grid; /* For CSS grid */

  /* Full screen */
  width: 100vw;
  min-width: 100vw;
  max-width: 100vw;
  height: 100vh;
  min-height: 100vh;
  max-height: 100vh;
  margin: 0;
  padding: 0;
}

html {
  -ms-overflow-style: none;  /* Internet Explorer 10+ */
  overflow: -moz-scrollbars-none; /* Should hide the scroll bar */
}

/* No scroll bar for Safari and Chrome */
html::-webkit-scrollbar,
body::-webkit-scrollbar {
  display: none; /* Might be enough */
  background: transparent;
  visibility: hidden;
  width: 0px;
}

/* Firefox only workaround */
@-moz-document url-prefix() {
  /* Make HTML with overflow hidden */
  html {
    overflow: hidden;
  }

  /* Make body max height auto */
  /* Set right scroll bar out the screen  */
  body {
    /* Enable scrolling content */
    max-height: auto;

    /* 100vw +15px: trick to set the scroll bar out the screen */
    width: calc(100vw + 15px);
    min-width: calc(100vw + 15px);
    max-width: calc(100vw + 15px);

    /* Set back the content inside the screen */
    padding-right: 15px;
  }
}

body {
  /* Allow vertical scroll */
  overflow-y: scroll;
}

4

การเพิ่มขยายไปยังด้านในขณะที่คำตอบที่ได้รับการยอมรับในขณะนี้จะไม่ทำงานถ้าด้วยเหตุผลบางอย่างที่คุณต้องการที่จะใช้divbox-model: border-box

สิ่งที่ทำงานในทั้งสองกรณีคือการเพิ่มความกว้างของด้านในdivเป็น 100% บวกกับความกว้างของแถบเลื่อน (สมมติว่าoverflow: hiddenใน div ภายนอก)

ตัวอย่างเช่นใน CSS:

.container2 {
    width: calc(100% + 19px);
}

ใน JavaScript เบราว์เซอร์ข้าม:

var child = document.getElementById('container2');
var addWidth = child.offsetWidth - child.clientWidth + "px";
child.style.width = 'calc(100% + ' + addWidth + ')';

4

นี่คือวิธีที่ฉันทำเพื่อเลื่อนแนวนอน CSS เท่านั้นและทำงานได้ดีกับเฟรมเวิร์กเช่น Bootstrap / col- * มันต้องการเพียงสองพิเศษdivและผู้ปกครองที่มีwidthหรือmax-widthตั้งค่า:

คุณสามารถเลือกข้อความที่จะทำให้มันเลื่อนหรือเลื่อนด้วยนิ้วถ้าคุณมีหน้าจอสัมผัส

.overflow-x-scroll-no-scrollbar {
    overflow: hidden;
}
.overflow-x-scroll-no-scrollbar div {
    overflow-x: hidden;
    margin-bottom: -17px;
    overflow-y: hidden;
    width: 100%;
}
.overflow-x-scroll-no-scrollbar div * {
    overflow-x: auto;
    width: 100%;
    padding-bottom: 17px;
    white-space: nowrap;
    cursor: pointer
}

/* The following classes are only here to make the example looks nicer */
.row {
    width: 100%
}
.col-xs-4 {
    width: 33%;
    float: left
}
.col-xs-3 {
    width:25%;
    float:left
}
.bg-gray {
    background-color: #DDDDDD
}
.bg-orange {
    background-color:#FF9966
}
.bg-blue {
    background-color: #6699FF
}
.bg-orange-light{
    background-color: #FFAA88
}
.bg-blue-light{
    background-color: #88AAFF
}
<html><body>
  <div class="row">
    <div class="col-xs-4 bg-orange">Column 1</div>
    <div class="col-xs-3 bg-gray">Column 2</div>
    <div class="col-xs-4 bg-blue">Column 3</div>
  </div>
  <div class="row">
    <div class="col-xs-4 bg-orange-light">Content 1</div>
    <div class="col-xs-3 overflow-x-scroll-no-scrollbar">
      <div>
        <div>This content too long for the container, so it needs to be hidden but scrollable without scrollbars</div>
      </div>
    </div>
    <div class="col-xs-4 bg-blue-light">Content 3</div>
  </div>
</body></html>

เวอร์ชั่นสั้นสำหรับคนขี้เกียจ:

.overflow-x-scroll-no-scrollbar {
    overflow: hidden;
}
.overflow-x-scroll-no-scrollbar div {
  overflow-x: hidden;
  margin-bottom: -17px;
  overflow-y: hidden;
  width: 100%;
}
.overflow-x-scroll-no-scrollbar div * {
  overflow-x: auto;
  width: 100%;
  padding-bottom: 17px;
  white-space: nowrap;
  cursor:pointer
}

/* The following classes are only here to make the example looks nicer */
.parent-style {
    width: 100px;
    background-color: #FF9966
}
<div class="parent-style overflow-x-scroll-no-scrollbar">
  <div>
    <div>This content too long for the container, so it needs to be hidden but scrollable without scrollbars</div>
  </div>
</div>


ขอบคุณฉันพยายามมันใช้งานได้ดี สิ่งหนึ่งที่ดีกว่าคือเปลี่ยนmargin-bottomเป็นpadding-bottomแต่มีค่าเท่ากัน สิ่งนี้จะไม่กินพื้นที่ด้านล่างสำหรับองค์ประกอบที่ด้านล่าง มันป้องกันการทับซ้อนกัน
haxpor

@haxpor The margin-bottomเป็นค่าลบฉันคิดว่าไม่สามารถเปลี่ยนเป็น a padding-bottomที่ไม่สามารถจัดการค่าลบได้
Jean

4

สไตล์SASSต่อไปนี้ควรทำให้แถบเลื่อนของคุณโปร่งใสในเบราว์เซอร์ส่วนใหญ่ (ไม่รองรับ Firefox):

.hide-scrollbar {
  scrollbar-width: thin;
  scrollbar-color: transparent transparent;

  &::-webkit-scrollbar {
    width: 1px;
  }

  &::-webkit-scrollbar-track {
    background: transparent;
  }

  &::-webkit-scrollbar-thumb {
    background-color: transparent;
  }
}

3

ฉันลองใช้วิธีแก้ไขปัญหาข้างต้นในโครงการของฉันและด้วยเหตุผลบางอย่างฉันไม่สามารถซ่อนแถบเลื่อนเนื่องจากการวางตำแหน่ง div ดังนั้นฉันจึงตัดสินใจซ่อนแถบเลื่อนโดยแนะนำ div ที่ครอบคลุมมันอย่างเผินๆ ตัวอย่างด้านล่างสำหรับแถบเลื่อนแนวนอน:

<div id="container">
  <div id="content">
     My content that could overflow horizontally
  </div>
  <div id="scroll-cover">
     &nbsp; 
  </div>
</div>

CSS ที่สอดคล้องกันมีดังนี้:

#container{
   width: 100%;
   height: 100%;
   overflow: hidden;
   position: relative;
}

#content{
  width: 100%;
  height: 100%;
  overflow-x: scroll;
}
#scroll-cover{
  width: 100%;
  height: 20px;
  position: absolute;
  bottom: 0;
  background-color: #fff; /*change this to match color of page*/
}

3

นี่จะอยู่ที่ร่างกาย:

<div id="maincontainer" >
<div id="child">this is the 1st step</div>
<div id="child">this is the 2nd step</div>
<div id="child">this is the 3rd step</div>

และนี่คือ CSS:

#maincontainer
{
    background: grey;
    width: 101%;
    height: 101%;
    overflow: auto;
    position: fixed;
}

#child
{
    background: white;
    height:500px;
}

3

นี่เป็นวิธีแก้ปัญหา divitis-esque ซึ่งควรใช้ได้กับทุกเบราว์เซอร์ ...

มาร์กอัปมีดังต่อไปนี้และจำเป็นต้องอยู่ภายในบางสิ่งบางอย่างที่มีตำแหน่งสัมพัทธ์ (และควรตั้งค่าความกว้างของมันเช่น 400 พิกเซล):

<div class="hide-scrollbar">
    <div class="scrollbar">
        <div class="scrollbar-inner">

        </div>
    </div>
</div>

CSS:

.hide-scrollbar {
    overflow: hidden;
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}

.scrollbar {
    overflow-y: scroll;
    position: absolute;
    top: 0;
    left: 0;
    right: -50px;
    bottom: 0;
}

.scrollbar-inner {
    width: 400px;
}

3

perfect-scrollbarปลั๊กอินน่าจะเป็นวิธีที่จะไปดู: https://github.com/noraesae/perfect-scrollbar

เป็นโซลูชั่นที่ใช้เอกสาร JavaScript ที่ครบถ้วนและสมบูรณ์สำหรับปัญหาการเลื่อน

หน้าสาธิต: http://noraesae.github.io/perfect-scrollbar/


2
ฉันไม่เห็นว่าสิ่งนี้เกี่ยวข้องกับคำถามได้อย่างไร
Chris Nevill

3
รับการจ้องมองที่แถบเลื่อนที่สมบูรณ์แบบเป็นเวลา 2 นาทีโดยไม่ต้องเปิดเผยวิธีใช้เพื่อซ่อนแถบเลื่อนทันที หากคุณต้องการขยายคำตอบของคุณในหัวข้อนั้นฉันมั่นใจว่าคุณจะได้รับการอัปโหลดมากขึ้น
Christiaan Westerbeek

2

วิธีการแฮ็กอีกประเภทหนึ่งคือทำoverflow-y: hiddenแล้วเลื่อนองค์ประกอบด้วยตนเองดังนี้:

function detectMouseWheelDirection(e) {
  var delta = null, direction = false;
  if (!e) { // If the event is not provided, we get it from the window object
    e = window.event;
  }
  if (e.wheelDelta) { // Will work in most cases
    delta = e.wheelDelta / 60;
  } else if (e.detail) { // Fallback for Firefox
    delta = -e.detail / 2;
  }
  if (delta !== null) {
    direction = delta > 0 ? -200 : 200;
  }
  return direction;
}

if (element.addEventListener) {
  element.addEventListener('DOMMouseScroll', function(e) {
    element.scrollBy({
      top: detectMouseWheelDirection(e),
      left: 0,
      behavior: 'smooth'
    });
  });
}

มีบทความที่ดีเกี่ยวกับวิธีตรวจจับและจัดการกับonmousewheelเหตุการณ์ในบล็อกของ deepmikoto สิ่งนี้อาจได้ผลสำหรับคุณ แต่ก็ไม่ใช่วิธีแก้ไขปัญหาที่ชัดเจน


2

ฉันแค่ต้องการแชร์ตัวอย่างรวมเพื่อซ่อนแถบเลื่อนที่ฉันใช้เมื่อพัฒนา มันเป็นคอลเลกชันของตัวอย่างเล็ก ๆ ที่พบบนอินเทอร์เน็ตที่เหมาะกับฉัน:

.container {
    overflow-x: scroll; /* For horiz. scroll, otherwise overflow-y: scroll; */

    -ms-overflow-style: none;
    overflow: -moz-scrollbars-none;
    scrollbar-width: none;
}


.container::-webkit-scrollbar {
    display: none;  /* Safari and Chrome */
}

2

คุณสามารถใช้รหัสด้านล่างเพื่อซ่อนแถบเลื่อน แต่ในขณะที่ยังสามารถเลื่อนได้:

.element::-webkit-scrollbar { 
    width: 0 !important 
}

2

ในการซ่อนแถบเลื่อนสำหรับองค์ประกอบที่มีการใช้เนื้อหามากเกินไป

.div{

  scrollbar-width: none; /* The most elegant way for Firefox */

}    

การสนับสนุนไม่มีอยู่จริงยกเว้นสำหรับ FF ตามที่คุณกล่าวถึงมีน้อยเกินไปสำหรับสิ่งที่ OP ร้องขอ ตรวจสอบcaniuse.com/#feat=mdn-css_properties_scrollbar-width
Adrien

@Adrien ดีคำถามเดิมระบุว่าพวกเขามีทางออกสำหรับเบราว์เซอร์อื่น ๆ (แต่ Mozilla Firefox และ Internet Explorer ดูเหมือนจะไม่ทำงานอย่างนั้น) เขาบอกว่านั่นเป็นเหตุผลที่ฉันให้โซลูชัน Firefox
Alvin Moyo

ฉันพบว่าสิ่งนี้ทำงานได้ดีเมื่อรวมกับสิ่งที่เทียบเท่า: div :: - webkit-scrollbar {display: none; } สำหรับ Webkit / Chrome
Sean Halls

1

อีกเรื่องง่ายที่ทำงาน :

#maincontainer {
    background: orange;
    width: 200px;
    height: 200px;
    overflow: hidden;
}

#childcontainer {
    background: yellow;
    position: relative;
    width: 200px;
    height: 200px;
    top: 20px;
    left: 20px;
    overflow: auto;
}

โอเวอร์โฟลว์ที่ซ่อนอยู่ในคอนเทนเนอร์หลักและโอเวอร์โฟลว์อัตโนมัติบนคอนเทนเนอร์ย่อย ง่าย


สิ่งนี้ไม่ได้ซ่อนแถบเลื่อน แต่มันดันออกจากมุมมองด้วยค่า "ซ้าย"
robertmiles3

@ robertmiles3 ไม่เหมือนกันเหรอ? การซ่อนและไม่สามารถดูได้
ไบรอันวิลลิส

1
@ robertmiles3 คำตอบที่เลือกไว้ด้านบนทำสิ่งเดียวกันจากด้านขวา ดูเหมือนว่าโซลูชันทั้งหมดจะแฮ็คจนกว่า FIrefox จะตัดสินใจอนุญาตให้ CSS ซ่อนแถบเลื่อนอีกครั้ง blogs.msdn.com/b/kurlak/archive/2013/11/03/…
geoyws

ฉันต้องยอมรับ นี่เป็นวิธีการแก้ปัญหาที่คล้ายกันซึ่งเสนอโดยคำตอบที่ยอมรับ ถ้ามันใช้งานได้ผล upvoted
JSON

1

โซลูชันที่ซับซ้อนนี้ทำงานได้แม้บนเว็บเบราว์เซอร์ IE เก่า

มันเป็นวิธีแก้ปัญหาสำหรับ [ แถบเลื่อนแนวตั้ง ]

<html>
<head>
<style>
html,body{
         overflow:-moz-scrollbars-vertical;
         overflow-x:hidden;
         overflow-y:hidden;
         height:100%;
         margin:0 0 0 0
         }
</style>
</head>
<body id=body
      style="overflow:auto;
             height:100%" 
      onload="document.getElementById('body').style.width=document.body.offsetWidth+20+'px'">
//your stuff here
</body> 
</html>

แค่ลองดู: jsfiddle


0

เพียงแค่ตั้งค่าความกว้างของความกว้างของเด็กเป็น 100%, padding เป็น 15 พิกเซลoverflow-xเพื่อเลื่อนและoverflow:hiddenสำหรับผู้ปกครองและความกว้างที่คุณต้องการ

มันทำงานได้อย่างสมบูรณ์บนเบราว์เซอร์หลักทั้งหมดรวมถึง Internet Explorer และ Edge ยกเว้น Internet Explorer 8 และต่ำกว่า

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