回答編集履歴

2

absoluteの挙動について検証して説明を書き直しました

2021/09/30 15:25

投稿

surface_0
surface_0

スコア497

test CHANGED
@@ -16,4 +16,40 @@
16
16
 
17
17
 
18
18
 
19
+ ここからは`absolute`の挙動の解説です。
20
+
21
+
22
+
19
- (ここにabsoluteの挙動ついて解説したのでが、半分間違っているのでいったん削除しました)
23
+ `position: absolute`は適用させると、そ要素は **親要素のレイアウト影響を与えなくなりま。**
24
+
25
+ 加えて、通常は親要素の幅いっぱいに自動的に広がるというブロック要素のレイアウトの特徴も無くなります。
26
+
27
+ ですが、明示的にサイズ指定するか、内側から押し広げれば幅は広がります。
28
+
29
+ また、**直近の`position: static`(デフォルト)以外が指定された親要素の幅** に依存するようになります。
30
+
31
+
32
+
33
+ ここで、`label`の唯一の子要素である`.balloon`が`absolute`なので、前述の性質の通り親の`label`の内包レイアウトは幅ゼロになります。
34
+
35
+ また、`.balloon`から見て、直近の`static`以外が指定された親要素は`label`であるから、
36
+
37
+ `.balloon`は実質幅ゼロのレイアウトに依存することになるので、`min-width:100px`(あるいは画像の幅)がつっぱり棒になる形で最小幅を保つことになります。
38
+
39
+
40
+
41
+ というのが初期状態ですが、なぜ`label`の`absolute`を外すと3列に並ぶようになるかというと、
42
+
43
+ `.balloon`の親に`static`以外が指定された要素が存在しなくなることで、**代わりにページ幅に依存するようになる** ので、ページの端に届くまで列の横並びによる幅の拡張ができるようになります。
44
+
45
+ この状態では`max-width:400px`が効くようになるので最大3列まで表示されるようになります。
46
+
47
+
48
+
49
+ 原理は以上ですが、試しに`label`にレイアウトが保持される`position:relative`にしてやると、今度は`.balloon`が`label`の幅に依存するようになるのを確認できると思います。
50
+
51
+ (`inline-block`と`text-align`のおかげで挙動がわかりずらくなってますが)
52
+
53
+
54
+
55
+ わかりずらかったらすいません。

1

absoluteの説明に嘘が入ってるので修正

2021/09/30 15:25

投稿

surface_0
surface_0

スコア497

test CHANGED
@@ -14,34 +14,6 @@
14
14
 
15
15
  ---
16
16
 
17
- ここからは`absolute`の挙動の解説です。
18
17
 
19
18
 
20
-
21
- `position: absolute`は適用させると、そ要素は親要素のレイアウト依存なくなるため、
19
+ (ここにabsoluteの挙動ついて解説たのですが、半分間違っていのでいっん削除しました)
22
-
23
- 通常は親要素の幅いっぱいに広がるブロック要素は幅を持たなくなります。
24
-
25
-
26
-
27
- 明示的にサイズ指定するか、内側から押し広げれば幅は取られますが、
28
-
29
- `float`は親要素の幅の中で回り込み処理をするものなので、幅に余裕が確保されていないと横並びになってくれません。
30
-
31
-
32
-
33
- というのが初期状態ですが、なぜ`label`の`absolute`を外すと3列に並ぶようになるかというと、
34
-
35
- `absolute`は親要素がデフォルトの`position: static`以外が指定されていないと適用されないという仕様だからです。
36
-
37
-
38
-
39
- `.balloon`の親要素である`label`から`absolute`を外すと自動的に`static`となるので、子要素の`.balloon`には`absolute`が適用されなくなります。
40
-
41
- そうすると`display: block`が指定された`label`は、`.balloon`とともにブロック要素本来のレイアウト(幅いっぱい)に広がりますが、`max-width: 400px`で短くなっているということです。
42
-
43
-
44
-
45
-
46
-
47
- わかりずらかったらすいません。