html5

<!DOCTYPE html>
        <html lang="en">
<head>
    <meta charset="utf-8"/>
    <title>云镜</title>
    <style type="text/css">
        body {
            background: #000;
            min-height: 580px;
            color: #fff;
            font: normal 13px/26px "Libre Baskerville",serif;
            font-smooth: always;
            -webkit-font-smoothing: antialiased;
        }
        #experience {
            perspective: 800px;
            width: 100%;
            min-height: 580px;
            overflow: hidden;
            position: relative;
            z-index: 20;
        }
        #lines {
            position: absolute;
            top: 0;
            left: 0;
            z-index: 30;
            pointer-events: none;
            opacity: .55;
        }
    </style>
</head>
<body>

    <div id="experience">
        <canvas id="lines"></canvas>
    </div>

</body>
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script>
    var experience = {
        page : null,
        resize: null,
        init : function(){
            // SET
            if($(#lines).length){
                this.setLines();
            }
        },
        setLines : function(){
//            console.log(this);
            this.canvas = document.querySelector(canvas);

            var ctx = this.canvas.getContext(2d),
                    color = #ffffff;                  //控制颜色
            this.canvas.width = window.innerWidth;
            this.canvas.height = window.innerHeight;
            this.canvas.style.display = block;
            ctx.fillStyle = color;
            ctx.lineWidth = .2;                         //线条粗细,1018修改为.2,本来是.1
            ctx.strokeStyle = color;                    //线条颜色

            /*控制resize后的canvas*/
            this.resize = function(){
                experience.canvas.width = window.innerWidth;
                experience.canvas.height = window.innerHeight;
                ctx.fillStyle = color;
                ctx.lineWidth = .1;
                ctx.strokeStyle = color;
            };

            $(window).on(resize, experience.resize);
            /*控制resize后的canvas End*/

            var mousePosition = {         //开始时线条集合中心点的位置
                x: 30 * experience.canvas.width / 100,
                y: 30 * experience.canvas.height / 100
            };

            var dots = {
                nb: 250,        //效果中点个数
                distance: 80,   //distance代表当星星之间的距离是多少时连接产生线条
                d_radius: 150,  //控制可显示的线条的区域大小
                array: []       //点和线的集合的数组
            };

            function Dot(){         //Dot函数对象是代表的是点,被实例化了点的个数次
                this.x = Math.random() * experience.canvas.width;    //表示点的在DOM加载完成时的初始水平位置,如果是个常量,则所有点都在一个位置,产生的效果类似烟花爆炸的效果,另外,无论初始在哪里,所有的点最终都会散布开来,要不然不会有烟花效果
                this.y = Math.random() * experience.canvas.height;   //表示点的在DOM加载完成时的初始垂直位置,如果是个常量,则所有点都在一个位置,产生的效果类似烟花爆炸的效果,另外,无论初始在哪里,所有的点最终都会散布开来,要不然不会有烟花效果
                this.vx = -.5 + Math.random();
                this.vy = -.5 + Math.random();
                this.radius = Math.random();    //控制点的圆大小

            }

            Dot.prototype = {   //绘制点的圆
                create: function(){
                    ctx.beginPath();    //beginPath() 方法开始一条路径,或重置当前的路径
                    ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false);    //arc() 方法创建弧/曲线(用于创建圆或部分圆)
                    ctx.fill(); //fill() 方法填充当前的图像(路径)。默认颜色是黑色。如果路径未关闭,那么 fill() 方法会从路径结束点到开始点之间添加一条线,以关闭该路径,然后填充该路径。
                }
            };

            Dot.animate = function(){
                var i, dot;

                for(i = 0; i < dots.nb; i++){
                    dot = dots.array[i];

                    if(dot.y < 0 || dot.y > experience.canvas.height){
                        dot.vx = dot.vx;
                        dot.vy = - dot.vy;
                    }
                    else if(dot.x < 0 || dot.x > experience.canvas.width){
                        dot.vx = - dot.vx;
                        dot.vy = dot.vy;
                    }
                    dot.x += dot.vx;
                    dot.y += dot.vy;
                }
            };

            /*绘制线条的核心算法*/
            Dot.line = function(){
                var i, j, i_dot, j_dot;

                for(i = 0; i < dots.nb; i++){
                    for(j = 0; j < dots.nb; j++){
                        i_dot = dots.array[i];
                        j_dot = dots.array[j];

                        if((i_dot.x - mousePosition.x) < dots.d_radius && (i_dot.y - mousePosition.y) < dots.d_radius && (i_dot.x - mousePosition.x) > - dots.d_radius && (i_dot.y - mousePosition.y) > - dots.d_radius){
                            if((i_dot.x - j_dot.x) < dots.distance && (i_dot.y - j_dot.y) < dots.distance && (i_dot.x - j_dot.x) > - dots.distance && (i_dot.y - j_dot.y) > - dots.distance){
                                ctx.beginPath();
                                ctx.moveTo(i_dot.x, i_dot.y);   //moveTo() 方法把路径移动到画布中的指定点,不创建线条。
                                ctx.lineTo(j_dot.x, j_dot.y);   //lineTo() 方法添加一个新点,然后创建从该点到画布中最后指定点的线条(该方法并不会创建线条)。
                                ctx.stroke();   //stroke() 方法会实际地绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色
                                ctx.closePath();    //closePath() 方法创建从当前点到开始点的路径。
                            }
                        }
                    }
                }
            };

            function createDots(){
                var i;

                ctx.clearRect(0, 0, experience.canvas.width, experience.canvas.height); //clearRect()方法清空给定矩形内的指定像素。

                if(dots.array.length < 1) {         //在没有dot的条件下,创建对应dot数的dot
                    for(i = 0; i < dots.nb; i++){
                        dots.array.push(new Dot());
                    }
                }

                for(i = 0; i < dots.nb; i++){
                    var dot = dots.array[i];
                    dot.create();
                }

                Dot.line();
                Dot.animate();
            }
            /*绘制线条的核心算法 End*/

            $(#experience).on(mousemove mouseleave, function(e){
                if(e.type == mousemove){
                    mousePosition.x = e.pageX;
                    mousePosition.y = e.pageY;
                }
                if(e.type == mouseleave){
                    mousePosition.x = experience.canvas.width / 2;      //回归到未移入之前的位置
                    mousePosition.y = experience.canvas.height / 2;     //回归到未移入之前的位置
                }
            });

            this.interval = setInterval(createDots, 1000/30);   //控制线条变化的速度

        },

        destroy : function() {
            if(this.interval) {
                clearInterval(this.interval);       //清除setnterval
            }
            if(experience.resize){
                $(window).on(resize, experience.resize);
            }

        }
    };

    experience.init();
</script>
        </html>

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。