CSS overflow-x: มองเห็นได้; และล้น -y: ซ่อนอยู่; ทำให้เกิดปัญหาแถบเลื่อน


455

สมมติว่าคุณมีสไตล์และมาร์กอัป:

ul
{
  white-space: nowrap;
  overflow-x: visible;
  overflow-y: hidden;
/* added width so it would work in the snippet */
  width: 100px; 
}
li
{
  display: inline-block;
}
<div>
  <ul>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
  </ul>
</div>

เมื่อคุณดูสิ่งนี้ <ul>มีแถบเลื่อนที่ด้านล่างแม้ว่าฉันได้ระบุค่าที่มองเห็นและซ่อนสำหรับล้น Y / X

(พบใน Chrome 11 และ Opera (?))

ฉันเดาว่าต้องมีคุณสมบัติของ w3c หรือบางอย่างที่บอกว่าจะเกิดขึ้น แต่สำหรับชีวิตของฉันฉันไม่สามารถหาสาเหตุได้

JSFiddle

UPDATE: -ulผมพบว่าวิธีการที่จะบรรลุผลเดียวกันโดยการเพิ่มองค์ประกอบอื่นห่อรอบที่ ลองดูสิ


ผลลัพธ์ที่คุณต้องการคืออะไร jsfiddle.net/Kyle_Sevenoaks/3xv6A/2
Kyle

@ ไคล์มันควรมีลักษณะมากกว่านี้: jsfiddle.net/3xv6A/5โชคไม่ดีถ้าฉันตั้งoverflow-x hidden;มันเอาการเลื่อน แต่เนื่องจากฉันต้องการองค์ประกอบ li เพื่อซ่อนเส้นขอบที่ด้านล่างจึงให้ผลประที่ต้องการ ฉันไม่ uderstand ทำไมoverflow-x: visibleสร้างแถบเลื่อน มันไม่ควร afaik
James Khoury

@JamesKhoury คุณสามารถอธิบายเพิ่มเติมเล็กน้อยในโซลูชันของคุณได้หรือไม่ ฉันไม่สามารถทำงานให้เป็นจริงได้
George Katsanos

1
@GeorgeKatsanos วิธีแก้ปัญหา: jsfiddle.net/3xv6A/9ขึ้นอยู่กับผู้ปกครองoverflow: hidden;และเด็กแทรกรอบสิ่ง<ul>มีoverflow: visibleชีวิต
James Khoury

@JamesKhoury คุณคิดว่ามันสามารถใช้งานได้กับembed.plnkr.co/2rbaISwvzuKhyPEFpBKD
George Katsanos

คำตอบ:


681

หลังจากค้นหาอย่างจริงจังดูเหมือนว่าฉันได้พบคำตอบสำหรับคำถามของฉัน:

จาก: http://www.brunildo.org/test/Overflowxy2.html

ใน Gecko, Safari, Opera, 'visible' จะกลายเป็น 'auto' และเมื่อรวมกับ 'hidden' (กล่าวอีกนัยหนึ่ง: 'visible' จะกลายเป็น 'auto' เมื่อรวมกับสิ่งอื่นที่แตกต่างจาก 'visible') Gecko 1.8, Safari 3, Opera 9.5 ค่อนข้างสอดคล้องกันในหมู่พวกเขา

นอกจากนี้ยังมีข้อมูลจำเพาะ W3Cพูดว่า:

ค่าที่คำนวณได้ของ 'overflow-x' และ 'overflow-y' นั้นเหมือนกับค่าที่ระบุยกเว้นว่าจะไม่สามารถใช้ชุดค่าผสมที่มี 'visible' ได้: หากมีการระบุเป็น 'visible' และอีกอันคือ 'scroll' หรือ 'อัตโนมัติ' จากนั้น 'มองเห็น' ถูกตั้งค่าเป็น 'อัตโนมัติ' ค่าที่คำนวณได้ของ 'overflow' มีค่าเท่ากับค่าที่คำนวณได้ของ 'overflow-x' หาก 'overflow-y' เหมือนกัน มิฉะนั้นจะเป็นคู่ของค่าที่คำนวณได้ของ 'overflow-x' และ 'overflow-y'

เวอร์ชั่นสั้น:

หากคุณกำลังใช้visibleอย่างใดอย่างหนึ่งoverflow-xหรือoverflow-yและสิ่งอื่น ๆ กว่าvisibleอื่น ๆ ที่คุ้มค่าถูกตีความว่าเป็นvisibleauto


264
ฉันเข้าใจว่า W3C ระบุด้วยวิธีนี้ แต่แรงจูงใจเบื้องหลังคืออะไร ฉันพบว่ามันค่อนข้างแปลกและไม่สอดคล้องกันส่งผลให้เกิดการทำงานยุ่ง ๆ ซึ่งต้องเพิ่มองค์ประกอบ HTML เล็กน้อย
เออร์วิน

21
@ เออร์วินฉันเห็นด้วยหวังว่ามีคนตัดสินใจที่จะอัปเดตข้อมูลจำเพาะ
James Khoury

125
คุณพูดถูก แต่มันก็ไม่สมเหตุสมผล สาเหตุที่พบบ่อยที่สุดที่คุณต้องการแม้กระทั่ง x และ y ก็คือคุณสามารถซ่อนสิ่งหนึ่งและอีกอันไว้ได้
rescuecreative

91
นี่คือการทำให้หมดอำนาจ เหตุใดเราไม่อนุญาตoverflow-x:visibleในระหว่างที่overflow-y:hiddenไม่มีการแฮ็กผู้ปกครอง / เด็ก สวยสองชั้น IMO
Slink

34
นี่เป็นสิ่งที่ทำให้หมดอำนาจอย่างสิ้นเชิง ผมพยายามที่จะทำให้พวงของการเชื่อมโยงแบบเลื่อนลงใน Bootstrap navbar เลื่อนในแนวนอน overflow-y: visibleแต่ที่แบ่งเมนูแบบเลื่อนลงซึ่งพึ่งพา Boo CSS!
Andy

131

การแฮ็กราคาถูกอีกอันซึ่งดูเหมือนจะหลอกลวง:

style="padding-bottom: 250px; margin-bottom: -250px;"ในองค์ประกอบที่การโอเวอร์โฟลว์แนวตั้งได้รับการตัดออกโดยมี250พิกเซลมากเท่าที่คุณต้องการสำหรับดรอปดาวน์ ฯลฯ


6
ขอบคุณมากแม้ว่าจะรู้สึกแฮ็ค แต่ดูเหมือนจะเป็นวิธีที่ดีที่สุดในการแก้ปัญหา มีจำนวนมากล้นใน css :(
Serge Eremeev

11
ทำให้แถบเลื่อนแนวนอนปรากฏว่าไกลมาก
nafg

2
นอกจากนี้ยังบล็อกกิจกรรมตัวชี้สำหรับ 250px ด้านล่างองค์ประกอบ แต่ฉันพบวิธีแก้ไขปัญหานี้และวิธีนี้คือสิ่งที่ฉันใช้
Chris Chudzicki

2
2 ปีต่อมาและนี่ยังคงเป็นคำตอบที่ดีที่สุดสำหรับปัญหานี้ ... หวังว่าจะมีเบราว์เซอร์อื่น (Microsoft Edge) กระโดดบน Chromium โอเพ่นซอร์สโปรเจ็กต์เราจะเห็นการพัฒนาคุณลักษณะเบราว์เซอร์ที่รวดเร็วขึ้น ความเข้ากันได้
Spencer O'Reilly

ในสถานการณ์เฉพาะของฉันที่ไม่สามารถลบposition: relativeหรือใช้ wrappers ได้นี่เป็นทางออกเดียวที่ใช้ได้แม้ว่าจะต้องเพิ่มระยะขอบที่น่าเกลียดให้กับองค์ประกอบลูกในองค์ประกอบที่ฉันต้องการตั้งค่าoverflow-x: hiddenเพื่อชดเชยการแฮ็ก การขยายความ. สิ่งนี้ช่วยฉันได้ แต่ขอบคุณมาก!
Philip Stratford

81

ฉันพบวิธี CSS ในการเลี่ยงสิ่งนี้เมื่อใช้ปลั๊กอิน Cycle jQuery Cycle ใช้ JavaScript เพื่อตั้งค่าสไลด์ของฉันoverflow: hiddenดังนั้นเมื่อตั้งค่ารูปภาพของฉันwidth: 100%เป็นรูปภาพจะดูตัดในแนวตั้งและดังนั้นฉันบังคับให้พวกเขามองเห็นได้ด้วย!importantและเพื่อหลีกเลี่ยงการแสดงภาพเคลื่อนไหวสไลด์ออกจากกล่องที่ฉันตั้งไว้overflow: hiddenในคอนเทนเนอร์ div ของ สไลด์ หวังว่ามันจะเหมาะกับคุณ

อัพเดท - โซลูชั่นใหม่:

ปัญหาดั้งเดิม -> http://jsfiddle.net/xMddf/1/ (แม้ว่าฉันoverflow-y: visibleจะใช้มันกลายเป็น "อัตโนมัติ" และ "เลื่อน" จริง ๆ )

#content {
    height: 100px;
    width: 200px;
    overflow-x: hidden;
    overflow-y: visible;
}

วิธีแก้ปัญหาใหม่ -> http://jsfiddle.net/xMddf/2/ (ฉันพบวิธีแก้ปัญหาโดยใช้wrapper div เพื่อนำไปใช้overflow-xและoverflow-yองค์ประกอบ DOM ต่าง ๆ ตามที่James Khouryแนะนำเกี่ยวกับปัญหาการรวมvisibleและhiddenองค์ประกอบ DOM เดียว)

#wrapper {
    height: 100px;
    overflow-y: visible;
}
#content {
    width: 200px;
    overflow-x: hidden;
}

12
สิ่งนี้มีผลอย่างไร ดูเหมือนว่าจะไม่ทำงานกับ overflow-x หรือ overflow-y
James Khoury

1
@Macumbaomuetre นั่นชัดเจนยิ่งขึ้นขอบคุณ +1 มันคล้ายกับ "อัพเดท" ฉันเพิ่ม เดิมทีฉันไม่สามารถแก้ไข div การห่อและวิธีการแก้ปัญหาของฉันก็คล้ายกับ: jsfiddle.net/3xv6A/338
James Khoury

9
วิธีนี้ใช้ไม่ได้ คำถามคือและoverflow-x:visible; overflow-y:hiddenไม่ใช่วิธีอื่น ๆ
Jakobovski

1
@TomasJansson @Edward มันไม่ทำงานคุณเพียงแค่ต้องแลกเปลี่ยนที่คุณใช้overflow-xและ-y: ซออัปเดต
แค่นักเรียน

1
สิ่งนี้จะล้มเหลวทันทีที่เสื้อคลุมได้รับความกว้างด้วยเหตุผลบางอย่าง - jsfiddle.net/ad1941k9/16
David Meister

10

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

วิธีการของฉันประกอบด้วยการใช้แยกต่างหาก:

  • overflow: visibleคุณสมบัติองค์ประกอบแถบด้านข้าง
  • overflow-y: autoคุณสมบัติการ sidebar ห่อหุ้มภายใน

กรุณาตรวจสอบตัวอย่างด้านล่างหรือcodepen ออนไลน์

html {
  min-height: 100%;
}
body {
  min-height: 100%;
  background: linear-gradient(to bottom, white, DarkGray 80%);
  margin: 0;
  padding: 0;
}

.sidebar {
  position: fixed;
  top: 0;
  right: 0;
  height: 100%;
  width: 200px;
  overflow: visible;  /* Just apply overflow-x */
  background-color: DarkOrange;
}

.sidebarWrapper {
  padding: 10px;
  overflow-y: auto;   /* Just apply overflow-y */
  height: 100%;
  width: 100%;
}

.element {
  position: absolute;
  top: 0;
  right: 100%;
  background-color: CornflowerBlue;
  padding: 10px;
  width: 200px;
}
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
<div class="sidebar">
  <div class="sidebarWrapper">
    <div class="element">
      I'm a sidebar child element but I'm able to horizontally overflow its boundaries.
    </div>
    <p>This is a 200px width container with optional vertical scroll.</p>
    <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
  </div>
</div>


2
ผมค่อนข้างมั่นใจว่านี่เป็นวิธีการแก้ปัญหาเช่นเดียวกับคนอื่น ๆ ได้นำเสนอยกเว้นแทนauto hidden
James Khoury

@JamesKhoury แต่อันนี้เป็นสิ่งเดียวที่ฉันสามารถเข้าใจเพราะมันชี้ให้เห็นการใช้งานของposition
Guichi

7

ผมใช้content+wrapperวิธี ... แต่ผมทำอะไรที่แตกต่างจากที่กล่าวถึงเพื่อให้ห่างไกล: ผมทำให้แน่ใจว่าขอบเขตเสื้อคลุมของฉันไม่ไม่สอดคล้องกับขอบเขตของเนื้อหาในทิศทางที่ผมอยากที่จะมองเห็น

หมายเหตุสำคัญ: มันเป็นเรื่องง่ายพอที่จะรับcontent+wrapper, same-boundsแนวทางการทำงานในเบราว์เซอร์เดียวหรืออื่นขึ้นอยู่กับการรวมกัน CSS ต่างๆposition, overflow-*ฯลฯ ... แต่ผมไม่เคยใช้วิธีการที่จะรับพวกเขาทั้งหมดที่ถูกต้อง (ขอบ Chrome, Safari, .. )

แต่เมื่อฉันมีสิ่งที่ชอบ:

  <div id="hack_wrapper" // created solely for this purpose
       style="position:absolute; width:100%; height:100%; overflow-x:hidden;">
      <div id="content_wrapper"
           style="position:absolute; width:100%; height:15%; overflow:visible;">         
          ... content with too-much horizontal content ... 
      </div>
  </div>

... เบราว์เซอร์ทั้งหมดมีความสุข


6

ขณะนี้มีวิธีการใหม่ในการแก้ไขปัญหานี้ - หากคุณลบตำแหน่ง: สัมพันธ์กับคอนเทนเนอร์ที่ต้องการให้มองเห็น overflow-y คุณสามารถเปิดดู overflow-y และ overflow-x ที่ซ่อนอยู่และในทางกลับกัน (มีส่วนเกิน - x มองเห็นและซ่อนไว้ล้นให้ตรวจสอบให้แน่ใจว่าคอนเทนเนอร์ที่มีคุณสมบัติที่มองเห็นไม่ได้อยู่ในตำแหน่งที่ค่อนข้าง)

ดูโพสต์นี้จากเคล็ดลับ CSS สำหรับรายละเอียดเพิ่มเติม - มันใช้ได้สำหรับฉัน: https://css-tricks.com/popping-hidden-overflow/


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