私の立場:flexboxを使用するとスティッキー要素がスティッキーではない


106

私はこれに少し立ち往生していて、これとposition: stickyフレックスボックスの落とし穴を共有したいと思いました:

ビューをフレックスボックスコンテナに切り替えるまで、スティッキーdivは正常に機能していましたが、フレックスボックスの親にラップされたときに突然divがスティッキーではなくなりました。

.flexbox-wrapper {
  display: flex;
  height: 600px;
}
.regular {
  background-color: blue;
}
.sticky {
  position: -webkit-sticky;
  position: sticky;
  top: 0;
  background-color: red;
}
<div class="flexbox-wrapper">
  <div class="regular">
    This is the regular box
  </div>
  <div class="sticky">
    This is the sticky box
  </div>
</div>

問題を示すJSFiddle


この動作は、サポートしているすべてのブラウザで持続しますposition: stickyか、それとも1つまたは一部のみで持続しますか?
TylerH 2017年

1
@TylerH私はそれがすべてのブラウザだと信じています。ChromeとSafariの両方でこのように機能しました。
BHOLT 2017年

ありがとう。Firefoxでも問題と解決策が発生していることを確認できます。
TylerH 2017年

回答:


205

フレックスボックス要素はデフォルトで stretch、すべての要素は同じ高さであり、スクロールすることはできません。

追加 align-self: flex-startスティッキー要素にして、高さを自動に設定しました。これにより、スクロールが可能になり、修正されました。

現在、これはすべての主要なブラウザでサポートされていますが、Safariはまだ-webkit-プレフィックスの後ろにあり、Firefoxを除く他のブラウザにはposition: stickyテーブルに関するいくつかの問題があります。

.flexbox-wrapper {
  display: flex;
  overflow: auto;
  height: 200px;          /* Not necessary -- for example only */
}
.regular {
  background-color: blue; /* Not necessary -- for example only */
  height: 600px;          /* Not necessary -- for example only */
}
.sticky {
  position: -webkit-sticky; /* for Safari */
  position: sticky;
  top: 0;
  align-self: flex-start; /* <-- this is the fix */
  background-color: red;  /* Not necessary -- for example only */
}
<div class="flexbox-wrapper">
  <div class="regular">
    This is the regular box
  </div>
  <div class="sticky">
    This is the sticky box
  </div>
</div>

ソリューションを示すJSFiddle


26
これは、含まれているflex要素内でスクロールする場合にのみ機能します-ウィンドウ全体をスクロールする場合、それは固執しません(少なくともFirefoxでは)-したがって、矛盾した動作を経験している人にとっては、矛盾した期待を経験している可能性が高くなります(iのようにだった)
aequalsb 2018

@aequalsbページ全体をスクロールするときにそれを固定する方法を知っていますか?
ダグラスガスケル

@Douglas質問は、問題がにあることを示唆しているため誤解を招く可能性がありますflexboxが、問題はsticky要素を含むことに関係しています。このフィドルを見てください:jsfiddle.net/9y87zL5cここで、2番目の赤いボックスは期待どおりに機能しますが、最初の赤いボックスは固執しません-したがって...これはフレックスボックスとは関係ありません(したがって、矛盾する期待)...また... iより正確な方法で結果を確認するために、jabberwockyの束を追加しました。
aequalsb

27

私の場合、親コンテナの1つがoverflow-x: hidden;適用されていたため、position: sticky機能が損なわれます。そのルールを削除する必要があります。

親要素に上記のCSSルールを適用しないでください。この条件は、「body」要素までの(ただし含まない)すべての親に適用されます。


またoverflow-x:hidden、html要素を使用することはできません。
SamuelLiew

どうもありがとう。私はいつもポジションスティッキーに苦労していて、あなたの返事を読むまでこの状態を知りませんでした。:)
Raphael Aleixo

@SamuelLiew、はいoverflow-x: hidden;、HTML要素に含めることができます。
TheoPlatica

@RaphaelAleixoお役に立ててうれしいです:)
TheoPlatica

これが、スティッキーが正しく機能するのを妨げていたものです。どうもありがとう!
MoOx

7

また、コンテンツを含むフレックスアイテムに子divを追加して、それに割り当てるposition: sticky; top: 0;こともできます。

これは、最初の列の内容を固定する必要があり、2番目の列がスクロール可能であるように見える2列のレイアウトでうまくいきました。


完全に同意します。これは私が見つけた中で最もシンプルで信頼できるオプションです。このように、コンテナの高さを制御することで、スティックを停止するタイミングを制御することもできます。
イブラヒムベンサラ

0

その場しのぎのフレックスボックステーブルを作成しましたが、この問題が発生しました。これを解決するには、スティッキーヘッダー行をフレックスボックスの外側の直前に配置します。


0

私の状況では、align-self: flex-start(またはjustify-self: flex-start)ソリューションは機能しません。私は保つ必要がありますoverflow-x: hidden一部のコンテナは水平方向にスワイプするので、もます。

私のソリューションでは、目的の動作display: flexを実現overflow-y: autoするためにネストする必要がありました。

  • ヘッダーは高さを動的に調整できるため、position: absoluteまたはposition: fixed
  • コンテンツは垂直方向にスクロールし、ビュー幅に水平方向に制限されます
  • スティッキー要素は、ヘッダーの下部に貼り付けて、垂直方向のどこにでも配置できます
  • 他の要素は水平方向にスライドできます
    • SOスニペットツールがwidth子要素をレンダリングして水平スライドを適切に表示できないように見えます。または、実際のレイアウトに他の設定があり、それが機能する可能性があります...
    • overflow-x: auto親の下の要素で正しく機能するには、他に何もしないラッパー要素が必要であることに注意してください。overflow-x: hidden

body {
  height: 100vh;
  width: 100vw;
  display: flex;
  flex-direction: column;
}

body>header {
  background-color: red;
  color: white;
  padding: 1em;
}

.content {
  overflow-x: hidden;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

article {
  position: relative;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
}

.horizontal_slide {
  display: flex;
  overflow-x: auto;
  background-color: lightblue;
  padding: .5em;
}

.horizontal_slide>* {
  width: 1000px;
}

.toolbar {
  position: sticky;
  top: 0;
  z-index: 10;
  background-color: lightgray;
  padding: .5em;
  display: flex;
}
<header>Fancy header with height adjusting to variable content</header>
<div class="content">
  <article class="card">
    <h1>One of several cards that flips visibility</h1>
    <div class="overflow_x_wrapper">
      <div class="horizontal_slide">
        <div>Reason why `overflow-x: hidden` on the parent is required
        </div>
        <div>Reason why `overflow-x: hidden` on the parent is required
        </div>
        <div>Reason why `overflow-x: hidden` on the parent is required
        </div>
      </div>
      <div class="toolbar">Sticky toolbar part-way down the content</div>
      <p>Rest of vertically scrollable container with variable number of child containers and other elements</p>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
        dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  </article>
  </div>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.