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