如何用transition实现短视频APP的点赞动画

实现不同表情的不断上升

如果使用纯 CSS 实现这一整套动画的话。我们首先需要实现一段无限循环的,大量不同的表情不断向上漂浮的动画

像是这样:

如何用transition实现短视频APP的点赞动画

这个整体还是比较容易实现的,核心原理就是同一个动画,设置不同的 transition-durationtransition-dalay,和一定范围内的旋转角度。

我们首先要实现多个表情,一个 DOM 标签放入一个随机的表情。

我们可以手动一个一个的添加:

<ul class="g-wrap">    <li>?</li>    <li>❤️</li>    <li>?</li>    // ... 随机设置不同的表情符号,共 50 个    <li>...</li></ul>

当然,我个人觉得这样太麻烦。我习惯利用 SASS 的循环函数及随机函数,利用伪元素的 content 去随机生成不同表情。像是这样:

<ul class="g-wrap">    <li></li>    <li></li>    <li></li>    // ... 共50个空标签</ul>
$expression: "?", "?", "❤️", "?", "?", "?", "?", "?", "??", "?", "?", "?", "?", "?";.g-wrap {    position: relative;    width: 50px;    height: 50px;}@for $i from 1 to 51 {    li:nth-child(#{$i}) {        position: absolute;        较好: 0;        left: 0;        width: 50px;        height: 50px;                &::before {            content: nth($expression, random(length($expression)));            position: absolute;            font-size: 50px;        }    }}

这样,我们就能得到 50 个叠加在一起的表情:

因为透明度为 1 的缘故,只能看到最上面的几个表情,实际上这里叠加了 50 个不同的表情。

这里的核心就是 content: nth($expression, random(length($expression))),我们利用了 SASS 的 random 和 length 和 nth 等方法,随机的将 $expression 列表中的表情,添加给了不同的 li 的 before 伪元素的 content 内。

接下来,我们需要让它们动起来

这个简单,添加一个无限的 transform: translate() 动画即可:

@for $i from 1 to 51 {    li:nth-child(#{$i}) {        animation: move 3000ms infinite linear;    }}@keyframes move {    100% {        transform: translate(0, -250px);    }}

效果如下:

如何用transition实现短视频APP的点赞动画

OK,由于 50 个元素都叠加在一起,所以我们需要将动画区分开来,我们给它们添加随机的动画时长,并且,赋予不同的负 transition-delay 值:

@for $i from 1 to 51 {    li:nth-child(#{$i}) {        animation: move #{random() * 2500 + 1500}ms infinite #{random() * 4000 / -1000}s linear;    }}@keyframes move {    100% {        transform: translate(0, -250px);    }}

效果如下:

如何用transition实现短视频APP的点赞动画

效果已经非常接近我们想要的了!这里有一点点的跳跃,需要理解 move #{random() * 2500 + 1500}ms infinite #{random() * 4000 / -1000}s linear 这里大段代码:

  • #{random() * 2500 + 1500}ms 生成 1500ms ~ 4000ms 之间的随机数,表示动画的持续时长

  • #{random() * 4000 / -1000}s 生成 -4000ms ~ 0s 之间的随机数,表示负的动画延迟量,这样做的目的是为了让动画提前进行

如果你对负的 transition-delay 的作用还不了解,可以看看我的这篇文章 — 深入浅出 CSS 动画

到这,还是不够随机,我们再通过随机添加一个较小的旋转角度,让整体的效果更加的随机:

@for $i from 1 to 51 {    li:nth-child(#{$i}) {        transform: rotate(#{random() * 80 - 40}deg);        animation: move #{random() * 2500 + 1500}ms infinite #{random() * 4000 / -1000}s linear;    }}@keyframes move {    100% {        transform: rotate(0) translate(0, -250px);    }}

这里 transform: rotate(#{random() * 80 - 40}deg) 的作用就是随机生成 -40deg ~ 40deg 的随机数,产生一个随机的角度。

至此,我们就得到了这样一个效果:

如何用transition实现短视频APP的点赞动画

利用 transition 化腐朽为神奇

到这里。很多同学可能还不明白,明明是点赞一次产生一个表情,为什么需要一次生成这么多不断运动的表情效果呢?

这是因为,由于 CSS 没法直接正面做到点击一次,生成一个表情,所以我们需要换一种思路实现。

如果这些表情一直都是在运动的,只不过不点击的时候,它们的透明度都为 0,我们要做的,就是当我们点击的时候,让它们从 opacity: 0 变到 opacity: 1

要实现这一点,我们需要巧妙的用到 transition

我们以一个表情为例子:

  • 默认它的透明度为 opacity: 0.1

  • 点击的时候,它的透明度瞬间变成 opacity: 1

  • 然后,通过 transition-delayopacity: 1 的状态保持一段时间后

  • 逐渐再消失,变回 opacity: 0.1

看上去有亿点点复杂,代码会更容易理解:

li {    opacity: .1;    transition: 1.5s opacity 0.8s;}li:active {    opacity: 1;    transition: .1s opacity;}

效果如下:

如何用transition实现短视频APP的点赞动画

一定要理解上面的代码!巧妙地利用 transition 在正常状态和 active 状态下的变化,我们实现了这种巧妙的点击效果。

如果我们把初始的 opacity: 0.1 改成 opacity: 0 呢?就会是这样:

如何用transition实现短视频APP的点赞动画

好,我们结合一下上面两个动画:

  • 我们将所有的表情,默认的透明度改为 0.1

  • 被点击的时候,透明度变成 1

  • 透明度在 1 维持一段时间,逐渐消失

代码如下:

@for $i from 1 to 51{    li:nth-child(#{$i}) {        position: absolute;        较好: 0;        left: 0;        width: 50px;        height: 50px;        transform: rotate(#{random() * 80 - 40}deg);        animation: move #{random() * 2500 + 1500}ms infinite #{random() * 4000 / -1000}s linear;        opacity: .1;        transition: 1.5s opacity .8s;                &::before {            content: nth($expression, random(length($expression)));            position: absolute;        }    }        li:active {        opacity: 1;        transition: .1s opacity;    }}@keyframes move {    100% {        transform: rotate(0) translate(0, -250px);    }}

效果如下:

如何用transition实现短视频APP的点赞动画

嘿,是不是有那么点意思了!

好最后一步,我们通过一个点击按钮引导用户点击,并且给与一个点击反馈,每次点击的时候,点赞按钮放大 1.1 倍,同时,我们把默认表情的透明度从 opacity: 0.1 彻底改为 opacity: 0

这样,整个动画的完整的核心代码:

<ul class="g-wrap">    <li></li>    <li></li>    <li></li>    // ... 共50个空标签</ul>
$expression: "?", "?", "❤️", "?", "?", "?", "?", "?", "??", "?", "?", "?", "?", "?";.g-wrap {    position: relative;    width: 50px;    height: 50px;    &::before {        content: "??";        position: absolute;        width: 50px;        height: 50px;        transition: 0.1s;    }    &:active::before {        transform: scale(1.1);    }}@for $i from 1 to 51 {    li:nth-child(#{$i}) {        position: absolute;        width: 50px;        height: 50px;        transform: rotate(#{random() * 80 - 40}deg);        animation: move #{random() * 2500 + 1500}ms infinite #{random() * 4000 / -1000}s cubic-bezier(.46,.53,.51,.62);        opacity: 0;        transition: 1.5s opacity .8s;        &::before {            content: nth($expression, random(length($expression)));            position: absolute;        }    }    li:active {        transition: .1s opacity;        opacity: 1!important;    }}@keyframes move {    100% {        transform: rotate(0) translate(0, -250px);    }}

这里,需要注意的是:

  • 点赞的按钮,通过了父元素 .g-wrap 的伪元素实现,这样的好处是,子元素 li 的 :active 点击事件,是可以冒泡传给父元素的,这样每次子元素被点击,我们都可以放大一次点赞按钮,用于实现点击反馈;

  • 稍微修改一下缓动函数,让整体效果更为均衡合理。

这样,我们就得到了题图一开始的效果,利用纯 CSS 实现的点赞动画:

如何用transition实现短视频APP的点赞动画

感谢各位的阅读,以上就是“如何用transition实现短视频APP的点赞动画”的内容了,经过本文的学习后,相信大家对如何用transition实现短视频APP的点赞动画这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

文章标题:如何用transition实现短视频APP的点赞动画,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/23570

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月8日 上午1:33
下一篇 2022年9月8日 上午1:34

相关推荐

  • windows罗技驱动常见问题怎么解决

    罗技驱动怎么用 1、首先我们百度搜索罗技驱动,进入罗技的网站。 2、进入后在上方选中“支持”,进入“软件下载” 3、然后点击下载下方的“下载与应用程序” 4、接着在软件下方找到并进入“罗技G HUB” 5、在上方可以选择我们的系统版本。 6、选择完成后点击下方的“download now” 7、然后…

    2022年9月20日
    1.2K00
  • PDF转Word SDK效果对比

    Hello 大家好,我是小瘪三。我们打工人平时办公免不了要对一些文档格式行转换。我们将探讨几款主流的 PDF 转 Word SDK,分析它们在我们打工人的实际工作中所呈现的优势与劣势。 Solid:老牌的 PDF to Office 转档库,有几十年的积累。 Aspose: 支持非常多的文件格式互转…

    2023年8月31日
    44900
  • Oracle中for循环如何使用

    Oracle for in loop 循环的一些实例,以作学习和加强使用熟练度及场景应用. 一些技巧 for 语句后面的 loop end loop 可以类比成 c#/java 等编程语言 for 语句后面的语句块符号(花括号{}), 以便理解和使用. 一些实例 循环输出数值 — 循环输出数值be…

    2022年8月29日
    60400
  • Pytorch中的tensor数据结构实例代码分析

    torch.Tensor torch.Tensor 是一种包含单一数据类型元素的多维矩阵,类似于 numpy 的 array。Tensor 可以使用 torch.tensor() 转换 Python 的 list 或序列数据生成,生成的是dtype 默认是 torch.FloatTensor。 注意…

    2022年9月15日
    83900
  • 如何进行crawlergo、rad、burpsuite和awvs爬虫的对比

    前言 最近在写代码,涉及了web爬取链接的方面,在百度过程中了解到了这篇文章:superSpider,突然就好奇平时常见的爬虫 工具和扫描器里的爬虫模块能力如何,所以来测试下。 主要测试1个自己手写的瞎眼爬虫,还有crawlergo、rad、burpsuite pro v202012、awvs 20…

    2022年9月26日
    1.3K00
  • windows浩辰cad看图王背景怎么换黑色

    浩辰cad看图王背景换黑色的方法: 1、首先我们打开图纸,点击左上角的“文件”选项。 2、接着在上方栏的帮助中,打开“设置” 3、打开后就可以看到背景颜色了,点击下方的颜色,如图所示。 4、点开后,选中弹出菜单中的“黑色” 5、设置完成后点击下方“确定”保存。 6、保存完成就可以发现我们的背景已经换…

    2022年9月21日
    68700
  • C语言内存分配函数被污染的示例分析

    1、被污染的内存分配 C 语言的内存分配函数包括 malloc()、 kmalloc 、 smalloc()、 xmalloc()、realloc()、 calloc()、 GlobalAlloc()、 HeapAlloc()等等,以 malloc()为例, malloc() 函数的原型为: ext…

    2022年9月20日
    60600
  • tencent files可不可以删除

    “tencent files”可以删除,但是不建议删除;“tencent files”文件是腾讯文件,其中储存的都是与腾讯软件有关的文件,例如QQ中的缓存文件,如果删除该文件,可能会导致腾讯的软件在使用的过程中出现异常。 本教程操作环境:windows10系统、DELL G3电脑。 tencent …

    2022年9月18日
    1.7K00
  • Apache Shiro 1.2.4反序列化漏洞实例分析

    0x00 Apache Shiro 这个组件的漏洞很久之前就爆出来了,但是最近工作中又遇到了,刚好最近也在看Java反序列化的东西,所以决定拿出来再分析一下,期间也遇到了一些奇怪的问题。 网上的分析文章中大部分都是手动添加了commons-collections4-4.0的依赖,目的是为了使用yso…

    2022年9月16日
    58800
  • css如何实现​左下角

    左下角 #triangle-bottomleft { width: 0; height: 0; border-bottom: 100px solid red; border-right: 100px solid transparent;} 以上是“css如何实现左下角”这篇文章的所有内容,感谢各位的…

    2022年9月1日
    58100
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部