返回顶部
首页 > 资讯 > 精选 >使用HTML5怎么实现一个疯狂点赞动画
  • 398
分享到

使用HTML5怎么实现一个疯狂点赞动画

2023-06-09 11:06:13 398人浏览 薄情痞子
摘要

这篇文章给大家介绍使用HTML5怎么实现一个疯狂点赞动画,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<div class="praise_bubble"> &nbs

这篇文章给大家介绍使用HTML5怎么实现一个疯狂点赞动画,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<div class="praise_bubble">  <div class="bubble b1 bl1"></div></div>.praise_bubble{  width:100px;  height:200px;  position:relative;  background-color:#f4f4f4;}.bubble{    position: absolute;    left:50%;    bottom:0;}

Step 2: 运动起来

使用 animation 的帧动画,定义一个 bubble_y 的帧序列。

.bl1{    animation:bubble_y 4s linear 1 forwards ;  }@keyframes bubble_y {    0% {        margin-bottom:0;    }    100% {        margin-bottom:200px;    }}

渐隐效果,使用 opacity 即可。这里我们固定在最后 1/4 开始渐隐。 修改 bubble_y:

@keyframes bubble_y {    0% {        margin-bottom:0;    }    75%{        opacity:1;    }    100% {        margin-bottom:200px;        opacity:0;    }}

使用HTML5怎么实现一个疯狂点赞动画 

Step 4: 增加动画放大效果

在最开始一小段时间,图片由小变大。

于是我们新增一个动画:bubble_big_1。

这里从 0.3 倍原图放大到 1 倍。这里注意运行时间,比如上面设置,从动画开始到结束总共是 4s,那么这个放大时间就可以按需设置了,比如 0.5s。

.bl1{    animation:bubble_big 0.5s linear 1 forwards;  }@keyframes bubble_big_1 {    0% {        transfORM: scale(.3);    }    100% {        transform: scale(1);    }  }

使用HTML5怎么实现一个疯狂点赞动画 

Step 5: 设置偏移

我们先定义帧动画:bubble_1 来执行偏移。图片开始放大阶段,这里没有设置偏移,保持中间原点不变。

在运行到 25% * 4 = 1s,即 1s之后,是向左偏移 -8px, 2s 的时候,向右偏移 8px,3s 的时候,向做偏移 15px ,最终向右偏移 15px。

大家可以想到了,这是定义的一个经典的左右摆动轨迹,“向左向右向左向右” 曲线摆动效果。

@keyframes bubble_1 {    0% {    }    25% {        margin-left:-8px;    }    50% {        margin-left:8px    }    75% {        margin-left:-15px    }    100% {        margin-left:15px    }}

效果图如下:

使用HTML5怎么实现一个疯狂点赞动画 

Step 6: 补齐动画样式

这里预设了一种运行曲线轨迹,左右摆动的样式,我们在再预设更多种曲线,达到随机轨迹的目的。

比如 bubble_1 的左右偏移动画轨迹,我们可以修改偏移值,来达到不同的曲线轨迹。

Step 7: js 操作随机增加节点样式

提供增加点赞的方法,随机将点赞的样式组合,然后渲染到节点上。

let praiseBubble = document.getElementById("praise_bubble");let last = 0;function addPraise() {    const b =Math.floor(Math.random() * 6) + 1;    const bl =Math.floor(Math.random() * 11) + 1; // bl1~bl11    let d = document.createElement("div");    d.className = `bubble b${b} bl${bl}`;    d.dataset.t = String(Date.now());    praiseBubble.appendChild(d);}setInterval(() => {    addPraise();},300)

在使用 CSS 来实现点赞的时候,通常还需要注意设置 bubble 的随机延时,比如:

.bl2{    animation:bubble_2 $bubble_time linear .4s 1 forwards,bubble_big_2 $bubble_scale linear .4s 1 forwards,bubble_y $bubble_time linear .4s 1 forwards;   }

这里如果是随机到 bl2,那么延时 0.4s 再运行,bl3 延时 0.6s &hellip;&hellip;

如果是批量更新到节点上,不设置延时的话,那就会扎堆出现。随机“ bl ”样式,就随机了延时,然后批量出现,都会自动错峰显示。当然,我们还需要增加当前用户手动点赞的动画,这个不需要延时。

另外,有可能同时别人下发了点赞 40 个,业务需求通常是希望这 40 个点赞气泡都能依次出现,制造持续的点赞氛围,否则下发量大又会扎堆显示了。

那么我们还需要分批打散点赞数量,比如一次点赞的时间($bubble_time)是 4s, 那么 4s 内,希望同时出现多少个点赞呢?比如是 10个,那么 40 个点赞,需要分批 4 次渲染。

window.requestAnimationFrame(() => {     // 继续循环处理批次     render(); });

另外还需要手动清除节点。以防节点过多带来的性能问题。如下是完整的效果图。

使用HTML5怎么实现一个疯狂点赞动画 

Canvas 绘图实现

这个很容易理解,直接在 canvas 上绘制动画就行,如果不了解 canvas 的,可以后续学习下。

Step 1:初始化

页面元素上新建 canvas 标签,初始化 canvas。

canvas 上可以设置 width 和 height 属性,也可以在 style 属性里面设置 width 和 height。

  • canvas 上 style 的 width 和 height 是 canvas 在浏览器中被渲染的高度和宽度,即在页面中的实际宽高。

  • canvas 标签的 width 和 height 是画布实际宽度和高度。

<canvas id="thumsCanvas" width="200" height="400" style="width:100px;height:200px"></canvas>

页面上一个宽 200,高 400 的 canvas 画布,然后整个 canvas 显示在 页面 宽 100,高 200 的区域内。canvas 画布的内容被等比缩小一倍显示在页面。

定义一个点赞类,ThumbsUpAni,构造函数就是读取 canvas,保存宽高值。

class ThumbsUpAni{    constructor(){        const canvas = document.getElementById('thumsCanvas');        this.context = canvas.getContext('2d')!;        this.width = canvas.width;        this.height = canvas.height;    }}

Step 2:提前加载图片资源

将需要随机渲染的点赞图片,先预加载,获得图片的宽高,如果有下载失败的,则不显示该随机图片即可。没啥说的,简单易懂。

loadImages(){    const images = [        'jfs/t1/93992/8/9049/4680/5e0aea04Ec9dd2be8/608efd890fd61486.png',        'jfs/t1/108305/14/2849/4908/5e0aea04Efb54912c/bfa59f27e654e29c.png',        'jfs/t1/98805/29/8975/5106/5e0aea05Ed970e2b4/98803f8ad07147b9.png',        'jfs/t1/94291/26/9105/4344/5e0aea05Ed64b9187/5165fdf5621d5bbf.png',        'jfs/t1/102753/34/8504/5522/5e0aea05E0b9ef0b4/74a73178e31bd021.png',        'jfs/t1/102954/26/9241/5069/5e0aea05E7dde8bda/720fcec8bc5be9d4.png'    ];    const promiseAll = [] as Array<Promise<any>>;    images.forEach((src) => {        const p = new Promise(function (resolve) {            const img = new Image;            img.onerror = img.onload = resolve.bind(null, img);            img.src = 'https://img12.360buyimg.com/img/' + src;        });        promiseAll.push(p);    });    Promise.all(promiseAll).then((imgsList) => {        this.imgsList = imgsList.filter((d) => {            if (d && d.width > 0) return true;            return false;        });        if (this.imgsList.length == 0) {            logger.error('imgsList load all error');            return;        }    })}

Step 2:创建渲染对象

实时渲染图片,使其变成一个连贯的动画,很重要的是:生成曲线轨迹。这个曲线轨迹需要是平滑的均匀曲线。 假如生成的曲线轨迹不平滑的话,那看到的效果就会太突兀,比如上一个是 10 px,下一个就是 -10px,那显然,动画就是忽左忽右左右闪烁了。

理想的轨迹是上一个位置是 10px,接下来是 9px,然后一直平滑到 -10px,这样的坐标点就是连贯的,看起来动画就是平滑运行。

随机平滑 X 轴偏移

如果要做到平滑曲线,其实可以使用我们再熟悉不过的正弦( Math.sin )函数来实现均匀曲线。

看下图的正弦曲线:

使用HTML5怎么实现一个疯狂点赞动画

这是 Math.sin(0) 到 Math.sin(9) 的曲线图走势图,它是一个平滑的从正数到负数,然后再从负数到正数的曲线图,完全符合我们的需求,于是我们再需要生成一个随机比率值,让摆动幅度随机起来。

const angle = getRandom(2, 10);let ratio = getRandom(10,30)*((getRandom(0, 1) ? 1 : -1));const getTranslateX = (diffTime) => {    if (diffTime < this.scaleTime) {// 放大期间,不进行摇摆偏移        return basicX;    } else {        return basicX + ratio*Math.sin(angle*(diffTime - this.scaleTime));    }};

scaleTime 是从开始放大到最终大小,用多长时间,这里我们设置 0.1,即总共运行时间前面的 10% 的时间,点赞图片逐步放大。

diffTime,是只从开始动画运行到当前时间过了多长时间了,为百分比。实际值是从 0 --》 1 逐步增大。 diffTime - scaleTime = 0 ~ 0.9, diffTime 为 0.4 的时候,说明是已经运行了 40% 的时间。

因为 Math.sin(0) 到 Math.sin(0.9) 曲线几乎是一个直线,所以不太符合摆动效果,从 Math.sin(0) 到 Math.sin(1.8) 开始有细微的变化,所以我们这里设置的 angle 最小值为 2。

这里设置角度系数 angle 最大为 10 ,从底部到顶部运行两个波峰。

当然如果运行距离再长一些,我们可以增大 angle 值,比如变成 3 个波峰(如果时间短,出现三个波峰,就会运行过快,有闪烁现象)。如下图:

使用HTML5怎么实现一个疯狂点赞动画 

Y 轴偏移

这个容易理解,开始 diffTime 为 0 ,所以运行偏移从 this.height --> image.height / 2。即从最底部,运行到顶部留下,实际上我们在顶部会淡化隐藏。

const getTranslateY = (diffTime) => {    return image.height / 2 + (this.height - image.height / 2) * (1-diffTime);};

放大缩小

当运行时间 diffTime 小于设置的 scaleTime 的时候,按比例随着时间增大,scale 变大。超过设置的时间阈值,则返回最终大小。

const basicScale = [0.6, 0.9, 1.2][getRandom(0, 2)];const getScale = (diffTime) => {    if (diffTime < this.scaleTime) {        return +((diffTime/ this.scaleTime).toFixed(2)) * basicScale;    } else {        return basicScale;    }};

淡出

同放大逻辑一致,只不过淡出是在运行快到最后的位置开始生效。

const fadeOutStage = getRandom(14, 18) / 100;const getAlpha = (diffTime) => {    let left = 1 - +diffTime;    if (left > fadeOutStage) {        return 1;    } else {        return 1 - +((fadeOutStage - left) / fadeOutStage).toFixed(2);    }};

实时绘制

创建完绘制对象之后,就可以实时绘制了,根据上述获取到的“偏移值”,“放大”和“淡出”值,然后实时绘制点赞图片的位置即可。

每个执行周期,都需要重新绘制 canvas 上的所有的动画图片位置,最终形成所有的点赞图片都在运动的效果。

createRender(){    return (diffTime) => {        // 差值满了,即结束了 0 ---》 1        if(diffTime>=1) return true;        context.save();        const scale = getScale(diffTime);        const translateX = getTranslateX(diffTime);        const translateY = getTranslateY(diffTime);        context.translate(translateX, translateY);        context.scale(scale, scale);        context.globalAlpha = getAlpha(diffTime);        // const rotate = getRotate();        // context.rotate(rotate * Math.PI / 180);        context.drawImage(            image,            -image.width / 2,            -image.height / 2,            image.width,            image.height        );        context.restore();    };}

这里绘制的图片是原图的 width 和 height。前面我们设置了 basiceScale,如果图片更大,我们可以把 scale 再变小即可。

const basicScale = [0.6, 0.9, 1.2][getRandom(0, 2)];

实时绘制扫描器

开启实时绘制扫描器,将创建的渲染对象放入 renderList 数组,数组不为空,说明 canvas 上还有动画,就需要不停的去执行 scan,直到 canvas 上没有动画结束为止。

scan() {    this.context.clearRect(0, 0, this.width, this.height);    this.context.fillStyle = "#f4f4f4";    this.context.fillRect(0,0,200,400);    let index = 0;    let length = this.renderList.length;    if (length > 0) {        requestAnimationFrame(this.scan.bind(this));    }    while (index < length) {        const render = this.renderList[index];        if (!render || !render.render || render.render.call(null, (Date.now() - render.timestamp) / render.duration)) {            // 结束了,删除该动画            this.renderList.splice(index, 1);            length--;        } else {            // 当前动画未执行完成,continue            index++;        }    }}

这里就是根据执行的时间来对比,判断动画执行到的位置了:

diffTime = (Date.now() - render.timestamp) / render.duration

如果开始的时间戳是 10000,当前是100100,则说明已经运行了 100 毫秒了,如果动画本来需要执行 1000 毫秒,那么 diffTime = 0.1,代表动画已经运行了 10%。

增加动画

每点赞一次或者每接收到别人点赞一次,则调用一次 start 方法来生成渲染实例,放进渲染实例数组。如果当前扫描器未开启,则需要启动扫描器,这里使用了 scanning 变量,防止开启多个扫描器。

start() {    const render = this.createRender();    const duration = getRandom(1500, 3000);    this.renderList.push({        render,        duration,        timestamp: Date.now(),    });    if (!this.scanning) {        this.scanning = true;        requestFrame(this.scan.bind(this));    }    return this;}

保持不扎堆

当接收到大量的点赞数据,且连续多次点赞(直播间人气很旺的时候)。那么点赞数据的渲染就需要特别注意了,否则页面就是一坨一坨的点赞动画。且衔接不紧密。

thumbsUp(num: number) {      if (num <= this.praiseLast) return;      this.thumbsStart = this.praiseLast;      this.praiseLast = num;      if (this.thumbsStart + 500 < num)        this.thumbsStart = num - 500;      const diff = this.praiseLast - this.thumbsStart;      let time = 100;      let isFirst = true;      if (this.thumbsInter != 0) {        return;      }      this.thumbsInter = setInterval(() => {        if (this.thumbsStart >= this.praiseLast) {          clearInterval(this.thumbsInter);          this.thumbsInter = 0;          return;        }        this.thumbsStart++;        this.thumbsUpAni.start();        if (isFirst) {          isFirst = false;          time = Math.round(5000 / diff);        }      }, time);    },

关于使用html5怎么实现一个疯狂点赞动画就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 使用HTML5怎么实现一个疯狂点赞动画

本文链接: https://lsjlt.com/news/255747.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用HTML5怎么实现一个疯狂点赞动画
    这篇文章给大家介绍使用HTML5怎么实现一个疯狂点赞动画,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<div class="praise_bubble"> &nbs...
    99+
    2023-06-09
  • 在Android项目中实现一个点赞动画
    在Android项目中实现一个点赞动画?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体内容如下MainActivity.java代码:package siso.likea...
    99+
    2023-05-31
    android roi 目中
  • Android怎么实现点赞动画效果
    今天小编给大家分享一下Android怎么实现点赞动画效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言对接下来功能实...
    99+
    2023-06-29
  • 使用Vue transition 实现点赞动画效果
    要实现点赞动画效果,你可以使用Vue的过渡(transition)组件。下面是一个简单的示例代码:```html<templa...
    99+
    2023-09-21
    Vue
  • 怎么在HTML5中实现一个3D焦点图动画
    怎么在HTML5中实现一个3D焦点图动画?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。HTML代码<div class="dg-wrapper&quo...
    99+
    2023-06-09
  • 怎么在Html5页面中使用JSON实现一个动画
    今天就跟大家聊聊有关怎么在Html5页面中使用JSON实现一个动画,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.demo.html里面有很多内联的东西,使用时堆积在页面内不好看仔...
    99+
    2023-06-09
  • 如何使用HTML5实现一个时钟动画
    这篇文章主要为大家展示了“如何使用HTML5实现一个时钟动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用HTML5实现一个时钟动画”这篇文章吧。  ...
    99+
    2024-04-02
  • 使用Html5怎么实现一个移动端弹幕动画效果
    这期内容当中小编将会给大家带来有关使用Html5怎么实现一个移动端弹幕动画效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。思路把单个内容编辑好,计算自身宽度,确定初始位置移动的距离是屏幕宽度js动态的添...
    99+
    2023-06-09
  • 使用Html5怎么在移动端实现一个无缝滚动动画
    使用Html5怎么在移动端实现一个无缝滚动动画?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。html骨架其实很简单,最外面的<div>是做固定的窗口,里面的<...
    99+
    2023-06-09
  • 怎么在html5中使用canvas实现一个动态画饼状图
    怎么在html5中使用canvas实现一个动态画饼状图?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。先用canvas画实心圆//伪代码var canv...
    99+
    2023-06-09
  • 利用Android实现一种点赞动画效果的全过程
    目录前言点击后的缩放效果拇指的散开效果示例总结前言 最近有个需求,需要仿照公司的H5实现一个游戏助手,其中一个点赞的按钮有动画效果,如下图: 分析一下这个动画,点击按钮后,拇指首先...
    99+
    2022-12-08
    android 点赞动画 android点赞效果 android点击动画
  • 怎么用HTML5+CSS3动态画一个笑脸
    本篇内容介绍了“怎么用HTML5+CSS3动态画一个笑脸”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!今天...
    99+
    2024-04-02
  • 怎么使用html5 canvas画一个时钟
    这篇文章主要介绍“怎么使用html5 canvas画一个时钟”,在日常操作中,相信很多人在怎么使用html5 canvas画一个时钟问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 怎么在HTML5中实现一个3D书本翻页动画
    这期内容当中小编将会给大家带来有关怎么在HTML5中实现一个3D书本翻页动画,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。HTML代码 <div class="back...
    99+
    2023-06-09
  • 怎么在HTML5中实现一个移动端弹幕动画效果
    怎么在HTML5中实现一个移动端弹幕动画效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。思路把单个内容编辑好,计算自身宽度,确定初始位置 移动的距离是屏幕宽度js动...
    99+
    2023-06-09
  • 如何用transition实现短视频APP的点赞动画
    这篇文章主要讲解了“如何用transition实现短视频APP的点赞动画”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用transition实现短视频A...
    99+
    2024-04-02
  • CSS怎么利用计数器来实现长按点赞累积动画
    这篇“CSS怎么利用计数器来实现长按点赞累积动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2024-04-02
  • 怎么用HTML5+CSS3动态画出一个大象
    这篇文章主要讲解了“怎么用HTML5+CSS3动态画出一个大象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用HTML5+CSS3动态画出一个大象”吧!...
    99+
    2024-04-02
  • 怎么用html5画一个圆形
    本篇内容主要讲解“怎么用html5画一个圆形”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用html5画一个圆形”吧!代码如下:<!DOCTYPE&n...
    99+
    2024-04-02
  • 使用CSS3怎么实现一个粒子动画效果
    本篇文章给大家分享的是有关使用CSS3怎么实现一个粒子动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。按钮点击粒子动画<div class="b...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作