実務でよく使用する position(ポジション)プロパティ の応用的なユースケースを紹介します。
Web制作では、ちょっとしたUIパーツを「どこに・どう配置するか」、そして「スクロール時にどう動かすか」によって、ユーザーの操作性や利便性が大きく変わります。特に、ページのスクロール中でも必要なボタンや情報を見失わないように配置することは、使いやすいWebサイトを作るうえで重要なポイントです。
そのような場面で活躍するのが position: fixed と position: sticky です。これらを活用することで、ページトップボタンを画面右下に固定したり、購入ボタンをスクロールに追随させたり、長い表の見出しをスクロール中も表示し続けたりと、実務でよく使われるUIを実装できます。
ここでは、position を使って実装する次の3つの定番UIパターンを、サンプルコードを交えながら初心者にも分かりやすく解説します。
・画面右下にページトップボタンを固定する
・スクロールしても追随する購入ボタンを画面下に固定する
・長い表の見出し行(ヘッダー)をスクロール中も固定する
それぞれの実装方法だけでなく、fixed と sticky の使い分けや、それぞれのプロパティが適している場面についても紹介します。
「スクロールに合わせてUIをどう動かせばいいの?」「fixed と sticky はどう使い分ければいいの?」という疑問を、実務で役立つ3つの実践例を通して解消していきましょう。
画面右下にページトップボタンを固定する
fixedを使うと、スクロール位置に関係なく常に画面の決まった位置に要素を表示できます。
例)style.css
.page-top {
position: fixed;
bottom: 24px; /* 画面下端から24px */
right: 24px; /* 画面右端から24px */
width: 48px;
height: 48px;
background-color: steelblue;
color: white;
border-radius: 50%;
text-align: center;
line-height: 48px; /* 行の高さを要素の高さ(48px)と同じにして、矢印をボタンの上下中央に配置させる */
cursor: pointer; /* マウスを乗せたときにカーソルを指の形にし、クリックできることを示す */
font-size: 20px;
}例)index.html
<html>
<head>
<title>ページのタイトル</title>
<style>
@import url(style.css)
</style>
</head>
<body>
<div class="page-top" onclick="window.scrollTo(0,0)">↑</div>
<p>コンテンツ1</p>
<p>コンテンツ2</p>
<p>コンテンツ3</p>
<p>コンテンツ4</p>
<p>コンテンツ5</p&g;
<p>コンテンツ6</p>
<p>コンテンツ7</p>
<p>コンテンツ8</p>
<p>コンテンツ9</p>
<p>コンテンツ10</p>
<p>コンテンツ11</p>
<p>コンテンツ12</p>
<p>コンテンツ13</p>
<p>コンテンツ14</p>
<p>コンテンツ15</p>
<p>コンテンツ16</p>
<p>コンテンツ17</p>
<p>コンテンツ18</p>
<p>コンテンツ19</p>
<p>コンテンツ20</p>
<p>コンテンツ31</p>
<p>コンテンツ32</p>
<p>コンテンツ33</p>
<p>コンテンツ34</p>
<p>コンテンツ35</p>
<p>コンテンツ36</p>
<p>コンテンツ37</p>
<p>コンテンツ38</p>
<p>コンテンツ39</p>
<p>コンテンツ40</p>
</body>
</html>※window.scrollTo(0,0) はJavaScriptのコードで、クリックしたときにページの先頭へスクロールする動作を指定しています。JavaScriptはWebページに動きや操作への反応を加えるためのプログラミング言語です。詳しくは別の記事で解説します。
ブラウザでの表示結果

右下のアイコンを押下するとJavaScriptのコードが実行されて、ページの先頭へスクロールします。

スクロールしても追随する購入ボタンを画面下に固定する
ショッピングサイトの商品ページなどでよく見かける「カートに入れる」「購入する」ボタンは、position: fixed を使ってスクロールしても画面に表示され続けるように実装できます。 例)style.css
.buy-button {
position: fixed; /* ブラウザ画面に固定 */
bottom: 20px; /* 画面の下端から20px上に配置 */
right: 20px; /* 画面の右端から20px内側に配置 */
background-color: crimson;
color: white;
padding: 16px 32px; /* ボタン内側の余白 */
border-radius: 4px; /* 角を少し丸める */
text-decoration: none; /* リンクの下線を消す */
}例)index.html
<html>
<head>
<title>ページのタイトル</title>
<style>
@import url(style.css)
</style>
</head>
<body>
<h1>商品名</h1>
<p>商品の説明文がここに入ります。</p>
<p>...(中略)...</p>
<p>商品の説明がさらに続きます。</p>
<a href="https://example.com/cart" class="buy-button">カートに入れる</a>
</body>
</html>ブラウザでの表示結果
ページをスクロールしても、ボタンは常に画面右下に表示され続けます。 このCSSのポイントは2つあります。
①<a> タグにクラスを指定して、ボタンとして装飾する → <a href=”…”>〜</a> はリンクを作るためのHTMLタグです。ここに class=”buy-button” を指定して、CSSでボタンらしい見た目(背景色、内側の余白、角の丸みなど)に装飾しています。text-decoration: none; で、リンク特有の青い下線を消しています。
② position: fixed でブラウザ画面の右下に固定する → bottom: 20px; right: 20px; で画面の右下から20px内側の位置に固定します。 リンクの貼り方 <a href=”リンク先のURL”> の リンク先のURL の部分に、購入ページのURLを書きます。
<a href="https://example.com/cart" class="buy-button">カートに入れる</a>>>CSS position(ポジション)種類.static、relative、absolute、fixed、sticky使い方
長い表の見出し行をスクロール中も固定する
件数の多い表を下にスクロールしていくと、見出し行(ヘッダー)が画面の外へ消えてしまい、いま見ている数字がどの列の値なのか分からなくなります。見出しのセルに position: sticky を指定すると、表をスクロールしても見出し行が画面の上端で止まって固定され、常に表示され続けます。
例)style.css
table {
border-collapse: collapse; /* 隣り合うセルの枠線を1本にまとめる */
width: 100%;
}
th, td {
border: 1px solid #ccc;
padding: 8px 12px;
text-align: left;
}
thead th {
position: sticky; /* スクロールしても固定する */
top: 0; /* 画面の上端で止める */
background-color: steelblue; /* 背景色は必須(無いと下の行が透ける) */
color: white;
}例)index.html
<html>
<head>
<title>ページのタイトル</title>
<style>
@import url(style.css)
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>注文番号</th>
<th>商品名</th>
<th>金額</th>
</tr>
</thead>
<tbody>
<tr><td>0001</td><td>商品A</td><td>1,200円</td></tr>
<tr><td>0002</td><td>商品B</td><td>2,500円</td></tr>
<tr><td>0003</td><td>商品C</td><td>980円</td></tr>
<tr><td>0004</td><td>商品D</td><td>4,300円</td></tr>
<tr><td>0005</td><td>商品E</td><td>1,800円</td></tr>
<tr><td>0006</td><td>商品F</td><td>3,100円</td></tr>
<tr><td>0007</td><td>商品G</td><td>2,200円</td></tr>
<tr><td>0008</td><td>商品H</td><td>760円</td></tr>
<tr><td>0009</td><td>商品I</td><td>5,400円</td></tr>
<tr><td>0010</td><td>商品J</td><td>1,500円</td></tr>
<tr><td>0011</td><td>商品K</td><td>2,900円</td></tr>
<tr><td>0012</td><td>商品L</td><td>3,600円</td></tr>
</tbody>
</table>
</body>
</html>ブラウザでの表示結果(初期表示)

表を下にスクロールしても、見出し行は固定されたままになります。

>>バッジ(ラベル)、モーダルウィンドウの作り方.CSS positionで作るUIデザインパーツ実装
>>CSS position(ポジション)種類.static、relative、absolute、fixed、sticky使い方

