CSS positionページトップボタン、スクロール追随ボタン、表見出し(ヘッダー)固定の作り方

実務でよく使用する 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>
<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使い方