canvas基础之动态线条---致敬windows98

还记得这货吗?初中每周一节的计算机课,因为不能联网,所以基本上半节课都在玩儿这个屏幕保护图案...就是这么无聊,但却有满满的回忆。
最近一直忙于写原生JS,对于H5和CSS3略有生疏,于是拿出一个经典的图形来练练canvas的一些基本知识。

win98.jpg

先来html和css部分,简单的韩红看了想打人:

<body>
<canvas  id="can"></canvas>
</body>
<style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }
        canvas{
            background:#000;
        }
    </style>

废话不啰嗦,直接进入js部分,上代码:

<script>
        function ran(n,m){
            return parseInt(Math.random()*(m-n)+n)
        }
        window.onload=function(){
            var oC=document.querySelector('#can');
            var gd=oC.getContext('2d');//创建2D画笔
            var winW=document.documentElement.clientWidth;
            var winH=document.documentElement.clientHeight;
            oC.width=winW;
            oC.height=winH;
            var Len=15;//尾巴个数
            var N=5; //转折点个数
            var arr=[]; //存每个转折点的xy坐标和x轴y轴运动速度
            for(var i=0;i<N;i++){
                arr[i]={
                    x:ran(0,winW),
                    y:ran(0,winH),
                    iSpeedX:ran(-10,10),
                    iSpeedY:ran(-10,10)
                }
            }
            var pw=1;//每个转折点的宽
            var ph=1;//每个转折点的高
            var oldArr=[];//存第一个线条

            function draw(json){
                gd.fillStyle = '#fff';
                gd.fillRect(json.x-pw/2,json.y-ph/2,pw,ph)
            }

            setInterval(function(){
                //先准备五个点
                gd.clearRect(0,0,oC.width,oC.height);
                for(var i=0;i<arr.length;i++){
                   //边界 碰到边界反向掉头继续运动
                   if(arr[i].x<=100){
                        arr[i].x=100;
                        arr[i].iSpeedX*=-1;
                    }else if(arr[i].x>=oC.width-100){
                        arr[i].x=oC.width-100;
                        arr[i].iSpeedX*=-1;
                    }
                    if(arr[i].y<=100){
                        arr[i].y=100;
                        arr[i].iSpeedY*=-1;
                    }else if(arr[i].y>=oC.height-100){
                        arr[i].y=oC.height-100;
                        arr[i].iSpeedY*=-1;
                    }
                    arr[i].x+=arr[i].iSpeedX;
                    arr[i].y+=arr[i].iSpeedY;
                    draw(arr[i]);
                }
                
        //开始沿着五个点画线
                gd.beginPath();//重新开启画笔
                gd.moveTo(arr[0].x,arr[0].y);//起始位置
                for(var i=1;i<arr.length;i++){
                    gd.lineTo(arr[i].x,arr[i].y)
                }//路径
                gd.closePath();//闭合路径
                gd.strokeStyle = 'rgb('+ran(0,255)+','+ran(0,255)+','+ran(0,255)+')';
                gd.stroke();//描边
               
         //画剩下的几条线
                var arr2=[];//存新的点
                for(var i=0;i<arr.length;i++){
                    arr2[i]={
                        x:arr[i].x,
                        y:arr[i].y
                    }
                }
                
                oldArr.push(arr2);//****存上次的数据

呐,重点来了,敲黑板!!其实第二条线是延续第一条线200ms前的路径,第三条线是延续第一条线400ms前的路径,so,只要mei200ms存够15次路径就够用了。

              if(oldArr.length>Len){
                    oldArr.shift();
                }//保证只有十五条数据就够了
                for(var i=0;i<oldArr.length;i++){
                    gd.beginPath();
                    gd.moveTo(oldArr[i][0].x,oldArr[i][0].y);
                    for(var j=1;j<oldArr[i].length;j++){
                        gd.lineTo(oldArr[i][j].x,oldArr[i][j].y);
                    }
                    gd.closePath();
                    gd.strokeStyle = 'rgb('+ran(0,255)+','+ran(0,255)+','+ran(0,255)+')';
                    gd.stroke();
                }
            },200)
        }
    </script>

H5 canvas基础的确很简单,但是要落实到每一个具体效果上,还要有清晰的逻辑并且巧妙的结合JS才能完成,加油!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,742评论 2 32
  • 书中代码示例效果展示:Core HTML5 Canvas Examples 基础知识 canvas元素 canva...
    szu_bee阅读 2,903评论 2 28
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,979评论 3 40
  • 我男朋友他 就是这样的人啊 会在中午靠着他睡觉的时候怕我滑下去一直护着我的头 抱着他胳膊睡了一个小时也没见他换过姿...
    uaremybelief阅读 331评论 0 0
  • 想象一下,炎炎夏日,你在家想要一听冰啤酒解渴,刚好冰箱里的啤酒喝完了,你会从舒服的沙发上坐起来去最近的门店买冰啤酒...
    伯凡时间阅读 287评论 0 1