业界 作者:SegmentFault 2022-08-27 22:34:29 阅读:924
在某条 APP 中,如果长按点赞,会出现这样花里胡哨的动画,如下:

这个动画有两部分组成,其中这个随机表情的实现可以参考 coco 的这篇文章

比较类似,这里就不重复了,我们这里要实现的是这个不断变化的数字动画,如下演示:

仔细观察,主要有以下几个交互:
<button class="like">长按点赞</button>用伪元素来实现提示文案,简单修饰一下。
.like{
position: relative;
}
.like::after{
position: absolute;
bottom: 100%;
width: max-content;
font-size: 2rem;
font-style: italic;
font-weight: bolder;
background-image: linear-gradient(#FFCF02, #FF7352);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
content:'x10';
}
效果如下:

.like::after{
/**/
transform: translateY(100%);
opacity: 0;
visibility: hidden;
transition: .3s;
}
.like:active::after{
visibility: visible;
opacity: 1;
transform: translateY(0);
}

关于这个动画技巧,可以参考我这篇文章 CSS 实现按钮点击动效的套路:https://segmentfault.com/a/1190000041400360
.like::after{
/**/
transform: translateY(100%);
opacity: 0;
visibility: hidden;
transition: .3s .3s, 0s .6s transform; /*默认情况下没有transform*/
}
.like:active::after{
visibility: visible;
opacity: 1;
transform: translateY(0);
transition: .3s;
}

<div>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>...</span>
</div>
.like::after{
/**/
--t:0;
counter-reset: time var(--t);
content: counter(time);
}

@keyframes count {
to {
--t: 999
}
}
.like::after{
/**/
--t:0;
counter-reset: time var(--t);
content: counter(time);
animation: count 100s steps(999) forwards;
}

@property --t {
syntax: '<integer>';
inherits: false;
initial-value: 0;
}

.like::after{
/**/
--t:0;
counter-reset: time var(--t);
content: counter(time);
animation: count 100s steps(999) forwards;
animation-play-state: paused; /*默认暂停*/
}
.like:active::after{
/**/
animation-play-state: running; /*按下运行*/
}

@counter-style 鼓励 {
system: cyclic;
symbols: '鼓励!';
range: 1 20;
}

.like::after{
content: counter(time) counter(time, 鼓励);
}

@counter-style 鼓励 {
system: cyclic;
symbols: '鼓励!';
range: 1 20;
fallback: 加油
}
@counter-style 加油 {
system: cyclic;
symbols: '加油!!';
range: 21 50;
fallback: 太棒了
}
@counter-style 太棒了 {
system: cyclic;
symbols: '太棒了!!!';
range: 51 infinite;
}
@counter-style 鼓励 {
system: cyclic;
symbols: '鼓励!';
range: 0 20;
fallback: 加油
}
@counter-style 加油 {
system: cyclic;
symbols: '加油!!';
range: 0 50; /*进入到这个计数器,起点肯定已经超过了20*/
fallback: 太棒了
}
@counter-style 太棒了 {
system: cyclic;
symbols: '太棒了!!!';
}



