基于 HTML5 Canvas 实现的文字动画特效

这次的这篇文章给大家分享的内容是基于 html5 canvas 实现的文字动画特效,非常的而是用,有需要的朋友可以用来参考一下

前言

文字是网页中最基本的元素,一般我们在网页上都是展示的静态文字,但是就效果来说,还是比较枯燥的。文字淡入淡出的动画效果在项目中非常实用,如果有某些关键的文字,可以通过这种动态的效果来提醒用户阅读。

动态效果图

基于 HTML5 Canvas 实现的文字动画特效

 

这个 Demo 是不断重复地设置文字的大小和透明度,这些英文字母也是我自己利用 HT 的矢量绘制的,总的来说效果还是不错的。

代码实现

代码总共一百来行,比较简单,前面说过我的英文字母是用矢量绘制的,用矢量绘制图形的好处非常多,比如图片缩放不会失真,这样在不同的 Retina 显示屏上我也不需要提供不同尺寸的图片;还有就是用 JSON 的方式来描述矢量,格式比较简洁等等。

矢量图片

接下来绘制这些矢量图片(这里只拿出第一个 H 进行说明):

{    "width": 10,//设置矢量的宽    "height": 10,//设置矢量的高    "comps": [//矢量图形的组件Array数组,每个数组对象为一个独立的组件类型,数组的顺序为组件绘制先后顺序    {        "type": "text",//文本类型        "text": "H",//文本内容        "color": "rgb(69,69,69)",//文本颜色        "align": "center",//文本在矢量中的对齐方式        "opacity": {//文本透明度            "func": "attr@text.opacity",//设置业务属性,对文本进行透明度的数据绑定            "value": 1//如果func中的值为空或者undefined,那么就直接用这个值        },        "clipDirection": "bottom",//裁切方向为“从上到下”        "rect": [//指定组件绘制在矢量中的矩形边界            0,//代表左上角坐标x            0,//代表左上角坐标y            10,//代表组件的width            10//代表组件的height        ]    }]}

 

绘制矢量图形是通过 JSON 格式来书写的,主要的参数有三个:width、height 以及 comps。这三个参数都必须要写上,其中 width 为矢量图形的宽度,height 为矢量图形的高度,comps 里面是一个 Array 数组,数组中是一个个独立的对象,可以对这个对象设置一些预定义参数,也可设置一些可选的参数信息。

这里我将所有的文本信息存储在一个数组中,方便调用:

arr = [    {label: 'H', image: 'symbols/H.json'},    {label: 'T', image: 'symbols/T.json'},    {label: 'f', image: 'symbols/f.json'},    {label: 'o', image: 'symbols/o.json'},    {label: 'r', image: 'symbols/r.json'},    {label: 'W', image: 'symbols/W.json'},    {label: 'e', image: 'symbols/e.json'},    {label: 'b', image: 'symbols/b.json'},];

第一个 label 对象为矢量图形的名称,第二个 image 对象我们设置的是 json 格式的图片,但是实际上可以为 img、canvas 对象或图片 url 或 base64 字符串。

创建节点对象

基于 HTML5 Canvas 实现的文字动画特效

对象的图片已经生成,接下来就是创建对象了,这里英文字母总共 8 个,那么我们创建 8 个节点对象:

  var s = 80;
  arr.forEach(function(obj, index) {
      var text = obj.label;
      name = ‘t’ + text;
      window[name] = createNode(obj.image, 100+s*index, 100);
  });

function createNode(image, x, y) {//节点对象声明    var node = new ht.Node();//这个类为 ht 中定义的节点    node.setSize(0, 0);//设置节点大小    if(image) node.setImage(image);//设置节点图片    if(x && y) node.setPosition(x, y);//设置节点摆放位置    dm.add(node);//将节点添加进数据容器 datamodel 中    return node;}

关于上面的 ht.Node 节点的生成,其实这个只是 HT 封装好的类,这个类上面有很多很方便的 API。然后将这个生成的节点添加进数据容器 dm 中,这个数据容器又是整个拓扑图 gv 的数据容器。

拓扑图生成

来看看如何生成这个拓扑图吧:

dm = new ht.DataModel();//数据容器gv = new ht.graph.GraphView(dm);//拓扑图 通过 gv.getView() 可获得这个拓扑图的底层 pgv.addToDOM();//将 gv 添加进 body 中

实际上 HT 的原理就是在一个 p 中的 canvas 上绘制图形,也就是说这个 gv 就是一个 canvas。

然后通过 getView 获取这个 canvas 的底层 p,这样我们就能将这个 p 添加到 html 页面的任何地方了,addToDOM 的定义如下:

addToDOM = function(){       var self = this,        view = self.getView(),   //获取底层p        style = view.style;    document.body.appendChild(view);      //将底层p添加到body中          style.left = '0';//因为 HT 默认将组件的position设置为absolute 所以要设置位置    style.right = '0';    style.top = '0';    style.bottom = '0';          window.addEventListener('resize', function () { self.iv(); }, false);//窗口大小变化触发事件,调用最外层组件invalidate(即iv)函数进行更新。}

现在刷新页面,你会看到一片空白,为什么?因为前面设置节点的大小为 0 啊,怎么会显示,这个 Demo 的效果就是从无到有,又从有到无。那接下来看看如何“从无到有”。

文本动画

就像我刚刚说过的,要想让节点显示,肯定是需要设置节点的大小为我们肉眼可视的范围才会出现,但是我的目的不仅是从无到有,也是从小到大,这个能够一气呵成么?感觉好像代码内容简单,但是代码量却不小的一个任务,我定义了一个函数用来将节点从无到有,从小到大:

function setSize(node) {    if(node) {         var s = 80,              size = node.getSize().width;//获取节点当前的大小中的宽度,因为我知道宽高都是一样的,所以简写了        var sw = s - size;        ht.Default.startAnim({//HT 封装的动画函数,内容也是 JSON 格式的对象            duration: 1000,// 动画周期毫秒数            easing: function(t) { return t*t },//动画缓动函数            action: function(v, t) {//action函数必须提供,实现动画过程中的属性变化 第一个参数v代表通过easing(t)函数运算后的值,t代表当前动画进行的进度[0~1],一般属性变化根据v参数进行                 node.setSize(//设置节点的大小  (有一个缓动的过程 通过 sw*v 实现的)                    size + sw*v,                     size + sw*v                 );             }         });     } }

从大到小,从有到无的过程也跟上面类似,我就不赘述了。

基于 HTML5 Canvas 实现的文字动画特效

要让这些字母按照时间的先后顺序出现和消失,肯定需要用到 setTimeout 方法,要想实现一次的显示消失是非常容易的,但是我在实现的过程掉到了 setTimeout 的一个陷阱中,只能说自己学艺不精吧。因为我们需要给不同的字母设置不同的出现和消失时间,一般比较简单的方法就是设置一个固定的值,然后乘以对应节点专属的 index:

function animateIn() {    for(let i = 0; i < arr.length; i++) {        var name = 't' + arr[i];    animateLetterIn(window[name], i);//这个部分设置动画    }}

可是如果我直接在 for 循环中设置 setTimeout 的时间为动态变化的,那么这个动态变化的值肯定是只取 for 循环的最后一个值,所以我将 setTimeout 的方法抽取出来作为一个单独的函数:

function animateLetterIn(node, i) {    setTimeout(function() {        setSize(node);    }, i * 200);//这时候这个 i 取的就是节点对应的 i 而不是最后一个值了    if(i === arr.length - 1) {//当节点为最后一个节点时,设置节点淡出动画        setTimeout(function() {        animateOut();//节点淡出动画    }, (arr.length + 3) * 200);    }}

节点淡出动画也是类似的方法,只是需要循环调用这些动画函数,这样才能做到无限循环字母的大小控制。

相关推荐:

实例详解HTML如何实现文件间自由切换

 

以上就是基于 HTML5 Canvas 实现的文字动画特效的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1545986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 17:44:17
下一篇 2025年12月13日 11:27:22

相关推荐

  • HTML5实现拖拽功能步骤详解

    这篇文章主要介绍了HTML5实现拖拽功能步骤详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 问题:突然奇想,想在电影网上加一个收藏(类似于购物车的东西),可以通过拖拽图片进行添加 前提:需要了解HTML5中国Loacl Strorage(当然,其他的web存储也行,…

    好文分享 2025年12月21日
    000
  • HTML5调用移动浏览器相机问题

    因为浏览器和微信浏览器区别,导致直接使用capture=”camera”,浏览器会调用相机。解决方案,就是在组件加载时候,判断一下内核 代码如下 头像 @@##@@ @@##@@ import { USER_DEFAULT_BASE64, HEAD_IMAGE_SIZE_TO_BIG} from ‘…

    好文分享 2025年12月21日
    000
  • 实例详解Html5的背景应用

    这篇文章主要介绍了浅谈Html5的背景属性,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 1、背景属性复习:background-imagebackground-colorbackground-repeatbackground-positionbackground-at…

    2025年12月21日
    000
  • 详解HTML5 表单属性

    今天本文主要和大家详细介绍HTML5的表单属性,需要的朋友可以参考下,希望能帮助到大家。 表单事件: oninput:当用户输入的时候触发。oninvalid:当验证未通过时触发。 demo.html: Documentform { width: 100%; max-width: 640px; mi…

    好文分享 2025年12月21日
    000
  • 9个经典华丽的html5图表应用

    提及图表应用,用HTML5和jQuery制作的网页图表更加方便和使用,而且无论是功能还是外观,定制起来都比较灵活。本文就向大家分享9个经典华丽的HTML5图表应用,也许对你的前端开发会有帮助,一起来看看吧。 1、超酷HTML5 Canvas图表应用Chart.js 今天我们要介绍一款基于HTML5 …

    2025年12月21日 好文分享
    000
  • 关于HTML5的知识小结

    本文给大家带来关于HTML5的知识小结,需要的朋友可以参考下,希望能帮助到大家。下面跟随小编一起来看一下吧。 一:移动开发知识点 一. 使用rem作为单位 html { font-size: 100px; } @media(min-width: 320px) { html { font-size: …

    好文分享 2025年12月21日
    000
  • h5+js实现本地文件读取和写入

    这次给大家带来h5+js实现本地文件读取和写入,h5+js实现本地文件读取和写入的注意事项有哪些,下面就是实战案例,一起来看一下。 代码如下: 读取本地文件 Document //点击导入按钮,使files触发点击事件,然后完成读取文件的操作 $(“#fileImport”).click(funct…

    好文分享 2025年12月21日
    000
  • HTML5联合canvas实现图片压缩

    这次给大家带来html5联合canvas实现图片压缩,主要以代码的形式体现,下面就是实战案例,一起来看一下。 lianxi 名字: 上传: button var file = document.querySelector(‘#fileimage’) var username = document.q…

    好文分享 2025年12月21日
    000
  • HTML5之网页存储

    这次给大家带来HTML5之网页存储 ,HTML5之网页存储 的注意事项有哪些,下面就是实战案例,一起来看一下。 html5 网页存储 web storage 一、认识Web Storage Web Storage是一种将少量数据存储在客户端(client)磁盘的技术。只要支持WebStorage A…

    2025年12月21日
    000
  • html5 viewport总结讲述

    本篇文章是关于HTML5中的viewport的一个讲述,对于HTML5中viewport不太熟悉的同学,我们可以一起看看本篇文章!来详细的了解一下html5中的viewport 总结下来无非围绕三个问题: 1、为什么要设置虚拟窗口 起初是为了使得虚拟窗口的分辨率和pc端接近,这样虚拟窗口依然能够完整…

    好文分享 2025年12月21日
    000
  • 讲讲HTML5中被废弃的标签

    本篇文章讲述了HTML5中被废弃的标签,大家对HTML5中被废弃的标签不了解的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧!切记废弃的html标签最好不要使用哦! 在笔试或者面试中常常会遇到html5新标准的问题,下面是总结的html5废弃标签。 第一类:表现性元素 basefont …

    好文分享 2025年12月21日
    000
  • 了解一下HTML5中新增加的标签

     本篇文章讲述了HTML5中新增加的标签,大家对HTML5中新增加的标签不了解的话那么我们就一起来看看本篇文章吧, 好了废话少说进入正题吧! 在笔试或者面试中常常会遇到html5新标准的问题,如新增了哪些新标签,api,或者干脆问新增了哪些新特性,下面是总结的html5新增标签。 html5中新增标…

    好文分享 2025年12月21日
    000
  • 企业开发中使用H5有哪些注意事项

    这次给大家带来企业开发中使用h5有哪些注意事项,企业开发中使用h5的注意事项有哪些,下面就是实战案例,一起来看一下。 3在企业开发中,想让多个盒子的顶部对齐,我们可以让多个盒子同时浮动;或者通过定位微调,使他们顶部对齐;2.去掉控件系统自带的边框 :border:none;3.在企业开发中,css中…

    好文分享 2025年12月21日
    000
  • H5中的定位

    这次给大家带来h5中的定位,h5中定位的注意事项有哪些,下面就是实战案例,一起来看一下。 一.定位流分类 1.1相对定位1.2绝对定位1.3固定定位1.4静态定位 二.什么是相对定位? 相对定位就是相对于自己以前在标准流中的位置来移动position: relative; 相对定位注意点 1.相对定…

    好文分享 2025年12月21日
    000
  • HTML5中form表单标签用法详解

    本文主要和大家分享HTML5中form表单标签用法详解,会以代码实例来和大家分享form的用法,希望能帮助到大家。 语法: 结束,表单都必须放在其之间。   2.method 传送方式,  get/post  是后端程序员考虑的问题   3.action  浏览者输入的数据被传送到的地方,比如一个p…

    好文分享 2025年12月21日
    000
  • HTML5 Canvas的交互式地铁线路图实现代码

    地图稍微内容有点多,要全部展示,字显得有点小了,但是没关系,可以按照需求放大缩小,字体和绘制的内容并不会失真,毕竟都是用矢量绘制的~ 界面生成 底层的 p 是通过 ht.graph.GraphView 组件生成的,然后就可以利用 HT for Web 提供好的方法,调用 canvas 画笔随便绘制就…

    2025年12月21日
    000
  • H5中meta标签及作用

    本文主要和大家分享h5中meta标签及作用,希望能帮助到大家。 H5标准声明,使用 HTML5 doctype,不区分大小写 // 标准的 lang 属性写法 // 声明文档使用的字符编码 // 优先使用 IE 最新版本和 Chrome // 页面描述 // 页面关键词 // 网页作者 // 搜索引…

    好文分享 2025年12月21日
    000
  • MUI框架使用HTML5实现二维码扫描功能

    一、简介         Barcode模块管理条码扫描,提供常见的条码(二维码及一维码)的扫描识别功能,可调用设备的摄像头对条码图片扫描进行数据输入。通过plus.barcode可获取条码码管理对象。 二、实现的效果 三、实现 代码 立即学习“前端免费学习笔记(深入)”; #bcid{ width…

    2025年12月21日
    000
  • canvas中使用clip()函数裁剪方法

    在canvas中,可以使用clip()函数裁剪区域,设定裁剪区域后,只有在区域内的图像才能显示,其余部分会被屏蔽掉。本文主要和大家介绍了canvas裁剪clip()函数的具体使用的相关资料,希望能帮助到大家。 未使用裁剪绘制一个圆 *{margin:0; padding:0;} html, body…

    2025年12月21日 好文分享
    000
  • html canvas截取圆角图片的实现方法

    以前我们只能通过其他的截图工具来截取图像。现代浏览器的功能已经越来越强,随着h5的逐渐普及,浏览器本身就可以截图啦。html2canvas就是这样一款前端插件,它的原理是将dom节点在canvas里边画出来。虽然很方便,但有以下限制: 本文主要介绍html2canvas截图不能截取圆角图片的解决方案…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信