menu
menu

キーワード検索

 

最近の投稿

FlexboxでFooterを画面下部に表示するレイアウト

  • Labs

HTML5でFlexレイアウトのテンプレート+Footerを画面下に固定

こんにちは(・∀・)

前回Flexboxでレイアウトする方法HTML5でFlexレイアウトのテンプレートをご紹介しました。

普通にレイアウトする分にはそれで十分なのですが、スクロール量が少ない時でもFooterを画面の一番下に表示したい場合、上記の方法だとそれを実現することができません。

なので今回はFlexboxのレイアウトでFooterを画面下部に表示してレイアウトする方法をご紹介します。

Contents

  1. FlexboxでFooterを画面下部に表示するレイアウト
  2. 2カラムレイアウト
  3. 3カラムレイアウト

FlexboxでFooterを画面下部に表示するレイアウト

このテンプレートもレスポンシブデザインになっておりスマホサイト及びPCサイトという構造になります。

スマホサイトは1カラムのベーシックなデザインになっており、基本的な構成はbody直下の親要素が#wrapperで縦方向にheaderと#containerとfooterという構成となり、その中の#containerが横方向の親要素になります。

縦方向の親要素の#wrapperはfooterを画面下に表示させるために必要となります。#wrapperにdisplay:flex、flex-direction:column、headerとfooterには高さ固定でheightを指定、#containerにflex:autoを指定して縦方向の可変を実現します。

また、footerを画面下に固定するとコンテンツ部分の#column1・#column2は画面の高さいっぱいにはならず一番大きいカラムの高さになりますので注意が必要です。

横方向は親要素#column-wrapの中に#column1・#column2を並べています。


2カラムレイアウト

2カラムレイアウトのサンプルです。#column-wrapの中に#column1・#column2を入れてレイアウトします。

#column-wrapにdisplay:flexを指定します。#column1・#column2のサイドバーになる要素をサイズを固定にしてコンテンツになる要素を可変にします。

固定幅にするカラムに横幅の数値を指定して可変幅にするカラムにflex:autoを指定します。

サンプル
HTML

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>【サンプルデモ】HTML5で2カラムFlexレイアウト - Webデザインラボ</title>
<meta name="description" content="">
<meta name="keywords" content="">
<!--Require Mobile-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=10.0, user-scalable=yes">
<!--Require Stylesheet-->
<link rel="stylesheet" href="sample.css">
<!--Require JavaScript-->
<script src="sample.js"></script>
</head>
<body>
<div id="wrapper">
<header>
<h2 id="toplogo"><a href="/">Webデザインラボ</a></h2>
</header>
<div id="container">
<div id="column-wrap">
<div id="column1">
<h4>#column1</h4>
<p>このカラムの横幅は<span class="txt-sp">100%です。</span><span class="txt-pc">可変幅です。</span></p>
<h4>このテンプレートでやっていること</h4>
<dl>
<dt>縦の親要素#wrapper</dt>
<dd>display:flex、flex-direction:column、headerとfooterには高さ固定でheightを指定、#containerにflex:autoを指定して縦方向の可変を実現します。</dd>
<dt>横方向の親要素#column-wrap</dt>
<dd>display:flexを設定してFlexboxでレイアウトしています。</dd>
<dt>子要素#column1と#column2</dt>
<dd>flex:○○を設定して横幅に関する設定をしています。</dd>
<dd>order:○○を設定して表示される順番を決めています。</dd>
</dl>
<h4>PC向けレイアウトで#column1と#column2の横幅を変更したい場合</h4>
<p>このテンプレートでは#column1の横幅が可変幅で#column2の横幅は固定幅です。親要素#column-wrapの横幅から#column2の横幅を引いた値が#column1の横幅になります。</p>
<p>なので親要素#column-wrapの横幅が1200pxの場合、子要素#column2の横幅を300pxにしたら#column1の横幅は900pxになります。</p>
<!--column1--></div>
<div id="column2">
<h4>#column2</h4>
<p>このカラムの横幅は<span class="txt-sp">100%</span><span class="txt-pc">300px</span>です。</p>
<!--column2--></div>
<!--column-wrap--></div>
<!--container--></div>
<footer>
<div id="copyright">&copy;web design lab<!--copyright--></div>
</footer>
<!--wrapper--></div>
</body>
</html>
CSS

@charset "utf-8";
* { margin: 0; padding: 0; box-sizing: border-box; }
html { overflow-y: scroll; overflow-x: auto; }
html,body { height: 100%; -webkit-text-size-adjust: 100%; }
img { border: none; }
ul,ol { list-style: none; }
table { border-collapse: collapse; border-spacing: 0; }
body { font-size: 92%; line-height: 1.6; font-family: "ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic Pro","メイリオ",Meiryo,"MS Pゴシック","MS PGothic",sans-serif; }
h1,h2,h3,h4,h5,h6 { font-size: 100%; }
a,a:link,a:visited { color: #4776AF; text-decoration: none; }
a:hover,a:active { color: #9fb7d4; }
a:focus { outline: none; }
.clear { clear: both; }
article,aside,details,footer,header,main,menu,nav,section,summary { display: block; }
/*--sample----------------------------------------------------------*/
html,body {
  height: 100%;
}
#wrapper {
  min-height: 100vh;
  height: 100%;
  display: flex;/*footer固定1/3*/
  flex-direction: column;/*footer固定2/3*/
}
header {
  border-bottom: 2px solid #9fb7d4;
}
#toplogo {
  margin: 10px auto;
}
/*----------------------------------------------------------------------*/
#container {
  flex: auto;/*footer固定3/3*/
}
#container #column1 {/*カラム1*/
  background: #9fb7d4;
}
#container #column2 {/*カラム2*/
  background: #d49fc2;
}
  #container p,
  #container #column1 p,
  #container #column2 p {
    padding: 10px;
  }
  #container p .txt-pc {
    display: none;
  }
/*----------------------------------------------------------------------*/
footer {
  border-top: 2px solid #9fb7d4;
}
#copyright {
  padding: 10px 0;
  text-align: center;
  font-size: 14px;
}

@media (min-width: 769px) {
body {
  min-width: 1200px;
}
header {
  min-width: 1200px;
}
#column-wrap {
  width: 1200px;
  margin: 0 auto;
  display: flex;
  flex-direction: row;
}
#container #column1 {/*カラム1*/
    flex: auto;
    order: 2;
}
#container #column2 {/*カラム2*/
    flex: 0 0 300px;
    order: 1;
}
  #container p .txt-pc {
    display: inline-block;
  }
  #container p .txt-sp {
    display: none;
  }
footer {
  min-width: 1200px;
}
/* ** */}
Result

サンプルデモはこちら
スマホでのご確認はこちらをどうぞ
QRコード

#wrapperが縦並びの親要素で#column-wrapが横並びの親要素です。

#containerと#column-wrapを兼用したいところですが、#containerまたは#column-wrapを省略すると#column1・#column2の高さが可変になりません。

HTML5でFlexレイアウトのテンプレート+Footerを画面下に固定


3カラムレイアウト

3カラムレイアウトのサンプルです。#column-wrapの中に#column1・#column2・#column3を入れてレイアウトします。

#column-wrapにdisplay:flexを指定します。#column1・#column2・#column3のサイドバーになる要素をサイズ固定にしてコンテンツになる要素を可変にします。

固定幅にするカラムに横幅の数値を指定して可変幅にするカラムにflex:autoを指定します。

サンプル
HTML

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>【サンプルデモ】HTML5で3カラムFlexレイアウト - Webデザインラボ</title>
<meta name="description" content="">
<meta name="keywords" content="">
<!--Require Mobile-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=10.0, user-scalable=yes">
<!--Require Stylesheet-->
<link rel="stylesheet" href="sample.css">
<!--Require JavaScript-->
<script src="sample.js"></script>
</head>
<body>
<div id="wrapper">
<header>
<h2 id="toplogo"><a href="/">Webデザインラボ</a></h2>
</header>
<div id="container">
<div id="column-wrap">
<div id="column1">
<h4>#column1</h4>
<p>このカラムの横幅は<span class="txt-sp">100%です。</span><span class="txt-pc">可変幅です。</span></p>
<h4>このテンプレートでやっていること</h4>
<dl>
<dt>縦の親要素#wrapper</dt>
<dd>display:flex、flex-direction:column、headerとfooterには高さ固定でheightを指定、#containerにflex:autoを指定して縦方向の可変を実現します。</dd>
<dt>横方向の親要素#column-wrap</dt>
<dd>display:flexを設定してFlexboxでレイアウトしています。</dd>
<dt>子要素#column1と#column2と#column3</dt>
<dd>flex:○○を設定して横幅に関する設定をしています。</dd>
<dd>order:○○を設定して表示される順番を決めています。</dd>
</dl>
<h4>PC向けレイアウトで#column1と#column2と#column3の横幅を変更したい場合</h4>
<p>このテンプレートでは#column1の横幅が可変幅で#column2と#column3の横幅は固定幅です。親要素#column-wrapの横幅から#column2と#column3の横幅を引いた値が#column1の横幅になります。</p>
<p>なので親要素#column-wrapの横幅が1200pxの場合、子要素#column2と#column3の横幅を300pxにしたら#column1の横幅は600pxになります。</p>
<!--column1--></div>
<div id="column2">
<h4>#column2</h4>
<p>このカラムの横幅は<span class="txt-sp">100%</span><span class="txt-pc">300px</span>です。</p>
<!--column2--></div>
<div id="column3">
<h4>#column3</h4>
<p>このカラムの横幅は<span class="txt-sp">100%</span><span class="txt-pc">300px</span>です。</p>
<!--column3--></div>
<!--column-wrap--></div>
<!--container--></div>
<footer>
<div id="copyright">&copy;web design lab<!--copyright--></div>
</footer>
<!--wrapper--></div>
</body>
</html>
CSS

@charset "utf-8";
* { margin: 0; padding: 0; box-sizing: border-box; }
html { overflow-y: scroll; overflow-x: auto; }
html,body { height: 100%; -webkit-text-size-adjust: 100%; }
img { border: none; }
ul,ol { list-style: none; }
table { border-collapse: collapse; border-spacing: 0; }
body { font-size: 92%; line-height: 1.6; font-family: "ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic Pro","メイリオ",Meiryo,"MS Pゴシック","MS PGothic",sans-serif; }
h1,h2,h3,h4,h5,h6 { font-size: 100%; }
a,a:link,a:visited { color: #4776AF; text-decoration: none; }
a:hover,a:active { color: #9fb7d4; }
a:focus { outline: none; }
.clear { clear: both; }
article,aside,details,footer,header,main,menu,nav,section,summary { display: block; }
/*--sample----------------------------------------------------------*/
html,body {
  height: 100%;
}
#wrapper {
  min-height: 100vh;
  height: 100%;
  display: flex;/*footer固定1/3*/
  flex-direction: column;/*footer固定2/3*/
}
header {
  border-bottom: 2px solid #9fb7d4;
}
#toplogo {
  margin: 10px auto;
}
/*----------------------------------------------------------------------*/
#container {
  flex: auto;/*footer固定3/3*/
}
#container #column1 {/*カラム1*/
  background: #d49fc2;
}
#container #column2 {/*カラム2*/
  background: #9fb7d4;
}
#container #column3 {/*カラム3*/
  background: #dfd676;
}
  #container p,
  #container #column1 p,
  #container #column2 p,
  #container #column3 p {
    padding: 10px;
  }
  #container p .txt-pc {
    display: none;
  }
/*----------------------------------------------------------------------*/
footer {
  border-top: 2px solid #9fb7d4;
}
#copyright {
  padding: 10px 0;
  text-align: center;
  font-size: 14px;
}

@media (min-width: 769px) {
body {
  min-width: 1200px;
}
header {
  min-width: 1200px;
}
#column-wrap {
  width: 1200px;
  margin: 0 auto;
  display: flex;
  flex-direction: row;
}
#container #column1 {/*カラム1*/
  flex: auto;
  order: 2;
}
#container #column2 {/*カラム2*/
  flex: 0 0 300px;
  order: 1;
}
#container #column3 {/*カラム3*/
  flex: 0 0 300px;
  order: 3;
}
  #container p .txt-pc {
    display: inline-block;
  }
  #container p .txt-sp {
    display: none;
  }
footer {
  min-width: 1200px;
}
/* ** */}
Result

サンプルデモはこちら
スマホでのご確認はこちらをどうぞ
QRコード

こちらも#wrapperが縦並びの親要素で#column-wrapが横並びの親要素です。

こちらも同じく#containerと#column-wrapを兼用したいところですが、#containerまたは#column-wrapを省略すると#column1・#column2・#column3の高さが可変になりません。

HTML5でFlexレイアウトのテンプレート+Footerを画面下に固定


どちらのサンプルも#column-wrapの幅を1200pxで固定して中央に配置しておりますが、この横幅の指定をなくせば画面幅いっぱいのリキッドレイアウトになります。

また#column1・#column2・#column3のorder番号を変更すれば表示順も変更することができます。

関連リンク

HTML5でFlexレイアウトのテンプレート
HTML5でFloatレイアウトのテンプレート

  • カテゴリー:Labs