我在使用固定定位、CSS转换容器和Safari时遇到了问题。我试图在模态框内点击一个项目以显示下拉列表。模态框带有CSS
在Chrome、Firefox和Opera中,它按预期工作,但Safari表现出奇怪的行为。根据W3C:
transform
。为了确保下拉列表始终显示在模态框上方,我将其定位为固定位置(使用 JS 计算left
和top
值)。在Chrome、Firefox和Opera中,它按预期工作,但Safari表现出奇怪的行为。根据W3C:
因此,CSS转换容器内的固定定位元素应该相对于该容器定位,而不是相对于视口定位。但是似乎Safari并没有像这样运行。请查看此示例:任何计算值(computed value)除了none for the transform都会导致创建一个层叠上下文(stacking context)和包含块(containing block)。该对象作为固定定位后代元素的包含块。
$(document).ready(function() {
$(".show-liste").click(function() {
$(".liste").show();
});
});
.modale {
height: 50px;
overflow-y: scroll;
transform: translate(100px);
}
ul {
position: fixed;
left: 0px;
top: 0px;
}
/* --- Purely style related stuff ---- */
body {
font-size: 80%;
}
.modale {
position: absolute;
top: 50px;
padding: 60px;
background-color: white;
border: 1px solid #ccc;
box-shadow: 2px 2px 2px #ddd;
}
button {
width: 200px;
}
ul {
list-style-type: none;
margin-top: 0;
padding-left: 0;
width: 200px;
display: none;
box-shadow: 2px 2px 2px #ddd;
}
li {
background: white;
padding: 10px 20px;
border: 1px solid #eee;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="modale">
<div class="row">
<div>
<button class="show-liste">Open dropdown</button>
<ul class="liste">
<li>Choice 1</li>
<li>Choice 2</li>
<li>Choice 3</li>
<li>Choice 4</li>
<li>Choice 5</li>
</ul>
</div>
</div>
</div>
你有没有想过如何解决这个问题?有没有任何polyfill或方法可以解决这个问题?使用绝对定位是我想避免的解决方案,因为它会涉及将列表移动到文档的主体级别,然后处理它的创建/销毁、附加模型(我正在使用AngularJS)、事件等。那真的是我的最后一招。
position: fixed
应该始终相对于浏览器视口定位,而不是像absolute
一样相对于包含元素定位。因此,Firefox和Chrome正在偏离官方规范,而Safari认为其行为是“正确的”。 - Blazemonger