HTML5 canvas鼠标经过星星连线

简介: HTML5 canvas鼠标经过星星连线

HTML5 canvas鼠标经过星星连线,鼠标经过星空可将星星一颗颗连成直线,页面背景有变色效果。

完整项目文件(关注后下载免费不需要积分):https://download.csdn.net/download/qq_44273429/13781365


HTML代码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>互动星空</title>
<style>
html,body {
  margin:0;
  overflow:hidden;
  width:100%;
  height:100%;
  cursor:none;
  background:black;
  background:linear-gradient(to bottom,#000000 0%,#5788fe 100%);
}
.filter {
  width:100%;
  height:100%;
  position:absolute;
  top:0;
  left:0;
  background:#fe5757;
  animation:colorChange 30s ease-in-out infinite;
  animation-fill-mode:both;
  mix-blend-mode:overlay;
}
@keyframes colorChange {
  0%,100% {
  opacity:0;
}
50% {
  opacity:.9;
}
}.landscape {
  position:absolute;
  bottom:0px;
  left:0;
  width:100%;
  height:100%;
  /*background-image:url(img/Trees-Landscape-Silhouette.png);
  */
background-image:url('img/xkbg.png');
  background-size:1000px 250px;
  background-repeat:repeat-x;
  background-position:center bottom;
}
</style>
</head>
<body>
<div class="landscape"></div>
<div class="filter"></div>
<canvas id="canvas"></canvas>
<script>
function Star(id, x, y){
  this.id = id;
  this.x = x;
  this.y = y;
  this.r = Math.floor(Math.random()*2)+1;
  var alpha = (Math.floor(Math.random()*10)+1)/10/2;
  this.color = "rgba(255,255,255,"+alpha+")";
}
Star.prototype.draw = function() {
  ctx.fillStyle = this.color;
  ctx.shadowBlur = this.r * 2;
  ctx.beginPath();
  ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI, false);
  ctx.closePath();
  ctx.fill();
}
Star.prototype.move = function() {
  this.y -= .15;
  if (this.y <= -10) this.y = HEIGHT + 10;
  this.draw();
}
Star.prototype.die = function() {
    stars[this.id] = null;
    delete stars[this.id];
}
function Dot(id, x, y, r) {
  this.id = id;
  this.x = x;
  this.y = y;
  this.r = Math.floor(Math.random()*5)+1;
  this.maxLinks = 2;
  this.speed = .5;
  this.a = .5;
  this.aReduction = .005;
  this.color = "rgba(255,255,255,"+this.a+")";
  this.linkColor = "rgba(255,255,255,"+this.a/4+")";
  this.dir = Math.floor(Math.random()*140)+200;
}
Dot.prototype.draw = function() {
  ctx.fillStyle = this.color;
  ctx.shadowBlur = this.r * 2;
  ctx.beginPath();
  ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI, false);
  ctx.closePath();
  ctx.fill();
}
Dot.prototype.link = function() {
  if (this.id == 0) return;
  var previousDot1 = getPreviousDot(this.id, 1);
  var previousDot2 = getPreviousDot(this.id, 2);
  var previousDot3 = getPreviousDot(this.id, 3);
  if (!previousDot1) return;
  ctx.strokeStyle = this.linkColor;
  ctx.moveTo(previousDot1.x, previousDot1.y);
  ctx.beginPath();
  ctx.lineTo(this.x, this.y);
  if (previousDot2 != false) ctx.lineTo(previousDot2.x, previousDot2.y);
  if (previousDot3 != false) ctx.lineTo(previousDot3.x, previousDot3.y);
  ctx.stroke();
  ctx.closePath();
}
function getPreviousDot(id, stepback) {
  if (id == 0 || id - stepback < 0) return false;
  if (typeof dots[id - stepback] != "undefined") return dots[id - stepback];
  else return false;//getPreviousDot(id - stepback);
}
Dot.prototype.move = function() {
  this.a -= this.aReduction;
  if (this.a <= 0) {
    this.die();
    return
  }
  this.color = "rgba(255,255,255,"+this.a+")";
  this.linkColor = "rgba(255,255,255,"+this.a/4+")";
  this.x = this.x + Math.cos(degToRad(this.dir))*this.speed,
  this.y = this.y + Math.sin(degToRad(this.dir))*this.speed;
  this.draw();
  this.link();
}
Dot.prototype.die = function() {
    dots[this.id] = null;
    delete dots[this.id];
}
var canvas  = document.getElementById('canvas'),
  ctx = canvas.getContext('2d'),
  WIDTH,
  HEIGHT,
  mouseMoving = false,
  mouseMoveChecker,
  mouseX,
  mouseY,
  stars = [],
  initStarsPopulation = 80,
  dots = [],
  dotsMinDist = 2,
  maxDistFromCursor = 50;
setCanvasSize();
init();
function setCanvasSize() {
  WIDTH = document.documentElement.clientWidth,
    HEIGHT = document.documentElement.clientHeight;                      
  canvas.setAttribute("width", WIDTH);
  canvas.setAttribute("height", HEIGHT);
}
function init() {
  ctx.strokeStyle = "white";
  ctx.shadowColor = "white";
  for (var i = 0; i < initStarsPopulation; i++) {
    stars[i] = new Star(i, Math.floor(Math.random()*WIDTH), Math.floor(Math.random()*HEIGHT));
    //stars[i].draw();
  }
  ctx.shadowBlur = 0;
  animate();
}
function animate() {
    ctx.clearRect(0, 0, WIDTH, HEIGHT);
    for (var i in stars) {
      stars[i].move();
    }
    for (var i in dots) {
      dots[i].move();
    }
    drawIfMouseMoving();
    requestAnimationFrame(animate);
}
window.onmousemove = function(e){
  mouseMoving = true;
  mouseX = e.clientX;
  mouseY = e.clientY;
  clearInterval(mouseMoveChecker);
  mouseMoveChecker = setTimeout(function() {
    mouseMoving = false;
  }, 100);
}
function drawIfMouseMoving(){
  if (!mouseMoving) return;
  if (dots.length == 0) {
    dots[0] = new Dot(0, mouseX, mouseY);
    dots[0].draw();
    return;
  }
  var previousDot = getPreviousDot(dots.length, 1);
  var prevX = previousDot.x; 
  var prevY = previousDot.y; 
  var diffX = Math.abs(prevX - mouseX);
  var diffY = Math.abs(prevY - mouseY);
  if (diffX < dotsMinDist || diffY < dotsMinDist) return;
  var xVariation = Math.random() > .5 ? -1 : 1;
  xVariation = xVariation*Math.floor(Math.random()*maxDistFromCursor)+1;
  var yVariation = Math.random() > .5 ? -1 : 1;
  yVariation = yVariation*Math.floor(Math.random()*maxDistFromCursor)+1;
  dots[dots.length] = new Dot(dots.length, mouseX+xVariation, mouseY+yVariation);
  dots[dots.length-1].draw();
  dots[dots.length-1].link();
}
//setInterval(drawIfMouseMoving, 17);
function degToRad(deg) {
  return deg * (Math.PI / 180);
}
</script>
<div style="text-align:center;">
<p><a href="https://blog.csdn.net/qq_44273429" target="_blank">海拥</a></p>
</div>
</body>
</html>
目录
相关文章
|
3月前
|
前端开发 JavaScript API
2024 新年HTML5+Canvas制作3D烟花特效(附源码)
2024 新年HTML5+Canvas制作3D烟花特效(附源码)
58 0
|
8月前
|
移动开发 前端开发 Shell
《HTML5 Canvas核心技术 图形、动画与游戏开发》 读书笔记
《HTML5 Canvas核心技术 图形、动画与游戏开发》 读书笔记
|
3月前
|
存储 移动开发 前端开发
HTML新特性【HTML5内联SVG、SVG_矩形、SVG 与 Canvas两者间的区别 、HTML5_MathML 】(三)-全面详解(学习总结---从入门到深化)
HTML新特性【HTML5内联SVG、SVG_矩形、SVG 与 Canvas两者间的区别 、HTML5_MathML 】(三)-全面详解(学习总结---从入门到深化)
51 0
|
7月前
|
Web App开发 移动开发 JavaScript
【前端用法】HTML5 Video标签如何屏蔽右键视频另存为的js代码以及如何禁用浏览器控件,Video 禁止鼠标右键下载
【前端用法】HTML5 Video标签如何屏蔽右键视频另存为的js代码以及如何禁用浏览器控件,Video 禁止鼠标右键下载
182 0
|
2天前
|
移动开发 前端开发 HTML5
HTML5 Canvas发光Loading源码
一款基于HTML5 Canvas的发光Loading加载HTML源码。Loading旋转图标是在canvas画布上绘制的,整个loading动画是发光3D的视觉效果
12 1
HTML5 Canvas发光Loading源码
|
3天前
|
移动开发 前端开发 HTML5
Canvas实现超酷Loading动画HTML代码
之前我们分享过很多基于CSS3的Loading动画效果,相信大家都很喜欢。今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效。Loading旋转图标是在canvas画布上绘制的,整个loading动画是发光3D的视觉效果,HTML5非常强大。
10 1
Canvas实现超酷Loading动画HTML代码
|
23天前
鼠标点击效果.html(网上收集6)
鼠标点击效果.html(网上收集6)
|
23天前
(星星)跟随鼠标移动的效果.html(网上收集3)
(星星)跟随鼠标移动的效果.html(网上收集3)
|
2月前
|
移动开发 前端开发 API
简述HTML5 Canvas的基本绘图API及其在游戏开发中的作用。
HTML5 Canvas 提供丰富的绘图API,用于在网页上绘制图形、动画和视觉效果,支持基本形状、文本、渐变、图像及像素操作。在游戏开发中,Canvas API用于绘制游戏元素、实现动画效果、进行物理碰撞检测,并具备跨平台兼容性,为创新游戏体验提供强有力的支持。
12 1
|
2月前
|
前端开发 JavaScript 容器
编程笔记 html5&css&js 032 HTML Canvas
编程笔记 html5&css&js 032 HTML Canvas