ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果

rein
質問: ページの下部に固定で枠を出したい
ページの下にスクロールしてもずっと表示されている枠を表示したいです。どういうコードを書けばよいですか?

フローティング枠を実装するコードと実行結果を紹介します。

概要

フローティングの枠を実装するには、スクロールでスクロールアウトさせないために、スタイルに、"position:fixed;" を指定します。また、他の枠より上に表示される必要があるため、"z-index:1;"を指定し、最前面に表示します。

コード

次のHTMLファイルを作成します。

FloatingBottom.html
<head>
  <meta charset="utf-8" />
  <title></title>
  <link rel="stylesheet" href="FloatingBottom.css" />
</head>
<body>
  <h1>ページです。</h1>
  
  <p>コンテンツ1です。</p>
  <p>コンテンツ2です。</p>
  <p>コンテンツ3です。</p>
  <div style="height:600px;background-color:#ffd800;">大きな枠です。</div>
  <p>コンテンツ4です。</p>
  <p>コンテンツ5です。</p>
  <p>コンテンツ6です。</p>
  <div style="height:400px;background-color:#b6ff00;">中サイズの枠です。</div>
  <p>コンテンツ7です。</p>
  <p>コンテンツ8です。</p>
  <p>コンテンツ9です。</p>
  <p>コンテンツ10です。</p>

  <div class="BottomPanel">フローティング枠です。</div>

</body>
</html>

FloatingBottom.css
:root {
  --panel-height: 64px;
}

body {
  padding-bottom: var(--panel-height);
}

.BottomPanel {
  z-index: 1;
  position: fixed;
  left: 0;
  bottom: 0;
  width: 100%;
  height: var(--panel-height);
  background-color: #C0C0FF;
}

解説

BottomPanel クラスがフローティング枠を定義するクラスです。 スクロールアウトを防ぐため position:fixed; を指定し、bottom:0,left:0,width:100%,height:64px の 指定により画面の下部幅いっぱいの高さ64pxのフローティング枠となります。

また、z-index:1;の指定により、フローティング枠は最前面で表示されます。

画面の下部が表示されない現象に対処するため、bodyのpadding-bottomをフローティング枠の高さと同じ値にしています。 この設定により、ページ最下部までスクロールした際に、末尾のコンテンツがフローティングパネルに隠されない動作になります。

フローティング枠の高さとbodyのpadding-bottomは同じ値にする必要があるため、:rootで変数として定義しています。

表示結果

上記のHTMLファイルをWebブラウザで表示します。下図の画面が表示されます。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像1

下にスクロールするとコンテンツはスクロールアウトしますが、「フローティング枠です」の枠はスクロールせずに画面の下端に表示され続けます。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像2

画面の一番最下部までスクロールした状態が下図になります。画面下部までスクロールすると、最下部の「コンテンツ10」の項目がスクロールインすることが確認できます。~
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像3

番外編:Gridレイアウトで実装する方法

別の実装方法としてGirdレイアウトを利用する方法があります。
同様の動作が実現できますが、スクロールバーの位置が異なり、ウィンドウではなく枠にスクロールバーが表示されます。

FloatingBottomGrid.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <link rel="stylesheet" href="FloatingBottomGrid.css" />
</head>
<body>
  <div class="ContentPanel">
    <h1>ページです。</h1>

    <p>コンテンツ1です。</p>
    <p>コンテンツ2です。</p>
    <p>コンテンツ3です。</p>

  <div style="height:600px;background-color:#ffd800;">大きな枠です。</div>
  <p>コンテンツ4です。</p>
  <p>コンテンツ5です。</p>
  <p>コンテンツ6です。</p>
  <div style="height:400px;background-color:#b6ff00;">中サイズの枠です。</div>
  <p>コンテンツ7です。</p>
  <p>コンテンツ8です。</p>
  <p>コンテンツ9です。</p>
  <p>コンテンツ10です。</p>

  </div>
  <div class="BottomPanel">フローティング枠です。</div>

</body>
</html>

FloatingBottomGrid.css
:root {
  --panel-height: 64px;
}

body {
  padding: 0;
  margin: 0;
  display: grid;
  height: 100vh;
  grid-template-rows: 1fr auto;
}

.ContentPanel {
  overflow: auto; /* ここだけスクロール */
  padding: 1rem 1rem 1rem 1rem;
}

.BottomPanel {
  height: var(--panel-height);
  background-color: #C0C0FF;
}

解説

グリッドレイアウトで上部のコンテンツエリアと下部のフローティングエリアに分割します。
ページ自体はスクロールしない状態にして、下部のフローティングエリアが常に表示される状態にします。 コンテンツ部分は、ContentPanel クラス内に overflow: auto; を指定して枠内がスクロールすることでコンテンツを表示する動作にします。

表示結果

上記のHTMLファイルをWebブラウザで表示します。下図の画面が表示されます。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像4

下にスクロールするとコンテンツはスクロールアウトしますが、「フローティング枠です」の枠はスクロールせずに画面の下端に表示され続けます。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像5

画面の一番最下部までスクロールした状態が下図になります。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像6

以前の実装 (2016年)

コード

下記のHTMLファイルを作成します。
FloatingBelow.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
	<meta charset="utf-8" />
  <link rel="stylesheet" href="FloatingBelow.css" />
</head>
<body>
  <div>ページです。</div>
  <p>コンテンツ1です。</p>
  <p>コンテンツ2です。</p>
  <p>コンテンツ3です。</p>
  <div style="height:600px;background-color:#ffd800;">大きな枠です。</div>
  <p>コンテンツ4です。</p>
  <p>コンテンツ5です。</p>
  <p>コンテンツ6です。</p>
  <div style="height:400px;background-color:#b6ff00;">中サイズの枠です。</div>
  <p>コンテンツ7です。</p>
  <p>コンテンツ8です。</p>
  <p>コンテンツ9です。</p>
  <p>コンテンツ10です。</p>

  <div class="BelowPanel">フローティング枠です。</div>
</body>
</html>
FloatingBelow.css
.BelowPanel {
  z-index:1;
  position:fixed;
  left:0;
  bottom:0;
  width:100%;
  height:64px;
  background-color:#C0C0FF;
}

解説

BelowPanel クラスがフローティング枠を定義するクラスです。スクロールアウトを防ぐため "position:fixed;" を指定し、"bottom:0","left:0","width:100%","height:64px" の指定により画面の下部幅いっぱいの高さ64pxのフローティング枠となります。
また、"z-index:1;"の指定により、フローティング枠は最前面で表示されます。

表示結果

上記のHTMLファイルをWebブラウザで表示します。下図の画面が表示されます。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像7

下にスクロールするとコンテンツはスクロールアウトしますが、「フローティング枠です」の枠はスクロールせずに画面の下端に表示され続けます。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像8

ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像9

画面の一番最下部までスクロールした状態が下図になります。「コンテンツ9」の一部と「コンテンツ10」がフローティングの枠に隠されて画面に表示されていません。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像10

画面の下部が表示されない現象の修正

FloatingBelow.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
	<meta charset="utf-8" />
  <link rel="stylesheet" href="FloatingBelow.css" />
</head>
<body>
  <div>ページです。</div>
  <p>コンテンツ1です。</p>
  <p>コンテンツ2です。</p>
  <p>コンテンツ3です。</p>
  <div style="height:600px;background-color:#ffd800;">大きな枠です。</div>
  <p>コンテンツ4です。</p>
  <p>コンテンツ5です。</p>
  <p>コンテンツ6です。</p>
  <div style="height:400px;background-color:#b6ff00;">中サイズの枠です。</div>
  <p>コンテンツ7です。</p>
  <p>コンテンツ8です。</p>
  <p>コンテンツ9です。</p>
  <p>コンテンツ10です。</p>
  <div class="BlankPanel"></div>

  <div class="BelowPanel">フローティング枠です。</div>
</body>
</html>
FloatingBelow.css
.BelowPanel {
  z-index:1;
  position:fixed;
  left:0;
  bottom:0;
  width:100%;
  height:64px;
  background-color:#C0C0FF;
}

.BlankPanel {
  height:64px;
}

解説

フローティング枠は、ページの上に固定で表示されるため、コンテンツをすべて表示するには、ページのコンテンツにマージンが必要になります。今回のコードでは、フローティング枠と同じ高さをもつ"BlankPanel"クラスを用意し、コンテンツの末尾にこのクラスのDivを設置することで、フローティング枠と同じ高さのマージンを取る画面デザインにしています。

表示結果

上記のHTMLファイルをWebブラウザで表示します。画面下部までスクロールすると、最下部の「コンテンツ10」の項目がスクロールインすることが確認できます。
ページの下部に常に表示されるフローティングの枠を表示するコードと実行結果:画像11


AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2014-02-24
改訂日: 2025-05-04
Copyright © 1995–2025 iPentec all rights reserverd.