美文网首页web前端学习互联网科技让前端飞
谁说程序员不懂浪漫,canvas制作浪漫满屋爱心飘动

谁说程序员不懂浪漫,canvas制作浪漫满屋爱心飘动

作者: 烟雨丿丶蓝 | 来源:发表于2018-02-24 13:59 被阅读39次
web前端群,189394454,有视频、源码、学习方法等大量干货分享

谁说程序员不懂浪漫呢,程序员只是不善言语表达而已,下面我们就来看看这浪漫满屋的代码吧。

效果知识点:面向对象开发思想 , canvas画布 ,随机与运动函数, canvas图片绘制 ,动量设计,this与对象, 原型与构造函数 ,编程规范,逻辑思维,帧动画处理与平滑动画。

👇css代码:

  <style>
    *{margin:0;padding:0;}
    body{
        background:#303035;
        overflow:hidden; /*单页场景类特效 超出隐藏*/
    }
  </style>

👇javascript代码:

    <script>
        
        var canvas = document.querySelector('canvas'); //获取canvas元素
        var ctx = canvas.getContext('2d'); //创建canvas画布
        var wW = window.innerWidth; //获取浏览器宽度 screen.width
        var wH = window.innerHeight;
        var num = 100;// 绘制100个红心 100个红心对象
        var hearts=[]; //数组 心的集合
        var heartImage = new Image();// 创建一个新的image对象
        heartImage.src='images/heart.svg'; // 改变路径
        heartImage.onload = init; // 当图片加载完成之后渲染
    
        init(); //运行初始化函数
        
        
        
        function init(){ //创建一个函数(方法)
            //初始化画布的大小
            canvas.width = wW;
            canvas.height = wH;
            for(var i=0;i<num;i++){
                hearts[i]=new Heart();
            }
            requestAnimationFrame(render);
            window.addEventListener('resize',function(){
              wW = window.innerWidth; //获取浏览器宽度 screen.width
              wH = window.innerHeight;
            })
        }
         
        function Heart(){ //构造函数 首字母大写
            this.x = Math.random()*wW;//初始化生成范围为浏览器宽度
            this.y = Math.random()*wH;

            this.opacity = Math.random()*.5+.5; //[0.5+0.1-0.5]
            
            this.vel = { //位移参数 移动量和方向
                x: (Math.random()-.5)*4, // 0-.5=-.5 1-0.5 = 0.5 -值往左走 ﹢值往右走
                y: (Math.random()-.5)*4 //速度系数
            
            }

            this.initialW = 470; //基准宽度
            this.initialH = 410; //基准高度
             // 最终大小缩放比例targetScale 最小为0.02 
            this.targetScale= Math.random()*.15 +.02;
            // 初始化的时候大小缩放比例scale
            this.scale = this.targetScale*Math.random();
        }
        Heart.prototype.update = function(){//更新方法
            this.x += this.vel.x; // 改变心的x方向位置 10 10.5
            this.y += this.vel.y;
            
            if(this.x - this.width > wW || this.x + this.width < 0 ){
                this.scale = 0; //重置缩放值
                this.x = Math.random()*wW; //从新初始化x方向位置
            }
            if(this.y - this.height > wH || this.y + this.height < 0){
                this.scale = 0; //重置缩放值
                this.y = Math.random()*wH; //从新初始化x方向位置
            }

            this.scale += (this.targetScale-this.scale)*.01;
            // 当前大小 = 目标大小 - 当前大小
            // 0.3      = 0.3+(( 0.8 - 0.3 )* 0.01); 0.005+0.3 0.305
            // 0.8  = 0.8 + (0.8-0.8) *0.01;
            this.width = this.scale*this.initialW;
            this.height =this.scale*this.initialH;
        }
        Heart.prototype.draw = function(){ //绘制方法 原型方法
            ctx.globalAlpha = this.opacity; //红心透明度
            ctx.drawImage(heartImage,this.x,this.y,this.width,this.height);
        }
    
    
        function render(){//渲染函数
            ctx.clearRect(0,0,wW,wH);// 清空画布
            for(var i=0;i<num;i++){
                hearts[i].draw(); //对象的绘制方法
                hearts[i].update(); //每隔13毫秒重新绘制爱心坐标
            }
            
            requestAnimationFrame(render); //每隔13毫秒 调用一次render
        }
        
        function module(){ //修改内部作用域变量
            var person=[
                {
                    'name':'海牙',
                    'age':13,
                    'job':'前端工程师'
            
                },
                {
                    'name':'阿飞',
                    'age':3,
                    'job':'架构师'
            
                }
            ]
            var index=0;
            function mySelect(item){
                for(var i=0,len=person.length;i<len;i++){
                    if(person[i]['name']== item){
                        index = i;
                        return i;
                    }
                }
                    
            }
            function myUpdate(index,key,val){
                person[index][key] = val;
            
            }
            return {
                set:function(item,key,val){
                    myUpdate(mySelect(item),key,val);
                },
                get:function(){
                    return person[index];
                }
            }
        }
      
        var nmodule = module(); // json 对象
        nmodule.set('阿飞','age',2);
    
        console.log(nmodule.get())
        //console.log(numX);
        // 词法作用域 IIFE 变量声明提升
    </script>

相关文章

  • 谁说程序员不懂浪漫,canvas制作浪漫满屋爱心飘动

    谁说程序员不懂浪漫呢,程序员只是不善言语表达而已,下面我们就来看看这浪漫满屋的代码吧。 效果知识点:面向对象开发思...

  • 程序员的表白

    谁说程序员不懂浪漫! 程序员表白程序,开放源码,不断更新(第三篇:第二弹) 程序员表白神器

  • 谁说程序员不懂浪漫!———网址

    http://www.generalthink.com/mypage/showLove.html

  • 谁说军人不懂浪漫……

    文/枫鸿 似乎总会听到有人说,军人不懂浪漫,时常一副严肃静默的面孔,没有温暖,没有柔情,仿佛人世间的所有情与爱都与...

  • 浪漫满屋

    真滑稽 你把我拉进来 使唤我做这个做那个 让我认识你 让我明白你的想法 让我理解你的一切 当我都记住时 你却叫我都...

  • 浪漫满屋

    听着那首歌,她居然泪流满面 不过是一份不确定的爱情 他们的遇见本来是个错误 只是 他们将错就错 竟然走上正确的道路...

  • 浪漫满屋

    “爱的路千万里,我们要走过去。别彷徨别犹豫,我和你在一起……”播放着爱人喜欢的歌曲《爱的路千万里》,在花瓶...

  • 浪漫满屋

    第一次得心应手地用高光笔,这个感觉很赞

  • 《浪漫满屋》

    女主宋慧乔,单纯机灵,独立, 男主Rain,心地善良,脾气不好 现实大多数人会这喜欢男二,冷静,格局大。 几点经验...

  • 浪漫满屋

    周末看了一个房子,超级有感觉,是这一个多月看房子以来最美的,写下来也是因为它好美,更因为要在自己的脑海为我自己的d...

网友评论

    本文标题:谁说程序员不懂浪漫,canvas制作浪漫满屋爱心飘动

    本文链接:https://www.haomeiwen.com/subject/chmqxftx.html