浪人のサムライ

TOP

flexで下の余白を埋める

最近、gridよりflexを使う機会が多くなりました。しかし、ボックスの下に余白が生まれて、てんやわんやしました。ネットでそれらしい情報を元に、対応したら上手くいきました。完成系は以下になります。

完成系

完成系は以下になります。

ここに文章が入ります。ここに文章が入ります。ここに文章が入ります。

ここに文章が入ります。ここに文章が入ります。ここに文章が入ります。

ここに文章が入ります。ここに文章が入ります。ここに文章が入ります。

ここに文章が入ります。ここに文章が入ります。ここに文章が入ります。

「ここに文章が入ります」の文字の下にピッタリと画像が貼り付いています。サイドバーは特に何もしていません。デフォルトでマージンやパディングがないことが確認できます。

ただ、僕の場合、リセットCSSで対応しています。リセットCSSを指定しないのであれば、何かしらの余白ができるでしょう。

HTML


<div class="wrapper">

<div class="left">
<div class="left__item">
<figure><img src="images/cloud.JPG"></figure>
<p>ここに文章が入ります。ここに文章が入ります。ここに文章が入ります。</p>
</div>

<div class="left__item">
<figure><img src="images/cloud.JPG"></figure>
<p>ここに文章が入ります。ここに文章が入ります。ここに文章が入ります。</p>
</div>

<div class="left__item">
<figure><img src="images/cloud.JPG"></figure>
<p>ここに文章が入ります。ここに文章が入ります。ここに文章が入ります。</p>
</div>

<div class="left__item">
<figure><img src="images/cloud.JPG"></figure>
<p>ここに文章が入ります。ここに文章が入ります。ここに文章が入ります。</p>
</div>
</div>

<aside class="side-bar">

<div class="side-bar__box">
<figure><img src="images/cloud.JPG"></figure>
<p>サイドバー</p>
</div>

<div class="side-bar__box">
<figure><img src="images/cloud.JPG"></figure>
<p>サイドバー</p>
</div>

<div class="side-bar__box">
<figure><img src="images/cloud.JPG"></figure>
<p>サイドバー</p>
</div>

</aside>

</div>

wrapperで、left(コンテンツ部分)、side-bar(サイドバー)を囲んでいます。

CSS


.wrapper {
  width: 100%;
  display: flex;
  gap: 2%;
  flex-wrap: wrap;
  align-items: flex-start;
}

.left {
  width: 70%;
  display: flex;
  flex-wrap: wrap;
  -moz-column-gap: 1%;
  column-gap: 1%;
}
.left__item {
  width: 49%;
}

.side-bar {
  width: 28%;
}

SCSS


.wrapper{
width: 100%;
display: flex;
gap: 2%;
flex-wrap: wrap;
align-items: flex-start;
}

.left{
width: 70%;
display: flex;
flex-wrap: wrap;
column-gap: 1%;
&__item{
width: calc(98% / 2);
}
}

.side-bar{
width: 28%;
}

wrapperにflexを書き、wrapperは親要素なので、align-items: flex-start;を書きます。これで、「ここに文章が入ります」の下ぴったりに画像を置くことができます。

簡単に言うと、親要素にalign-items: flex-start;ですね。flexも忘れず、書きましょう。

子要素はサイズを決める必要がある

display:flexで簡単に横一列にできますが、flex-wrap:wrapにすると画像が横に並びません。そこで、子要素、ここではitemになりますが、widthでサイズを決める必要があります。そのさい、gapも考慮する必要があります。

ややこしいですが、calcが便利です。CSSでは使えないと思うので、これを機に、SCSSの勉強をしてみましょう。

簡単に解説している記事があるので、お時間ある方はご覧ください。

コンテンツ内のflexは

ここではleftにしていますが、これに関してもflexで横並びしています。先ほど書いたように、widthを書かないと横並びになりません。やはり、calcの方が便利ですね。電卓で計算する必要がありません。

普通のCSSでも使えるのだろうか。昔、調べたところ、無理っぽいので、SCSSがいいですね。

ちなみに、SCSSは最終的にCSSにコンパイルする必要があります。

vscodeだと、プラグインで可能なので、気になる方はチェックして下さい。

さいごに

実は、この一連は2時間くらい悩みました。僕が困るということは、誰かも困っていると思っています。もちろん、正解は1つじゃありません。

他にも方法があるかもですので、参考程度にとどめておいてください。

対応はバックアップをしてからにしましょう。

これを元にした、デモサイトを作ったので、そちらも合わせてご覧ください。