当前位置: 首页 > 面试题库 >

动画和过渡的组合无法正常工作

姜天宇
2023-03-14
问题内容

我一直在尝试放置一些基本的CSS3动画。目的是在按钮的click事件上切换类,并根据添加的类为div设置动画。该代码非常适合Firefox中的第一个切换迭代,但是对于Chrome等其他浏览器以及Firefox中的下一个迭代,只需瞬间即可切换。请帮助我找出问题所在。

片段:

$('button').click(function() {

  $('div').toggleClass('clicked');

});


div {

  background-color: #ccc;

  height: 100px;

  width: 100px;

  transition-property: top, left;

  transition-duration: 1s;

  transition-timing-function: linear;

  position: relative;

  top: 0;

  left: 0;

}

.clicked {

  animation-name: clicked;

  animation-duration: 1s;

  animation-timing-function: linear;

  animation-fill-mode: forwards;

}

@keyframes clicked {

  0% {

    top: 0;

    left: 0;

  }

  100% {

    top: 100px;

    left: 100px;

  }

}


<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button type="button">Click Me!</button>

<div></div>

我也在这里准备了一个小提琴。


问题答案:

这是Chrome的一种已知行为。Firefox似乎确实能够在过渡过程中顺利处理动画的删除,但Chrome却不能。发生。

为什么删除动画不能在Chrome中进行过渡?

尽管我无法提供100%的万无一失的解释,但我们可以根据有关HTML5Rocks中有关Chrome加速渲染的文章和[有关GPU中GPU加速合成的在某种程度上对其进行解码。

似乎发生的事情是,该元素获得了自己的呈现层,因为在其上设置了显式的position属性。当某个图层(或其一部分)由于动画而失效时,Chrome只会重新绘制受更改影响的图层。当您打开Chrome开发者控制台时,打开“显示油漆矩形”选项,您会看到在动画发生时Chrome仅绘制正在动画的实际元素。

但是,在动画的开始和结束时会发生整个页面的重新绘制,这将使元素立即回到其原始位置,从而覆盖过渡行为。

$('button').click(function(){

  $('div').toggleClass('clicked');

});


div{

  background-color: #ccc;

  height: 100px;

  width: 100px;

  transition-property: top, left;

  transition-duration: 1s;

  transition-timing-function: linear;

  position: relative;

  top: 0;

  left: 0;

}

.clicked{

  animation-name: clicked;

  animation-duration: 1s;

  animation-timing-function: linear;

  animation-fill-mode: forwards;

}

@keyframes clicked{

  0% {top: 0; left: 0;}

  100% {top: 100px; left: 100px;}

}


<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button type="button">Click Me!</button>

<div></div>

解决办法是什么?

由于您的运动实际上是从一个位置到另一个位置的线性运动,因此无需任何动画就可以实现它。我们需要做的就是使用translate转换并将元素移位所需的no。类别开启时的像素数。由于存在通过另一个选择器分配给元素的过渡,因此移位将以线性方式发生。关闭类时,由于元素上的过渡,元素将再次以线性方式移回到其原始位置。

$('button').click(function() {

  $('div').toggleClass('clicked');

});


div {

  background-color: #ccc;

  height: 100px;

  width: 100px;

  transition-property: transform;

  transition-duration: 1s;

  transition-timing-function: linear;

  position: relative;

  top: 0;

  left: 0;

}

.clicked {

  transform: translate(100px, 100px);

}


<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>

<button type="button">Click Me!</button>

<div></div>


 类似资料:
  • 问题内容: 我有一个网站,我决定用纯CSS代码段替换基于jquery的切换框。当我使用固定的高度值进行过渡时(CSS的最后几行),效果很好,但是使用该值时,动画丢失了,只有高度变化才起作用! 有没有办法将其与自动值一起使用?我想使用可变文本而不使用脚本。 问题答案: 如果您只想使用CSS,则一种解决方案是过渡而不是将其设置为比以往任何时候都更大的值… 您将需要稍稍缩短转换的速度,但是至少该示例使您

  • 本文向大家介绍解决vue的过渡动画无法正常实现问题,包括了解决vue的过渡动画无法正常实现问题的使用技巧和注意事项,需要的朋友参考一下 前记:最近在写vue的一个项目要实现过渡的效果,虽然vue动画不是强项,库也多,但是基本的坑还是得踩扎实; 建议:先学习vue官方文档的进入/离开 & 列表过渡章节,那么我们来看bug; 首先上出现问题的代码 以上代码看起起来真的没有什么问题,但是复制粘贴发现过渡

  • 是不是可以结合和?我想实现以下更改效果: 一个视图保留在屏幕上 从旧活动滑出的其他视图 来自新活动的视图逐渐消失 我可以分别使用第1点和第2点,第3点,是否有一种方法可以同时使用它们,可能使用不同的方法或其他方法?

  • 主要内容:过渡,实例,实例,实例,实例,JavaScript 钩子,HTML 代码:,JavaScript 代码:,实例,初始渲染的过渡本章节我们主要讨论 Vue.js 的过渡效果与动画效果。 过渡 Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。 Vue 提供了内置的过渡封装组件,该组件用于包裹要实现过渡效果的组件。 语法格式 我们可以通过以下实例来理解 Vue 的过渡是如何实现的: 实例 <div id = "databinding"> <button v-on:c

  • 我正在寻求对组件中的徽章进行动画处理。它有两种可能的状态: 隐藏 显示 当徽章从隐藏转变为显示时,我希望它淡入页面,当徽章由显示转变为隐藏时,我想它淡出。这部分工作得很好-我只需在0和1之间更改不透明度值的状态。 然而,当徽章被隐藏时,它仍然在DOM上,因为它是按钮的一部分,所以在鼠标悬停时看到徽章仍然被占用的所有空白空间看起来很奇怪。理想情况下,当它被隐藏时,我希望它从DOM中消失。 为此,当徽