teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

説明の改善

2020/10/16 13:58

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  追記
12
12
  ---
13
13
  時間があったので**CSS GridでMasonry的なものを作成**してみました。
14
- 質問の[実コード](https://jsfiddle.net/cb4dk6av/)を元にしました。
14
+ 質問の[実コード](https://jsfiddle.net/cb4dk6av/)を元にしました。
15
15
 
16
16
  [CodePenサンプル](https://codepen.io/hatena19/pen/GRqZrqg)
17
17
 
@@ -61,4 +61,6 @@
61
61
  <!-- 4行分の高さ -->
62
62
  </div>
63
63
  </div>
64
- ```
64
+ ```
65
+
66
+ rs2 rs3 ・・・のクラスの設定はJavaScriptを使って各ブロックの高さを取得して設定するようにすれば手書きでちまちまする必要はなくなりますね。

1

コード追記

2020/10/16 13:58

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -1,9 +1,64 @@
1
1
  まず、`flex: 0.5fr;` の部分ですが、fr は CSS Grid の単位で、Flexboxでは使えなかったと思います。
2
- `flex: 0 0 50%;` としていすべきでしょう。
2
+ `flex: 0 0 50%;` と指定すべきでしょう。
3
3
 
4
4
  FlexBoxで `flex-direction: row;` と行方向に展開する場合、行基準になるため、高さの違うブロックがあり下に余白ができても下の要素が上にくることはありません。
5
5
 
6
6
  `flex-direction: column;`で列方向に展開したほうが希望に近いレイアウトになるでしょう。
7
7
  ただし、幅が異なる要素があると列幅はいちばん広い要素に合わせられますので、今度は左右に余白ができます。
8
8
 
9
- 高さも幅も異なる要素がある場合は、CSS Grid を使うことになるでしょう。
9
+ 高さも幅も異なる要素がある場合は、CSS Grid を使うことになるでしょう。
10
+
11
+ 追記
12
+ ---
13
+ 時間があったので**CSS GridでMasonry的なものを作成**してみました。
14
+ 質問の[実行コード](https://jsfiddle.net/cb4dk6av/)を元にしました。
15
+
16
+ [CodePenサンプル](https://codepen.io/hatena19/pen/GRqZrqg)
17
+
18
+ CSSのポイント部分は下記になります。
19
+ Gridの自動配置を最大限利用してます。(IE11には非対応です。)
20
+
21
+ ```css
22
+ .product-are-container {
23
+ display: grid;
24
+ justify-content: center; /* 左右中央寄せ */
25
+ grid-template-columns: repeat(auto-fill, 25rem); /* 横幅に合わせて繰り返す */
26
+ grid-auto-rows: 3.2rem; /* 行を必用なだけ繰り返す */
27
+ grid-auto-flow: dense; /* なるべく隙間なく敷き詰める */
28
+ gap: 0.5rem;
29
+ margin: 0.5rem;
30
+ }
31
+
32
+ /* 以下各ブロックが何行分占有するかを指定 */
33
+ .rs2 {
34
+ grid-row: span 2;
35
+ }
36
+ .rs3 {
37
+ grid-row: span 3;
38
+ }
39
+ .rs4 {
40
+ grid-row: span 4;
41
+ }
42
+ .rs5 {
43
+ grid-row: span 5;
44
+ }
45
+ .rs5 {
46
+ grid-row: span 6;
47
+ }
48
+ ```
49
+
50
+ HTMLではそのブロックが何行分の高さかを rs2 rs3 ・・・のクラスを設定することで指定します。
51
+
52
+ ```html
53
+ <div class="product-are-container">
54
+ <div class="category-wrapper rs2">
55
+ <!-- 2行分の高さ -->
56
+ </div>
57
+ <div class="category-wrapper rs3">
58
+ <!-- 3行分の高さ -->
59
+ </div>
60
+ <div class="category-wrapper rs4">
61
+ <!-- 4行分の高さ -->
62
+ </div>
63
+ </div>
64
+ ```