html+css+js實現canvas跟隨鼠標的小圓特效源碼

效果(源碼在最後):

在這裡插入圖片描述

實現:

1.定義標簽:

 <h1>北極光之夜</h1>
 <canvas id="draw" style=" position: fixed; display: block;">  
			當前瀏覽器不支持Canvas,請更換瀏覽器後再試
 </canvas>

2. 文字的基本樣式:

h1{
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%,-50%);
   font-size: 5em;
   font-family: 'fangsong';
   color: rgb(38, 205, 247);
  }

top: 50%;
left: 50%;
transform: translate(-50%,-50%); 居中對齊
3. js部分,詳細看註釋 :

<script>
  /* 首先獲取canvas畫佈 */
  var canvas = document.querySelector("#draw");
  var yuan = canvas.getContext("2d");  
  /* 綁定窗口大小發生改變事件,讓canvas隨時鋪滿瀏覽器可視區 */
   window.onresize=resizeCanvas;
  function resizeCanvas(){
   canvas.width=window.innerWidth;
   canvas.height=window.innerHeight;
  }
  resizeCanvas(); 

  /* 定義數組,存下面觸發移動事件時產生的小圓 */
  var arr = [];
  
  /* 繪制小圓形的方法,x與y是初始位置,r是圓半徑 */
  function circle (x,y,r){
   this.x=x;
   this.y=y;
   this.r=r;
   /* 得一個隨機顏色 */
   this.color = `rgb(${255*Math.random()},${255*Math.random()},${255*Math.random()})`
   /* 圓的移動方向,random函數為隨機返回一個0.0到1.0的數,x可得隨機正負數,y為隨機正數 */
   this.xZou = parseInt(Math.random()*10-5);
   this.yZou = parseInt(Math.random()*10);  
   /* 向arr數組末尾添加這個元素 */ 
   arr.push(this);
  }

  /* 更新圓形的方法 */
   circle.prototype.updated = function() {
    /* x和y增加,呈現圓形一直走 */
   this.x = this.x + this.xZou ;
   this.y = this.y + this.yZou ;
   /* 半徑慢慢減少 */
   this.r = this.r - 0.1 ;
   /* 當半徑小於1清除這個圓 */
   if(this.r<0){
    this.remove();
   }
   }
   /* 刪除小圓的函數 */
   circle.prototype.remove = function (){
    /* 遍歷數組,找到和調用這個函數相同的圓後用splice函數刪除 */
   for(let i=0;i<arr.length;i++){
     if(this==arr[i])
     {
      arr.splice(i,1);
     }
   }
  }
   /* 渲染小圓 */
   circle.prototype.render = function(){

   yuan.beginPath();
   yuan.arc(this.x,this.y,this.r,0,2*3.14,false);
   yuan.fillStyle = this.color;
   yuan.fill();
   }
   /* 給畫佈綁定鼠標經過事件 */  
   canvas.addEventListener('mousemove',function(e){
    /* 傳入x,y,r。offsetX距離左側距離,.., */
   new circle(e.offsetX,e.offsetY,Math.random()*15); 
   })

    /* 定時器渲染小圓,開始動畫 ,30毫秒一次 */
   setInterval(function(){
     /* 清屏 */
    yuan.clearRect(0,0,canvas.width,canvas.height);
    /* 循環數組,給每個小圓更新和渲染 */
    for(let i=0;i<arr.length;i++){
     /* 更新 */
     arr[i].updated();
     /* 如果瀏覽器支持,則渲染 */
     if(arr[i].render()){
      arr[i].render();
     }
     
    }

   },30)

 </script>

canvas鏈接
splice()方法鏈接
random()方法鏈接
push()方法鏈接
resize事件鏈接

完整源碼:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <style>
  *{
   margin: 0;
   padding: 0;
   box-sizing: border-box;
  }
  
  body{
   background-color: rgb(72, 75, 122);
  }
  
  h1{
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%,-50%);
   font-size: 5em;
   font-family: 'fangsong';
   color: rgb(38, 205, 247);
  }
  
 </style>
</head>
<body>
 
  <h1>北極光之夜</h1>

 <canvas id="draw" style=" position: fixed; display: block;">  
			當前瀏覽器不支持Canvas,請更換瀏覽器後再試
 </canvas>

 <script>
  /* 首先獲取canvas畫佈 */
  var canvas = document.querySelector("#draw");
  var yuan = canvas.getContext("2d");  
  /* 綁定窗口大小發生改變事件,讓canvas隨時鋪滿瀏覽器可視區 */
   window.onresize=resizeCanvas;
  function resizeCanvas(){
   canvas.width=window.innerWidth;
   canvas.height=window.innerHeight;
  }
  resizeCanvas(); 

  /* 定義數組,存下面觸發移動事件時產生的小圓 */
  var arr = [];
  
  /* 繪制小圓形的方法,x與y是初始位置,r是圓半徑 */
  function circle (x,y,r){
   this.x=x;
   this.y=y;
   this.r=r;
   /* 得一個隨機顏色 */
   this.color = `rgb(${255*Math.random()},${255*Math.random()},${255*Math.random()})`
   /* 圓的移動方向,random函數為隨機返回一個0.0到1.0的數,x可得隨機正負數,y為隨機正數 */
   this.xZou = parseInt(Math.random()*10-5);
   this.yZou = parseInt(Math.random()*10);  
   /* 向arr數組末尾添加這個元素 */ 
   arr.push(this);
  }

  /* 更新圓形的方法 */
   circle.prototype.updated = function() {
    /* x和y增加,呈現圓形一直走 */
   this.x = this.x + this.xZou ;
   this.y = this.y + this.yZou ;
   /* 半徑慢慢減少 */
   this.r = this.r - 0.1 ;
   /* 當半徑小於1清除這個圓 */
   if(this.r<0){
    this.remove();
   }
   }
   /* 刪除小圓的函數 */
   circle.prototype.remove = function (){
    /* 遍歷數組,找到和調用這個函數相同的圓後用splice函數刪除 */
   for(let i=0;i<arr.length;i++){
     if(this==arr[i])
     {
      arr.splice(i,1);
     }
   }
  }
   /* 渲染小圓 */
   circle.prototype.render = function(){

   yuan.beginPath();
   yuan.arc(this.x,this.y,this.r,0,2*3.14,false);
   yuan.fillStyle = this.color;
   yuan.fill();
   }
   /* 給畫佈綁定鼠標經過事件 */  
   canvas.addEventListener('mousemove',function(e){
    /* 傳入x,y,r。offsetX距離左側距離,.., */
   new circle(e.offsetX,e.offsetY,Math.random()*15); 
   })

    /* 定時器渲染小圓,開始動畫 ,30毫秒一次 */
   setInterval(function(){
     /* 清屏 */
    yuan.clearRect(0,0,canvas.width,canvas.height);
    /* 循環數組,給每個小圓更新和渲染 */
    for(let i=0;i<arr.length;i++){
     /* 更新 */
     arr[i].updated();
     /* 如果瀏覽器支持,則渲染 */
     if(arr[i].render()){
      arr[i].render();
     }
     
    }

   },30)

 </script>
</body>
</html>

其它:

今日三省吾身:安逸的生活沒意思,充滿挑戰,取得勝利,才是生命真諦。

到此這篇關於html+css+js實現canvas跟隨鼠標的小圓特效源碼的文章就介紹到這瞭,更多相關canvas跟隨鼠標的小圓內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: