とあるサイトでpositonの勉強をしておりましたが以下のコードが解説を読んでもどうしても理解できません。
html
1<h1>sample07</h1> 2<section id="section01"> 3<div class="box box01"> 4 box01 5</div> 6<div class="box box02"> 7 box02 8</div> 9</section>
css
1#section01{ 2 background-color:pink; 3 border:2px solid #00f; 4 position:absolute; 5} 6.box { 7 width: 100px; 8 height: 100px; 9 border:1px solid #f00; 10 font-size:20px; 11} 12.box01{ 13 background-color: #aaa; 14} 15.box02{ 16 background-color: #bbb; 17 position:absolute; 18 top:50px; 19 left:50px; 20}
[解説]
#section01に指定した青線がbox01を囲って、背景ピンクがなくなっています。
これは、#section01がposition:absoluteを指定されたことで通常の位置より浮いて(通常の位置とはh1要素と並列の位置)、box01の下に重なっているため、背景ピンクが見えなくなってしまっているのです。
そして、box02が#section01を基準にtop:50px、left:50pxに位置しています。
[疑問点]
これは、#section01がposition:absoluteを指定されたことで通常の位置より浮いて(通常の位置とはh1要素と並列の位置)、box01の下に重なっているため、背景ピンクが見えなくなってしまっているのです。
box01の下に重なっているとのことなのですが、#section01はブロック要素であるのでwidthはブラウザ幅になるのにbox1はwidthが100pxでなぜ見えなくなるのかわかりません。加えてなんで背景は消えてborderの青線がbox01を囲うのかが全く分かりません
どなたかもう少し詳しく解説して頂けないでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
なんとなくですが、包含ブロックだけでなく整形コンテキストとかも知らないと混乱しそうな気がします。
このブロック整形コンテキストは概ね、レンダリング要素を並べて表示するためのレイヤーのようなものとイメージすると理解しやすいです。
MDNの解説通りルート要素(html要素)は最初の最も基本的なレイヤー(ブロック整形コンテキスト)で、表示幅はページ幅(≒ブラウザのクライアント領域の幅)になります。
(※これがiframeの内側であれば、子ページの表示幅は親ページで指定されたiframeの幅になったりします)
そのhtml要素(body要素)の直下に記述されているブロック要素は、上記解説の「新しいブロック整形コンテキストの生成」をしない限り、全て同一のレイヤーに配置&レンダリングされます。
この場合、スタイルで特殊な位置指定やwidth
プロパティが指定されない(つまりwidth:auto
である)ブロック要素は大抵は包含ブロックであるhtml要素に従いページ幅にぴったり収まるようにレンダリングされます
(通常のボックスレイアウトモデルに従い、ページ幅に合わせてmargin/border/paddingを解決するみたいな感じです)。
おそらく、コメントの『#section01=初期包含ブロック=ブラウザ幅という考えになってしまいます』というのはここ辺りの考え方に基づくものではないでしょうか。
さて、ここで新しいブロック整形コンテキストを生成した際の考え方ですが
特にposition:absolute
の場合、「既存の(包含ブロックを含む)レイヤーの1つ上に浮かぶ、全く新しいレイヤー」のようなイメージが近いです。
この新しく浮いたレイヤーは、その内部のレンダリング(サイズ決定と各要素の配置)は独自で解決し、レイヤー自身を包含ブロックである親のレイヤー内に配置するような流れになります。
示されたサンプルで言うと、#section01
の直接の親要素はbody
要素ですがレンダリング時は新しいレイヤーとなり
サイズ計算ではbody
内部=ページ幅ぴったりにおさまるような挙動ではなく Lhankor_Mhy さんが示されているような判定で#section01
自身のスタイル値を参照することになります。
ちなみにですが、新しいブロック整形コンテキストの生成が例えば「表のセル」である場合は「新しい浮いたレイヤー」を生成するわけではなく、
「票のセル内ごとの新しいレイヤー」が生成されるようなイメージで、そこでのサイズ計算は親のtable
関連要素のスタイル指定であったり自動計算時は表全体のレンダリングに影響されたり……と、position:absolute
とはまた違う考え方になったりします。
これは完全に余談なのですが、position:absolute
では「重ね合わせコンテキスト」とかいうものも生成され、やっぱりレイヤーのような考え方で説明されたりしています。
(よくz-index
指定してるのに思った通りの要素が前面に出ない!とかで問題になりがちなやつです)
投稿2024/08/04 11:00
総合スコア636
0
静的配置されたブロック要素の幅は、包含ブロックの幅になろうとしますが、
絶対配置されたブロック要素の幅は、必ずしも包含ブロックの幅になりません。
詳しくは以下の表がわかりやすいです。
https://drafts.csswg.org/css-position/#abspos-auto
この場合、left
width
right
がすべてauto
なので、表の1行目が該当します。
width → shrink-to-fit
とあるとおり、この場合は幅は内部コンテンツにフィットしようとします。
投稿2024/08/03 08:45
編集2024/08/03 08:45総合スコア36865
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/08/04 04:49
2024/08/04 04:57
2024/08/05 07:27 編集
2024/08/05 08:47 編集
2024/08/06 02:05 編集
2024/08/06 03:04
2024/08/06 05:53
2024/08/06 06:30
2024/08/07 05:42 編集
2024/08/07 06:22
2024/08/07 07:03 編集
2024/08/07 11:39
2024/08/07 12:25
2024/08/08 08:15 編集
2024/08/08 10:32
2024/08/09 01:20 編集
2024/08/09 02:59
2024/08/09 09:20
2024/08/09 10:11
2024/08/10 00:48 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/08/05 07:19