CSSオーバーフローx:表示; そして、overflow-y:hidden; スクロールバーの問題の原因


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>私は、オーバーフローのx / yのための可視および隠された値を指定したにも関わらず、下部にスクロールバーがあります。

(Chrome 11およびオペラ(?)で観察)

私はいくつかのw3c仕様またはこれが起こることを告げる何かがあるに違いないと思いますが、私の人生では私は理由を理解することができません。

JSFiddle

更新:-を囲む別の要素を追加して、同じ結果を得る方法を見つけましたul見てみな。


あなたの望ましい結果は何ですか?jsfiddle.net/Kyle_Sevenoaks/3xv6A/2
カイル

@kyleそれはもう少し似ているはずです:jsfiddle.net/3xv6A/5残念ながらそれを設定overflow-x hidden;するとスクロールが削除されますが、li要素が下部の境界を非表示にして必要な破線効果を与える必要があるためです。overflow-x: visibleスクロールバーが作成される理由がわかりません。それはフェイクすべきではありません。
James Khoury、2011年

@JamesKhouryは、ソリューションについて少し詳しく説明できますか?私は本当にそれを働かせることはできません
ジョージKatsanos

1
@GeorgeKatsanos回避策:jsfiddle.net/3xv6A/9は、親の存在overflow: hidden;と存在の周りに挿入された子に依存して<ul>overflow: visibleます。
James Khoury、2014年

@JamesKhoury Doがあなたはそれがために働くことができると思うembed.plnkr.co/2rbaISwvzuKhyPEFpBKD
ジョージKatsanos

回答:


680

いくつかの深刻な検索の後、私は私の質問に対する答えを見つけたようです:

から:http : //www.brunildo.org/test/Overflowxy2.html

Gecko、Safari、Operaでは、「visible」は「hidden」と組み合わせると「auto」になります(つまり、「visible」は「visible」とは異なるものと組み合わせると「auto」になります)。Gecko 1.8、Safari 3、Opera 9.5はそれらの間でかなり一貫しています。

また、W3C仕様は次のように述べています。

'overflow-x'および 'overflow-y'の計算値は、指定された値と同じですが、「可視」との一部の組み合わせは不可能です。一方が「可視」として指定され、もう一方が「スクロール」の場合または「auto」の場合、「visible」は「auto」に設定されます。「overflow-y」が同じ場合、「overflow」の計算値は「overflow-x」の計算値と同じです。それ以外の場合は、「overflow-x」と「overflow-y」の計算値のペアです。

短縮版:

visibleいずれかoverflow-xまたはoverflow-y他のものに使用している場合visiblevisible値はとして解釈されautoます。


263
W3Cがこのように指定していることを理解していますが、その背後にある動機は何ですか?私はそれがかなり奇妙で一貫性のない振る舞いであることに気づき、その結果、ささいなHTML要素を追加する必要がある厄介な回避策がもたらされました。
アーウィン

21
@Erwin同意します。うまくいけば、誰かが仕様を更新することにしました。
James Khoury、2012年

124
あなたは正しいですが、それは意味がありません。xとyを使用する最も一般的な理由は、一方を非表示にし、もう一方を表示できるようにするためです。
レスキュークリエイティブ、2014

91
これは不自由です。なぜ我々は許可することはできませんoverflow-x:visible中にoverflow-y:hidden、親/子ハックなし?かなり二段ベッド、IMO。
Slink 2014年

34
これは完全に不自由です。Bootstrap navbarの一連のドロップダウンリンクを水平方向にスクロールしようとしていましたが、ドロップダウンが壊れてしまいoverflow-y: visibleます。Boo CSS!
アンディ

131

トリックを行うように見える別の安価なハック:

style="padding-bottom: 250px; margin-bottom: -250px;"垂直オーバーフローが途切れている要素で、250ドロップダウンに必要なだけのピクセルを表します。


6
これはハッキーな感じがしますが、問題を解決する最良の方法のようです。CSSではオーバーフローがひどい:(
Serge Eremeev

11
これにより、水平スクロールバーがずっと下に表示されます
nafg

2
これにより、要素の下にある250pxのポインターイベントもブロックされます。しかし、私はそれを回避する方法を見つけました、そしてこの解決策は私が使っているものです。
Chris Chudzicki

2
2年後、これがこの問題に対する最良の答えであるように思われます...もう1つのブラウザー(Microsoft Edge)がChromiumオープンソースプロジェクトを利用していることで、より優れたブラウザーだけでなく、重要なブラウザー機能の開発がより速くなることを願っています。互換性。
スペンサーオライリー

position: relativeラッパーの削除または使用が不可能な私の特定のシナリオでは、これが機能する唯一のソリューションoverflow-x: hiddenでしたが、ハックを補うために設定したい要素内の子要素に多くの醜いマージンを追加する必要もありましたパディング。これは私を救ったので、感謝します!
フィリップストラトフォード

81

私はもともと、Cycle jQueryプラグインを使用するときにこれをバイパスするCSSの方法を見つけました。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/(James Khouryが結合と単一のDOM要素の問題についてアドバイスしたように、ラッパー divを使用overflow-xoverflow-yてさまざまなDOM要素に 回避策を見つけました。)visiblehidden

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

12
これはどのように適用されますか?それはoverflow-xまたはoverflow-yでは動作しないようです。
James Khoury 2013

1
@Macumbaomuetreそれはより明確です、あなたに+1をありがとう。追加した「アップデート」に似ています。元々、ラッピングdivを変更できなかったため、私のソリューションは次のようになりました:jsfiddle.net/3xv6A/338
James Khoury

9
このソリューションは適用されません。問題はoverflow-x:visible;overflow-y:hiddenです。その逆ではありません。
Jakobovski、2015年

1
@TomasJansson @Edwardそれはない仕事を、あなたはちょうどあなたが適用され、スワップに持っているoverflow-x-y更新フィドルを
学生のみ

1
これは、ラッパーが何らかの理由で幅を広げる
David Meister

10

垂直スクロール可能なコンテンツとネストされた絶対位置の子の両方がサイドバー境界の外側表示されるように固定位置のサイドバーを作成しようとしたときに、この問題に遭遇しました。

私のアプローチは個別に適用されました:

  • overflow: visibleサイドバー要素へのプロパティ
  • overflow-y: autoインナーラッパーをサイドバープロパティ

以下の例またはオンラインコードペンを確認してください。

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 2017

それはの使用を指摘しているため@JamesKhouryしかし、この1は私だけでは理解することができる午前れるposition
Guichi

7

私が使用しcontent+wrapperたアプローチを... しかし、私は、これまでに述べたよりも、何かの異なるました:私は確かに私のラッパーの境界がなかったことを行わないで、コンテンツの境界と並ぶ私は見ることがしたかったという方向には

重要注:入手しやすい十分だったcontent+wrapper, same-boundsのさまざまなCSSの組み合わせに応じて、1つのブラウザまたは別の作業へのアプローチをpositionoverflow-*など...しかし、私は彼らに取得するためにこのアプローチを使用することができなかったんすべて正しい(エッジ、クロム、サファリ、。 ..)。

しかし、私が次のようなものを持っていたとき:

  <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を非表示、またはその逆(overflow- xを表示し、overflow-yを非表示にします。visibleプロパティを持つコンテナが相対的に配置されていないことを確認してください)。

詳細については、CSS Tricksのこの投稿を参照してください-私にとってはうまくいきました:https : //css-tricks.com/popping-hidden-overflow/


2
ただし、要素が絶対的な場合は、要素を正しく配置するために何らかのJavaScriptが必要になります
gaurav5430
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.