回答編集履歴

2

別解

2020/05/20 08:06

投稿

thyda.eiqau
thyda.eiqau

スコア2982

test CHANGED
@@ -145,3 +145,141 @@
145
145
 
146
146
 
147
147
  全体の幅と高さを固定しておいて、grid-templateを2等分なり3等分なりに変えたほうがいいような気がします。幅を3つに分けるところは5列ずつでいいとしても2つに分けるところが7列・8列になっていて気持ち悪いし……
148
+
149
+
150
+
151
+ さらに追記
152
+
153
+ ---
154
+
155
+ 別解です。gridの子供に指定するのではなく、親のgrid-templateを変えてしまえばよいという考え方です。
156
+
157
+ ```css
158
+
159
+ .grid-container {
160
+
161
+ display: grid;
162
+
163
+ width: 100px;
164
+
165
+ height: 100px;
166
+
167
+ }
168
+
169
+ .grid-container[data-children-qty="1"] {
170
+
171
+ grid-template: "a" 1fr / 1fr;
172
+
173
+ }
174
+
175
+ .grid-container[data-children-qty="2"] {
176
+
177
+ grid-template:
178
+
179
+ "a" 1fr
180
+
181
+ "b" 1fr / 1fr;
182
+
183
+ }
184
+
185
+ .grid-container[data-children-qty="3"] {
186
+
187
+ grid-template:
188
+
189
+ "a a" 1fr
190
+
191
+ "b c" 1fr / 1fr 1fr;
192
+
193
+ }
194
+
195
+ .grid-container[data-children-qty="4"] {
196
+
197
+ grid-template:
198
+
199
+ "a b" 1fr
200
+
201
+ "c d" 1fr / 1fr 1fr;
202
+
203
+ }
204
+
205
+ .grid-container[data-children-qty="5+"] {
206
+
207
+ grid-template:
208
+
209
+ "a a a b b b" 1fr
210
+
211
+ "c c d d e e" 1fr / 1fr 1fr 1fr 1fr 1fr 1fr;
212
+
213
+ }
214
+
215
+ .grid-container > div {
216
+
217
+ border: 1px solid #222;
218
+
219
+ }
220
+
221
+
222
+
223
+ /* more */
224
+
225
+ .grid-container > div:nth-child(n+6) {
226
+
227
+ background-color: gray;
228
+
229
+ }
230
+
231
+ .grid-container > div:nth-child(n+6) p {
232
+
233
+ font-size: 2.5rem;
234
+
235
+ display: block;
236
+
237
+ position: relative;
238
+
239
+ left: 70px;
240
+
241
+ top: -170px;
242
+
243
+ color: white;
244
+
245
+ }
246
+
247
+ .grid-container > div:nth-child(n+6) img {
248
+
249
+ opacity: 0.6;
250
+
251
+ display: block;
252
+
253
+ }
254
+
255
+ .grid-container > div:nth-child(n+6) a {
256
+
257
+ color: white;
258
+
259
+ text-decoration: none;
260
+
261
+ }
262
+
263
+ ```
264
+
265
+
266
+
267
+ ```js
268
+
269
+ document.querySelectorAll('.grid-container').forEach(container => {
270
+
271
+ const children = container.querySelectorAll(':scope > div');
272
+
273
+ if(children.length === 0) return;
274
+
275
+
276
+
277
+ container.dataset.childrenQty = children.length >= 5? '5+' : children.length;
278
+
279
+ children.forEach((div, idx) => div.style.gridArea = 'abcde'.split('')[idx]);
280
+
281
+ });
282
+
283
+ ```
284
+
285
+ - [CodePen](https://codepen.io/eiqau/pen/YzydERB)

1

要件にあうコードを追記

2020/05/20 08:06

投稿

thyda.eiqau
thyda.eiqau

スコア2982

test CHANGED
@@ -39,3 +39,109 @@
39
39
  });
40
40
 
41
41
  ```
42
+
43
+
44
+
45
+ 追記
46
+
47
+ ---
48
+
49
+ 正直、クラスで指定するのが簡単か(やりやすいか・わかりやすいか)というと微妙な気がしますが……
50
+
51
+ ```js
52
+
53
+ // .grid-contaner の要素を取得し、forEachで回す
54
+
55
+ // 本筋とは関係ないですが、grid-conta"i"nerでは?
56
+
57
+ document.querySelectorAll('.grid-contaner').forEach(container => {
58
+
59
+ // 画像の数は querySelectorAll('img').length で取得してもよいが、
60
+
61
+ // 将来的にimg以外の要素が入ってくる可能性を考慮して、直下のdivの数で取得する
62
+
63
+ const children = container.querySelectorAll(':scope > div');
64
+
65
+ if(children.length === 0) return;
66
+
67
+
68
+
69
+ container 直下の <div> を取得し、forEachで回す
70
+
71
+ container.querySelectorAll(':scope > div').forEach((gridItem, idx) => {
72
+
73
+ switch(idx) {
74
+
75
+ case 0:
76
+
77
+ // 1つ目は基本的にはitem1
78
+
79
+ gridItem.className = 'item1';
80
+
81
+
82
+
83
+ // 画像の数が1つのときはitem10, 2つのときはitem9
84
+
85
+ if(children.length <= 2) {
86
+
87
+ gridItem.className = `item${11-children.length}`;
88
+
89
+ }
90
+
91
+ break;
92
+
93
+ case 1:
94
+
95
+ // 2つ目は基本的にはitem2
96
+
97
+ gridItem.className = 'item2';
98
+
99
+
100
+
101
+ // 画像の数が2つのときはitem8
102
+
103
+ if(children.length === 2) gridItem.className = `item8`;
104
+
105
+ break;
106
+
107
+ case 2:
108
+
109
+ case 3:
110
+
111
+ case 4:
112
+
113
+ // 3つ目から5つ目は基本的にはitem${idx+1}
114
+
115
+ gridItem.className = `item${idx+1}`;
116
+
117
+
118
+
119
+ // 画像の数が4つのときはitem${idx+4}
120
+
121
+ if(children.length === 4) gridItem.className = `item${idx+4}`;
122
+
123
+
124
+
125
+ // 画像の数が3つのときの3つ目はitem8
126
+
127
+ if(children.length === 3 && idx === 2) gridItem.className = 'item8';
128
+
129
+ break;
130
+
131
+ default:
132
+
133
+ // 画像が6つ目以降のとき (idxが0から4ではないとき) はここで指定
134
+
135
+ gridItem.className = 'more';
136
+
137
+ }
138
+
139
+ });
140
+
141
+ });
142
+
143
+ ```
144
+
145
+
146
+
147
+ 全体の幅と高さを固定しておいて、grid-templateを2等分なり3等分なりに変えたほうがいいような気がします。幅を3つに分けるところは5列ずつでいいとしても2つに分けるところが7列・8列になっていて気持ち悪いし……