2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

flexboxで、基本は中央寄せだが折り返して数が足りない要素は左寄せにした~い→gridで出来ました

Posted at

はじめに

掲題のことができずにQiitaで質問しようとしていましたが、自己解決したので記事にします。

解決したいこと

以下のhtmlがあります。

<html>
  <body>
    <div class="parent">
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
    </div>
    <style>
      .parent {
        width: 600px;
        height: 300px;
        padding: 20px;
        background-color: gray;
        display: flex;
        flex-wrap: wrap;
        column-gap: 10px;
      }
      .child {
        min-width: 120px;
        height: 120px;
        background-color: red;
        border: 1px solid;
      }
    </style>
  </body>
</html>

これはこんな感じの表示になります。
image.png
これを「全体としては中央寄せにするが、折り返されている2つの要素は左寄せ」にしたいのですがやり方が分かりませんでした。
image.png
↑こうしたい

なお、この表示はbackground-colorbordertransparentdivを2つ追加して数を揃えているだけです。
最悪これでも良いのですが、要素数が動的だと毎回横幅から収まる数を計算して折り返し要素数との差分だけtransparent要素を入れるという処理が必要でありイケてない感がするので、よりスマートな解決方法があるはず...

自分で試したこと

  • justify-content: center
    →折り返されている要素も中央に来てしまいます。
    image.png

  • justify-content: space-between
    →折り返されている要素が離れ離れになってしまいます。
    image.png

gridを試す

gridの存在は知っていたのですがほぼ使ったことがなく、なんとなく動的にできなさそうなイメージがあったのでflexboxでの解決方法を色々調べていました。
しかし、いよいよflexboxでは難しそう...となったので、gridで動的に表示できるか調べてみました。

<html>
  <body>
    <div class="parent">
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
    </div>
    <style>
      .parent {
        width: 600px;
        height: 300px;
        padding: 20px;
        background-color: gray;
        /* display: flex; flexではだめだったよ...
        flex-wrap: wrap;
        column-gap: 10px; */
        display: grid;
        grid-template-columns: repeat(auto-fit, minmax(120px, 120px));
        gap: 15px;
        justify-content: center;
      }
      .child {
        min-width: 120px;
        height: 120px;
        background-color: red;
        border: 1px solid;
      }
    </style>
  </body>
</html>

image.png
できた!

おわりに

gridも勉強しないとな...と思いました。
また、もし「flexboxでもこうやればできるよ!」というのがあれば教えて頂ければと思います :bow:

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?