トップへ(mam-mam.net/)

CSSのposition: stickyでスクロール固定|背景画像の動きも比較できるサンプル

CSSのposition: stickyでスクロール固定|背景画像の動きも比較できるサンプル

CSSのposition: stickyとbackground-attachmentを使って、JavaScriptなしでスクロール固定やパララックス風演出を実現。
背景画像の固定・スクロールの違いを比較できるサンプルを掲載しています。

縦方向にposition:stickyを適用した例

以下のインラインフレームを上下にスクロールすると、DIVタグ内がスクロールに応じて上の位置に固定されるようにスクロールします。

<style>
  body{ margin:0; }
  .sticky > div{
    position:sticky;
    top:0px;     width:100%;
    height:80vh; font-size:30pt;
  }
  /* 1つ目のdiv */
  .sticky > div:nth-of-type(1){
    background:#ccccff;
  }
  /* 2つ目のdiv */
  .sticky > div:nth-of-type(2){
    background-image: url("/cg/sozai/sky/0001.jpg");
    background-repeat: no-repeat;  /* 繰り返さない */
    background-attachment: scroll; /* スクロールする */
    background-size: contain;
  }
  /* 3つ目のdiv */
  .sticky > div:nth-of-type(3){
    background-image: url(/cg/sozai/sky/0001.jpg); 
    background-repeat: no-repeat;  /* 繰り返さない */
    background-attachment: fixed;  /* スクロールしない */
    background-size: cover;
  }
  /* 4つ目のdiv */
  .sticky > div:nth-of-type(4){
    background: #ccccff;
  }
  /* 5つ目のdiv */
  .sticky > div:nth-of-type(5){
    background-image: url("/cg/sozai/texture/grass01.jpg");
    background-repeat: no-repeat;  /* 繰り返さない */
    background-attachment: fixed;  /*スクロールしない */
    background-size:cover;
  }
  /* 6つ目のdiv */
  .sticky > div:nth-of-type(6){
    background-image: url("/cg/sozai/texture/grass01.jpg"); 
    background-repeat: repeat;     /* 繰り返す */
    background-attachment: scroll; /* スクロールする */
    background-size: auto;
  }
</style>

<div class="sticky">
  <div>1つ目のdiv</div>
  <div>2つ目のdiv</div>
  <div>3つ目のdiv</div>
  <div>4つ目のdiv</div>
  <div>5つ目のdiv</div>
  <div>6つ目のdiv</div>
</div>

横方向にposition:stickyを適用した例

以下のインラインフレームを左右にスクロールすると、DIVタグ内がスクロールに応じて左の位置に固定されるようにスクロールします。

<style>
  body{ margin:0; }
  .sticky{
    display:flex;  width:400%;
  }
  .sticky > div{
    position:sticky;
    left:0px;      width:100%;
    height:100vh;  font-size:30pt;
  }
  /* 1つ目、4つ目のdiv */
  .sticky > div:nth-of-type(3n+1){
    background:#ccccff;
  }
  /* 2つ目、5つ目のdiv */
  .sticky > div:nth-of-type(3n+2){
    background:#ccffcc;
  }
  /* 3つ目、6つ目のdiv */
  .sticky > div:nth-of-type(3n){
    background:#ffcccc;
  }
</style>

<div class="sticky">
  <div>1つ目のdiv</div>
  <div>2つ目のdiv</div>
  <div>3つ目のdiv</div>
  <div>4つ目のdiv</div>
  <div>5つ目のdiv</div>
  <div>6つ目のdiv</div>
</div>
background-repeat に指定できる値
指定値 説明
repeat 背景画像を水平方向・垂直方向に繰り返す(初期値)
repeat-x 水平方向のみに繰り返す
repeat-y 垂直方向のみに繰り返す
no-repeat 繰り返しなし。背景画像を1回だけ表示
space 画像間に均等な余白を入れて繰り返す(端にぴったり合わせる)
round 画像サイズを調整して隙間なく繰り返す(アスペクト比が崩れる可能性あり)
background-attachment に指定できる値
説明
scroll要素のスクロールに合わせて背景も動く(初期値)
fixed背景をビューポートに固定。スクロールしても動かない
local要素の内容に対して背景を固定。要素内スクロールに合わせて背景も動く
background-size に指定できる値
説明
auto元の画像サイズのまま表示
cover要素全体を覆うように拡大・縮小(はみ出す可能性あり)
contain要素内に収まるように拡大・縮小(余白ができる可能性あり)
px例:100px 50px → 幅100px、高さ50px
%例:100% 50% → 要素の幅に対して100%、高さに対して50%