gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

怎樣利用Javascript簡單實現星空連線的效果

本篇文章給大家帶來了JavaScript中星空連線效果應該怎樣呈現的相關知識,希望對大家有幫助。

怎樣利用Javascript簡單實現星空連線的效果

Javascript 星空連線效果的簡單實現

之前有見過非常炫酷的粒子連線的效果,這篇文章主要是實現一個簡單的星空連線的效果。

先貼一下大概的效果圖。

怎樣利用Javascript簡單實現星空連線的效果

這個主要是用到了Html5中的canvas繪圖,關于canvas的基本使用這里就不展開介紹了,大家可以自行去了解。

然后采用的是requestAnimationFrame來進行動畫的繪制,而沒有采用定時器。

一、實現的效果

  • 星星自動生成,且星星的顏色,初始位置,移動方向都是隨機的。

  • 當星星之間的距離小于給定值之后,會在星星之間生成連線。

  • 鼠標指針和星星之間的距離小于給定值之后,也會在星星和鼠標指針之間生成連線。

二、實現的方法

通過canvas繪圖實現

定義星星類Star, 包括位置,半徑,顏色,移速等屬性與繪制和移動等方法。

繪制星星,實現隨機移動的效果。

在繪制星星之后計算每個星星之間的距離,在符合要求的星星之間繪制連線。

計算鼠標指針和星星之間的距離,在符合要求的星星之間繪制連線。

繪制采用requestAnimationFrame

在主函數中執行4,5的函數繼續進行繪制

三、具體的實現

Html + Css

基本的文檔結構非常簡單,創建一個canvas容器就可以了。

<!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <meta http-equiv="X-UA-Compatible" content="ie=edge">     <title>星空連線</title>     <style type="text/css">         * {             margin: 0;             padding: 0;         }         body,         html {             width: 100%;             height: 100%;             overflow: hidden;         }         #starry {             position: absolute;             background-color: #000000;         }     </style> </head> <body>     <canvas id="starry"></canvas> </html>

定義星星類Star, 包括位置,半徑,顏色,移速等屬性與繪制和移動等方法。

      class Star {             constructor() {                 this.x = randNum(3, canvas.width - 3);                 this.y = randNum(3, canvas.height - 3);                 this.r = randNum(1, 3);                 this.color = randColor();                 this.speedX = randNum(-2, 2) * 0.2;                 this.speedY = randNum(-3, 3) * 0.2;             }             // 繪制每個星點             draw() {                 //新建一條路徑                 ctx.beginPath();                 //調整透明度                 ctx.globalAlpha = 1;                 // 填充顏色                 ctx.fillStyle = this.color;                 // 繪制圓弧                 ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);                 // 填充                 ctx.fill();             }             // 星星移動             move() {                 this.x += this.speedX;                 this.y += this.speedY;                 //設置極限值                 if (this.x <= 3 || this.x >= canvas.width - 3) this.speedX *= -1;                 if (this.y <= 3 || this.y >= canvas.height - 3) this.speedY *= -1;             }         }         // 存儲小球         let stars = [];         for (let i = 0; i < 150; i++) {             let star = new Star();             // 存入數組             stars.push(star);         }

繪制星星,實現隨機移動的效果。

我們可以先實現星星的繪制,先暫時不管連線的效果。

        function drawLine() {             for (var i = 0; i < stars.length; i++) {                 stars[i].draw();                 stars[i].move();             }         }

在繪制星星之后計算每個星星之間的距離,在符合要求的星星之間繪制連線。

其實只要在上一步的函數中添加距離判斷和繪制連線的代碼就可以了。

        function drawLine() {             for (var i = 0; i < stars.length; i++) {                 stars[i].draw();                 stars[i].move();                 for (var j = 0; j < stars.length; j++) {                     if (i != j) {                         if (Math.sqrt(Math.pow((stars[i].x - stars[j].x), 2) + Math.pow((stars[i].y - stars[j].y), 2)) < 80) {                             ctx.beginPath();                             ctx.moveTo(stars[i].x, stars[i].y);                             ctx.lineTo(stars[j].x, stars[j].y);                             ctx.strokeStyle = "white";                             ctx.globalAlpha = 0.2;                             ctx.stroke();                         }                     }                 }             }         }

計算鼠標指針和星星之間的距離,在符合要求的星星之間繪制連線。

和繪制星星的方法差不多。

      function mouseLine() {             for (var i = 0; i < stars.length; i++) {                 if (Math.sqrt(Math.pow((stars[i].x - mouseX), 2) + Math.pow((stars[i].y - mouseY), 2)) < 120) {                     ctx.beginPath();                     ctx.moveTo(stars[i].x, stars[i].y);                     ctx.lineTo(mouseX, mouseY);                     ctx.strokeStyle = "white";                     ctx.globalAlpha = 0.8;                     ctx.stroke();                 }             }         }

主函數進行繪制

      function main() {             // 清除矩形區域             ctx.clearRect(0, 0, canvas.width, canvas.height);             //鼠標移動繪制連線             mouseLine();             // 小球之間自動連線             drawLine();             // 不斷重新執行main(繪制和清除)             window.requestAnimationFrame(main);         }

一些輔助隨機函數

      // 隨機函數         function randNum(m, n) {             return Math.floor(Math.random() * (n - m + 1) + m);         }         // 隨機顏色         function randColor() {             return 'rgb(' + randNum(0, 255) + ',' + randNum(0, 255) + ',' + randNum(0, 255) + ')';         }

完整的代碼

<!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <meta http-equiv="X-UA-Compatible" content="ie=edge">     <title>星空連線</title>     <style type="text/css">         * {             margin: 0;             padding: 0;         }         body,         html {             width: 100%;             height: 100%;             overflow: hidden;         }         #starry {             position: absolute;             background-color: #000000;         }     </style> </head> <body>     <canvas id="starry"></canvas>     <script type="text/javascript">         // 獲取canvas容器         let canvas = document.getElementById('starry');         // 獲取屏幕的寬高         canvas.width = document.documentElement.clientWidth;         canvas.height = document.documentElement.clientHeight;         // 設置繪制模式為2d         let ctx = canvas.getContext('2d');         class Star {             constructor() {                 this.x = randNum(3, canvas.width - 3);                 this.y = randNum(3, canvas.height - 3);                 this.r = randNum(1, 3);                 this.color = 'pink';                 this.color = randColor();                 this.speedX = randNum(-2, 2) * 0.2;                 this.speedY = randNum(-3, 3) * 0.2;             }             // 繪制每個星點             draw() {                 //新建一條路徑                 ctx.beginPath();                 //調整透明度                 ctx.globalAlpha = 1;                 // 填充顏色                 ctx.fillStyle = this.color;                 // 繪制圓弧                 ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);                 // 填充                 ctx.fill();             }             // 小球移動             move() {                 this.x += this.speedX;                 this.y += this.speedY;                 //設置極限值                 if (this.x <= 3 || this.x >= canvas.width - 3) this.speedX *= -1;                 if (this.y <= 3 || this.y >= canvas.height - 3) this.speedY *= -1;             }         }         // 存儲小球         let stars = [];         for (let i = 0; i < 150; i++) {             let star = new Star();             // 存入數組             stars.push(star);         }         let mouseX; let mouseY;         canvas.onmousemove = function (e) {             var e = event || e;             mouseX = e.offsetX;             mouseY = e.offsetY;             // console.log(mouseX+','+mouseY);         }         // 主要事件         main();         function mouseLine() {             for (var i = 0; i < stars.length; i++) {                 if (Math.sqrt(Math.pow((stars[i].x - mouseX), 2) + Math.pow((stars[i].y - mouseY), 2)) < 120) {                     ctx.beginPath();                     ctx.moveTo(stars[i].x, stars[i].y);                     ctx.lineTo(mouseX, mouseY);                     ctx.strokeStyle = "white";                     ctx.globalAlpha = 0.8;                     ctx.stroke();                 }             }         }         // 在一定范圍內劃線         function drawLine() {             for (var i = 0; i < stars.length; i++) {                 stars[i].draw();                 stars[i].move();                 // for (var j = 0; j < stars.length; j++) {                 //     if (i != j) {                 //         if (Math.sqrt(Math.pow((stars[i].x - stars[j].x), 2) + Math.pow((stars[i].y - stars[j].y), 2)) < 80) {                 //             ctx.beginPath();                 //             ctx.moveTo(stars[i].x, stars[i].y);                 //             ctx.lineTo(stars[j].x, stars[j].y);                 //             ctx.strokeStyle = "white";                 //             ctx.globalAlpha = 0.2;                 //             ctx.stroke();                 //         }                 //     }                 // }             }         }         function main() {             // 清除矩形區域             ctx.clearRect(0, 0, canvas.width, canvas.height);             //鼠標移動繪制連線             mouseLine();             // 小球之間自動連線             drawLine();             // 不斷重新執行main(繪制和清除)             window.requestAnimationFrame(main);         }         // 隨機函數         function randNum(m, n) {             return Math.floor(Math.random() * (n - m + 1) + m);         }         // 隨機顏色         function randColor() {             return 'rgb(' + randNum(0, 255) + ',' + randNum(0, 255) + ',' + randNum(0, 255) + ')';         }     </script> </body> </html>

結果如下:

怎樣利用Javascript簡單實現星空連線的效果

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
特级西西444| 国产av人人夜夜澡人人爽| 国内外成人激情免费视频| 韩日视频在线观看| 国产三级生活片| av黄色在线网站| 菠萝蜜视频在线观看入口| 日韩av片网站| 91视频免费版污| 国产原创中文在线观看| 一起操在线视频| 日韩一级免费片| 99视频在线视频| 久久久久久久久久久久久国产精品| 91免费视频污| 亚洲黄色片免费看| 第一区免费在线观看| 黑人粗进入欧美aaaaa| 91专区在线观看| 国产av国片精品| 欧美一区二区中文字幕| 国内外成人激情免费视频| 精品久久一二三| 熟女性饥渴一区二区三区| 人人妻人人澡人人爽欧美一区| 欧美 日韩 国产 在线观看 | 久久综合亚洲精品| 樱花草www在线| 大桥未久一区二区三区| www.污污视频| 日日噜噜噜夜夜爽爽| 国产高清免费在线| 国产精品igao激情视频| 中文字幕成人免费视频| 日本77777| 超碰免费在线公开| 激情五月婷婷六月| 久久久一本二本三本| 欧美黄网站在线观看| 黄色片一级视频| 不卡中文字幕在线观看| 免费看啪啪网站| 中文字幕一区二区三区四区在线视频| 日韩在线视频在线| 黄色一级视频在线播放| 日本日本19xxxⅹhd乱影响| 成人在线观看黄| 国产999免费视频| 国产一区二区三区小说| 日本xxxxxxx免费视频| 日韩视频在线免费播放| 中国一级大黄大黄大色毛片| 欧美乱大交xxxxx潮喷l头像| 黄色影院一级片| 特级黄色片视频| 国产特级黄色大片| 国产精品美女在线播放| 美女福利视频在线| 日韩a级黄色片| 黄色www网站| 午夜啪啪福利视频| 黄色三级视频片| 亚洲精品久久久久久久蜜桃臀| 天天干天天干天天干天天干天天干| 久久免费一级片| 在线一区二区不卡| 天堂网成人在线| 亚洲图片 自拍偷拍| av在线播放天堂| 四虎影院一区二区| 污色网站在线观看| 波多野结衣 作品| 亚洲 国产 图片| 国产成年人在线观看| 性生活免费观看视频| 992kp免费看片| 免费看污黄网站| 亚洲色成人www永久在线观看| 久章草在线视频| 少妇无码av无码专区在线观看| 男女超爽视频免费播放| 久久精品.com| 97成人在线观看视频| 日本a在线免费观看| 亚洲成人手机在线观看| 国产av无码专区亚洲精品| 中文字幕丰满乱码| 欧美日韩视频免费在线观看| av网站在线不卡| 另类小说第一页| 日韩精品一区二区三区不卡| 免费av观看网址| 日韩视频第二页| 日本女人高潮视频| 亚洲欧美天堂在线| 污污的视频免费观看| 激情文学亚洲色图| 国产又粗又长又爽视频| 欧妇女乱妇女乱视频| 黄色网页免费在线观看| 女性女同性aⅴ免费观女性恋| 国产高清精品软男同| 日本xxxxxxx免费视频| 日本免费a视频| 亚洲无在线观看| 日本福利视频一区| 成年人免费大片| 免费看日本黄色| 国产深夜男女无套内射| 我的公把我弄高潮了视频| 蜜桃视频一区二区在线观看| 性欧美在线视频| 日本三级免费网站| av影院在线播放| 久久精品网站视频| 天天综合网日韩| www.日本在线视频| av污在线观看| www.18av.com| www.com毛片| 密臀av一区二区三区| 天天干天天操天天干天天操| 乱人伦xxxx国语对白| 在线看免费毛片| 欧美做暖暖视频| 丁香六月激情婷婷| 网站一区二区三区| 亚洲一区二区偷拍| 久久黄色免费看| 免费看国产曰批40分钟| 日韩不卡的av| 九九九在线观看视频| 超碰成人免费在线| 国产 国语对白 露脸| 好色先生视频污| 欧洲黄色一级视频| 亚洲一级片av| 苍井空浴缸大战猛男120分钟| 狠狠操狠狠干视频| 国产在线青青草| 400部精品国偷自产在线观看| 日韩av黄色网址| 性生活免费在线观看| 特级毛片在线免费观看| 亚洲污视频在线观看| 免费看国产一级片| 亚洲人成无码网站久久99热国产 | 国产a级一级片| 欧美成人精品欧美一级乱| 色中文字幕在线观看| www,av在线| 亚洲免费av网| www.亚洲一区二区| 四虎4hu永久免费入口| 涩涩网站在线看| 日av中文字幕| 成人免费观看毛片| 国产精品欧美激情在线观看| 黄色www网站| 日韩中文字幕二区| 一区二区三区国产免费| 男人插女人下面免费视频| 国产精品一色哟哟| 俄罗斯av网站| av污在线观看| 日本道在线视频| 欧美牲交a欧美牲交| 欧美日韩在线中文| 色一情一区二区三区| 亚洲不卡视频在线| 亚洲第一综合网站| 人妻av中文系列| 婷婷六月天在线| 日韩中文字幕亚洲精品欧美| 小早川怜子一区二区三区| 亚洲人成无码www久久久| 国产成年人视频网站| 潘金莲一级淫片aaaaaa播放1| 国产美女永久无遮挡| 男人天堂成人在线| 善良的小姨在线| 国产一级大片免费看| 男女猛烈激情xx00免费视频| 妞干网视频在线观看| 黄页网站大全在线观看| 日本三级黄色网址| 国产乱子伦精品无码专区| 黄色一级二级三级| 大陆极品少妇内射aaaaaa| 欧美精品一区二区性色a+v| 先锋影音男人资源| 免费男同深夜夜行网站| 男人天堂网站在线| 一本一道久久a久久综合蜜桃| 青青青青在线视频| 欧美日韩亚洲第一| 欧美一级中文字幕| 国产精品拍拍拍| 精品久久久久久久免费人妻| 99热这里只有精品免费|