通常、position: fixed;でtop: 0;left: 0;の場合、画面の左上が基準位置になります。しかし、親要素(先祖を含む)にtransformが設定されている場合、子要素のposition: fixed;は親要素からの相対位置になってしまいます。
デモページはこちら
以下のhtml構造で確認します。
<p>transform設定あり</p>
<div class="div-parent-01">
<div class="div-child"></div>
</div>
<p>transform設定なし</p>
<div class="div-parent-02">
<div class="div-child"></div>
</div>
CSSは以下になります。クラス名div-parent-01の方にだけ、transform: translate(0);を設定します。結果、position: fixed;を設定した子要素が親要素からの相対位置で配置されます。
.div-parent-01 {
min-height: 100px;
margin: 0 0 1em;
background-color: #fff;
transform: translate(0);
}
.div-parent-02 {
min-height: 100px;
margin: 0 0 1em;
background-color: #fff;
}
.div-child {
position: fixed;
top: 0;
left: 0;
width: 80px;
height: 40px;
}
.div-parent-01 .div-child {
background-color: red;
}
.div-parent-02 .div-child {
background-color: blue;
}
この問題を解決するには、以下のどちらかで実装します。
1. 親要素のtransformを外す
2. 子要素のposition: fixed;を親要素の外に出す
position: fixed;で表示したい要素はhtmlのどこに記述されていても大して変わらないので、親要素のtransformが外せない場合は「2」で実装します。
最悪bodyタグにtransformが設定されていて外せない場合は、bodyタグの外側(bodyの閉じタグの後)にposition: fixed;の要素を記述します。





