質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

Flex boxで左右均等配置しつつ回り込んだ要素を左寄せにしたい

受付中

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,024

6つの同じサイズの要素をFlexで並べています。
ウインドウサイズや解像度によって3×2列、4と2の2列、5と1の2列、6の1列
と変動するのですが
justify-content: space-between;
で指定すると折り返した2列目の要素が左右に張り付いてしまい
justify-content: space-around;
で指定すると折り返した2列目の要素が真ん中に寄ってしまいます。
折り返した2列目の要素が常に左揃えになるようにしたいのですが何か良い方法はありますでしょうか?

■ ■ ■
■ ■ ■

■ ■ ■ ■
■ ■    ←こうなるようにしたい

.container{
    width:100%;
    display:flex;
    display: -webkit-flex;
    justify-content: space-between;
    -webkit-justify-content: space-between;
    flex-wrap: wrap;
    -webkit-flex-wrap:wrap;
}
.item{
    width:50px;
    height:50px;
    background:#ccc;
}
<div class="container">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+5

質問者さんが実現しようとしていることをflexboxでやろうとすると、非常に面倒です。CSSだけで完結することすら難しいと思います。それほどの手間をかけてまでflexboxを使わなければいけないのでなければ、それ以外のものを使うほうが良いと思います。今回は、CSS Grid Layoutを使った例を載せておきます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>タイトル</title>
    <style>
        .container {
            display: grid;
            width: 100%;
            grid-auto-rows: 50px;
            grid-template-columns: repeat(auto-fit, 50px);
            grid-gap: 100px;
            justify-content: space-between;
        }

        .item {
            background: #ccc;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>
</body>
</html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

空のアイテムを置くことでできるようです。こちらをお試しください。

.container::after{
  content:"";
  display: block;
  width:30%;
}

参考記事: http://blog.webcreativepark.net/2016/08/15-125202.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/13 10:53

    これ質問者さんの意図した通りに動作しない気がするのですが、どうでしょうか?

    キャンセル

0

justify-content: flex-start;
で左揃えになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/12 13:09

    ありがとうございます。その場合要素間に均等にスペースが入らなくなりますよね?
    親要素いっぱいに均等に並べた上で2列目も左から並んでほしいのです。

    キャンセル

  • 2018/03/12 13:27

    なるほど。意図を理解できておらずすみません。
    それだと、NARI_Creator様が回答されているように疑似要素で対応するか、
    justify-content: flex-start;にして、全ての子要素にmargin-leftを%で指定して隙間をあけるか、
    ですかね。

    margin-leftで隙間を開ける場合は、
    改行されるたびに、css mediaqueryで指定しなおさないといけないので、少し面倒くさいですが。

    キャンセル

0

cssでゴリ押し
.itemの幅と倍数でmargin-rightをcalc計算すれば…

<!doctype html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
    html,body{
        padding: 0;
        margin: 0;
    }
    .container{
    width:100%;
    display:flex;
    display: -webkit-flex;
    justify-content: space-between;
    -webkit-justify-content: space-between;
    flex-wrap: wrap;
    -webkit-flex-wrap:wrap;
}
.item{
    width:100px;
    height:50px;
    background:#ccc;
}
/*5列用*/
@media (max-width: 599px) and (min-width: 500px){
    .container div.item:nth-child(5n+2):last-child {
        margin-right: calc(300px + (100% - 500px) / 4 * 3);
    }
    .container div.item:nth-child(5n+3):last-child {
        margin-right: calc(200px + (100% - 500px) / 4 * 2);
    }
    .container div.item:nth-child(5n+4):last-child {
        margin-right: calc(100px + (100% - 500px) / 4 * 1);
    }

}
/*4列用*/
@media (max-width: 499px) and (min-width: 400px){
    .container div.item:nth-child(4n+2):last-child {
        margin-right: calc(200px + (100% - 400px) / 3 * 2);
    }
    .container div.item:nth-child(4n+3):last-child {
        margin-right: calc(100px + (100% - 400px) / 3 * 1);
    }

}
/*3列用*/
@media (max-width: 399px) and (min-width: 300px) {
    .container div.item:nth-child(3n-1):last-child {
        margin-right: calc(100px + (100% - 300px) / 2 * 1);
    }
}
    </style>
</head>
<body>
<div class="container">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
    <!--<div class="item">7</div>-->
    <!--<div class="item">8</div>-->
    <!--<div class="item">9</div>-->
</div>
</body>
</html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Chrome以外無理だけどこういう力技も。(変数部分を展開すればFirefoxでもEdgeでもいけるはず)
※ 画面幅1200px以上は処理していないのでマージンが消えています(規定値をきちんと付ければ対処可能)

.container{
    width:100%;
    display:flex;
    display: -webkit-flex;
    /*
    justify-content: space-between;
    -webkit-justify-content: space-between;
    */
    flex-wrap: wrap;
    -webkit-flex-wrap:wrap;
}
.item{
    width:50px;
    height:50px;
    background:#ccc;
    margin: 5px;
}
@media (max-width: 1200px) { :root { --my-count: 19; } }
@media (max-width: 1140px) { :root { --my-count: 18; } }
@media (max-width: 1080px) { :root { --my-count: 17; } }
@media (max-width: 1020px) { :root { --my-count: 16; } }
@media (max-width: 960px) { :root { --my-count: 15; } }
@media (max-width: 900px) { :root { --my-count: 14; } }
@media (max-width: 840px) { :root { --my-count: 13; } }
@media (max-width: 780px) { :root { --my-count: 12; } }
@media (max-width: 720px) { :root { --my-count: 11; } }
@media (max-width: 660px) { :root { --my-count: 10; } }
@media (max-width: 600px) { :root { --my-count: 9; } }
@media (max-width: 540px) { :root { --my-count: 8; } }
@media (max-width: 480px) { :root { --my-count: 7; } }
@media (max-width: 420px) { :root { --my-count: 6; } }
@media (max-width: 360px) { :root { --my-count: 5; } }
@media (max-width: 300px) { :root { --my-count: 4; } }
@media (max-width: 240px) { :root { --my-count: 3; } }
@media (max-width: 180px) { :root { --my-count: 2; } }
@media (max-width: 120px) { :root { --my-count: 1; } }
.item{
    margin: calc(5px + calc(calc(100% - calc(50px + 10px) * var(--my-count)) / calc(2 * var(--my-count))));
}

動くサンプル:https://jsfiddle.net/myp6seva/1/
動くサンプル(1ウィンドウ表示):https://jsfiddle.net/myp6seva/1/show/


【CSSの変数を使う - CSS | MDN】
https://developer.mozilla.org/ja/docs/Web/CSS/Using_CSS_variables

【calc() - CSS | MDN】
https://developer.mozilla.org/ja/docs/Web/CSS/calc

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/13 10:22

    ある程度広げると突然アイテム間のマージンがなくなりますが、これは意図するものなのでしょうか?

    キャンセル

  • 2018/03/13 10:26

    > ※ 画面幅1200px以上は処理していないのでマージンが消えています
    と書いている通り、面倒なのでそこまでで処理を終えています。(いや、デフォルトをきちんと設定すればいいだけなのですが)

    キャンセル

  • 2018/03/13 11:03

    回答ありがとうございます。縦方向まで変わるので何か違和感があったのでした

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる