CSS overflow-x: terlihat; dan overflow-y: disembunyikan; menyebabkan masalah scrollbar

455

Misalkan Anda memiliki beberapa gaya dan markup:

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>

Ketika Anda melihat ini. The <ul>memiliki scroll bar di bagian bawah meskipun saya sudah ditentukan nilai-nilai terlihat dan tersembunyi untuk overflow x / y.

(diamati pada Chrome 11 dan opera (?))

Saya menduga pasti ada beberapa spesifikasi w3c atau sesuatu yang mengatakan ini terjadi tetapi untuk kehidupan saya, saya tidak dapat menemukan alasannya.

JSFiddle

UPDATE: - Saya menemukan cara untuk mencapai hasil yang sama dengan menambahkan elemen lain yang melilit ul. Coba lihat.

James Khoury
sumber
Apa hasil yang Anda inginkan? jsfiddle.net/Kyle_Sevenoaks/3xv6A/2
Kyle
@kyle itu akan terlihat sedikit lebih seperti: jsfiddle.net/3xv6A/5 Sayangnya jika saya mengaturnya overflow-x hidden;menghapus gulir tetapi karena saya memerlukan elemen li untuk menyembunyikan perbatasan di bagian bawah sehingga memberikan efek putus-putus yang diinginkan. Saya tidak mengerti mengapa overflow-x: visiblemembuat bilah gulir. Seharusnya tidak afaik.
James Khoury
@JamesKhoury dapatkah Anda menjelaskan sedikit dalam solusi Anda? Saya tidak bisa membuatnya bekerja
George Katsanos
1
@GeorgeKatsanos Solusi: jsfiddle.net/3xv6A/9 bergantung pada orang tua overflow: hidden;dan seorang anak dimasukkan di sekitar <ul>makhluk overflow: visible.
James Khoury
@JamesKhoury Apakah Anda pikir ini dapat bekerja untuk embed.plnkr.co/2rbaISwvzuKhyPEFpBKD
George Katsanos

Jawaban:

680

Setelah beberapa pencarian serius sepertinya saya telah menemukan jawaban untuk pertanyaan saya:

dari: http://www.brunildo.org/test/Overflowxy2.html

Di Gecko, Safari, Opera, 'terlihat' menjadi 'otomatis' juga bila dikombinasikan dengan 'tersembunyi' (dengan kata lain: 'terlihat' menjadi 'otomatis' bila dikombinasikan dengan hal lain yang berbeda dari 'terlihat'). Gecko 1.8, Safari 3, Opera 9.5 cukup konsisten di antara mereka.

juga spesifikasi W3C mengatakan:

Nilai yang dihitung dari 'overflow-x' dan 'overflow-y' sama dengan nilai yang ditentukan, kecuali bahwa beberapa kombinasi dengan 'terlihat' tidak mungkin: jika satu ditentukan sebagai 'terlihat' dan yang lain adalah 'gulir' atau 'otomatis', maka 'terlihat' diatur ke 'otomatis'. Nilai yang dihitung dari 'overflow' sama dengan nilai yang dihitung dari 'overflow-x' jika 'overflow-y' adalah sama; kalau tidak itu adalah pasangan nilai yang dihitung dari 'overflow-x' dan 'overflow-y'.

Versi pendek:

Jika Anda menggunakan visibleuntuk salah satu dan overflow-xatau overflow-ysesuatu selain visibleuntuk yang lain, visiblenilainya diartikan sebagai auto.

James Khoury
sumber
263
Saya mengerti bahwa W3C menetapkannya dengan cara ini, tetapi apa motivasi di baliknya? Saya menemukan itu perilaku yang cukup aneh dan tidak konsisten, menghasilkan pekerjaan yang berantakan yang membutuhkan penambahan elemen HTML sepele.
Erwin
21
@ Erwin Saya setuju, Semoga seseorang memutuskan untuk memperbarui spesifikasi.
James Khoury
124
Anda benar tetapi tidak masuk akal. Alasan paling umum Anda bahkan ingin x dan y adalah agar Anda dapat membuat satu tersembunyi dan lainnya terlihat.
Rescuecreative
91
Ini melumpuhkan. Mengapa kami tidak dapat mengizinkan overflow-x:visibleselama overflow-y:hiddentanpa hack orang tua / anak? Tempat tidur yang cukup, IMO.
Slink
34
Ini benar-benar melumpuhkan. Saya mencoba membuat banyak tautan dropdown di navbar scroll Bootstrap secara horizontal, tapi itu memecah dropdown, yang bergantung pada overflow-y: visible. Boo CSS!
Andy
131

peretasan murah lainnya, yang tampaknya berhasil:

style="padding-bottom: 250px; margin-bottom: -250px;" pada elemen di mana overflow vertikal mendapatkan cutoff, dengan 250 mewakili piksel sebanyak yang Anda butuhkan untuk dropdown, dll.

Justin Krause
sumber
6
terima kasih banyak, meskipun ini terasa seperti retas, tetapi tampaknya menjadi cara terbaik untuk menyelesaikan masalah. Overflow mengerikan di css :(
Serge Eremeev
11
Ini membuat bilah gulir horizontal muncul sejauh itu
nafg
2
Ini juga memblokir acara pointer untuk 250px di bawah elemen. Tapi saya menemukan jalan keluarnya, dan solusi ini yang saya gunakan.
Chris Chudzicki
2
2 tahun kemudian dan ini tampaknya masih menjadi jawaban terbaik untuk masalah ini ... Semoga dengan browser lain (Microsoft Edge) melompat pada proyek open source Chromium kita akan melihat pengembangan lebih cepat dari fitur browser yang penting serta browser yang lebih baik kesesuaian.
Spencer O'Reilly
Dalam skenario khusus saya, di mana menghapus position: relativeatau menggunakan pembungkus tidak mungkin, ini adalah satu-satunya solusi yang berhasil, meskipun itu juga membutuhkan penambahan banyak margin jelek ke elemen anak di dalam elemen yang ingin saya setel overflow-x: hiddenuntuk mengkompensasi peretasan lapisan. Ini menyelamatkan saya, jadi terima kasih!
Philip Stratford
81

Saya awalnya menemukan cara CSS untuk mem-bypass ini ketika menggunakan plugin Cycle jQuery. Siklus menggunakan JavaScript untuk mengatur slide saya overflow: hidden, jadi ketika mengatur gambar saya ke width: 100%gambar akan terlihat terpotong secara vertikal, jadi saya memaksa mereka untuk terlihat dengan !importantdan untuk menghindari menampilkan animasi slide keluar dari kotak saya mengatur overflow: hiddenke div wadah dari meluncur. Semoga ini berhasil untuk Anda.

UPDATE - Solusi Baru:

Masalah asli -> http://jsfiddle.net/xMddf/1/ (Bahkan jika saya menggunakannya overflow-y: visiblemenjadi "otomatis" dan sebenarnya "gulir".)

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

Solusi baru -> http://jsfiddle.net/xMddf/2/ (Saya menemukan solusi menggunakan pembungkus div untuk menerapkan overflow-xdan overflow-yelemen DOM yang berbeda seperti yang disarankan oleh James Khoury tentang masalah penggabungan visibledan hiddensatu elemen DOM.)

#wrapper {
    height: 100px;
    overflow-y: visible;
}
#content {
    width: 200px;
    overflow-x: hidden;
}
Macumbaomuerte
sumber
12
Bagaimana ini berlaku? Tampaknya tidak berfungsi pada overflow-x atau overflow-y.
James Khoury
1
@ Macumbaomuetre Itu lebih jelas, terima kasih +1. Ini mirip dengan "pembaruan" yang saya tambahkan. Awalnya saya tidak dapat mengubah div pembungkus dan solusi saya berakhir mirip dengan: jsfiddle.net/3xv6A/338
James Khoury
9
Solusi ini tidak berlaku. Pertanyaannya adalah overflow-x:visible;dan overflow-y:hidden. Bukan sebaliknya.
Jakobovski
1
@TomasJansson @Edward Ini tidak bekerja, Anda hanya perlu swap yang mana Anda menerapkan overflow-xdan -y: biola diperbarui .
Hanya seorang siswa
1
ini gagal segera setelah pembungkus mendapatkan lebar untuk beberapa alasan - jsfiddle.net/ad1941k9/16
David Meister
10

Saya telah mengalami masalah ini ketika mencoba membuat sidebar posisi tetap dengan konten yang dapat digulir secara vertikal dan membuat anak - anak yang diposisikan secara absolut untuk ditampilkan di luar batas sidebar .

Pendekatan saya terdiri dari penerapan yang terpisah:

  • sebuah overflow: visibleproperti untuk elemen sidebar
  • sebuah overflow-y: autoproperti untuk sidebar wrapper batin

Silakan periksa contoh di bawah ini atau codepen online .

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>

Andrea Carraro
sumber
2
Saya cukup yakin ini adalah solusi yang sama seperti yang disajikan orang lain kecuali dengan autobukan hidden.
James Khoury
@JamesKhoury Tapi ini satu-satunya yang bisa saya pahami karena menunjukkan penggunaanposition
Guichi
7

Saya menggunakan content+wrapperpendekatan ... tapi saya melakukan sesuatu yang berbeda dari yang disebutkan sejauh ini: saya memastikan bahwa batas pembungkus saya TIDAK sejajar dengan batas konten ke arah yang saya ingin terlihat .

CATATAN penting: Itu cukup mudah untuk mendapatkan content+wrapper, same-boundspendekatan untuk bekerja pada satu browser atau lain tergantung pada berbagai kombinasi css dari position, overflow-*, dll ... tapi aku tak pernah bisa menggunakan pendekatan yang untuk mendapatkan mereka semua benar (Edge, Chrome, Safari,. ..)

Tetapi ketika saya memiliki sesuatu seperti:

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

... semua browser senang.

dsdsdsdsd
sumber
6

Sekarang ada cara baru untuk mengatasi masalah ini - jika Anda menghapus posisi: relatif dari wadah yang perlu memiliki overflow-y terlihat, Anda dapat memiliki overflow-y terlihat dan overflow-x tersembunyi, dan sebaliknya (memiliki overflow- x terlihat dan meluap-y tersembunyi, pastikan wadah dengan properti yang terlihat tidak diposisikan relatif).

Lihat posting ini dari Trik CSS untuk detail lebih lanjut - ini bekerja untuk saya: https://css-tricks.com/popping-hidden-overflow/

Alexandra
sumber
2
tapi itu akan memerlukan beberapa javascript untuk memposisikan elemen dengan benar jika absolut
gaurav5430