【CSS】scroll-state()について

どうも、くまだです。

CSSのscroll-state()について。

scroll-state()

scroll-state()はコンテナクエリーの一つです。コンテナ要素のスクロールに応じてスタイルを変更することができます。例えばスクロールされたらヘッダーの背景色が変わる、という感じです。

例えば以下のようなコードになります。

  <div class="container">
    <div class="container__scroll">
      <header class="header"></header>
    </div>
    <div class="contents">
      <p>↓スクロール</p>
      <p>↓</p>
      <p>↓</p>
      <p>↓</p>
      <p>↓</p>
    </div>
  </div>
.container__scroll {
  position: sticky;
  top: 0;
  container-type: scroll-state;
}


.header{
  background-color: orange;
  width: 100%;
  height: 50px;
}

@container scroll-state(stuck: top) {
  .header {
    background-color: red;
  }
}

.contents {
  background-color: skyblue;
  height: 2000px;
}

See the Pen scroll-state() by kuma0605 (@kuma0605) on CodePen.

スクロールするとヘッダーの背景色が変わります。

コンテナ要素にはcontainer-type: scroll-state;を指定します。

そして以下の部分でscroll-stateが指定された子要素に対して、コンテナの状態に応じてスタイルを変更します。

@container scroll-state(stuck: top) {
  .header {
    background-color: red;
  }
}

stuckはpostion:sticky;で要素が固定されている状態を表しています。

スクロールして要素がstickyによって固定されたタイミングで、ヘッダーの背景色が変わる、というイメージです。

他のパターンでは、以下のようなコードもあります。

  <div class="container">
    <div class="box">
      <div class="box__block">1</div>
    </div>
    <div class="box">
      <div class="box__block">2</div>
    </div>
    <div class="box">
      <div class="box__block">3</div>
    </div>
    <div class="box">
      <div class="box__block">4</div>
    </div>
    <div class="box">
      <div class="box__block">5</div>
    </div>
    <div class="box">
      <div class="box__block">6</div>
    </div>
  </div>
.container {
  overflow: hidden;
    overflow: auto;
     scroll-snap-type: both mandatory;
    scroll-behavior: smooth;
  height: 100vh;
}

.box {
  padding-top: 40px;
  padding-bottom: 40px;
  scroll-snap-align: center;
  container-type: scroll-state;
  
}
.box__block {
  background-color: #fff;
  height: 80vh;
  margin: 0 auto;
  border: 1px solid #000;
  transition: background-color 0.3s ease;
}

@container scroll-state(snapped: y) {
    .box__block {
        background-color: red;
    }
}

See the Pen scroll-state(snapped: y) by kuma0605 (@kuma0605) on CodePen.

scroll-snap-typプロパティを使って、スクロールしたら中のコンテンツをピタッと貼りつくように止まります。

コンテナ要素にはcontainer-type: scroll-state;を指定します。

そして以下の部分(snapped:y)の部分で、scroll-snap-typeプロパティで子要素がピタッと止まったら背景色が変わる、というスタイルにしています。

@container scroll-state(snapped: y) {
    .box__block {
        background-color: red;
    }
}

他にもscroll-state(scrollable:~~)というのもあります。

ここまで読んでくださりありがとうございました。

この記事を書いた人