序章

スティッキーサイドバーは、ユーザーが最初に表示された位置を超えてスクロールした場合でも、サイドバーを画面上に保持するためのWebデザイン手法です。 これは、サブナビゲーションに簡単にアクセスできるようにし、ユーザーがスクロールするときにサイドバーのコンテンツをより強調し、広告の表示回数、クリック数、ページビューを増やす可能性がある場合に役立ちます。

これまで、この機能は、スクロール位置を検出し、要素の位置を切り替えるためのJavaScript計算によって頻繁に実現されていました。 positionabsolute また fixed.

現在、W3C仕様は定義しています sticky ポジショニング、そして多くの最新のブラウザはすでにそれを採用しています。

このチュートリアルでは、を使用するサイドバーを備えたWebページを作成します position: sticky およびブートストラップ4。

前提条件

このデモンストレーションでは、ローカル環境を設定する必要はありません。 選択したコードエディタとブラウザを使用できます。

このチュートリアルを完了するには、次のものが必要です。

ステップ1—使用 position: sticky

使用仕様 position: sticky 次のような方向が必要です top また bottom 以外の値で指定する auto.

このプロパティを使用するCSSクラスの例は次のようになります。

.sticky {
  position: sticky;
  top: 0;
}

体験する position: sticky、新しいプロジェクトディレクトリを作成できます。

  1. mkdir position-sticky-example

そして、そのディレクトリに移動します。

  1. cd position-sticky-example

このプロジェクトディレクトリ内に、 example.html 次のコードでファイルします。

example.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Sticky Position Example</title>
    <style>
      * {
        box-sizing: border-box;
      }

      html,
      body {
        margin: 0;
        padding: 0;
      }

      .placeholder-example {
        background: lavender;
        height: 100vh;
        padding: 1em;
      }

      .sticky-example {
        background: cornflowerblue;
        padding: 1em;
      }

      .sticky {
        position: sticky;
        top: 0;
      }
    </style>
  </head>
  <body>
    <div class="sticky-example sticky">Sticky</div>
    <div class="placeholder-example">Placeholder</div>
  </body>
</html>

このコードは div とともに sticky クラスと別の div とともに placeholder ビューポートの全高であるクラス。

開ける index.html Webブラウザで、その方法を観察します position: sticky ページを上下にスクロールすると動作します。

ブラウザのサポートの確認とフォールバックの使用

新しいCSSプロパティを採用する前に、さまざまなブラウザでどの程度サポートされているかを調べる必要があります。 機能がターゲットオーディエンスのブラウザでサポートされていない場合、プロジェクトに採用するのに適した候補ではない可能性があります。

ブラウザのサポートを確認するためのツールの1つは、使用できますかです。 この時点で、位置のページを使用できますか:sticky は、サポートがないことを報告します position: sticky InternetExplorerで。 最新バージョンのEdge、Firefox、Chrome、Safari、およびOperaがサポートされています。 そして、の特定の側面が position: sticky 一部のブラウザでは期待どおりに動作していません。

への賢明なフォールバック position: sticky だろう position: relative. 同一のブラウザエクスペリエンスにつながることはありませんが、サポートされていないブラウザを使用しているユーザーが引き続き内のコンテンツにアクセスできるようになります。 position: sticky 要素。

また、CSSプロパティにベンダープレフィックスを使用することを検討することもできます。 position: -webkit-sticky、SafariおよびiOSSafariの古いバージョンに対応します。

書き直された sticky フォールバックをサポートするクラスは次のようになります。

.sticky {
  position: relative;
  position: -webkit-sticky;
  position: sticky;
  top: 0;
}

このコードは、ブラウザが認識しないプロパティ値を無視し、最後の有効な値のみを使用する方法を利用しています。

これで、 position: sticky 行動。 それを高度なシナリオに適用する方法を見てみましょう。

ステップ2—Bootstrap4を使用してスティッキーサイドバーを構築する

目的のレイアウトには、コンテンツの長いブロックに隣接して配置されるサイドバーがあります。 これは、Bootstrap4ライブラリを使用して実現できます。

目的のレイアウトの図は次のとおりです。

A title-section ページの上部にまたがっています。 A content-section 画面の左側の大部分を占めています。 画面の右側には、複数のサイドバー要素があります。 container 1, container 2, container 3、 と container n.

新しいを作成します index.html ファイルを作成し、Bootstrap4ライブラリを追加します。

index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Sticky Position Sidebar</title>
    <link
      rel="stylesheet"
      href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
      integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z"
      crossorigin="anonymous"
    />
    <style>
    </style>
  </head>
<body>
</body>
</html>

希望のレイアウトを実現するために、 body コンテンツは、ブートストラップマークアップ構造を採用する必要があります。

index.html
<body>
  <article>
    <div class="container-fluid">
      <div class="row">
        <div class="col">
          <div class="title-section">
            <h1>Stacking Sticky Sidebars with Bootstrap 4</h1>
          </div>
        </div>
      </div>
      <div class="row">
        <div class="col-7">
          <div class="content-section">
            Content Section
          </div>
        </div>
        <div class="col-5">
          <div class="sidebar-section">
            <div class="sidebar-item">
              <div class="sidebar-content">
                Container 1
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </article>
</body>

このマークアップは、 content-section 7列幅を拡張するサイドバーセクションと5列幅を拡張するサイドバーセクション。 これにより、最大12列が追加されます。これは、Bootstrap4のデフォルトのグリッドシステムです。

申請中 sticky-top

Bootstrap 4には、という名前のユーティリティクラスも付属しています。 sticky-top 機能的には sticky 以前に作成したクラス。

お申し込み前に sticky-top、コンテンツとサイドバーのセクションをより視覚的にわかりやすくするために、いくつかのスタイルを追加します。

index.html
<style>
  .content-section {
    background: lavender;
    height: 1000px;
    min-height: 100vh;
    padding: 1em;
  }

  .sidebar-section {
    height: 100%;
  }

  .sidebar-content {
    background: cornflowerblue;
    padding: 1em;
  }
</style>

このコードは、 background-color, height、 と padding コンテンツとサイドバーのセクション。

注: height ここでコンテンツセクションに提供されているのは、デモンストレーションの目的で任意の量です。 十分な大きさのコンテンツがある場合は、それを利用してレイアウトを定義し、 height 財産。

訪問するとき index.html Webブラウザーでは、コンテンツセクションと小さなサイドバーセクションを確認する必要があります。

ここで、 sticky-top クラスへ sidebar-item:

index.html
<div class="col-5">
  <div class="sidebar-section">
    <div class="sidebar-item sticky-top">
      <div class="sidebar-content">
        Container 1
      </div>
    </div>
  </div>
</div>

ページを下にスクロールすると、サイドバーは「スティッキー」な動作をするはずです。

これはおそらく、ほとんどのシナリオで最も一般的な機能要求になるでしょう。 次のステップでは、より想像力に富んだシナリオを検討します。

ステップ3—高度なシナリオを試す

次のセクションでは、 index.html 以前に作成したファイルを作成し、複数のアイテムを追加し、サイドバーアイテムを積み重ね、最後にサイドバーアイテムを画面から押し出します。

スティッキーサイドバーと複数のアイテムを試す

例に基づいて、サイドバーにアイテムを追加できます。

index.html
<div class="col-5">
  <div class="sidebar-section">
    <div class="sidebar-item sticky-top">
      <div class="sidebar-content">
        Container 1
      </div>
    </div>

    <div class="sidebar-item sticky-top">
      <div class="sidebar-content">
        Container 2
      </div>
    </div>

    <div class="sidebar-item sticky-top">
      <div class="sidebar-content">
        Container 3
      </div>
    </div>

    <div class="sidebar-item sticky-top">
      <div class="sidebar-content">
        Container 4
      </div>
    </div>
  </div>
</div>

訪問するとき index.html Webブラウザーでは、コンテンツセクションと複数のサイドバーアイテムを確認する必要があります。

サイドバーセクションをフレックスボックスに変換し、アイテムを columnspace-between、より視覚的に興味深いサイドバーを作成できます。

index.html
<style>
  /* ... */

  .sidebar-section {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    height: 100%;
  }

  /* ... */
</style>

訪問するとき index.html Webブラウザーでは、コンテンツセクションと、間にスペースがある複数のサイドバーアイテムを確認する必要があります。 下にスクロールすると、サイドバーのアイテムが画面の上部に貼り付くのを確認する必要があります。

すべてのサイドバーアイテムを積み重ねてみる

一般的な機能要求は、すべてのサイドバーアイテムを画面上に視覚的に「スタック」しておくことです。

これには、 height 各サイドバーアイテムの top 価値。 デフォルトの代わりに top: 0 によって提供された sticky-top クラスでは、前のサイドバーアイテムの高さの合計を提供します。

このデモではサイドバーアイテムの数と高さがわかっているため、を使用して各サイドバーアイテムにオフセットを適用できます。 nth-child:

index.html
<style>
  /* ... */

  .sidebar-item:nth-child(2) {
    top: 3.5em;
  }

  .sidebar-item:nth-child(3) {
    top: 7em;
  }

  .sidebar-item:nth-child(4) {
    top: 10.5em;
  }

  /* ... */
</style>

訪問するとき index.html Webブラウザーでは、コンテンツセクションと、間にスペースがある複数のサイドバーアイテムを確認する必要があります。 下にスクロールすると、サイドバーのアイテムが積み重なっているのがわかります。

ただし、これはサイドバーに含まれていることを知っているシナリオに制限されています 4 それぞれのサイドバーアイテム 3.5em 高い。 さらに複雑になると、Pure CSSの制限が強調され、JavaScriptソリューションを使用する方が時間に適している場合があります。

サイドバーアイテムを画面外に押し出す実験

前の例を基に構築を続けると、制限の少ない代替手段として、前のサイドバーアイテムを画面から「プッシュ」することができます。

まず、以前の実験を削除する必要があります nth-child.

この新しい構成では、 flex-grow のプロパティ .sidebar-item:

index.html
<style>
  /* ... */

  .sidebar-item {
    flex-grow: 1;
  }

  /* ... */
</style>

今、移動します sticky-top からのクラス sidebar-item 要素に sidebar-content エレメント:

index.html
<div class="col-5">
  <div class="sidebar-section">
    <div class="sidebar-item">
      <div class="sidebar-content sticky-top">
        Container 1
      </div>
    </div>

    <div class="sidebar-item">
      <div class="sidebar-content sticky-top">
        Container 2
      </div>
    </div>

    <div class="sidebar-item">
      <div class="sidebar-content sticky-top">
        Container 3
      </div>
    </div>

    <div class="sidebar-item">
      <div class="sidebar-content sticky-top">
        Container 4
      </div>
    </div>
  </div>
</div>

訪問するとき index.html Webブラウザーでは、コンテンツセクションと複数のサイドバーアイテムを確認する必要があります。 下にスクロールすると、サイドバーアイテムが前のサイドバーアイテムを「プッシュ」する「スタック」動作を観察する必要があります。

注:このチュートリアルの以前のバージョンでは、 position: absolute 経験した制限によるアプローチ display: flexboxposition: sticky 当時のWebブラウザで。

このCodePenの例は、 position: absolute アプローチ。

ただし、今回の改訂時点では、 flexbox このアプローチは、柔軟性が高く、さまざまな量のサイドバーアイテム、高さ、およびオフセットの処理が少なくて済みます。

幅、高さ、オフセットを調整することで実行できる実験がさらにあります。

結論

このチュートリアルでは、CSSプロパティについて学習しました position: sticky Webデザインのレイアウトのサイドバーにどのように使用できるか。

ブラウザのサポートによる制限があることに注意してください。 JavaScriptまたは position: absolute 視聴者のブラウザの使用状況に応じた代替手段。

CSSの詳細については、CSSトピックページで演習とプログラミングプロジェクトを確認してください。