Canvas实现圆点动画

news2025/1/12 8:42:11

示例效果图:

 

话不多说直接上代码: 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>canvas实现圆点动画 </title>
  <style>
    body {
      background-color: #383838;
    }
  </style>
</head>
<body>
  <canvas></canvas>
  <script>
    const cvs = document.querySelector('canvas')
    const ctx = cvs.getContext('2d')

    function init() {
      // devicePixelRatio
      cvs.width = 600
      cvs.height = 600
    }

    init()

    // 获取随机数,用于生成随机位置等
    function getRandom(min, max) {
      return Math.floor(Math.random() * (max + 1 - min) + min)
    }

    // 生成圆点
    class Point {
      constructor() {
        // 圆的大小
        this.r = 4 
        // 生成圆的随机位置
        this.x = getRandom(0, cvs.width - this.r / 2)
        this.y = getRandom(0, cvs.height - this.r / 2)
        // 设置生成随机位置的边界
        this.xSpeed = getRandom(-50, 50)
        this.ySpeed = getRandom(-50, 50)
        // 上次生成时间
        this.lastDrawTime = null
      }

      draw() {
        if(this.lastDrawTime) {
          const now = Date.now()
          // 计算距离上次生成时间
          const t = (now - this.lastDrawTime) / 1000
          // 给圆点赋值新的位置
          let x = this.x + this.xSpeed * t
          let y = this.y + this.ySpeed * t
          // 如果圆点位置到达边界,则回弹
          if(x <= this.r || x >= cvs.width - this.r) {
            this.xSpeed *= -1
          }
          if(y <= this.r || y >= cvs.height - this.r) {
            this.ySpeed *= -1
          }
          this.x = x
          this.y = y
        }
        // 绘制圆点
        ctx.beginPath()
        ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI)
        ctx.fillStyle = 'rgb(200,200,200)'
        ctx.fill()
        // 记录当前绘制时间
        this.lastDrawTime = Date.now()
      }
    }

    // 绘制页面图形
    class Graph {
      constructor(pointNumber = 30, maxDis = 300) {
        // 生成圆点数组
        this.points = new Array(pointNumber).fill(0).map(() => new Point())
        // 圆点连接距离
        this.maxDis = maxDis
        
      }
      
      draw() {
        // 无限执行,将线与点连接
        requestAnimationFrame(() => {
          this.draw()
        })
        // 将上次绘制清楚
        ctx.clearRect(0, 0, cvs.width, cvs.height)
        for (let i = 0; i < this.points.length; i++) {
          const p1 = this.points[i]
          p1.draw()
          for (let j = i + 1; j < this.points.length; j++) {
            const p2 = this.points[j]
            // 二个点相距离的长度,如果超出设置的长度,则不绘制
            const d = Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2)            
            if(d > this.maxDis) {
              continue
            }
            
            // 绘制连线
            ctx.beginPath()
            ctx.moveTo(p1.x, p1.y)
            ctx.lineTo(p2.x, p2.y)
            ctx.closePath()
            // 设置渐变颜色
            ctx.strokeStyle = `rgba(200,200,200, ${Math.abs(((p2.x - p1.x) / this.maxDis).toFixed(1))})`
            ctx.stroke()
          }
          
        }
      }
    }

    // 初始化生成
    const g = new Graph()
    g.draw()
  </script>
</body>
</html>

浏览器不兼容处理(重点)

ie9 以上才支持 canvas, 其他 chrome、ff、苹果浏览器等都支持
只要浏览器兼容 canvas,那么就会支持绝大部分 api(个别最新 api 除外)
移动端的兼容情况非常理想,基本上随便使用
2d 的支持的都非常好,3d(webgl)ie11 才支持,其他都支持
如果浏览器不兼容,最好进行友好提示

例如:
<canvas id="cavsElem">
  你的浏览器不支持canvas,请升级浏览器.浏览器不支持,显示此行文本
</canvas> 


浏览器不兼容,可以使用_flash_等手段进行优雅降

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1558718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…

Flutter 开发学习笔记(2):第一个简单的Flutter项目(下)

文章目录 前言官方Flutter案例侧边栏添加代码初始化展示效果 子组件私有数据空间导航栏转为有状态WidgetsetState手动转换页面实现效果 响应式动态切换宽度添加收藏夹&#xff0c;跨Widget传数据实现效果 完整代码后续进阶效果总结 前言 接着继续上一章的内容 官方Flutter案例…

C++ 项目:使用 GSL 数学运算库 C++ 调用Python

文章目录 Part.I IntroductionChap.I CMakeListsChap.II ExportLibGSL.hChap.III test_python.cpp Part.II GSL 使用方法Part.III C 调用 Python 使用方法相关博客 Part.I Introduction 本项目是一个使用 GSL 的小项目&#xff0c;还有 C 调用 Python。项目虽简单&#xff0c;…

2024软件设计师备考讲义——(6)

信息安全与网络安全 一、信息与信息系统安全 1.信息安全含义及属性 含义是保密性、完整性、可用性其他属性如&#xff1a;真实性、可核查性、不可抵赖性、可靠性 2.安全需求 物理安全&#xff1a;物理设备和环境网络安全&#xff1a;网络攻击和入侵系统安全&#xff1a;操作…

[SWPUCTF 2021 新生赛]crypto5(小明文攻击)

题目&#xff1a; 直接暴力破解&#xff1a; from Cryptodome.Util.number import * import gmpy2 flag 251667516535309413648396638468065433877208653392633709079856557751521873194647157371165991714772070474300653458826262598807568390941796270326238953302426553…

HTTP/1.1 特性(计算机网络)

HTTP/1.1 的优点有哪些&#xff1f; 「简单、灵活和易于扩展、应用广泛和跨平台」 1. 简单 HTTP 基本的报文格式就是 header body&#xff0c;头部信息也是 key-value 简单文本的形式&#xff0c;易于理解。 2. 灵活和易于扩展 HTTP 协议里的各类请求方法、URI/URL、状态码…

Linux 常见性能分析方法论介绍(业务负载画像、下钻分析、USE方法论,检查清单)

写在前面 博文内容为 《BPF Performance Tools》 读书笔记整理内容涉及常用的性能调优方法论介绍&#xff1a;业务负载画像下钻分析USE方法论检查清单理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼…

基于百度地图实现Android定位功能实现(一)

Android集成百度地图 文章目录 Android集成百度地图前言准备工作创建工程申请密钥 在项目中集成BaiduMap SDK创建地图 前言 本案例使用百度地图实现在Android中集成地图&#xff0c;并且实现了普通地图/卫星地图&#xff0c;以及路况图和热状图功能&#xff1b; 参考技术文档&…

SRS OBS利用RTMP协议实现音视频推拉流;WebRTC 屏幕直播分享工具

一、SRS OBS利用RTMP协议实现音视频推拉流 参考&#xff1a;https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1&#xff09;docker直接运行SRS服务&#xff1a; docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.co…

如何使用固定公网地址远程访问内网Axure RP生成的网站原型web页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

开源翻译大模型

开源翻译大模型 1 简介 在开发过程中&#xff0c;会遇到定制化翻译工具的需要&#xff0c;开源的翻译模型可以解决相应的问题。其中英语转中文的比较好的开源项目有&#xff1a; 序号组织模型地址备注1赫尔辛基大学语言技术研究小组&#xff08;Language Technology Researc…

debug: 解决typora两侧留白过大问题

问题如下图:解决办法:打开: 文件 -> 偏好设置 -> -> 外观 -> 看主题选择的是哪一个, 我选择的是GitHub * 点击打开主题设置 -> 选择你对应主题的.css文件 -> CTRL cv 备份一份, 然后打开 在文件中找到max-width : 修改对应的值 , 我改成了1920px * 改好以后…

安装即启动?探索流氓App的自启动“黑科技” (Android系统内鬼之ContentProvider篇)

前段时间发现了一个神奇的app&#xff0c;它居然可以在安装之后立即自启动&#xff1a; 看到没有&#xff0c;在提示安装成功大概1到2秒后&#xff0c;就直接弹出Toast和通知了&#xff01; 好神奇啊&#xff0c;在没有第三方app帮忙唤醒的前提下&#xff0c;它是怎么做到首次安…

谷粒商城——RabbitMQ

0. 消息中间件 1.RabbitMQ的核心概念 2. 工作流程 整体架构&#xff1a; 相关细节&#xff1a; 上述要注意的是&#xff1a; 路由键包含在message的头中&#xff0c;其作用是用于指定该消息存储与哪个消息队列中。 信道是客户端&#xff08;包括生产者和消费者&#xff09;用…

WIFI驱动移植实验:WIFI从路由器动态获取IP地址与联网

一. 简介 前面两篇文章&#xff0c;一篇文章实现了WIFI联网前要做的工作&#xff0c;另一篇文章配置了WIFI配置文件&#xff0c;进行了WIFI热点的连接。文章如下&#xff1a; WIFI驱动移植实验&#xff1a;WIFI 联网前的工作-CSDN博客 WIFI驱动移植实验&#xff1a;连接WIF…

Python字符串字母大小写变换,高级Python开发技术

寻找有志同道合的小伙伴&#xff0c;互帮互助,群里还有不错的视频学习教程和PDF电子书&#xff01; ‘’’ demo ‘tHis iS a GOod boOK.’ print(demo.casefold()) print(demo.lower()) print(demo.upper()) print(demo.capitalize()) print(demo.title()) print(dem…

什么是 SSL 证书?

SSL 证书的介绍 SSL&#xff08;Secure Sockets Layer&#xff09;证书是一种由数字证书颁发机构&#xff08;CA&#xff09;签发的加密证书&#xff0c;用于在 Web 浏览器和服务器之间建立安全连接。SSL 证书能够确保网站和应用程序的数据传输过程中不被窃听、篡改或伪造&…

springboot点餐平台网站

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

初始《string》及手搓模拟实现《string》

目录 前言&#xff1a; 为什么学习string类&#xff1f; 标准库中的string类 1. string类对象的常见构造 ​编辑 2. string类对象的容量操作 ​编辑 3. string类对象的访问及遍历操作 4. string类对象的修改操作 5. string类非成员函数 vs和g下string结构的说明 vs下s…

C/C++游戏编程实例-飞翔的小鸟

飞翔的小鸟游戏设计 首先需要包含以下库&#xff1a; #include<stdio.h> #include<windows.h> #include<stdlib.h> //包含system #include<conio.h>设置窗口大小&#xff1a; #define WIDTH 50 #define HEIGHT 16设置鸟的结构&#xff1a; struct …