总站首页 | 合作模式 您好,欢迎访问易达招生网,希望本篇文章能够给您带来帮助!

电话咨询 在线客服 预约试听

易达招生网 > 动态汇总 > Web前端培训学院> 杭州十大网站设计培训班排名

杭州十大网站设计培训班排名
Web前端培训学院 2021-11-15 11:43:08 148

2021年 Flutter、WebAssembly、Serverless 可谓是前端领域中的最大赢家,TypeScript 的逐步普及,对整个前端发展都有极大的推动作用,Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台,WebAssembly 源于Mozilla 发起的 Asm.js 项目,设计补充而非取代 JavaScript, 它是一个二进制格式,容易翻译到原生代码,本地解码速度比 JS 解析快得多,让高性能的 Web 应用在浏览器上运行成为可能,比如视频游戏、计算机辅助设计、视频和图像编辑、科学可视化等等...

IT培训学院

canvas中普通动效与粒子动效的实现方法

canvas 用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。

canvas 可以绘制动态效果,除了常用的规则动画之外,还可以采用粒子的概念来实现较复杂的动效,本文分别采用普通动效与粒子特效实现了一个简单的时钟。

普通时钟

普通动效即利用 canvas 的 api,实现有规则的图案、动画。

效果


该效果实现比较简单,主要分析一下刻度与指针角度偏移的实现。

绘制刻度

此例为小时刻度的绘制:表盘上共有 12 个小时,Math.PI 为 180°,每小时占据 30°。

.save()表示保存 canvas 当前环境的状态,在此基础上进行绘制。绘制完成之后,返回之前保存过的路径状态和属性。

分钟刻度同理,改变角度与样式即可。

// 小时时间刻度offscreenCanvasCtx.save();for (var i = 0; i < 12; i++) { offscreenCanvasCtx.beginPath();// 刻度颜色 offscreenCanvasCtx.strokeStyle = "#fff"; // 刻度宽度 offscreenCanvasCtx.lineWidth = 3; // 每小时占据30° offscreenCanvasCtx.rotate(Math.PI / 6); // 开始绘制的位置 offscreenCanvasCtx.lineTo(140, 0); // 结束绘制的位置; offscreenCanvasCtx.lineTo(120, 0); // 绘制路径 offscreenCanvasCtx.stroke();}offscreenCanvasCtx.restore();

指针指向

以秒针为例:获取当前时间的秒数,并计算对应的偏移角度

var now = new Date(), sec = now.getSeconds(), min = now.getMinutes(), hr = now.getHours(); hr = hr 12 ? hr - 12 : hr; //秒针 offscreenCanvasCtx.save(); offscreenCanvasCtx.rotate(sec * (Math.PI / 30)); ...... offscreenCanvasCtx.stroke();

粒子动效

canvas 可以用来绘制复杂,不规则的动画。粒子特效可以用来实现复杂、随机的动态效果。

粒子,指图像数据imageData中的每一个像素点,获取到每个像素点之后,添加属性或事件对区域内的粒子进行交互,达到动态效果。

效果


粒子获取

以下图的图片转化为例,该效果是先在 canvas 上渲染图片,然后获取文字所在区域的每个像素点。

let image = new Image();image.src = "../image/logo.png";let pixels = []; //存储像素数据let imageData;image.width = 300;image.height = 300;// 渲染图片,并获取该区域内像素信息image.onload = function() { ctx.drawImage( image, (canvas.width - image.width) / 2, (canvas.height - image.height) / 2, image.width, image.height ); imageData = ctx.getImageData( (canvas.width - image.width) / 2,(canvas.height - image.height) / 2, image.width, image.height ); //获取图表像素信息 //绘制图像};

像素信息

图片的大小为 300*300,共有 90000 个像素,每个像素占 4 位,存放 rgba 数据。


粒子绘制

function getPixels() { var pos = 0; var data = imageData.data; //RGBA的一维数组数据 //源图像的高度和宽度为300px for (var i = 1; i <= image.width; i++) { for (var j = 1; j <= image.height; j++) { pos = [(i - 1) * image.width + (j - 1)] * 4; //取得像素位置 if (data[pos] >= 0) { var pixel = { x: (canvas.width - image.width) / 2 + j + Math.random() * 20, //重新设置每个像素的位置信息 y: (canvas.height - image.height) / 2 + i + Math.random() * 20, //重新设置每个像素的位置信息 fillStyle: "rgba(" + data[pos] + "," + data[pos + 1] + "," + data[pos + 2] + "," + data[pos + 3] + ")" }; pixels.push(pixel); } } }}function drawPixels() { var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); ctx.clearRect(0, 0, canvas.width, canvas.height); var len = pixels.length, curr_pixel = null; for (var i = 0; i < len; i++) { curr_pixel = pixels[i]; ctx.fillStyle = curr_pixel.fillStyle; ctx.fillRect(curr_pixel.x, curr_pixel.y, 1, 1); }}

粒子时钟

渲染文字时钟

function time() { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.font = "150px 黑体"; ctx.textBaseline = "top"; ctx.fillStyle = "rgba(245,245,245,0.2)"; ctx.fillText( new Date().format("hh:mm:ss"), (canvas.width - textWidth) / 2, (canvas.height - textHeight) / 2, textWidth, textHeight );}

效果


获取粒子

文字转换粒子概念同上,获取选定区域的像素,根据筛选条件进行选择并存入数组。经过遍历后重新绘制。

function getPixels() { let imgData = ctx.getImageData( (canvas.width - textWidth) / 2, (canvas.height - textHeight) / 2, textWidth, textHeight ); let data = imgData.data; pixelsArr = []; for (let i = 1; i <= textHeight; i++) { for (let j = 1; j <= textWidth; j++) { pos = [(i - 1) * textWidth + (j - 1)] * 4; //取得像素位置 if (data[pos] >= 0) { var pixel = { x: j + Math.random() * 20, //重新设置每个像素的位置信息 y: i + Math.random() * 20, //重新设置每个像素的位置信息 fillStyle: "rgba(" + data[pos] + "," + data[pos + 1] + "," + data[pos + 2] + "," + data[pos + 3] + ")" }; pixelsArr.push(pixel); } } }}

imgData保存了所选区域内的像素信息,每个像素点占据 4 位,保存了 RGBA 四位信息。筛选每个像素的第四位,这段代码中将所有透明度不为 0 的像素都保存到了数组pixelsArr中。

x、y记载了该粒子的位置信息,为了产生效果图中的运动效果,给每个粒子添加了 0-20 个像素的偏移位置,每次重绘时,偏移位置随机生成,产生运动效果。

粒子重绘

获取粒子之后,需要清除画布中原有的文字,将获取到的粒子重新绘制到画布上去。

function drawPixels() { // 清除画布内容,进行重绘 ctx.clearRect(0, 0, canvas.width, canvas.height); for (let i in pixelsArr) { ctx.fillStyle = pixelsArr[i].fillStyle; let r = Math.random() * 4; ctx.fillRect(pixelsArr[i].x, pixelsArr[i].y, r, r); }}

粒子重绘时的样式为筛选像素时原本的颜色与透明度,并且每个在画布上绘制每个粒子时,定义大小参数 r,r 取值为 0-4 中随机的数字。最终生成的粒子大小随机。

实时刷新

获取粒子并成功重绘之后,需要页面实时刷新时间。这里采用window.requestAnimationFrame(callback)方法。

function time() { ...... getpixels(); //获取粒子 drawPixels(); // 重绘粒子 requestAnimationFrame(time); }

window.requestAnimationFrame(callback) 方法告诉浏览器您希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画。该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。

该方法不需要设置时间间隔,调用频率采用系统时间间隔(1s)。

文档解释戳这里

效果


总结

本文主要通过两种不同的方式实现了时钟的动态效果,其中粒子时钟具有更多的可操作性。在以后的 canvas 系列中会针对粒子系统实现更多的动态效果。

Web前端项目驱动教学,所需即所学,所学即所用

参与企业真实的项目积累实战经验

  • IT培训学院

    真实商业项目

    真实企业项目实战,成立项目专项小组,团队完成,更贴近工作场景。

  • IT培训学院

    课程贯穿

    课程贯穿企业核心项目贯穿全课程,培养Web大局观

  • IT培训学院

    项目部署上线

    云服务器真实部署,项目上线,投入使用。

  • IT培训学院

    接轨企业

    真实对接企业,标准化,规范化,流程化的工作流。

  • IT培训学院

    完成50000行代码

    实战讲师手把手教学,完成50000行代码。

  • IT培训学院

    自主项目

    学员自主完成3个不低于10000行代码的项目。

随着硬件的完善、高性能浏览器的出现和宽带的普及,技术可以在用户体验方面实现更多种可能,前端技术领域迸发出旺盛的生命力。网页不再只是承载单一的文字和图片,各种富媒体让网页的内容更加生动,网页上软件化的交互形式为用户提供了更好的使用体验,这些都是基于前端技术实现的。随着手机成为人们生活中不可或缺的一部分,成为人们身体的延伸,人们迎来了体验为王的时代。移动端的前端技术开发前景宽阔。此外,前端技术还能应用于智能电视、智能手表甚至人工智能领域。因此越来越多的人开始学习Web前端技术。

达内Web前端课程 紧跟时代步伐

前端课程全面升级为Web前端全栈式

  • IT培训学院

    课程升级

    课程结合了前端H5,后端node.JS和移动端APP开发,培养真正的全栈人才

    咨询详情
  • IT培训学院

    实时更新

    达内课程实时更新,融合时下前沿技术热点,包含了新颖、热门的技术

    咨询详情
  • IT培训学院

    项目实战

    主流项目贯穿课程,讲师手把手指导突破50000行代码

    咨询详情
  • IT培训学院

    自主项目

    真实部署,自命题醒目,*完成三大自命题项目

    咨询详情
  • IT培训学院

    企业接轨

    课程以就业为导向,企业的要求就是我们的重点

    咨询详情
IT培训学院

易达招生网@版权所有 豫ICP备12014175号

本站文章由用户自行上传发布,如有侵权内容请及时联系我们删除。