こんにちは、さち です。
ウェブサイトを作っているときに、CSS で position: absolute; を使うと「要素」が上手く順番に重ならないことがありました。
思い通りの重なり順にするには position の仕様を理解しないといけなかったので、備忘録としてこの記事を残しておきます。
やりたいこと
HTML
<div id="wrapper"> <div id="blue" >1<div> <div id="orange">2<div> <div id="green" >3<div> </div>
結果(こうなって欲しい)
CSS を書く
おしかった方法
CSS
#wrapper {
position: relative;
}
#blue {
position: absolute;
top: 100px;
left: 100px;
background: skyblue;
}
#orange {
position: absolute;
top: 50px;
left: 50px;
background: gold;
}
#green {
background: limegreen;
}
#blue, #orange, #green {
width: 150px;
height: 150px;
}
結果
div#blue div#orange div#green は HTML の記述の順番的に div#green が一番上になりそうですが違います。
div#orange が一番上になってしまいました。
修正したところ
CSS
見やすいように、修正した部分だけ抜き出しました。
#green {
position: relative;
background: limegreen;
}
#green に position: relative; を追加しました。( static(初期値) 以外なら他の値でもOK)
結果
これで、div#green の要素が最前面に重なるようになりました。
原因(興味がある人向け)
このような現象が起きた原因は、「CSS」の position プロパティです。
position が static(初期値) 以外の値になった「要素」は、通常の重なり順から離脱して「独立」します。(語弊はありますが)簡単にいうと、その「要素」が少しだけ「浮く」んです。
今回の場合、position: absolute; になっている div#blue div#orange は少し浮くので、 div#green よりも上に重なります。
div#green も position: relative; になると、div#blue div#orange と同じように少し浮くので、通常と同じ重なり順になったわけです。
ちなみに、この少しだけ「浮く」現象は、下記のような CSS の値を「初期値以外」に変更した場合に起きます。
positionopacitytransformfilterclip-pathmaskperspectiveisolation
今回は「要素」の重なり順が崩れるという話でしたが、z-index が上手く動作しない原因にもなるので気をつけましょう。
関連記事







コメント