怎样利用Javascript简单实现星空连线的效果

本篇文章给大家带来了javascript中星空连线效果应该怎样呈现的相关知识,希望对大家有帮助。

怎样利用Javascript简单实现星空连线的效果

Javascript 星空连线效果的简单实现

之前有见过非常炫酷的粒子连线的效果,这篇文章主要是实现一个简单的星空连线的效果。

先贴一下大概的效果图。

立即学习“Java免费学习笔记(深入)”;

26.png

这个主要是用到了Html5中的canvas绘图,关于canvas的基本使用这里就不展开介绍了,大家可以自行去了解。

然后采用的是requestAnimationFrame来进行动画的绘制,而没有采用定时器。

一、实现的效果

星星自动生成,且星星的颜色,初始位置,移动方向都是随机的。

当星星之间的距离小于给定值之后,会在星星之间生成连线。

鼠标指针和星星之间的距离小于给定值之后,也会在星星和鼠标指针之间生成连线。

二、实现的方法

通过canvas绘图实现

定义星星类Star, 包括位置,半径,颜色,移速等属性与绘制和移动等方法。

绘制星星,实现随机移动的效果。

在绘制星星之后计算每个星星之间的距离,在符合要求的星星之间绘制连线。

计算鼠标指针和星星之间的距离,在符合要求的星星之间绘制连线。

绘制采用requestAnimationFrame

在主函数中执行4,5的函数继续进行绘制

三、具体的实现

Html + Css

基本的文档结构非常简单,创建一个canvas容器就可以了。

nbsp;html>                星空连线            * {            margin: 0;            padding: 0;        }        body,        html {            width: 100%;            height: 100%;            overflow: hidden;        }        #starry {            position: absolute;            background-color: #000000;        }        

登录后复制

定义星星类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 = canvas.width - 3) this.speedX *= -1;                if (this.y = canvas.height - 3) this.speedY *= -1;            }        }        // 存储小球        let stars = [];        for (let i = 0; i 

绘制星星,实现随机移动的效果。

我们可以先实现星星的绘制,先暂时不管连线的效果。

        function drawLine() {            for (var i = 0; i 

在绘制星星之后计算每个星星之间的距离,在符合要求的星星之间绘制连线。

其实只要在上一步的函数中添加距离判断和绘制连线的代码就可以了。

        function drawLine() {            for (var i = 0; i 

计算鼠标指针和星星之间的距离,在符合要求的星星之间绘制连线。

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

      function mouseLine() {            for (var i = 0; i 

主函数进行绘制

      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) + ')';        }

登录后复制

完整的代码

nbsp;html>                星空连线            * {            margin: 0;            padding: 0;        }        body,        html {            width: 100%;            height: 100%;            overflow: hidden;        }        #starry {            position: absolute;            background-color: #000000;        }                    // 获取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 = canvas.width - 3) this.speedX *= -1;                if (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) + ')';        }    

登录后复制

结果如下:

+1.gif

【相关推荐:javascript学习教程

以上就是怎样利用Javascript简单实现星空连线的效果的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2940773.html

(0)
上一篇 2025年3月11日 21:47:54
下一篇 2025年2月24日 16:17:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • javascript中next的意思是什么

    在JavaScript中,next是“下一个”的意思,next()方法用于返回被选元素的下一个同级元素,该方法只返回一个元素,语法为“$(selector).next(filter)”。 本教程操作环境:windows10系统、javasc…

    2025年3月11日
    200
  • javascript的case是啥意思

    在JavaScript中,case是判断条件的意思,常与switch语句配合使用,基于不同的条件来执行不同的动作,语法为“switch(n){case 1:执行代码块1 break; default:与case1不同时执行的代码}”。 本教…

    2025年3月11日
    200
  • javascript中的不等于怎么表示

    在JavaScript中,不等于可以使用“!=”和“!==”运算符来表示不等于;使用“!=”运算符用于比较两个操作数的值是否不相等,使用“!==”运算符用于比较两个操作数的值是否不相等,同时检测它们的类型是否不相同。 本教程操作环境:win…

    2025年3月11日
    200
  • html中script有什么用

    在html中,script标签用于定义客户端脚本,既可以包含脚本语句,也可以通过src属性指向外部脚本文件,语法“脚本代码”或“”。 本教程操作环境:windows10系统、HTML5版、Dell G3电脑。 html中script有什么用…

    2025年3月11日
    200
  • html中id是什么意思

    在html中,id是“Identity document”的缩写,是“身份标识号”的意思,该属性用于规定元素的唯一id,该属性可用作链接锚,通过JavaScript或通过CSS为带有指定id的元素改变或添加样式。 本教程操作环境:windo…

    2025年3月11日
    200
  • JavaScript的单线程你真的理解了吗

    本篇文章给大家带来了我们的javascript单线程的相关知识,javascript是一门单线程的语言,为什么javascript可以一边执行定时器一边执行函数,希望对大家有帮助。 1. 进程与线程 1.1 进程(Process) 是计算机…

    2025年3月11日
    200
  • javascript怎么隐藏li

    javascript隐藏li的方法:1、创建一个HTML示例文件;2、定义li标签;3、通过js代码“function showli(pid){…}”控制li的隐藏和显示即可。 本文操作环境:Windows7系统、javascr…

    2025年3月11日
    200
  • javascript怎么隐藏右键

    javascript隐藏右键的方法:1、打开相应的代码文件;2、使用“window.oncontextmenu=function(e){e.preventDefault();}”方法禁用鼠标右键菜单即可。 本文操作环境:Windows7系统…

    2025年3月11日
    200
  • java javascript是什么

    java和javascript是两种不同的编程语言;java是一门面向对象编程语言,具有功能强大和简单易用两个特征,而javascript是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。 本文操作环境:Windows7系统、jav…

    2025年3月11日
    200
  • JavaScript中断点的类型有哪些

    JavaScript中断点的类型:1、Sources断点;2、Debugger断点;3、DOM断点,即在DOM元素上添加断点,进而达到调试的目的;4、XHR断点;5、事件监听器断点。 本教程操作环境:windows7系统、javascrip…

    2025年3月11日
    200

发表回复

登录后才能评论