基于HTMLl5 Canvas实现鼠标跟随炫彩小动画

举报
运气男孩 发表于 2021/08/22 23:59:09 2021/08/22
【摘要】 简介<canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形。在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字。<canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可以进行实时视频处理和渲染。 它最初由苹果内部使用...

简介

<canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形。在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字。

<canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可以进行实时视频处理和渲染。 它最初由苹果内部使用自己MacOS X WebKit推出,供应用程序使用像仪表盘的构件和 Safari 浏览器使用。 后来,有人通过Gecko内核的浏览器 (尤其是Mozilla和Firefox),Opera和Chrome和超文本网络应用技术工作组建议为下一代的网络技术使用该元素。

​ Canvas是由HTML代码配合高度和宽度属性而定义出的可绘制区域。JavaScript代码可以访问该区域,类似于其他通用的二维API,通过一套完整的绘图函数来动态生成图形。

基本使用

 <canvas>看起来和<img>标签一样,只是 <canvas> 只有两个可选的属性 width、heigth 属性,而没有 src、alt 属性。 如果不给<canvas>设置widht、height属性时,则默认 width为300、height为150,单位都是px。也可以使用css属性来设置宽高,但是如宽高属性和初始比例不一致,他会出现扭曲。所以,建议永远不要使用css属性来设置<canvas>的宽高。

了解了<canvas>的用途和原理,这里我们热身一下,直接用<canvas>在画布上绘制一个高 30px 的空心文字,请看下面!

完整代码:使用 canvas 绘制文本

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>hello word</title> 
</head>
<body>

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3;">您的浏览器不支持 HTML5 canvas 标签。</canvas>

<script>

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.font="30px Arial";
ctx.strokeText("Hello World",10,50);

</script>

</body>
</html>

接下来就要基于HTMLl5  Canvas实现鼠标跟随炫彩小动画:

这是html/css部分

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
		<title>炫彩小球球</title>
		<style type="text/css">
			#canvas {
				border: 1px solid #CCCCCC;
			}
		</style>
	</head>
	<body>
		<canvas id="canvas" width="" height=""></canvas>
	</body>
</html>

先来说说js部分

  首先  获取画布

    let canvas = document.querySelector('#canvas');


然后定义宽高

   canvas.width = window.innerWidth
    canvas.height = window.innerHeight 


定义为2d,circular为圆

    let circular = canvas.getContext('2d');

定义数组存取增加的圆     
 

   let CirArr = [] 

 定义构造函数

    function Cir(obj) {
        for (let prop in obj) {
            this[prop] = obj[prop]
        }
        this.dotX = Math.random() * 12 - 7
        this.dotY = Math.random() * 12 - 7
        this.color = "rgb(" + (parseInt(Math.random() * 200) + 9) + "," + (parseInt(Math.random() * 230) + 18) + ",150)";
}


圆的操作

CirArr.push(this)

 
    // 绘制圆
    Cir.prototype.addCir = function() {
        // 开始路径绘制
        circular.beginPath()
        // 画圆
        circular.arc(this.x, this.y, this.r, 0, Math.PI*2)
        circular.fillStyle = this.color
        circular.fill()
    }
    Cir.prototype.ani = function() {
        this.x += this.dotX
        this.y += this.dotY
        this.r--
 
        if (this.r <= 0) {
            // 清除r小于0的圆
            for (let i = 0; i < CirArr.length-1; i++) {
                if (CirArr[i] === this) {
                    CirArr.splice(i, 1)
                }
            }
        }
    }


鼠标移入事件

    canvas.onmousemove = function(e) {
        new Cir({
            x: e.offsetX, //x坐标
            y: e.offsetY, //y坐标
            r: 30 //半径
        })
    }


 设置定时器

    setInterval(() => {
        circular.clearRect(0, 0, window.innerWidth, window.innerHeight)
        for (let i = 0; i < CirArr.length-1; i++) {
            CirArr[i].ani()
            CirArr[i].addCir()
        }
    },20)


 效果如下:

格式工厂 屏幕录像20210822_235755 00_00_00-00_00_30.gif

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。