婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > html5 canvas 實現光線沿不規則路徑運動

html5 canvas 實現光線沿不規則路徑運動

熱門標簽:平涼地圖標注位置怎么弄 拓展地圖標注 只辦理400電話 機器人外呼系統存在哪些能力 高德地圖標注地點糾錯 南昌仁和怎么申請開通400電話 電話機器人電銷系統掙話費 電話機器人黑斑馬免費 如何獲取地圖標注客戶

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>
		<h2>路徑偏移</h2>
		<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>
		<h2>角度偏移</h2>
		<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>
	<h2>設置stroke-dasharray</h2>
	<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>
	<h2>設置stroke-dashoffset讓邊線相對于初始位置發生偏移</h2>
	<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>
	<h2>通過設置stroke-dasharray 和 stroke-dashoffset讓邊線動起來</h2>
	<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組合圖形的模式,取線條和一個圖形重疊部分(類似于燈罩)來實現光線效果
 

組合前
 


 

組合后
 

<!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-over
			ctx.globalCompositeOperation = "destination-in";
			ctx.lineWidth = 60;
			ctx.beginPath();
			ctx.moveTo(40, 80);
			ctx.lineTo(200, 80);
			ctx.stroke();
		}
		drawLine();

	</script>
	</html>

讓線條動起來

當我們實現好線條剩下就需要讓線條動起來,由于線條是通過燈罩的方式來實現的,讓線條運動只需要讓燈罩動起來就好
 

<!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 isEnd
			arrLine = 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-over
			ctx.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>

這種實現方式也有一定的條件限制,那就是路徑可大體抽象成為一個有一定規律的圖型或者線條,比如上面demo中路徑可抽象成為一個矩形的兩邊,或者是2條連接的直線
我們必須從沒有具體規則的路徑中抽象出一個大體的規則,不同路徑規則不同
上面的例子就是將不規則路徑抽象成了一個直角的規則路徑
 

可優化點

這邊找到了2個可優化的點
1.時間方向上: 為了讓動畫消耗較小,代碼中的定時器已經用的是requestAnimationFrame, 但是由于光線的特殊性(自帶模糊效果),為了性能更加,嘗試了2次requestAnimationFrame調用一次繪圖的方式,效果較前者未有明顯區別
2.繪圖方向上: 從上圖可發現,燈罩每次只圈出路徑的一部分,故繪圖中不需要每次都繪制全部路徑,只需要找出燈罩前后的路徑點,將這一段路徑繪制出來就好

坑點

在完成這個動動畫效果之后遇到一個至今原因不明的bug,隨著屏幕放置時間的變長,動畫越來越慢,打開任務管理器,未見內存泄漏或者cpu使用率過高。打開performance,發現頁面調幀嚴重,屏幕幀數越來越低,單個Frame CPU time越來越長,范圍來看,script和render和paint耗時未發生線性變化,只有system時間越來越來長,越來越長,期望能被大佬告知原因
一開始
 

到后來
 

解決的辦法較為...,光線每循環一個周期,我銷毀了之前的canvas并新建了canvas,上層規避了system time不知道為什么越來越長的問題
chrome版本:80.0.3987.163(正式版本) (64 位)

到此這篇關于html5 canvas 實現光線沿不規則路徑運動的文章就介紹到這了,更多相關canvas 光線不規則運動內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持腳本之家!

標簽:青島 西藏 棗莊 漯河 遼源 永州 池州 新疆

巨人網絡通訊聲明:本文標題《html5 canvas 實現光線沿不規則路徑運動》,本文關鍵詞  html5,canvas,實現,光線,沿,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《html5 canvas 實現光線沿不規則路徑運動》相關的同類信息!
  • 本頁收集關于html5 canvas 實現光線沿不規則路徑運動的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国内久久精品视频| 韩国欧美国产一区| 精品电影一区二区三区| 久久久久久久久久久久久夜| 亚洲毛片av在线| 国产精品乡下勾搭老头1| 在线观看亚洲一区| 欧美激情中文字幕一区二区| 视频一区在线播放| 色狠狠一区二区三区香蕉| 亚洲精品一区二区三区影院| 亚洲成人三级小说| 在线亚洲欧美专区二区| 亚洲国产高清在线观看视频| 麻豆91在线观看| 欧美精品v国产精品v日韩精品 | 国产精品一色哟哟哟| 欧美日韩亚洲丝袜制服| 亚洲欧美日韩中文播放| 丰满放荡岳乱妇91ww| 国产婷婷一区二区| 国产制服丝袜一区| 精品动漫一区二区三区在线观看| 日韩**一区毛片| 欧美丰满高潮xxxx喷水动漫| 亚洲国产精品一区二区尤物区| 日本久久精品电影| 亚洲三级在线免费观看| av激情成人网| 亚洲人妖av一区二区| 91麻豆福利精品推荐| 亚洲人妖av一区二区| 99国产一区二区三精品乱码| 日韩美女视频一区二区 | 99综合电影在线视频| 国产精品天天看| 福利一区二区在线| 中文字幕在线观看一区| 91视频在线看| 亚洲国产一区二区在线播放| 欧美日韩激情一区二区三区| 日本美女一区二区| 久久无码av三级| 福利一区二区在线| 一区二区三区免费看视频| 欧美视频在线一区| 免费人成在线不卡| 久久久久国产一区二区三区四区| 国产成人精品一区二| 国产精品久久免费看| 欧洲日韩一区二区三区| 美女国产一区二区三区| 久久伊人蜜桃av一区二区| 波多野结衣在线一区| 一区二区免费视频| 精品国产乱码久久久久久闺蜜| 中文字幕一区二区三区四区不卡| 日韩欧美一区二区免费| 日韩中文字幕91| 欧美va在线播放| 成人性视频网站| 亚洲一二三四在线| 日韩一级在线观看| jlzzjlzz欧美大全| 免费成人美女在线观看| 国产精品天干天干在线综合| 欧美日韩亚洲综合在线 | 91麻豆精品国产自产在线观看一区| 久久黄色级2电影| 最新日韩av在线| 精品国产青草久久久久福利| 99精品欧美一区| 久久99这里只有精品| 成人免费在线观看入口| 日韩欧美国产成人一区二区| 99精品久久99久久久久| 蜜桃视频第一区免费观看| 久久五月婷婷丁香社区| 欧美大胆人体bbbb| 美国十次了思思久久精品导航| 国产女人aaa级久久久级| 欧美猛男gaygay网站| 国产精品一区二区免费不卡| 亚洲一区二区精品3399| 国产精品久久毛片av大全日韩| 日韩一区二区中文字幕| 色综合天天综合网国产成人综合天 | 欧美一区二区三区视频在线| 99riav一区二区三区| 国产一区视频网站| 日本特黄久久久高潮| 一区二区三区在线高清| 国产精品久久久久影院色老大| 精品卡一卡二卡三卡四在线| 欧美日韩国产一区二区三区地区| www.日韩在线| 成人av手机在线观看| 国产不卡在线视频| 国产永久精品大片wwwapp| 麻豆极品一区二区三区| 婷婷久久综合九色综合伊人色| 亚洲精品视频一区二区| 亚洲欧洲日韩在线| 中文字幕一区二区在线播放| 欧美国产视频在线| 国产精品久久久久影院老司| 国产日韩精品一区二区三区| 久久久亚洲精品一区二区三区| 精品欧美一区二区在线观看| 欧美一级二级三级蜜桃| 欧美日韩免费高清一区色橹橹 | 国产成人午夜精品影院观看视频 | 久久综合色婷婷| 日韩欧美国产1| 久久伊人中文字幕| 国产欧美视频一区二区三区| 中文字幕国产一区| 亚洲欧洲性图库| 亚洲综合在线电影| 日本成人在线看| 国内精品视频一区二区三区八戒| 国精产品一区一区三区mba桃花 | 免费在线成人网| 激情丁香综合五月| 国产高清视频一区| 99精品久久只有精品| 日本高清视频一区二区| 欧美精品三级日韩久久| 欧美va亚洲va香蕉在线| 国产欧美日韩视频在线观看| 国产精品五月天| 亚洲国产精品久久一线不卡| 美腿丝袜在线亚洲一区| 粉嫩久久99精品久久久久久夜| 99这里都是精品| 8v天堂国产在线一区二区| 久久一二三国产| 亚洲黄色免费电影| 男女性色大片免费观看一区二区 | www一区二区| 亚洲精品国产无套在线观| 日韩电影在线免费看| 国产成人午夜电影网| 色婷婷狠狠综合| 久久天堂av综合合色蜜桃网| 亚洲乱码中文字幕| 老司机免费视频一区二区| 成人午夜视频网站| 欧美一区二区免费| 国产精品久久毛片a| 日日欢夜夜爽一区| 成人av第一页| 精品国产一区二区亚洲人成毛片| 中文字幕制服丝袜成人av| 青草av.久久免费一区| 99re热这里只有精品免费视频 | 国产精品午夜久久| 日韩电影免费在线看| 91在线高清观看| 久久久久久久久久久99999| 一区二区三区在线观看视频| 国产精品资源在线| 欧美一级夜夜爽| 国产真实精品久久二三区| 欧美日韩在线直播| 国产精品沙发午睡系列990531| 人人精品人人爱| 91国产精品成人| 中文字幕日韩av资源站| 狠狠色丁香婷综合久久| 欧美精品成人一区二区三区四区| 亚洲欧美日韩国产综合| 国产成a人亚洲| 久久综合狠狠综合久久综合88 | 亚洲嫩草精品久久| 欧美日韩高清在线播放| 亚洲日本在线看| 国产福利一区在线观看| 日韩三级在线免费观看| 亚洲线精品一区二区三区| 91亚洲精品一区二区乱码| 中文字幕免费一区| 国产成人精品影视| 久久精品视频在线看| 美日韩一级片在线观看| 欧美二区三区的天堂| 91在线视频观看| 99精品视频在线播放观看| 色先锋aa成人| 亚洲精品伦理在线| 色哟哟在线观看一区二区三区| 国产精品久久网站| jlzzjlzz亚洲日本少妇| 国产精品麻豆一区二区| 成人av先锋影音| 亚洲色图欧洲色图婷婷| 欧洲精品在线观看| 午夜激情一区二区三区| 欧美一区二区视频在线观看 | 成人午夜又粗又硬又大|