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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1944閲覧

Masonryに似てるものをflexboxで使えますか

TruoG91

総合スコア7

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/10/15 15:08

編集2020/10/16 15:43

こんにちは!
私は以下のようにmasonryのようなものを作ろうとおもっています。
期待のは以下のようになります。
イメージ説明
ただし、どうしてもBOXを空いている部分に入れません。
私が試したコードは実装コードです。
試した部分は以下となります。

HTML

1<div class="product-are-container"> 2 <div class="category-wrapper"> 3 <div class="category-header"> 4 <h1>Header</h1> 5 </div> 6 <ul class="category-items"> 7 <li class="item-wrapper"> 8 <div class="item-row-1"> 9 <div class="item-title"> 10 <h3>Item Title</h3> 11 <div class="item-subtitle-wrapper"> 12 <i class="fas fa-calculator">1</i> 13 <i class="fas fa-box-open">100</i> 14 </div> 15 </div> 16 <div class="item-price"> 17 <span>500$</span> 18 </div> 19 <div class="item-order"> 20 <i class="zmdi zmdi-shopping-cart-plus"></i> 21 </div> 22 </div> 23 </li> 24 </ul> 25 </div> 26 ・・・・省略部分・・・・ 27 </div>

CSS

1・・・・省略部分・・・・ 2.product-are-container { 3 display: flex; 4 flex-direction: row; 5 flex-wrap: wrap; 6} 7.category-wrapper { 8 flex: 0.5fr; 9 align-self: start; 10} 11・・・・省略部分・・・・

改善方法がご存じすれば、ぜひお教えてください。
よろしくお願いいたします。

2020/10/16追記

解決方法は見つけました。Columnを使います。
参考ですが、以下のように実装しています。
https://jsfiddle.net/z65ewsu0/

CSS

1.product-are-container { 2columns: 3 280px; 3column-gap: 1rem; 4font-size: 1.2rem; 5} 6.category-wrapper { 7display: inline-block; 8width: 100%; 9break-inside: avoid; 10text-align: center; 11font-weight: bold; 12}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、flex: 0.5fr; の部分ですが、fr は CSS Grid の単位で、Flexboxでは使えなかったと思います。
flex: 0 0 50%; と指定すべきでしょう。

FlexBoxで flex-direction: row; と行方向に展開する場合、行基準になるため、高さの違うブロックがあり下に余白ができても下の要素が上にくることはありません。

flex-direction: column;で列方向に展開したほうが希望に近いレイアウトになるでしょう。
ただし、幅が異なる要素があると列幅はいちばん広い要素に合わせられますので、今度は左右に余白ができます。

高さも幅も異なる要素がある場合は、CSS Grid を使うことになるでしょう。

追記

時間があったのでCSS GridでMasonry的なものを作成してみました。
質問の実装コードを元にしました。

CodePenサンプル

CSSのポイント部分は下記になります。
Gridの自動配置を最大限利用してます。(IE11には非対応です。)

css

1.product-are-container { 2 display: grid; 3 justify-content: center; /* 左右中央寄せ */ 4 grid-template-columns: repeat(auto-fill, 25rem); /* 横幅に合わせて繰り返す */ 5 grid-auto-rows: 3.2rem; /* 行を必用なだけ繰り返す */ 6 grid-auto-flow: dense; /* なるべく隙間なく敷き詰める */ 7 gap: 0.5rem; 8 margin: 0.5rem; 9} 10 11/* 以下各ブロックが何行分占有するかを指定 */ 12.rs2 { 13 grid-row: span 2; 14} 15.rs3 { 16 grid-row: span 3; 17} 18.rs4 { 19 grid-row: span 4; 20} 21.rs5 { 22 grid-row: span 5; 23} 24.rs5 { 25 grid-row: span 6; 26}

HTMLではそのブロックが何行分の高さかを rs2 rs3 ・・・のクラスを設定することで指定します。

html

1<div class="product-are-container"> 2 <div class="category-wrapper rs2"> 3 <!-- 2行分の高さ --> 4 </div> 5 <div class="category-wrapper rs3"> 6 <!-- 3行分の高さ --> 7 </div> 8 <div class="category-wrapper rs4"> 9 <!-- 4行分の高さ --> 10 </div> 11</div>

rs2 rs3 ・・・のクラスの設定はJavaScriptを使って各ブロックの高さを取得して設定するようにすれば手書きでちまちまする必要はなくなりますね。

投稿2020/10/15 15:43

編集2020/10/16 13:58
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TruoG91

2020/10/15 15:56

ご回答ありがとうございます。 つまり、CSS Gridを使ったほうがいいでしょうか? 私も初心者なので、詳しくなくてFlexを使っています。 flex-direction: column;だと1列になってしまいます。私の期待は2列です。 flexは不可だそうですね。Gridでやってみます。もし参考できるリンク・サンプルなどをお教えていただければ幸いです。
TruoG91

2020/10/15 16:21

参考リンクありがとうございます。 ただし、赤いBOXが増える可能性なので、heightを指定するのは不便ですね。 多分Gridだけだと不十分だと思い、Javascript処理が必要だそうですね。調べていきます。
TruoG91

2020/10/16 15:40

いろいろありがとうございます。 わたしは解決方法が見つかりました。Columnを使うことにします。 参考ですが、これ(https://jsfiddle.net/z65ewsu0/)はソースです。 修正部分は以下となります。 .product-are-container { columns: 3 280px; column-gap: 1rem; font-size: 1.2rem; } .category-wrapper { display: inline-block; width: 100%; break-inside: avoid; text-align: center; font-weight: bold; } ご参照できれば幸いです。
hatena19

2020/10/16 16:05

なるほど、アイテムの幅が同じなら、columns を使うのが簡単ですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問