position を使わずにフッターをページの最下部に持ってくる
◆ ページの一番下に隙間なくフッターを配置する
◆ 高さ 100vh を flexbox で真ん中の要素に flex-grow: 1 するかフッターに margin-top:auto を指定
◆ 高さ 100vh を grid でヘッダーとメイン部分とフッターにわける
◆ 高さ 100vh を flexbox で真ん中の要素に flex-grow: 1 するかフッターに margin-top:auto を指定
◆ 高さ 100vh を grid でヘッダーとメイン部分とフッターにわける
ウィンドウに固定じゃなくてページの一番下にあるけど ページの中身が少ないときにフッターの下に隙間が出ないようにする方法です
ググれば色々あるのですが 見つかるのは古い方法が多めです
margin と position を使ったりしてますけど フッターのサイズを指定しなくていい方法がいいです
全体を囲んだ要素 .container の高さを最低 100vh にします
justify-content を space-between にすることで section を上の端 footer を下の端に配置させます
.container の中の要素が 2 つだけならうまくいきます
しかし space-between だと header も入るとうまくいかないです
3 つの要素になると body が header のすぐ下じゃなくて 真ん中に位置することになります
2 つの要素になればいいので header と section をまとめてしまうことで対処できます
でも気持ち的には header, section, footer が同じ階層に並んでいてほしいですよね
出来る限りなくていい div を減らしたいですし
最後だけ下にもっていけないかと方法を探していたら Stackoverflow で良い回答をみつけました
https://stackoverflow.com/questions/33924655/position-last-flex-item-at-the-end-of-container
margin に auto をつけると自動で広がるので justify-content の代わりに footer に margin-top:auto をつけます
これで header と section が上に並んで footer だけが下に表示されます
真ん中は全部 section の領域にしてしまうこともできます
こっちはもうちょっと簡単です
margin は使わずに section に flex-grow: 1 を指定します
これで自動で section が広がるので header と footer 以外の空間が全部 section になります
3 行 1 列に並べて header と footer は中身の要素に応じて自動サイズ 残りの section は自動で広げるようにしてます
position と margin で頑張る方法よりはわかりやすくなったと思います
ググれば色々あるのですが 見つかるのは古い方法が多めです
margin と position を使ったりしてますけど フッターのサイズを指定しなくていい方法がいいです
flexbox 1 - margin
レイアウトと言えば flexbox です<style>
html, body{
margin: 0;
padding: 0;
}
.container {
min-height: 100vh;
display: flex;
flex-flow: column nowrap;
justify-content: space-between;
}
</style>
<div class="container">
<section>body</section>
<footer>footer</footer>
</div>
html, body{
margin: 0;
padding: 0;
}
.container {
min-height: 100vh;
display: flex;
flex-flow: column nowrap;
justify-content: space-between;
}
</style>
<div class="container">
<section>body</section>
<footer>footer</footer>
</div>
全体を囲んだ要素 .container の高さを最低 100vh にします
justify-content を space-between にすることで section を上の端 footer を下の端に配置させます
.container の中の要素が 2 つだけならうまくいきます
しかし space-between だと header も入るとうまくいかないです
3 つの要素になると body が header のすぐ下じゃなくて 真ん中に位置することになります
2 つの要素になればいいので header と section をまとめてしまうことで対処できます
<div class="container">
<div>
<header>header</header>
<section>body</section>
</div>
<footer>footer</footer>
</div>
<div>
<header>header</header>
<section>body</section>
</div>
<footer>footer</footer>
</div>
でも気持ち的には header, section, footer が同じ階層に並んでいてほしいですよね
出来る限りなくていい div を減らしたいですし
最後だけ下にもっていけないかと方法を探していたら Stackoverflow で良い回答をみつけました
https://stackoverflow.com/questions/33924655/position-last-flex-item-at-the-end-of-container
margin に auto をつけると自動で広がるので justify-content の代わりに footer に margin-top:auto をつけます
<style>
html, body{
margin: 0;
padding: 0;
}
.container {
min-height: 100vh;
display: flex;
flex-flow: column nowrap;
}
footer{
margin-top: auto;
}
</style>
<div class="container">
<header>header</header>
<section>body</section>
<footer>footer</footer>
</div>
html, body{
margin: 0;
padding: 0;
}
.container {
min-height: 100vh;
display: flex;
flex-flow: column nowrap;
}
footer{
margin-top: auto;
}
</style>
<div class="container">
<header>header</header>
<section>body</section>
<footer>footer</footer>
</div>
これで header と section が上に並んで footer だけが下に表示されます
flexbox 2 - grow
ここまでの方法だとスクロールバーがない状態だと section と footer の間は margin 扱いです真ん中は全部 section の領域にしてしまうこともできます
こっちはもうちょっと簡単です
margin は使わずに section に flex-grow: 1 を指定します
これで自動で section が広がるので header と footer 以外の空間が全部 section になります
<style>
html, body{
margin: 0;
padding: 0;
}
.container {
min-height: 100vh;
display: flex;
flex-flow: column nowrap;
}
section{
flex-grow: 1;
}
</style>
<div class="container">
<header>header</header>
<section>body</section>
<footer>footer</footer>
</div>
html, body{
margin: 0;
padding: 0;
}
.container {
min-height: 100vh;
display: flex;
flex-flow: column nowrap;
}
section{
flex-grow: 1;
}
</style>
<div class="container">
<header>header</header>
<section>body</section>
<footer>footer</footer>
</div>
grid
flexbox より新しい機能の grid も使えます<style>
html, body{
margin: 0;
padding: 0;
}
.container {
min-height: 100vh;
display: grid;
grid-template-rows: auto 1fr auto;
}
header{
grid-row: 1;
}
section{
grid-row: 2;
}
footer{
grid-row: 3;
}
</style>
<div class="container">
<header>header</header>
<section>body</section>
<footer>footer</footer>
</div>
html, body{
margin: 0;
padding: 0;
}
.container {
min-height: 100vh;
display: grid;
grid-template-rows: auto 1fr auto;
}
header{
grid-row: 1;
}
section{
grid-row: 2;
}
footer{
grid-row: 3;
}
</style>
<div class="container">
<header>header</header>
<section>body</section>
<footer>footer</footer>
</div>
3 行 1 列に並べて header と footer は中身の要素に応じて自動サイズ 残りの section は自動で広げるようにしてます
position と margin で頑張る方法よりはわかりやすくなったと思います