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

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

ただいまの
回答率

89.97%

flex:wrap;のときに、左右の幅を調整する方法

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,634
退会済みユーザー

退会済みユーザー

やりたいこと

下記のHTMLがあるとき、

➀数字の要素(.flex > div)
→左に寄せたい。

➁その要素全体(.flex)
→.warpの左右真ん中に置きたい。

という2つを満たしたいです。

<section class="section1">

<div class="wrap">

<div class="flex">
<div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div>
</div>

</div>

</section>

やってみたこと

次のCSSでは、各数字は左に来るものの、その要素全体は真ん中に来てくれません。

図のように、グレーの範囲の右側が大きくなってしまうのです。
イメージ説明

/*数字の要素全体をグレーの左右真ん中にしたいCSS*/
.wrap {
    text-align: center;
    margin: 0 auto;
}

/*特に問題がないと思われるCSS*/
.section1 {
    background: #888;
    padding: 10px;
}
.flex {
    display: flex;
    justify-content: start; /*ビミョーなところ*/
    flex-wrap: wrap;
}
.flex div {
    background: pink;
    width: 50px;
    margin: 10px;
    text-align: center;
}


上のCSSの/*ビミョーなところ*/justify-content: start;centerにすれば、数字の要素全体はグレーの真ん中には来るのですが、すると今後は数字の各要素が左寄せになってくれず、9や10まで真ん中に来てしまうのです。

なんとか冒頭の2つを両立させる方法をご教示いただけませんでしょうか?

table-cellなども試したのですが、どうしてもできず質問させて頂きました。

よろしくお願いいたします。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • defghi1977

    2018/04/10 18:48

    /*ビミョーなところ*/の前に全角スペースがあるので, 削除して下さい.

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/04/11 10:15

    ご指摘ありがとうございます。質問文を修正いたしました。

    キャンセル

回答 5

+4

恐らくこういった配置にしたいのだと思うのですが、この例では数字をspanで囲って隙間を作っています。
親要素をwidth25%で均等に4つ横並びに配置し、paddingで隙間を作っています。

質問者様がされたいレイアウトは、Flexboxよりもgridの方が向いていると思いますので、検討されてはいかがでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/11 10:15

    ありがとうございます。まさに仰るとおりですね。使い分け方を知りませんでしたので参考にさせて頂きます。

    キャンセル

+4

列数が数パターンならlast-childでmargin-right計算すればメディアクエリである程度ゴリ押し出来るかな…。

.flex {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
}
.flex div:last-child{
  margin-right: calc((10px + 50px + 10px) * 2 + 10px);
}


例えばこれだとdivが10個なら4列と3列が対応出来ます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/11 10:18

    なるほど。最後の子の右側に、他の子たちの幅を追加してあげるのですね。考えておりませんでした。ありがとうございます。

    キャンセル

checkベストアンサー

+3

子ノードの幅(width)が固定値ですとなかなかにうまく行かないようです. 代替案として親要素に対する比率で設定するのは如何でしょうか?

<div class="flex">
<div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div>
</div>
.flex {
    background-color: gray;
    display: flex;
    justify-content: left;
    flex-wrap: wrap;
    padding: 10px;
}
.flex div{
    --margin: 10px;
    background: pink;
    width: calc(25% - var(--margin) * 2);
    margin: var(--margin);
    text-align: center;
}

NOTE:
Gridレイアウトでも考えてみましたが, 全く同じ状況になります.
NOTE:
あくまで固定幅に拘るのであれば, スクリプトで子ノードの偏り幅を計算しtransform属性で右にずらすといった方法が考えられます.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/11 10:16

    「--margin」という指定方法をはじめて知りました。またこちらの方法でもきちんとできました。ありがとうございます。感謝です。

    キャンセル

  • 2018/04/11 10:18

    CSS変数という記法でvar関数から値を参照することが可能です.
    https://developer.mozilla.org/ja/docs/Web/CSS/Using_CSS_variables
    これが使えると, ぐっと表現の幅が広がります.

    キャンセル

  • 2018/04/11 10:20

    へぇ~!どう検索したらいいものか迷っていたので、リンク先、うれしいです。

    解決+変数のご指導ということで、ベストアンサーにさせて頂きました。

    どうもありがとうございますっ!!

    キャンセル

+1

.flex {
    display: flex;
    justify-content: flex-start; /*ビミョーなところ*/
    flex-wrap: wrap;
}


これでどうでしょう

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/10 20:05

    あーなんも考えずに入れてしまいましたけど、そうですね
    margin:0 auto;
    を有効にするには幅を指定しないと
    .wrap
    の幅がautoで100%になってしまって中央寄せはできないですね。

    キャンセル

  • 2018/04/11 10:17

    質問で幅の件を明確にしておりませんでしたので、当然の誤解だと思います。失礼いたしました。でも、ご回答誠にありがとうございます。参考になりました。

    キャンセル

  • 2018/04/11 10:20

    むしろ「flex/grid」レイアウトの弱点が明確化されたことで良い質問となったと思います.

    キャンセル

+1

ちょっと前に同じような質問があったので

Flex boxで左右均等配置しつつ回り込んだ要素を左寄せにしたい
https://teratail.com/questions/117116

やはりgridがいいでしょうねえ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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