【问题标题】:Transition misbehavior过渡不当行为
【发布时间】:2016-06-03 09:48:21
【问题描述】:

我有几个过渡行为问题,可能它们是同一个问题。 短转换的第一类问题。

<style>
.someclass {
    transition: all 1s linear;
}
</style>
<script>
function activationcode()
{
    //$('.someclass').hide(); was in display none state.
    $('.someclass').css('opacity', 0);
    $('.someclass').show();
    $('.someclass').css('opacity', 1);
}
</script>

添加在大多数情况下,此代码无法按预期工作。 .someclass 项目以最终状态出现。更改属性无关紧要,opacity 只是示例。要使其正常工作,有两件事会有所帮助:a) 更改 all 以转换到特定属性,本示例为 opacity; b) 延迟调用$('.someclass').css('opacity', 1);,例如100ms。 但这只会将问题的概率降低到非常低的值,并不能解决问题。

第二类问题是长动画。它可以工作,但如果你把它放在选项卡(或类似的东西)内,并开始从动画选项卡切换到另一个,动画可能会在指定时间之前以最终状态完成。单次切换/切换回通常不会破坏动画。但是两个或更多开关发生的概率非常高。

我可以在 Firefox 上重现这个(不是最近的)。最初是为 Chrome 报道的(记者称他使用的是最后一个版本)。

我怀疑问题确实取决于页面上的 css/js 活动量(无法用最少的 jsfiddle 重现第二个问题)。

所以问题是如何解决这些问题,是否存在任何解决方案?

【问题讨论】:

  • 你在transition之后忘记了:

标签: javascript css transition


【解决方案1】:

放置线...

$('.someclass').css('opacity', 1);

...在setTimeout(fn, 0) 中。这将延迟其执行,确保浏览器不会将这些步骤优化为一次绘制(以 100% 不透明度显示元素)。

【讨论】:

  • 我这样做了,但在某些情况下,我通常使用的延迟 100 毫秒似乎还不够。
【解决方案2】:

我建议您改用类并仅在 CSS 中处理显示/隐藏

.hide {
    display: none;
    opacity: 0;
    transition: opacity 1s linear 0s, display 0s linear 1s;
    /* decrease opacity, then change display with a delay */
}
.show {
    display: block;
    opacity: 1;
    transition: display 0s linear 0s, opacity 1s linear 0s;
    /* change display instantly without delay, then increase opacity */
}

通过将隐藏延迟 1 秒,您可以在隐藏之前完成不透明度过渡。 但是我们重置了放映的延迟,因为我们需要人们看到不透明度的增加。

【讨论】:

  • 此技术是否需要 setTimeout 解决方法?我没有专门测试,但看起来问题不仅在于在将不透明度设置为 0 以触发过渡之后将不透明度设置为 1。最有可能的是,当浏览器忙于页面上的其他活动时,也会出现该问题。
  • 你不需要任何超时来工作。第四个参数是过渡的延迟,我们用它来让消失在完全隐藏块之前发生。只需用 JS 更改元素的类即可。即使忙于做其他事情,导航器也会自行处理转换。反正比用 JS 做的要流畅很多,因为浏览器可以自己优化。
  • tab切换怎么样,你有什么想法吗?
  • 如果你只是使用 JS 添加/删除类,让浏览器使用 CSS 做动画,它应该也可以解决问题。
猜你喜欢
  • 2019-02-18
  • 1970-01-01
  • 2017-03-11
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多