【发布时间】:2019-09-03 20:20:58
【问题描述】:
我想在用户单击按钮时使用 CSS 过渡淡入叠加层。
覆盖元素的样式为:transition: opacity 1s
我正在使用 jQuery 将显示从 none 设置为 block,然后在短暂延迟后将不透明度设置为 1:
overlay.css('display', 'block');
setTimeout(function() {
overlay.css('opacity', 1);
}, 10);
没有延迟,叠加层将以完全不透明度显示。
这适用于大多数浏览器(Chrome、Safari、Internet Explorer 11、Edge...),但在 Firefox 中通常不会发生这种转换。较长的超时使 Firefox 更可靠,较短的超时将使其几乎从不显示转换。
在设置不透明度之前,如何可靠地等待 display: block 应用?
function show() {
$('#square').css('display', 'block');
setTimeout(function() {
$('#square').css('opacity', 1);
}, 5);
}
function hide() {
$('#square').css('display', 'none');
$('#square').css('opacity', 0);
}
#square {
width: 100px;
height: 100px;
background-color: red;
opacity: 0;
display: none;
transition: opacity 1s;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onClick="show()">Show</button>
<button onClick="hide()">Hide (no animation)</button>
<div id="square"></div>
【问题讨论】:
-
请添加您的html和css。甚至更好地让 sn-p 重现您的问题。
-
我只能推测 Quantum CSS buggy(或太快) - 所以,这看起来很老套,但
requestAnimationFrame(() => requestAnimationFrame(() => overlay.css('opacity', 1)) );保证可以工作(在所有测试中都有) - 嵌套动画帧,因为第一个回调可能发生得太早 - 第二个总是在适当的时间发生 -
@JaromandaX 通过获取元素的 offsetHeight 而不是使用超时来强制回流似乎始终有效。
标签: javascript jquery css firefox settimeout