CSS tràn-x: hiển thị; và tràn-y: ẩn; gây ra sự cố thanh cuộn


455

Giả sử bạn có một số phong cách và đánh dấu:

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>

Khi bạn xem điều này. Thanh <ul>có một thanh cuộn ở phía dưới mặc dù tôi đã chỉ định các giá trị hiển thị và ẩn cho tràn x / y.

(quan sát trên Chrome 11 và opera (?))

Tôi đoán phải có một số thông số w3c hoặc một cái gì đó nói điều này xảy ra nhưng đối với cuộc sống của tôi, tôi không thể tìm ra lý do tại sao.

Câu đố

CẬP NHẬT: - Tôi tìm thấy một cách để đạt được kết quả tương tự bằng cách thêm một yếu tố khác bao quanh ul. Kiểm tra nó ra.


Kết quả mong muốn của bạn là gì? jsfiddle.net/Kyle_Sevenoaks/3xv6A/2
Kyle

@ Kyle nó nên nhìn nhiều hơn một chút như: jsfiddle.net/3xv6A/5 Thật không may nếu tôi đặt overflow-x hidden;nó loại bỏ các cuộn nhưng như tôi cần các yếu tố li giấu biên giới ở phía dưới để nó mang lại cho rằng ảnh hưởng tiêu tan mong muốn. Tôi không hiểu tại sao overflow-x: visibletạo một thanh cuộn. Nó không nên afaik.
James Khoury

@JamesKhoury bạn có thể giải thích một chút trong giải pháp của mình không? Tôi thực sự không thể làm cho nó hoạt động
George Katsanos

1
@GeorgeKatsanos Cách giải quyết: jsfiddle.net/3xv6A/9 phụ thuộc vào việc con người mẹ overflow: hidden;và một đứa trẻ chèn xung quanh <ul>hạnh phúc overflow: visible.
James Khoury

@JamesKhoury Bạn có nghĩ rằng nó có thể hoạt động cho embed.plnkr.co/2rbaISwvzuKhyPEFpBKD
George Katsanos

Câu trả lời:


680

Sau khi tìm kiếm nghiêm túc, có vẻ như tôi đã tìm thấy câu trả lời cho câu hỏi của mình:

từ: http://www.brunasy.org/test/Overflowxy2.html

Trong Gecko, Safari, Opera, 'hiển thị' cũng trở thành 'tự động' khi được kết hợp với 'ẩn' (nói cách khác: 'hiển thị' trở thành 'tự động' khi được kết hợp với bất kỳ thứ gì khác với 'hiển thị'). Gecko 1.8, Safari 3, Opera 9.5 khá nhất quán trong số đó.

thông số W3C cũng nói:

Các giá trị được tính toán của 'overflow-x' và 'overflow-y' giống như các giá trị được chỉ định của chúng, ngoại trừ một số kết hợp với 'thấy được' là không thể: nếu một được chỉ định là 'hiển thị' và cái còn lại là 'cuộn' hoặc 'tự động', sau đó 'hiển thị' được đặt thành 'tự động'. Giá trị tính toán của 'tràn' bằng với giá trị được tính của 'tràn-x' nếu 'tràn-y' là như nhau; mặt khác, đó là cặp giá trị được tính toán của 'overflow-x' và 'overflow-y'.

Phiên bản ngắn:

Nếu bạn đang sử dụng visiblecho một trong hai overflow-xhoặc overflow-ymột cái gì đó ngoài visiblecái khác, visiblegiá trị được hiểu là auto.


263
Tôi hiểu rằng W3C chỉ định nó theo cách này, nhưng động lực đằng sau nó là gì? Tôi thấy hành vi này khá kỳ lạ và không nhất quán, dẫn đến những công việc lộn xộn đòi hỏi phải thêm các yếu tố HTML tầm thường.
Erwin

21
@Erwin Tôi đồng ý, Hy vọng ai đó quyết định cập nhật thông số.
James Khoury

124
Bạn đúng nhưng nó không có ý nghĩa. Lý do phổ biến nhất mà bạn thậm chí muốn x và y là vì vậy bạn có thể ẩn cái này và cái kia hiển thị.
cứu hộ

91
Đây là làm tê liệt. Tại sao chúng ta không thể cho phép overflow-x:visibletrong khi overflow-y:hiddenkhông có hack cha / con? Khá đẹp, IMO.
Slink

34
Điều này là hoàn toàn tê liệt. Tôi đã cố gắng tạo ra một loạt các liên kết thả xuống trong một thanh điều hướng Bootstrap theo chiều ngang, nhưng điều đó phá vỡ các liên kết thả xuống, dựa vào đó overflow-y: visible. Boo CSS!
Andy

131

một hack giá rẻ khác, dường như thực hiện thủ thuật:

style="padding-bottom: 250px; margin-bottom: -250px;"trên phần tử mà phần tràn dọc đang bị cắt, với 250đại diện là bao nhiêu pixel bạn cần cho trình đơn thả xuống của mình, v.v.


6
cảm ơn rất nhiều, mặc dù điều này cảm thấy khó khăn, nhưng dường như là cách tốt nhất để giải quyết vấn đề. Tràn ngập quá khủng khiếp trong css :(
Serge Eremeev

11
Điều này làm cho thanh cuộn ngang xuất hiện ở phía xa
nafg

2
Điều này cũng chặn các sự kiện con trỏ cho 250px bên dưới phần tử. Nhưng tôi đã tìm ra cách giải quyết vấn đề đó và giải pháp này là những gì tôi đang sử dụng.
Chris Chudzicki

2
2 năm sau và đây dường như vẫn là câu trả lời tốt nhất cho vấn đề này ... Hy vọng với một trình duyệt khác (Microsoft Edge) hy vọng vào dự án nguồn mở Chromium, chúng ta sẽ thấy sự phát triển nhanh hơn của các tính năng trình duyệt cũng như trình duyệt tốt hơn khả năng tương thích.
Spencer O'Reilly

Trong kịch bản cụ thể của tôi, khi không thể loại bỏ position: relativehoặc sử dụng trình bao bọc, đây là giải pháp duy nhất có hiệu quả, mặc dù nó cũng yêu cầu thêm rất nhiều lợi nhuận xấu cho các phần tử con bên trong phần tử mà tôi muốn cài đặt overflow-x: hiddenđể bù đắp cho vụ hack đệm. Điều này đã cứu tôi, mặc dù, vì vậy cảm ơn!
Philip Stratford

81

Ban đầu tôi đã tìm thấy một cách CSS để bỏ qua điều này khi sử dụng plugin Chu kỳ jQuery. Chu kỳ sử dụng JavaScript để đặt trang chiếu của tôi thành overflow: hidden, vì vậy khi đặt hình ảnh của tôi width: 100%thành hình ảnh sẽ bị cắt theo chiều dọc, và vì vậy tôi buộc chúng phải hiển thị cùng !importantvà để tránh hiển thị hình ảnh động ra khỏi hộp tôi đặt overflow: hiddenvào div container của cầu trượt. Hi vọng nó sẽ giúp ích cho bạn.

CẬP NHẬT - Giải pháp mới:

Vấn đề ban đầu -> http://jsfiddle.net/xMddf/1/ (Ngay cả khi tôi sử dụng, overflow-y: visiblenó sẽ trở thành "tự động" và thực sự là "cuộn".)

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

Giải pháp mới -> http://jsfiddle.net/xMddf/2/ (Tôi đã tìm thấy một cách giải quyết bằng cách sử dụng div trình bao bọc để áp dụng overflow-xoverflow-ycho các phần tử DOM khác nhau như James Khoury đã khuyên về vấn đề kết hợp visiblehiddenvới một phần tử DOM duy nhất.)

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

12
Làm thế nào để áp dụng này? Nó dường như không hoạt động trên overflow-x hoặc overflow-y.
James Khoury

1
@Macumbaomuetre Điều đó rõ ràng hơn, cảm ơn bạn +1. Nó tương tự như "cập nhật" tôi đã thêm. Ban đầu tôi không thể thay đổi div gói và giải pháp của tôi đã kết thúc tương tự như: jsfiddle.net/3xv6A/338
James Khoury

9
Giải pháp này không áp dụng. Câu hỏi là overflow-x:visible;overflow-y:hidden. Không phải hướng ngược lại.
Jakobovski

1
@TomasJansson @Edward Nó không làm việc, bạn chỉ cần hoán đổi nơi bạn áp dụng overflow-x-y: fiddle cập nhật .
Chỉ là học sinh

1
điều này không thành công ngay khi trình bao bọc tăng chiều rộng vì một số lý do - jsfiddle.net/ad1941k9/16
David Meister

10

Tôi đã gặp phải vấn đề này khi cố gắng xây dựng một thanh bên được định vị cố định với cả nội dung có thể cuộn theo chiều dọc và trẻ em được định vị tuyệt đối lồng nhau sẽ được hiển thị bên ngoài ranh giới của thanh bên .

Cách tiếp cận của tôi bao gồm áp dụng riêng:

  • một thuộc overflow: visibletính cho phần tử thanh bên
  • một thuộc overflow-y: autotính để bọc bên trong sidebar

Vui lòng kiểm tra ví dụ dưới đây hoặc một codepen trực tuyến .

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
Tôi khá chắc chắn rằng đây là giải pháp tương tự như những người khác đã trình bày ngoại trừ autothay vì hidden.
James Khoury

@JamesKhoury Nhưng đây là điều duy nhất tôi có thể hiểu được vì nó chỉ ra cách sử dụngposition
Guichi

7

Tôi đã sử dụng content+wrappercách tiếp cận ... nhưng tôi đã làm một cái gì đó khác với đề cập cho đến nay: Tôi chắc chắn rằng ranh giới của trình bao bọc của tôi KHÔNG phù hợp với ranh giới của nội dung theo hướng mà tôi muốn hiển thị .

Chú ý quan trọng: Đó là dễ dàng, đủ để có được content+wrapper, same-boundscách tiếp cận để làm việc trên một trình duyệt này hay cách khác tùy thuộc vào sự kết hợp css hình position, overflow-*, vv ... nhưng tôi không bao giờ có thể sử dụng cách tiếp cận để có được chúng tất cả đúng (Edge, Chrome, Safari,. ..).

Nhưng khi tôi có một cái gì đó như:

  <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>

... Tất cả các trình duyệt đều hạnh phúc.


6

Hiện tại có một cách mới để giải quyết vấn đề này - nếu bạn loại bỏ vị trí: tương đối khỏi vùng chứa cần hiển thị tràn-y, bạn có thể ẩn tràn-y và ẩn tràn-x, và ngược lại (có tràn- x ẩn và tràn-y, chỉ cần đảm bảo rằng thùng chứa với thuộc tính hiển thị không được định vị tương đối).

Xem bài đăng này từ Thủ thuật CSS để biết thêm chi tiết - nó hoạt động với tôi: https://css-tricks.com/popping-hidden-overflow/


2
nhưng điều đó sẽ yêu cầu một số javascript để định vị chính xác phần tử nếu nó là tuyệt đối
gaurav5430
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.