RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 795445
Accepted
Виталик Черный
Виталик Черный
Asked:2020-03-09 03:59:41 +0000 UTC2020-03-09 03:59:41 +0000 UTC 2020-03-09 03:59:41 +0000 UTC

如何在css动画结束时获得回调?

  • 772

单击一个元素first会添加一个样式animation = "move 5s";。如何callback在css动画结束时重置样式?您可以以具有样式的类的形式抛出修饰符,或者通过属性然后重置它,但是如何获取它callback?

PS:为了清楚起见,我通过setTimeout.

function getId(id) {
	return document.getElementById(id);
}

function getStyle(elem) {
	return getComputedStyle(elem);
}

function setStyle(elem) {
	return elem.style;
}

let firstElem = getId("first");

firstElem.addEventListener('click', function() {
	setStyle(firstElem).animation = "move 5s";
	setTimeout(function() {
		setStyle(firstElem).animation = "none";
	}, 5000);
});
body {
	background: #3B3738;
	padding: 10px;
}

.elem {
	position: relative;
	text-align: center;
	font-weight: bold;
	font-size: 18px;
	text-transform: uppercase;
	padding: 20px;
	background: #512;
	width: 150px;
	box-shadow: inset 0 0 0 1px #000;
	//animation: move 5s;
	left: 0;
	margin-bottom: 10px;
	&:not(:last-child) {
		margin-bottom: 10px;
	}
}

@keyframes move {
	50% {
		left: 100%;
		transform: translateX(-100%);
	}
}
<div class="elem" id="first">First</div>

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Дмытрык
    2020-03-09T19:56:54Z2020-03-09T19:56:54Z

    动画完成后会触发两个事件,您可以绑定到它们。

    1) transitionend- 当 CSS 属性完成执行时触发transition

    2) animationend - 分别在 CSS 属性完成执行时触发animation。

    • 4
  2. Данил Чугаев
    2020-03-09T20:41:25Z2020-03-09T20:41:25Z

    为了能够callback在函数完成后调用,可以使用requestAnimationFrame. 例如:

    function getId(id) {
    	return document.getElementById(id);
    }
    let firstElem = getId("first");
    
    firstElem.onclick = function() {
        animate(function(timePassed) {
            firstElem.style.left = timePassed / 5 + 'px';
        }, 2000);
    };
    
    // Рисует функция draw
    // Продолжительность анимации duration
    function animate(draw, duration) {
      var start = performance.now();
    
      requestAnimationFrame(function animate(time) {
        // определить, сколько прошло времени с начала анимации
        var timePassed = time - start;
    
          // возможно небольшое превышение времени, в этом случае зафиксировать конец
        if (timePassed > duration) timePassed = duration;
    
        // нарисовать состояние анимации в момент timePassed
        draw(timePassed);
    
        // если время анимации не закончилось - запланировать ещё кадр
        if (timePassed < duration) {
          requestAnimationFrame(animate);
        } else {
        //иначе показываем сообщение что анимация завершилась
        //или вызываем какой нибудь callback
          firstElem.style.left = 0
          alert('анимация завершена')
        }
    
      });
    }
    body {
    	background: #3B3738;
    	padding: 10px;
    }
    .elem {
    	position: relative;
    	text-align: center;
    	font-weight: bold;
    	font-size: 18px;
    	text-transform: uppercase;
    	padding: 20px;
    	background: #512;
    	width: 150px;
    	box-shadow: inset 0 0 0 1px #000;
    	//animation: move 5s;
    	left: 0;
    	margin-bottom: 10px;
    }
    <div class="elem" id="first">First</div>

    阅读更多关于 js 动画的教程,更多信息请点击这里和这里。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5