javascript - 如何在 CSS 中实现数字递增动画
问题描述
我试图创建一个类似于 Twitter 帖子的动画,比如 counter
我想实现相同的效果/动画。我对如何实现动画感到困惑。
这是我到目前为止在 jQuery 中所做的:
$(function() {
var $number = 1;
$('#test').click(function() {
var $elem = $(this).find('span');
var $text = $(this).find('span').text();
$number = $number + 1;
setTimeout(function() {
$(this).find('span').removeClass("static").addClass("up");
}, 0);
setTimeout(function() {
$elem.text($number);
}, 100);
setTimeout(function() {
$elem.removeClass("up").addClass("down");
}, 100);
setTimeout(function() {
$elem.removeClass("down").addClass("static");
}, 200);
});
});
.up {
display: inline-flex;
opacity: 0;
transform: translate3d(0, -20px, 0);
transition: 0.1s ease-in-out;
}
.down {
display: inline-flex;
opacity: 0;
transform: translate3d(0, 20px, 0);
}
.static {
display: inline-flex;
opacity: 1;
transform: translate3d(0, 0px, 0);
transition: 0.1s ease-in-out;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button type="button" id="test" class="btn btn-sm"><span class="static"> 1</span></button>
解决方案
您的代码有两个问题:
- 正如@NullDev所提到的,你已经放置
$text
而不是$elem
你setTimeout
的一个。这是一个简单的错字。 - 第二个问题是行:
$(this).find('span').removeClass("static").addClass("up");
在内部setTimeout
,变量与外部变量不在this
同一个上下文中。要验证这一点,您可以记录:this
setTimeout
console.log($(this).find('span') === $elem); // should be false
要解决此问题,您只需替换:
$(this).find('span').removeClass("static").addClass("up");
在你的第一个setTimeout
:
$elem.removeClass("static").addClass("up");
您可以在下面找到工作代码:
$(function() {
var $number = 1;
$('#test').click(function() {
var $elem = $(this).find('span');
var $text = $(this).find('span').text();
$number = $number + 1;
setTimeout(function() {
$elem.removeClass("static").addClass("up");
}, 0);
setTimeout(function() {
$elem.text($number);
}, 100);
setTimeout(function() {
$elem.removeClass("up").addClass("down");
}, 100);
setTimeout(function() {
$elem.removeClass("down").addClass("static");
}, 200);
});
});
.up {
display: inline-flex;
opacity: 0;
transform: translate3d(0, -20px, 0);
transition: 0.1s ease-in-out;
}
.down {
display: inline-flex;
opacity: 0;
transform: translate3d(0, 20px, 0);
}
.static {
display: inline-flex;
opacity: 1;
transform: translate3d(0, 0px, 0);
transition: 0.1s ease-in-out;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button type="button" id="test" class="btn btn-sm"><span class="static"> 1</span></button>
推荐阅读
- javascript - 通过删除 cookie 的注销功能
- reactjs - React hooks - 从父组件调度重置状态
- c++ - detours vs MinHook 用于 DLL 注入
- python - python和conda:如果找不到包(openssl=1.1.1b=h1de35cc_0)怎么办?
- vba - 如何通过现有的 word.range 定义一个新的 word.range 而不影响原来的?
- android - 使用带有参数的 Fragment 进行导航
- java - 如何从 Java 中的 LinkedList 获取节点条目参考
- linux - LFS 为什么要安装 glibc 两次
- c++ - 如何在OpenGL中绘制一个圆角矩形?
- angular - 模块解析失败:意外字符 '' (1:3)