返回顶部
首页 > 资讯 > 精选 >怎么在html5中使用canvas 实现光线沿不规则路径运动
  • 193
分享到

怎么在html5中使用canvas 实现光线沿不规则路径运动

2023-06-09 11:06:02 193人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关怎么在HTML5中使用canvas 实现光线沿不规则路径运动,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。svg让动画沿着不规则路径运动查阅svg文档后发现,sv

这篇文章将为大家详细讲解有关怎么在HTML5中使用canvas 实现光线沿不规则路径运动,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

svg让动画沿着不规则路径运动

查阅svg文档后发现,svg动画运动有两种实现方式,且都非常简单,但对于100%实现设计师给出的效果有很大的距离

使用offset-path偏移路径和offset-roate偏移角度让元素沿着不规则路径走

<!DOCTYPE html><html><head><title>offset-path/offset-roate</title></head><style type="text/CSS">* {padding: 0;margin: 0;box-sizing: border-box;}body {background: #000;}.line {width: 80px;height: 3px;        position: absolute;        background: red;offset-path: path("M10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500");        animation: move 10s linear infinite;}@keyframes move {100% {offset-distance: 2000px;}}.line1 {position: absolute;left: 100px;width: 20px;height: 20px;border-radius: 50%;background: red;offset-path: path("M0,0a72.5,72.5 0 1,0 145,0a72.5,72.5 0 1,0 -145,0");   offset-rotate: 0deg;   animation: load 1.8s cubic-bezier(0.86, 0, 0.07, 1) infinite;   animation-delay: 0.147s;    animation-fill-mode: forwards;}@keyframes load {from {        offset-distance: 0;    }    to {        offset-distance: 100%;    }}</style><body><h3>路径偏移</h3><div class="line"></div><svg width="100%" height="600px" version="1.0" id="svg1"><path d="M10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500" fill="#tranparent" stroke="#FFF"></path></svg><h3>角度偏移</h3><div class="line1"></div></body></html>

此种方式的限制是滚动元素无法随路径进行没有规律的变化

使用stroke-dasharray和stroke-dashoffset让路径边线动起来

stroke-dasharray:设置shap和text 边框虚线的实线长度与实线之间的间隔(虚线长度)
stroke-dashoffser:设置边框线条相对于默认位置的偏移(正值:向左,负值:向右)

<!DOCTYPE html><html><head><title>stroke-dasharray/stroke-dashoffser</title></head><style type="text/css">* {padding: 0;margin: 0;box-sizing: border-box;}body {background: #000;color: #fff;}.move {animation: moving 5s infinite;}@keyframes moving {0% {stroke-dashoffset: 80px;}100% {stroke-dashoffset: -1600px;}}</style><body><h3>设置stroke-dasharray</h3><b>storke-dasharray设置为80 ,此时实线和实线间隔一样</b><svg width="100%" height="600px" version="1.0" id="svg1"><path d="M10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500" fill="#tranparent" stroke="#FFF" stroke-dasharray="80"></path></svg><b>storke-dasharray设置为80 320,此时实线和是实线间隔的1/4</b><svg width="100%" height="600px" version="1.0" id="svg1"><path d="M10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500" fill="#tranparent" stroke="#FFF" stroke-dasharray="80 320"></path></svg><h3>设置stroke-dashoffset让边线相对于初始位置发生偏移</h3><svg width="100%" height="600px" version="1.0" id="svg1"><path d="M10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500" fill="#tranparent" stroke="#FFF" stroke-dasharray="80 320" stroke-dashoffset="40"></path></svg><h3>通过设置stroke-dasharray 和 stroke-dashoffset让边线动起来</h3><svg width="100%" height="600px" version="1.0" id="svg1"><path d="M10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500" fill="#tranparent" stroke="#FFF"></path><path d="M10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500" fill="#tranparent" stroke="red" stroke-dasharray="80 1600" stroke-dashoffset="0" class="move"></path></svg></body></html>

此种方式通过边框偏移的效果可以设置跟随路径的滚线条,但是无法设置线条的光线效果,即实线的阴影和实线的渐变效果(渐变区域需随着偏移路径的变化而变化)

canvas实现线条延不规则路径运动

线条实现

对于不规则路径,如果直接用画线条的方式实现光线,需要计算每一个开始点和结束点的位置,中间还可能存在转折点,计算起来非常麻烦,不可取
故这边采取canvas组合图形的模式,取线条和一个图形重叠部分(类似于灯罩)来实现光线效果
 

组合前
 

怎么在html5中使用canvas 实现光线沿不规则路径运动
 

组合后
 

怎么在html5中使用canvas 实现光线沿不规则路径运动

<!DOCTYPE html><html><head><title>canvas实现不规则路径光效</title></head><style type="text/css">body {background: #000;}#wrap {position: absolute;width: 1200px;height: 600px}</style><body><div id="wrap"><canvas id="canvas" width="1200" height="600"></canvas></div></body><script type="text/javascript">var path = 'M 10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500';var list = path.match(/([A-Z]([^A-Z]){1,})/g).map(item => {return {x: item.split(' ')[1],y: item.split(' ')[2],action: item.split(' ')[0],}});//获取每个点位置var canvas = document.getElementById('canvas');var ctx = canvas.getContext('2d');ctx.strokeStyle = 'rgba(255,255,255,1)';function drawPath() {ctx.lineWidth = 3;ctx.beginPath();list.forEach(item => {if(item.action == 'M') ctx.moveTo(item.x, item.y);if(item.action == 'L') ctx.lineTo(item.x, item.y);});ctx.stroke();}drawPath();function drawLine() {//设置图形组合方式 默认source-overctx.globalCompositeOperation = "destination-in";ctx.lineWidth = 60;ctx.beginPath();ctx.moveTo(40, 80);ctx.lineTo(200, 80);ctx.stroke();}drawLine();</script></html>

让线条动起来

当我们实现好线条剩下就需要让线条动起来,由于线条是通过灯罩的方式来实现的,让线条运动只需要让灯罩动起来就好
 

怎么在html5中使用canvas 实现光线沿不规则路径运动

<!DOCTYPE html><html><head><title>canvas实现不规则路径光效</title></head><style type="text/css">body {background: #000;}#wrap {position: absolute;width: 1200px;height: 600px}</style><body><div id="wrap"><canvas id="canvas" width="1200" height="600"></canvas></div></body><script type="text/javascript">var path = 'M 10 80 L 77.5 60 L 145 80 L 280 100 L 500 80 L 600 120 L 800 80 L 950 120 L 950 200 L 930 250 L 950 300 L 950 500';var list = path.match(/([A-Z]([^A-Z]){1,})/g).map(item => {return {x: item.split(' ')[1],y: item.split(' ')[2],action: item.split(' ')[0],}});//获取每个点位置var step = 3;var x1, x2, y1, y2;//确定路径中最大最小点var timer;var canvas = document.getElementById('canvas');var ctx = canvas.getContext('2d');ctx.strokeStyle = 'rgba(255,255,255,1)';ctx.shadowColor = 'rgba(255,255,255,1)';ctx.lineCap = 'round';ctx.shadowBlur = 3;list.forEach(item => {x1 = !x1 || Number(item.x) < x1 ? Number(item.x) : x1;y1 = !y1 || Number(item.y) < y1 ? Number(item.y) : y1;x2 = !x2 || Number(item.x) > x2 ? Number(item.x) : x2;y2 = !y2 || Number(item.y) > y2 ? Number(item.y) : y2;});function drawPath() {ctx.lineWidth = 3;ctx.beginPath();list.forEach(item => {if(item.action == 'M') ctx.moveTo(item.x, item.y);if(item.action == 'L') ctx.lineTo(item.x, item.y);});//添加光效渐变var grd = ctx.createLinearGradient(arrLine[arrLine.length - 1].x, arrLine[arrLine.length - 1].y, arrLine[0].x, arrLine[0].y);grd.addColorStop(0, 'rgba(255, 255, 255, 0)');   //定义渐变线起点颜色        grd.addColorStop(1, 'rgba(255, 255, 255, 1)');  //定义渐变线结束点的颜色        ctx.strokeStyle = grd;ctx.stroke();}//设计合适的初始线条状态var arrLine = Array(10).fill(0).map((item, inx) => {return {x: x1 - 20 * inx,y: y1 + 30,}});//随时间变化图形路径function getArrLine() {var isEndarrLine = arrLine.map(item => {var x = item.x;var y = item.y;if(x < x2 - 30) {x = x + step > x2 -30 ? x2 - 30 : x + step;} else if(x == x2 -30 && y < y2) {y = y + step > y2 ? y2 : y + step;} else {isEnd = true;}return {x,y}});isEnd && timer && cancelAnimationFrame(timer);}//绘制图形function drawLine() {//设置图形组合方式 默认source-overctx.globalCompositeOperation = "destination-in";ctx.lineWidth = 70;ctx.beginPath();arrLine.forEach((item, inx) => {if(inx == 0) {ctx.moveTo(item.x, item.y);} else {ctx.lineTo(item.x, item.y);}})ctx.stroke();}function start() {ctx.clearRect(0, 0, 1200, 600);ctx.globalCompositeOperation = 'source-over';drawPath();drawLine();getArrLine();timer = requestAnimationFrame(start);}timer = requestAnimationFrame(start);</script></html>

关于怎么在html5中使用canvas 实现光线沿不规则路径运动就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在html5中使用canvas 实现光线沿不规则路径运动

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

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

猜你喜欢
  • 怎么在html5中使用canvas 实现光线沿不规则路径运动
    这篇文章将为大家详细讲解有关怎么在html5中使用canvas 实现光线沿不规则路径运动,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。svg让动画沿着不规则路径运动查阅svg文档后发现,sv...
    99+
    2023-06-09
  • 怎么在html5中使用Canvas自定义路径动画
    怎么在html5中使用Canvas自定义路径动画?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。创建Path制作动画前,先要拿到动画的路径,对此我们可以直接使用svg的pat...
    99+
    2023-06-09
  • 怎么在html5中使用canvas实现柱状图
    这篇文章给大家介绍怎么在html5中使用canvas实现柱状图,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用方式首先我们看一下使用方式,参考了部分ECharts的使用方式,先传入要显示图表的html标签,接着调用i...
    99+
    2023-06-09
  • html5中怎么利用canvas实现跟随光标跳动火焰效果
    这篇文章给大家介绍html5中怎么利用canvas实现跟随光标跳动火焰效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<!DOCTYPE HTML><head>...
    99+
    2024-04-02
  • 怎么在html5中使用canvas实现手势解锁
    怎么在html5中使用canvas实现手势解锁?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。demo.html<!DOCTYPE html><h...
    99+
    2023-06-09
  • 怎么在Html5中使用Canvas实现动画碰撞检测功能
    本篇文章为大家展示了怎么在Html5中使用Canvas实现动画碰撞检测功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵...
    99+
    2023-06-09
  • 怎么在html5中使用canvas实现一个动态画饼状图
    怎么在html5中使用canvas实现一个动态画饼状图?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。先用canvas画实心圆//伪代码var canv...
    99+
    2023-06-09
  • 怎么在html5中利用canvas实现一个背景鼠标连线动态效果
    本篇文章为大家展示了怎么在html5中利用canvas实现一个背景鼠标连线动态效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。<!doctype html><html&...
    99+
    2023-06-09
  • 怎么在Html5中使用canvas实现一个粒子时钟
    这篇文章将为大家详细讲解有关怎么在Html5中使用canvas实现一个粒子时钟,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先要创建一个html文件并添加一个canvas画布,如下:<...
    99+
    2023-06-09
  • 怎么在JavaScript中使用canvas实现七彩太阳光晕效果
    今天就跟大家聊聊有关怎么在JavaScript中使用canvas实现七彩太阳光晕效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体内容如下<!DOCTYPE ht...
    99+
    2023-06-15
  • 怎么在HTML5中使用Canvas实现一个放大镜效果
    这期内容当中小编将会给大家带来有关怎么在HTML5中使用Canvas实现一个放大镜效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原理首先选择图片的一块区域,然后将这块区域放大,然后再绘制到原先的图片上...
    99+
    2023-06-09
  • 怎么在HTML5中使用manifest实现离线缓存
    本篇文章给大家分享的是有关怎么在HTML5中使用manifest实现离线缓存,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。离线访问对基于网络的应用而言越来越重要。虽然所有浏览器...
    99+
    2023-06-09
  • 怎么在HTML5中使用canvas实现一个瀑布流文字效果
    今天就跟大家聊聊有关怎么在HTML5中使用canvas实现一个瀑布流文字效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。代码如下:<!doctype html>...
    99+
    2023-06-09
  • 怎么在HTML5中使用Canvas实现一个破碎重组视频特效
    本篇文章为大家展示了怎么在HTML5中使用Canvas实现一个破碎重组视频特效,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。HTML代码<video id="sourcev...
    99+
    2023-06-09
  • 怎么在Html5页面中使用JSON实现一个动画
    今天就跟大家聊聊有关怎么在Html5页面中使用JSON实现一个动画,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.demo.html里面有很多内联的东西,使用时堆积在页面内不好看仔...
    99+
    2023-06-09
  • 怎么在H5中使用canvas实现一个动态图形功能
    怎么在H5中使用canvas实现一个动态图形功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是动画?我们在绘制动画之前必须要弄清楚什么是动画,一个动画最起码需要哪些基...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作