CSS transform 导致 position: fixed 失效问题分析
1、问题描述
在以下示例中,.size-guide-modal设置了position: fixed,
但由于其父元素.grid-item2应用了transform属性,导致fixed定位失效。
2、问题代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
body {
display: grid;
}
.grid {
display: flex;
flex-wrap: wrap;
}
.grid-item1 {
max-width: 65%;
width: 65%;
background-color: #f0f0f0;
height: 400px;
}
.grid-item2 {
max-width: 35%;
width: 35%;
background-color: #e0e0e0;
height: 400px;
transform: translateY(0px); /* 导致fixed失效的transform */
}
.size-guide-modal {
display: block;
position: fixed;
z-index: 999;
left: 0;
top: 0;
width: 35%;
height: 100%;
overflow: auto;
background-color: rgba(0, 0, 0, 0.4);
animation: slideIn 0.5s ease-in-out forwards;
}
</style>
</head>
<body>
<div class="" style="box-sizing: inherit;">
<div class="grid">
<div class="grid-item1"></div>
<div class="grid-item2">
<div><div><div class="size-guide-modal">Size Guide Modal</div></div></div>
</div>
</div>
</div>
</body>
</html>
3、问题表现
.size-guide-moda本应相对于视口固定定位
但实际上会相对于.grid-item2定位
导致模态框位置异常
4、解决方案
方案1:移除transform属性(推荐)
.grid-item2 {
/* 移除transform属性 */
max-width: 35%;
width: 35%;
background-color: #e0e0e0;
height: 400px;
}
方案2:调整DOM结构
<div class="" style="box-sizing: inherit;">
<div class="grid">
<div class="grid-item1"></div>
<div class="grid-item2"></div>
</div>
<!-- 将fixed元素移到transform父级之外 -->
<div class="size-guide-modal">Size Guide Modal</div>
</div>
方案3:改用absolute定位(需配合JS)
.size-guide-modal {
position: absolute;
top: 0;
left: 65%; /* 与.grid-item1宽度匹配 */
width: 35%;
height: 100%;
}
5、总结
-
transform会改变position: fixed的定位基准
-
最简单的解决方法是移除不必要的transform
-
必须保留transform时,调整fixed元素的DOM位置

浙公网安备 33010602011771号