【445云顶国际在线娱乐】canvas学习笔记,前端基

时刻流互连网之今后(下)

2013/04/15 · HTML5 · 1 评论 · HTML5

来源:pingwest

canvas学习笔记:小公式大野趣

2014/03/20 · HTML5 · 1 评论 · HTML5

原作出处: WAxes   

近日想弄二个网页,把自个儿学HTML5进度中做的一部分DEMO放上去做集结,不过,假若就单单做个网页把持有DEMO三个二个排列又以为太不要脸了。就想,既然学了canvas,那就来折腾下浏览器,做个相当的小开场动画吧。

开场动画的功能,想了一会,决定用粒子,因为认为粒子相比有趣。还记得之前自身写的率先篇手艺博文,便是讲文字图片粒子化的:文字图片粒子化 , 那时就一味做的是直线运动,顺便加了几许3D成效。运动公式很简单。所以就想这一个开场动画就做的更充沛一些呢。

先上DEMO:

效果与利益是还是不是比直线的位移特别振作呢?而且也真正很轻便,别忘了那篇博文的标题,小小滴公式,大大滴野趣。要做出如此的效应,用的就偏偏是大家初级中学。。可能高级中学时候的情理知识,加快移动,减速运动的公式啦。所以的确是小小滴公式。楼主很欢腾折腾一些璀璨的事物,纵然或然平常专业上用不上,不过,那野趣确实很令人着迷啊。何况,做下那些也足以升高级中学一年级下编制程序的思维技巧哈。

废话非常少说,进入正题啦。就大概的解释一下原理吧~~~

粒子运动的为主代码就好像此一点:

JavaScript

update:function(time){ this.x += this.vx*time; this.y += this.vy*time; if(!this.globleDown&&this.y>0){ var yc = this.toy - this.y; var xc = this.tox - this.x; this.jl = Math.sqrt(xc*xc+yc*yc); var za = 20; var ax = za*(xc/this.jl), ay = za*(yc/this.jl), vx = (this.vx+ax*time)*0.97, vy = (this.vy+ay*time)*0.97; this.vx = vx; this.vy = vy; }else { var gravity = 9.8; var vy = this.vy+gravity*time; if(this.y>canvas.height){ vy = -vy*0.7; } this.vy = vy; } },

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
update:function(time){
            this.x += this.vx*time;
            this.y += this.vy*time;
 
            if(!this.globleDown&&this.y>0){
                var yc = this.toy - this.y;
                var xc = this.tox - this.x;
 
                this.jl = Math.sqrt(xc*xc+yc*yc);
 
                var za = 20;
 
                var ax = za*(xc/this.jl),
                    ay = za*(yc/this.jl),
                    vx = (this.vx+ax*time)*0.97,
                    vy = (this.vy+ay*time)*0.97;
 
                this.vx = vx;
                this.vy = vy;
 
            }else {
                var gravity = 9.8;
                var vy = this.vy+gravity*time;
 
                if(this.y>canvas.height){
                    vy = -vy*0.7;
                }
 
                this.vy = vy;
            }
        },

粒子总共有两种情景,一种是自由落体,一种正是面对吸力。自由落体就背着了。说吸力在此以前先贴出粒子的性格:

JavaScript

var Dot = function(x,y,vx,vy,tox,toy,color){ this.x=x; this.y=y; this.vx=vx; this.vy=vy; this.nextox = tox; this.nextoy = toy; this.color = color; this.visible = true; this.globleDown = false; this.setEnd(tox , toy); } setEnd:function(tox , toy){     this.tox = tox;     this.toy = toy;     var yc = this.toy - this.y;     var xc = this.tox - this.x; },

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var Dot = function(x,y,vx,vy,tox,toy,color){
        this.x=x;
        this.y=y;
        this.vx=vx;
        this.vy=vy;
        this.nextox = tox;
        this.nextoy = toy;
        this.color = color;
        this.visible = true;
        this.globleDown = false;
        this.setEnd(tox , toy);
    }
 
setEnd:function(tox , toy){
    this.tox = tox;
    this.toy = toy;
    var yc = this.toy - this.y;
    var xc = this.tox - this.x;
},

x,y正是粒子的职位,vx是粒子水平速度,vy是粒子的垂直速度,nexttox之类知否道都不在乎,只是有时保留变量的。tox,和toy就是粒子的指标地地方。

率先,先予以全体粒子贰个目标地,这么些指标地上面再会说。也正是要粒子达到的地方,然后再定义七个变量za作为加快度,具体数值的话,就和煦多测验下就能有差非常的少参数的了,我设成20,认为就差不离了。za是粒子和指标地之间连线的加速度,所以,大家因而粒子的职位和指标地的职位,通过轻便的三角形函数,就足以把粒子的等级次序加快度和垂直加快度求出来了,就这段

JavaScript

var ax = za*(xc/this.jl), ay = za*(yc/this.jl),

1
2
var ax = za*(xc/this.jl),
  ay = za*(yc/this.jl),

有了档次加快度和垂直加快度后,接下去就更简约了,直接计算水平速度和垂直速度的增量,进而改造程度速度和垂直速度的值

JavaScript

vx = (this.vx+ax*time)*0.97, vy = (this.vy+ay*time)*0.97;

1
2
vx = (this.vx+ax*time)*0.97,
vy = (this.vy+ay*time)*0.97;

故而要乘于0.97是为了仿成效量消耗,粒子才会减速。time是每一帧的年华差

测算出速度后就立异粒子地方就行了。

JavaScript

this.x += this.vx*time; this.y += this.vy*time;

1
2
this.x += this.vx*time;
this.y += this.vy*time;

因为粒子在航空进度中,与目标地之间的连线方向是不停改动的,所以每一帧都要再次总计粒子的程度加快度和垂直加快度。

活动规律正是这么,是或不是很简单吗。

一举手一投足规律讲罢了,再扯一下地点拾叁分动画的切实可行落到实处吗:动画起始化,在四个离屏canvas上把想要的字如故图片画出来,然后再经过getImageData那些主意获得离屏canvas的像素。然后用三个巡回,把离屏canvas中有绘制的区域找寻来,因为imageData里的data值就是三个rgba数组,所以大家看清最后三个的值也便是光滑度大于128就是有绘制过的区域。然后拿走该区域的xy值,为了防范粒子对象过多导致页面卡顿,所以大家就限制一下粒子的数码,取像素的时候x值和y值每一回递增2,进而减弱粒子数量。

JavaScript

this.osCanvas = document.createElement("canvas"); var osCtx = this.osCanvas.getContext("2d"); this.osCanvas.width = 一千; this.osCanvas.height = 150; osCtx.textAlign = "center"; osCtx.textBaseline = "middle"; osCtx.font="70px 微软雅黑,石籀文 bold"; osCtx.fillStyle = "#1D181F" osCtx.fillText("WelCome" , this.osCanvas.width/2 , this.osCanvas.height/2-40); osCtx.fillText("To wAxes' HOME" , this.osCanvas.width/2 , this.osCanvas.height/2+40); var bigImageData = osCtx.getImageData(0,0,this.osCanvas.width,this.osCanvas.height); dots = []; for(var x=0;x<bigImageData.width;x+=2){ for(var y=0;y<bigImageData.height;y+=2){ var i = (y*bigImageData.width + x)*4; if(bigImageData.data[i+3]>128){ var dot = new Dot( Math.random()>0.5?Math.random()*20+10:Math.random()*20+canvas.width-40, -Math.random()*canvas.height*2, 0, 0, x+(canvas.width/2-this.osCanvas.width/2), y+(canvas.height/2-this.osCanvas.height/2), "rgba("+bigImageData.data[i]+","+bigImageData.data[i+1]+","+bigImageData.data[i+2]+",1)" ); dot.setEnd(canvas.width/2,canvas.height/2) dots.push(dot); } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
this.osCanvas = document.createElement(&quot;canvas&quot;);
        var osCtx = this.osCanvas.getContext(&quot;2d&quot;);
 
        this.osCanvas.width = 1000;
        this.osCanvas.height = 150;
 
        osCtx.textAlign = &quot;center&quot;;
        osCtx.textBaseline = &quot;middle&quot;;
        osCtx.font=&quot;70px 微软雅黑,黑体 bold&quot;;
        osCtx.fillStyle = &quot;#1D181F&quot;
        osCtx.fillText(&quot;WelCome&quot; , this.osCanvas.width/2 , this.osCanvas.height/2-40);
        osCtx.fillText(&quot;To wAxes&#039; HOME&quot; , this.osCanvas.width/2 , this.osCanvas.height/2+40);
        var bigImageData = osCtx.getImageData(0,0,this.osCanvas.width,this.osCanvas.height);
 
        dots = [];
 
        for(var x=0;x&lt;bigImageData.width;x+=2){
            for(var y=0;y&lt;bigImageData.height;y+=2){
                var i = (y*bigImageData.width + x)*4;
                if(bigImageData.data[i+3]&gt;128){
                    var dot = new Dot(
                        Math.random()&gt;0.5?Math.random()*20+10:Math.random()*20+canvas.width-40,
                        -Math.random()*canvas.height*2,
                        0,
                        0,
                        x+(canvas.width/2-this.osCanvas.width/2),
                        y+(canvas.height/2-this.osCanvas.height/2),
                        &quot;rgba(&quot;+bigImageData.data[i]+&quot;,&quot;+bigImageData.data[i+1]+&quot;,&quot;+bigImageData.data[i+2]+&quot;,1)&quot;
                    );
                    dot.setEnd(canvas.width/2,canvas.height/2)
                    dots.push(dot);
                }
            }
        }

经过巡回获取到粒子的岗位xy值后,把地点赋给粒子,成为粒子的目标地。然后动画开始,就能够做出文字图片粒子化的职能了。

上边贴出动画完毕的js代码。假诺对别的代码也许有野趣的,可以一直看调整台哈,没压缩的。

JavaScript

var part_1 = (function(w){ var dots = [],DOT_SIZE = 2,cube=null; var Dot = function(x,y,vx,vy,tox,toy,color){ this.x=x; this.y=y; this.vx=vx; this.vy=vy; this.nextox = tox; this.nextoy = toy; this.color = color; this.visible = true; this.globleDown = false; this.setEnd(tox , toy); } Dot.prototype = { paint:function(){ ctx.fillStyle=this.color; ctx.fillRect(this.x-DOT_SIZE/2 , this.y-DOT_SIZE/2 , DOT_SIZE , DOT_SIZE); }, setEnd:function(tox , toy){ this.tox = tox; this.toy = toy; var yc = this.toy - this.y; var xc = this.tox - this.x; // this.initjl = Math.sqrt(xc*xc+yc*yc); }, update:function(time){ this.x += this.vx*time; this.y += this.vy*time; if(!this.globleDown&&this.y>0){ var yc = this.toy - this.y; var xc = this.tox - this.x; this.jl = Math.sqrt(xc*xc+yc*yc); var za = 20; var ax = za*(xc/this.jl), ay = za*(yc/this.jl), vx = (this.vx+ax*time)*0.97, vy = (this.vy+ay*time)*0.97; this.vx = vx; this.vy = vy; // if(Math.abs(this.vx)<1&&Math.abs(this.vy)<1){ // this.y = this.toy // this.x = this.tox // } }else { var gravity = 9.8; var vy = this.vy+gravity*time; if(this.y>canvas.height){ vy = -vy*0.7; } this.vy = vy; } }, loop:function(time){ this.update(time); this.paint(); } } var animate = function(){ this.state = "before" } var ap = animate.prototype; ap.init = function(){ this.osCanvas = document.createElement("canvas"); var osCtx = this.osCanvas.getContext("2d"); this.osCanvas.width = 1000; this.osCanvas.height = 150; osCtx.textAlign = "center"; osCtx.textBaseline = "middle"; osCtx.font="70px 微软雅黑,草书 bold"; osCtx.fillStyle = "#1D181F" osCtx.fillText("WelCome" , this.osCanvas.width/2 , this.osCanvas.height/2-40); osCtx.fillText("To wAxes' HOME" , this.osCanvas.width/2 , this.osCanvas.height/2+40); var bigImageData = osCtx.getImageData(0,0,this.osCanvas.width,this.osCanvas.height); dots = []; for(var x=0;x<bigImageData.width;x+=2){ for(var y=0;y<bigImageData.height;y+=2){ var i = (y*bigImageData.width + x)*4; if(bigImageData.data[i+3]>128){ var dot = new Dot( Math.random()>0.5?Math.random()*20+10:Math.random()*20+canvas.width-40, -Math.random()*canvas.height*2, 0, 0, x+(canvas.width/2-this.osCanvas.width/2), y+(canvas.height/2-this.osCanvas.height/2), "rgba("+bigImageData.data[i]+","+bigImageData.data[i+1]+","+bigImageData.data[i+2]+",1)" ); dot.setEnd(canvas.width/2,canvas.height/2) dots.push(dot); } } } console.log(dots.length) } ap.changeState = function(){ var osCtx = this.osCanvas.getContext("2d"); osCtx.clearRect(0,0,this.osCanvas.width,this.osCanvas.height); this.osCanvas.width = 460; this.osCanvas.height = 100; osCtx.fillStyle="#5C5656" osCtx.fillRect(20,20,60,60) drawLogo(this.osCanvas , osCtx); var bigImageData = osCtx.getImageData(0,0,this.osCanvas.width,this.osCanvas.height); var index=0; dots.sort(function(a , b){ return Math.random()-Math.random(); }) for(var x=0;x<bigImageData.width;x+=2){ for(var y=0;y<bigImageData.height;y+=2){ var i = (y*bigImageData.width + x)*4; if(bigImageData.data[i+3]>128){ var d = dots[index]; if(d){ d.setEnd(x+(canvas.width/2-300) , y+50) d.color = "rgba("+bigImageData.data[i]+","+bigImageData.data[i+1]+","+bigImageData.data[i+2]+",1)"; index++ } } } } setTimeout(function(){ var endindex = index; for(var i=0;i<dots.length-endindex;i++){ if(dots[index]){ var d = dots[index]; d.globleDown = true; d.vx = Math.random()*100-50; } index++; } } , 2000) } function endState(){ canvas.width = 600; canvas.height = 100; canvas.style.display="block"; canvas.style.top = "50px"; canvas.style.left = (window.innerWidth-canvas.width)/2+"px"; cube = new Cube(50); cube._initVector(50,50); } function drawLogo(canvas , ctx){ ctx.textAlign = "center"; ctx.textBaseline = "middle"; ctx.font="65px 微软雅黑,草书 bold" ctx.fillStyle="#E06D2F" ctx.fillText("DEMO" , 300 , canvas.height/2) ctx.font="40px 微软雅黑,小篆 bold" ctx.fillStyle="#405159" ctx.fillText("吖猩的" , 160 , canvas.height/2) ctx.fillText("小窝" , 420 , canvas.height/2) } var num = 0; ap.update = function(time){ time = time/100; if(this.state==="first"||this.state==="before"){ var completeNum = 0; dots.forEach(function(dot){ if(dot.visible) dot.loop(time); if(dot.jl<5){ completeNum++ } }); if(completeNum>=5*dots.length/6){ if(this.state==="before"){ this.state = "first"; dots.forEach(function(dot){ dot.setEnd(dot.nextox , dot.nextoy); }); }else { this.state = "second"; this.changeState(); } } }else if(this.state==="second"){ var completeNum = 0, allnum = 0; dots.forEach(function(dot){ if(dot.visible) dot.loop(time); if(dot.globleDown){ allnum++; if(Math.abs(dot.y-canvas.height)<2){ completeNum++ } } }); if(completeNum===allnum&&allnum!==0){ this.state = "third"; part_2.animate(); endState(); } }else if(this.state==="third"){ cube.update(); drawLogo(canvas , ctx); } } return new animate(); })(window)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
var part_1 = (function(w){
    var dots = [],DOT_SIZE = 2,cube=null;
 
    var Dot = function(x,y,vx,vy,tox,toy,color){
        this.x=x;
        this.y=y;
        this.vx=vx;
        this.vy=vy;
        this.nextox = tox;
        this.nextoy = toy;
        this.color = color;
        this.visible = true;
        this.globleDown = false;
        this.setEnd(tox , toy);
    }
 
    Dot.prototype = {
        paint:function(){
            ctx.fillStyle=this.color;
            ctx.fillRect(this.x-DOT_SIZE/2 , this.y-DOT_SIZE/2 , DOT_SIZE , DOT_SIZE);
        },
 
        setEnd:function(tox , toy){
            this.tox = tox;
            this.toy = toy;
            var yc = this.toy - this.y;
            var xc = this.tox - this.x;
            // this.initjl = Math.sqrt(xc*xc+yc*yc);
        },
 
        update:function(time){
            this.x += this.vx*time;
            this.y += this.vy*time;
 
            if(!this.globleDown&amp;&amp;this.y&gt;0){
                var yc = this.toy - this.y;
                var xc = this.tox - this.x;
 
                this.jl = Math.sqrt(xc*xc+yc*yc);
 
                var za = 20;
 
                var ax = za*(xc/this.jl),
                    ay = za*(yc/this.jl),
                    vx = (this.vx+ax*time)*0.97,
                    vy = (this.vy+ay*time)*0.97;
 
                this.vx = vx;
                this.vy = vy;
 
                // if(Math.abs(this.vx)&lt;1&amp;&amp;Math.abs(this.vy)&lt;1){
                //     this.y = this.toy
                //     this.x = this.tox
                // }
            }else {
                var gravity = 9.8;
                var vy = this.vy+gravity*time;
 
                if(this.y&gt;canvas.height){
                    vy = -vy*0.7;
                }
 
                this.vy = vy;
            }
        },
 
        loop:function(time){
            this.update(time);
            this.paint();
        }
    }
 
    var animate = function(){
        this.state = &quot;before&quot;
    }
 
    var ap = animate.prototype;
 
    ap.init = function(){
        this.osCanvas = document.createElement(&quot;canvas&quot;);
        var osCtx = this.osCanvas.getContext(&quot;2d&quot;);
 
        this.osCanvas.width = 1000;
        this.osCanvas.height = 150;
 
        osCtx.textAlign = &quot;center&quot;;
        osCtx.textBaseline = &quot;middle&quot;;
        osCtx.font=&quot;70px 微软雅黑,黑体 bold&quot;;
        osCtx.fillStyle = &quot;#1D181F&quot;
        osCtx.fillText(&quot;WelCome&quot; , this.osCanvas.width/2 , this.osCanvas.height/2-40);
        osCtx.fillText(&quot;To wAxes&#039; HOME&quot; , this.osCanvas.width/2 , this.osCanvas.height/2+40);
        var bigImageData = osCtx.getImageData(0,0,this.osCanvas.width,this.osCanvas.height);
 
        dots = [];
 
        for(var x=0;x&lt;bigImageData.width;x+=2){
            for(var y=0;y&lt;bigImageData.height;y+=2){
                var i = (y*bigImageData.width + x)*4;
                if(bigImageData.data[i+3]&gt;128){
                    var dot = new Dot(
                        Math.random()&gt;0.5?Math.random()*20+10:Math.random()*20+canvas.width-40,
                        -Math.random()*canvas.height*2,
                        0,
                        0,
                        x+(canvas.width/2-this.osCanvas.width/2),
                        y+(canvas.height/2-this.osCanvas.height/2),
                        &quot;rgba(&quot;+bigImageData.data[i]+&quot;,&quot;+bigImageData.data[i+1]+&quot;,&quot;+bigImageData.data[i+2]+&quot;,1)&quot;
                    );
                    dot.setEnd(canvas.width/2,canvas.height/2)
                    dots.push(dot);
                }
            }
        }
        console.log(dots.length)
    }
 
    ap.changeState = function(){
        var osCtx = this.osCanvas.getContext(&quot;2d&quot;);
        osCtx.clearRect(0,0,this.osCanvas.width,this.osCanvas.height);
        this.osCanvas.width = 460;
        this.osCanvas.height = 100;
 
        osCtx.fillStyle=&quot;#5C5656&quot;
        osCtx.fillRect(20,20,60,60)
 
        drawLogo(this.osCanvas , osCtx);
 
        var bigImageData = osCtx.getImageData(0,0,this.osCanvas.width,this.osCanvas.height);
 
        var index=0;
        dots.sort(function(a , b){
            return Math.random()-Math.random();
        })
        for(var x=0;x&lt;bigImageData.width;x+=2){
            for(var y=0;y&lt;bigImageData.height;y+=2){
                var i = (y*bigImageData.width + x)*4;
                if(bigImageData.data[i+3]&gt;128){
                        var d = dots[index];
                        if(d){
                            d.setEnd(x+(canvas.width/2-300) , y+50)
                            d.color = &quot;rgba(&quot;+bigImageData.data[i]+&quot;,&quot;+bigImageData.data[i+1]+&quot;,&quot;+bigImageData.data[i+2]+&quot;,1)&quot;;
                            index++
                        }
                }
            }
        }
 
        setTimeout(function(){
            var endindex = index;
            for(var i=0;i&lt;dots.length-endindex;i++){
                if(dots[index]){
                    var d = dots[index];
 
                    d.globleDown = true;
                    d.vx = Math.random()*100-50;
                }
                index++;
            }
        } , 2000)
    }
 
    function endState(){
        canvas.width = 600;
        canvas.height = 100;
        canvas.style.display=&quot;block&quot;;
        canvas.style.top = &quot;50px&quot;;
        canvas.style.left = (window.innerWidth-canvas.width)/2+&quot;px&quot;;
        cube = new Cube(50);
        cube._initVector(50,50);
    }
 
    function drawLogo(canvas , ctx){
        ctx.textAlign = &quot;center&quot;;
        ctx.textBaseline = &quot;middle&quot;;
        ctx.font=&quot;65px 微软雅黑,黑体 bold&quot;
        ctx.fillStyle=&quot;#E06D2F&quot;
        ctx.fillText(&quot;DEMO&quot; , 300 , canvas.height/2)
 
        ctx.font=&quot;40px 微软雅黑,黑体 bold&quot;
        ctx.fillStyle=&quot;#405159&quot;
        ctx.fillText(&quot;吖猩的&quot; , 160 , canvas.height/2)
        ctx.fillText(&quot;小窝&quot; , 420 , canvas.height/2)
    }
 
    var num = 0;
    ap.update = function(time){
        time = time/100;
        if(this.state===&quot;first&quot;||this.state===&quot;before&quot;){
            var completeNum = 0;
            dots.forEach(function(dot){
                if(dot.visible) dot.loop(time);
                if(dot.jl&lt;5){
                    completeNum++
                }
            });
            if(completeNum&gt;=5*dots.length/6){
 
                if(this.state===&quot;before&quot;){
                    this.state = &quot;first&quot;;
                    dots.forEach(function(dot){
                        dot.setEnd(dot.nextox , dot.nextoy);
                    });
                }else {
                    this.state = &quot;second&quot;;
                    this.changeState();
                }
            }
        }else if(this.state===&quot;second&quot;){
            var completeNum = 0,
                allnum = 0;
            dots.forEach(function(dot){
                if(dot.visible) dot.loop(time);
                if(dot.globleDown){
                    allnum++;
                    if(Math.abs(dot.y-canvas.height)&lt;2){
                        completeNum++
                    }
                }
            });
 
            if(completeNum===allnum&amp;&amp;allnum!==0){
                this.state = &quot;third&quot;;
                part_2.animate();
                endState();
            }
        }else if(this.state===&quot;third&quot;){
            cube.update();
            drawLogo(canvas , ctx);
        }
    }
 
    return new animate();
})(window)

赞 1 收藏 1 评论

445云顶国际在线娱乐 1

前端基础进级(10):面向对象实战之封装拖拽对象

2017/04/02 · JavaScript · 面向对象

原稿出处: 波同学   

445云顶国际在线娱乐 2

终于

日前几篇小说,作者跟我们共享了JavaScript的一些基础知识,那篇小说,将会步入第三个实战环节:利用前面几章的所关联到的学问,封装叁个拖拽对象。为了能够帮忙我们精晓越来越多的办法与拓宽对照,小编会使用二种区别的点子来促成拖拽。

  • 不封装对象直接促成;
  • 选取原生JavaScript封装拖拽对象;
  • 透过扩大jQuery来促成拖拽对象。

本文的例证会停放于codepen.io中,供大家在翻阅时平素查看。假若对于codepen不打听的同学,能够花点时间有个别精晓一下。

拖拽的贯彻进程会涉嫌到不行多的实用小知识,因而为了加固自个儿本身的知识储存,也为了大家可以学到愈来愈多的学问,笔者会尽量详细的将一部分细节分享出来,相信我们认真读书之后,一定能学到一些东西。

canvas图形绘制之星空、噪点与冰雾效果

2016/06/07 · HTML5 · 1 评论 · Canvas

原来的书文出处: 张鑫旭(@张鑫旭)   

页面制作之付出调节和测量检验工具(1)

2015/04/14 · CSS, HTML5, JavaScript · 调试

初稿出处: jingwhale   

《岁月流互连网之今后(上)》

1、怎么着让二个DOM成分动起来

大家平日会通过修改成分的top,left,translate来其的职务产生退换。在下面包车型地铁例证中,每点击贰遍按键,对应的因素就能够活动5px。大家可点击查阅。

点击查阅贰个让成分动起来的小例子

由于修改贰个要素top/left值会引起页面重绘,而translate不会,因而从品质优化上来判别,我们会事先使用translate属性。

一、三合一

三个功效合成一篇文章。

有八个小友人问小编,为什么不开个大伙儿号,今后都以活动时代,你博客小说写好后,公众号再复制一份,花不了多久,同时传播方便高效,打赏方便飞快,明显低成本高收益。

从眼下来看,就像真的如此。

唯独,就自己个人来说,行为和操持准绳总是遵守内心的直觉和大方向的指引。说不上具体的道理,正是以为,小说的输出源假若持续多少个,久远来看,带来的茫然损耗必须要超过短时间的已知受益。

取巧的业务多慎思而克己,就好比本文内容,实际上,多个不等的canvas效果,直接分3篇来写,凑个文章数,扩展点浏览量其实也是无可非议的。然,想了想,有一点不像自身的style,内心真实的和煦并不期望团结如此做,于是,就3个功效合体为一篇文章。

不容小片段的诱惑,让本身过得更自在。

正文的3个效果与利益都是源自己前段时间做的多少个实在的花色,是canvas领域基本入门的一部分效益。代码小编都非常重新梳理了下,供给注释也都丰裕去了,方便我们的读书。然后,要是你有不懂的地方,请不要来问我,没错,是不要,作者并不款待你找作者来沟通,自个儿一点一点去弄精通。因为,要是连这么基本的canvas效果都不明白,我实在也帮不了你什么。倒不是说腾不出时间,而是腾不出精力,每一天博客园私信还应该有邮箱找作者的人还挺多,实在招待不暇。

开垦工具介绍

开采工具平日分为两种类型:文本编辑器和集成开垦条件(IDE)

常用的文件编辑器:Sublime Text、Notepad++、EditPlus等

常用的IDE:WebStorm、Intellij IDEA、Eclipce等

笔者们这里关键介绍怎样使用Sublime Text编辑器,它基本满意我们对前端开发工具的供给。

手提式有线电话机、谷歌(Google) Glass、智能石英手表、平板、电视机……

移步互连网的上进,不唯有让网络时间流天性越发显著、音信更加的扁平化,同有的时候候对于平日群众以来,最大的退换便是多屏化趋势、以及种种显示器新闻扁平化表现格局的变通。而这最根本的三个原因,便是网络从PC 走向手提式有线电话机、电视机、石英手表等物联网时期的种种设施。本章大家就介绍一下各样大小的显示屏中间的距离、互连网内容在那么些道具上的表现格局。

445云顶国际在线娱乐 3

在互连网还仅局限于PC 上事先,行业内部就有第一显示屏(电视)、第二显示屏(手提式有线电话机)、第三显示屏(PC)等等的说法。后来趁着科学和技术的升华,手提式有线电电话机日益产生了第一荧屏,平板兴起并最初和电视机争夺客厅的掌握控制权,而钟表、近视镜也成了新生显示器,更别提Nest、三门电冰箱、电磁波炉那些小显示器了。

智能手提式有线电话机

移步互连网的进化,已经让智能手提式有线电话机成为了PC之外包容网络内容最优的配备,今后的互连网内容表现方式和明天差别也不会太大。但手提式有线电电话机的演化,也会使得现在我们运用手提式有线话机的点子有一点点差别。

第一,手提式有线电话机显示器越来越大,从3.5英寸到4英寸,从4英寸到5依然5.5英寸,大家起先逐年接受大显示屏。显示屏一大,自然展现的信息就多,相当多潜藏的很深的音讯便可以平昔放到桌面上,比如天气、音信、各个小插件等。那契合互联网时间流的生成,消息层级变浅,更加的多内容聚合到桌面上。

援助,触屏手提式有线电话机的风行,使得现在语音、智能传感器(如眼动仪、距离感应器等)获得升华。今后只需对起始提式有线电话机说句话,它就能告诉你任何新闻,你不用去打开某款App,设备就足以自行从网络上找到您想要的事物。消息更加的扁平,HTML5网址内容可间接表以后表弟大显示器上。

机械计算机

平板Computer的流行也就这两七年的事(二零零六年三星GALAXY Tab第一代发表),尽管事先也会有各个Pad 概念和道具。平板连续了智能手提式有线电话机的操作系统,导致其易用性也比PC越来越高。比较PC 这种生产力工具,平板更疑似叁个生活设施,而多数家园要求的,也只是用来休闲游乐的生存设施。

据此完全上,平板和智能手机大概,在网络内容宽容、内容呈现方式、人机交互等地点都曾经非常干练了。随着网络时间流的扁平化,现在的猛烈更疑似二个音讯流自动展现平台。

智能TV

TV以前是客厅的霸主,未来机械的出现让大伙儿在大厅也是有了别的的政工可做,但智能TV很有非常大大概挽留这种局面。和平板同样,智能电视也是叁个互连网的时日流展示平台:全部内容在群众不看电视的时候自动滚动一些音信,譬喻天气、音讯、社交基友照片、新新闻、分享内容等。并且智能TV的视讯系统和手势操控,能分别调整大厅录制通话和游戏这两大种类,在电视机前和亲朋好友摄像聊天、玩游戏是再自然可是的事了。

在网络音信流显示形式上,电视机相比平板其表现内容更加少(固然显示屏大但距离远),所以电视机上的内容更偏向于前边的要讲的近视镜,即卡牌式显示。除了语音和手势调整,电视机上都是以大块内容展现的,比如四个电影海报大概就据有了半个显示屏,一场球赛直播可能就占有了3/4依然更加多的显示屏。但从当前智能电视的分界面设计看,还并未有做的很好的变现方式。

智能老花镜(Google Glass)

就算如此本段大家以谷歌(Google)Glass为例,但此处要阐明的是:智能老花镜并不单独指GoogleGlass这种方式。GoogleGlass在智能近视镜研究开发上做的很好,但不清除今后会有其它的款式(举个例子Vuzix 的斯马特 Glasses M100),并且微软、Sony、Bluester 等竞争对手的加盟,大概也会让智能老花镜领域具备更各类性的生态。

在互连网时间流概念上,Google Glass 的音信表现方式能够说是最规范的了:提姆eline Card 。Glass 的每四个消息都以多少个小卡牌,并以时间为排序情势。卡片上能够突显天气、时间、照片、短音信、录像通话等等,Google把网络内容实行了讲明,社交基友的一条状态、照片墙上的一张图纸都只放在一张卡牌上,那样消息尤其聚集,也不会给客商产生烦恼。

GoogleGlass的这种“时间流卡牌”的展现方式得以用在广大设施上,举例智能电视机、智能机械手表、对开门电冰箱、洗烘一体机、Nest智能家居检验仪等。由于可是荧屏丰裕小,所以这种办法相比适合。并且HTML5的跨平台湾特务性,也能让互连网财富在那些小荧屏设备上很好展现。

智能原子钟

智能石英表有过多,它或然也会像智能老花镜同样成为各大科学和技术厂家的韬略产品,何况由于智能石英钟门槛要比老花镜低,也许更会有一堆小商家也涌进来。假如我们拿Pebble 为例,就可以精晓石英表荧屏异常的小,只好呈现非常少的剧情,所以Timeline Card的款式也适用,在此我们就相当的少说了。

但智能钟表和智能老花镜都面前境遇着一样的多个主题材料:由于体量太小,导致硬件受限,很难支付贰个独立的操作系统,只好通过连日到手提式有线电话机成为一个显示器。(即使谷歌(Google)Glass是单身运维的,但前景不保障其余近视镜也能消除这一难点。)

PC

互连网正是在那方面诞生的,PC 的价值毫无疑问。但科技(science and technology)的前行,已经让PC稳步退居二线了,大家未来多方操作都能够在运动终端上完结,今后也不保障不会完全放弃PC 。有些许人说,现在的PC 不该叫PC 了,应该叫WC (Work Computer)。确实,PC 今后基本上成为了二个生产力工具,大家下班之后基本都不会摸Computer了,更况且对于父老子女还特别难用。

 

2、怎样收获当前浏览器协理的transform宽容写法

transform是css3的性质,当大家运用它时就只可以面前碰到宽容性的标题。分化版本浏览器的万分写法大约有如下两种:

['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform']

于是大家必要看清当前浏览器蒙受帮助的transform属性是哪个种类,方法如下:

JavaScript

// 获取当前浏览器帮助的transform包容写法 function getTransform() { var transform = '', divStyle = document.createElement('div').style, // 恐怕波及到的两种包容性写法,通过巡回找寻浏览器度和胆识其他那多少个 transformArr = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform'], i = 0, len = transformArr.length; for(; i < len; i++) { if(transformArr[i] in divStyle) { // 找到之后随即回到,停止函数 return transform = transformArr[i]; } } // 若无找到,就径直回到空字符串 return transform; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 获取当前浏览器支持的transform兼容写法
function getTransform() {
    var transform = '',
        divStyle = document.createElement('div').style,
        // 可能涉及到的几种兼容性写法,通过循环找出浏览器识别的那一个
        transformArr = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform'],
 
        i = 0,
        len = transformArr.length;
 
    for(; i < len; i++)  {
        if(transformArr[i] in divStyle) {
            // 找到之后立即返回,结束函数
            return transform = transformArr[i];
        }
    }
 
    // 如果没有找到,就直接返回空字符串
    return transform;
}

该方式用于获取浏览器辅助的transform属性。假若回去的为空字符串,则象征目前浏览器并不协理transform,这一年大家就供给采纳left,top值来改动成分的岗位。尽管协助,就改动transform的值。

二、canvas图形效果之旋转星空

445云顶国际在线娱乐 4

图是死的,效果是活的,IE9+浏览器下,您能够狠狠地点击这里:canvas完成的旋转星空效果demo

拜看见地球上方会有众多星星在稳步地绕着地球转啊转,星星在闪啊闪。

像那类密集型canvas效果,日常离不开上面这多少个重大字:实例,随机,变化与重绘,requestAnimationFrame。

规律正是:

  1. 先画三个岗位光滑度随机的静态的星星点点实例对象;
  2. 有四个得以更改不难地方和光滑度的draw方法;
  3. 反应计时器跑起来,画布不停地清除与绘图,动画效果完结!

原理相当粗略。

本例子达成的2个困难在于:

  1. 月歌手稀
    有数垂直方向实际上是个伪随机,越临近地球,星星越密集,而越往上,越疏弃。其算法如下:
JavaScript

var getMinRandom = function() { var rand = Math.random(); //
step的大小决定了星星靠近地球的聚拢程度, // step = Math.ceil(2 /
(1 - rand))就聚拢很明显 var step = Math.ceil(1 / (1 - rand)); var
arr = []; for (var i=0; i&lt;step; i++) { arr.push(Math.random());
} return Math.min.apply(null, arr); };

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f4a6436b2b195965046-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f4a6436b2b195965046-2">
2
</div>
<div class="crayon-num" data-line="crayon-5b8f4a6436b2b195965046-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f4a6436b2b195965046-4">
4
</div>
<div class="crayon-num" data-line="crayon-5b8f4a6436b2b195965046-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f4a6436b2b195965046-6">
6
</div>
<div class="crayon-num" data-line="crayon-5b8f4a6436b2b195965046-7">
7
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f4a6436b2b195965046-8">
8
</div>
<div class="crayon-num" data-line="crayon-5b8f4a6436b2b195965046-9">
9
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f4a6436b2b195965046-10">
10
</div>
<div class="crayon-num" data-line="crayon-5b8f4a6436b2b195965046-11">
11
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f4a6436b2b195965046-12">
12
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f4a6436b2b195965046-1" class="crayon-line">
var getMinRandom = function() {
</div>
<div id="crayon-5b8f4a6436b2b195965046-2" class="crayon-line crayon-striped-line">
    var rand = Math.random();
</div>
<div id="crayon-5b8f4a6436b2b195965046-3" class="crayon-line">
    // step的大小决定了星星靠近地球的聚拢程度,
</div>
<div id="crayon-5b8f4a6436b2b195965046-4" class="crayon-line crayon-striped-line">
    // step = Math.ceil(2 / (1 - rand))就聚拢很明显
</div>
<div id="crayon-5b8f4a6436b2b195965046-5" class="crayon-line">
    var step = Math.ceil(1 / (1 - rand));
</div>
<div id="crayon-5b8f4a6436b2b195965046-6" class="crayon-line crayon-striped-line">
    var arr = [];
</div>
<div id="crayon-5b8f4a6436b2b195965046-7" class="crayon-line">
    for (var i=0; i&lt;step; i++) {
</div>
<div id="crayon-5b8f4a6436b2b195965046-8" class="crayon-line crayon-striped-line">
        arr.push(Math.random());
</div>
<div id="crayon-5b8f4a6436b2b195965046-9" class="crayon-line">
    }
</div>
<div id="crayon-5b8f4a6436b2b195965046-10" class="crayon-line crayon-striped-line">
 
</div>
<div id="crayon-5b8f4a6436b2b195965046-11" class="crayon-line">
    return Math.min.apply(null, arr);       
</div>
<div id="crayon-5b8f4a6436b2b195965046-12" class="crayon-line crayon-striped-line">
};
</div>
</div></td>
</tr>
</tbody>
</table>

很大概率会返回一个数值偏小的值,于是,就可以有“月明星稀”的分布效果了。
  1. 圆弧轨迹
    其实很轻便,大家套用高中时候学的圆方程式就足以了,如投注释截图所述:
    445云顶国际在线娱乐 5那下标题就总结了,已知a,b, 求y相对于x的函数表明式……

一、Sublime Text的特点:

跨平台、启动快

多行选用

各样实用插件

Snippets

帮衬VIM宽容格局

Sublime Text获取地址:

Facebook Home、HTC BlinkFeed功能、SO.HO……

脸谱 发表了一款基于Android 的深浅应用 推特(Twitter)Home,到明天本国外仍不乏许多传播媒介有目共赏马克Zuckerberg的明智之举。即使笔者不认为TwitterHome称得起那样大的赞美,但它却实实在在地得以说是互连网时间流形态很好的例子。本文除了介绍FacebookHome ,还只怕会介绍SamsungSence UI的BlinkFeed、第三方使用SO.HO 以及和网络时间流理论类似的粗略演示 lifestreams.com等。

445云顶国际在线娱乐 6

Facebook Home

关于推特(Twitter) Home ,PingWest在此以前的几篇小说有过介绍。它是一款Android手机深度定制App,约等于在应用层和系统层中间加了一层。顾客的直接使用感受正是:你的Instagram好朋友图片音讯流都会在主荧屏展现,你能够滑动桌面浏览推特(Twitter)好朋友照片;当有短信、新闻或照片墙Message时,能够向来在主荧屏上拓宽苏醒、删除、存档等操作;与推特(Twitter)(推特(Twitter))老铁谈天说地也足以指间接在桌面上进行;别的FacebookHome的 Launcher允许客商挑选多少个最常用的开展火速打开或应用。

能够见到,Instagram已经把互连网音信流(独有推特(TWTR.US)内容)直接推到顾客的主显示屏上了,顾客随时都在浏览Twitter上的音讯,而照片墙的Newsfeed恰恰又是一代间流的款式排序的,所以那是一个百般独立的网络时间流应用格局。

但互连网时间流并不只是newsfeed这一种档次,它还富含音讯流、职分流等越来越细分的源委。Facebook(Instagram)Home也把新闻流很好的给顾客展现出来了,但做的并不全面,何况FacebookHome终究只是推特(TWTR.US)(TWT大切诺基.US)一家的出品,现在客商桌面包车型大巴网络时间流集合成Facebook、推文(Tweet)、纽约时报、邮件等异彩纷呈标剧情。具体有何,完全信赖客商增进。

HTC Sence UI的BlinkFeed 功能

阳春中下旬,当看见三星(Samsung) Sence 5.0上的BlinkFeed 功用之后,作者的激情非常感动,那就是互连网时间流的真的表现格局。BlinkFeed将你的张罗网络、新闻资源信息、生活娱乐、照片录制等各个音信赶尽杀绝,直接在你的主荧屏上显示出来。BlinkFeed的消息源来自全世界1400多家传媒和网址,同期还是能来得日历等客商音信,基本满意了为此顾客的渴求。

大概过多个人并不习于旧贯那样的浏览格局,何况一贯把网络消息推送到桌面上,对网速、手提式有线话机续航、内部存储器等也是贰个压力。并且倘诺订阅的新闻流比比较多来讲,便会并发消息爆炸的动静,导致客户根本看十分的小张旗鼓。可是那么些难点都有各个方法来化解或优化,最终一章大家会详细介绍。

Nokia的 Sence UI本身就不移至理(现在手提式有线电话机也尤其美貌了),而在手提式有线话机的并行设计上,这家百货店也更加的大胆。BlinkFeed 这种样式就算未来还多少超前,但随着系统的接连不断迭代,现在会越来越符合大家的施用习于旧贯。

lifestreams.com

lifestreams.com是二个互连网时间流概念的二个粗略德姆o,它自己也是依据DavidGelernter的驳斥设计的。其利用了谷歌 Glass 的 Timeline Card形式,并根据时间流排序。大家在前一章也介绍过,Timeline Card这种样式特别适合智能钟表、近视镜或任何的小显示器设备,但在手提式有线电话机或平板上这种显示格局并不体面。

lifestreams.com 即使严酷凭仗大卫Gelernter的岁月流互连网概念,但还是太偏理论。可是这种方式基本上给出了前途互连网音信突显形象的基本样式,现在的互联网音讯流会以此为基本情势张开各样越来越尖端的演变。

其三方采纳SO.HO

SO.HO是一款Android App,正确地说,是一款Android运维器(Launcher)。在GooglePlay上线也独有4个月左右的小运,和TwitterHome大约,SO.HO也是令你在显示器上平昔显示推特上的内容,同不时候还援助Instagram。产品做得很糙,但已经有些未来的意思了。

SO.HO上线二日,谷歌Play下就有人钻探说:“能够拉长Google+、多账户twitter、Foursquare、推特(TWTR.US)、tumblr、PAJEROSS”。显著,大家想得都一律,大家能够把手提式有线电话机桌面上塞满各类大家想要的音信……

正如前方在BlinkFeed 这段大家关系的一律,把持有信息都放在三个显示器上醒目十分不可相信。大家应有对其开展合理的归类,比如应酬新闻、音讯资源新闻二个荧屏,短信、新闻、邮件等一个荧屏,专门的事行业内部容(专门的学问索要)的东西再放叁个荧屏(如BlackBerry10的Balance生活专门的学业切换作用),那样就回顾多了。

 

3、 怎样赢得成分的初始地点

作者们第一供给取拿到对象成分的启幕地点,因而这里大家须要叁个特意用来收获成分样式的成效函数。

然则获取成分样式在IE浏览器与别的浏览器有一对不等,由此大家须求三个包容性的写法。

JavaScript

function getStyle(elem, property) { // ie通过currentStyle来得到成分的体裁,别的浏览器通过getComputedStyle来得到return document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(elem, false)[property] : elem.currentStyle[property]; }

1
2
3
4
function getStyle(elem, property) {
    // ie通过currentStyle来获取元素的样式,其他浏览器通过getComputedStyle来获取
    return document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(elem, false)[property] : elem.currentStyle[property];
}

有了这几个办法之后,就足以初始入手写获取目的元素开头地方的秘技了。

JavaScript

function getTargetPos(elem) { var pos = {x: 0, y: 0}; var transform = getTransform(); if(transform) { var transformValue = getStyle(elem, transform); if(transformValue == 'none') { elem.style[transform] = 'translate(0, 0)'; return pos; } else { var temp = transformValue.match(/-?【445云顶国际在线娱乐】canvas学习笔记,前端基础进级。d+/g); return pos = { x: parseInt(temp[4].trim()), y: parseInt(temp[5].trim()) } } } else { if(getStyle(elem, 'position') == 'static') { elem.style.position = 'relative'; return pos; } else { var x = parseInt(getStyle(elem, 'left') ? getStyle(elem, 'left') : 0); var y = parseInt(getStyle(elem, 'top') ? getStyle(elem, 'top') : 0); return pos = { x: x, y: y } } } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function getTargetPos(elem) {
    var pos = {x: 0, y: 0};
    var transform = getTransform();
    if(transform) {
        var transformValue = getStyle(elem, transform);
        if(transformValue == 'none') {
            elem.style[transform] = 'translate(0, 0)';
            return pos;
        } else {
            var temp = transformValue.match(/-?d+/g);
            return pos = {
                x: parseInt(temp[4].trim()),
                y: parseInt(temp[5].trim())
            }
        }
    } else {
        if(getStyle(elem, 'position') == 'static') {
            elem.style.position = 'relative';
            return pos;
        } else {
            var x = parseInt(getStyle(elem, 'left') ? getStyle(elem, 'left') : 0);
            var y = parseInt(getStyle(elem, 'top') ? getStyle(elem, 'top') : 0);
            return pos = {
                x: x,
                y: y
            }
        }
    }
}

在拖拽进度中,大家需求不停的装置目的成分的新岗位,那样它才会活动起来,由此大家供给二个安装指标元素地方的方法。

JavaScript

// pos = { x: 200, y: 100 } function setTargetPos(elem, pos) { var transform = getTransform(); if(transform) { elem.style[transform] = 'translate('+ pos.x +'px, '+ pos.y +'px)'; } else { elem.style.left = pos.x + 'px'; elem.style.top = pos.y + 'px'; } return elem; }

1
2
3
4
5
6
7
8
9
10
11
// pos = { x: 200, y: 100 }
function setTargetPos(elem, pos) {
    var transform = getTransform();
    if(transform) {
        elem.style[transform] = 'translate('+ pos.x +'px, '+ pos.y +'px)';
    } else {
        elem.style.left = pos.x + 'px';
        elem.style.top = pos.y + 'px';
    }
    return elem;
}

三、canvas图形效果之雪花噪点效果

445云顶国际在线娱乐 7

图是死的,效果这里也是死的,但并无妨碍大家零距离围观,您能够狠狠地方击这里:canvas达成的噪点效果demo

是因为此地是静态的,所以但从那一点来看,就如比上面星空轻松。不过,要是仅仅看绘制一帧,那这里的噪点要比下面的星空要辛苦些,最大的难处在于对质量的把控。

像这种类型说吗,上边的星空,总共最多就400个点(浅橙的有数),不过,这里的噪点,比如,demo中画布大小(那我的电话比如)是1918*500,当中,噪点大小是1像素*1像素,总共就有9陆仟0个绘制点,显著跟400个点完全不是叁个数额级的,假如大家真的三个两个制图下来,确定,就连Chrome这么牛步的浏览器也会倍以为显著的卡顿,怎么样优化如何绘制呢?

那正是本例子完结的难题:

  1. 数据与性格
    自家这里是如此管理的,尽管最终的噪点大小是一九二零*500,可是,大家实在是由N块300*150的小的像瓷砖同样的小方块拼起来的。话句话说,作者实际只绘制了4四千个点,比960000明显要小了20倍还不仅。那样,既满意了成效,又有限协理了品质。

切实实现原理为:

  1. 创办贰个canvas,绘制一个300*150即兴噪点图形;
  2. 把那边全体噪点的canvas以画布情势在绘制到页面上的大canvas上;

说得canvas绘图,不得不提一下不胜常用的一个drawImage()措施,语法如下:

context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

1
context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

依次参数暗中提示为(网络的描述都以直译,很隐晦,作者那边再一次陈述了下):

参数 描述
img 用来被绘制的图像、画布或视频。
sx 可选。img被绘制区域的起始左上x坐标。
sy 可选。img被绘制区域的起始左上y坐标。
swidth 可选。img被绘制区域的宽度。
sheight 可选。img被绘制区域的高度。
x 画布上放置img的起始x坐标。
y 画布上放置img的起始y坐标。
width 可选。画布上放置img提供的宽度。(伸展或缩小图像)
height 可选。画布上放置img提供的高度。(伸展或缩小图像)

本例的小的噪点区块就是透过drawImage()方法被平铺到大的canvas成分上的。

二、常用的插件

Package Control:设置任何插件此前,首先先安装Package Control

Emmet:Web开辟者的工具包,能够大大进步你的HTML和CSS的办事流程

SublimeCodeIntel:代码提示

DocBlocker:对js代码实行注明

JSFormat:格式化js代码

Terminal:使用vim命令

智能终端与终端界面包车型客车未来畅想

我们在前边有介绍,多屏时期,终端内容初步扁平化,App等深层菜单让客户相对使用费用大增,音讯开首向主显示器乃至锁屏分界面转移,移动OS调控权增大。而鉴于物联网时期显示屏越来越多更分歧,所以分歧道具上起内容呈现格局也南辕北辙。上边我们就根据设备特点,来预测一下种种极端上时间流网络是什么样表现的。

445云顶国际在线娱乐 8

手机、平板 :

把手提式有线话机和机械放在一块儿,是因为双方近日都很普遍,网络展现情势非常成熟,何况荧屏大小、分辨率、使用方式都距离相当小,所以放在一同介绍。

由于手提式有线电话机、平板是离互连网新近的位移终端,近期游人如织OS或App的进化已经让我们看看了种类化,比方Windows Phone的动态磁贴、中兴 10的Hub、Android的Widgets 以及InstagramHome。能够推测,今后的音信流将会在桌面上整合在一块,不要求走入App便可产生有着音信获得、沟通和享受。

但那边要解决消息冗余、噪音和苦闷的标题,全部新闻都投身一块儿会看不死灰复然,同一时候把职业邮件和Instagram聊天放在一齐也不佳。所以作者个人认为,今后的结缘音讯流会分类:Newsfeed 二个荧屏、专门的职业任务类多少个显示屏、IM内容三个显示屏。

诸如,小编把订阅的新闻、社交网络等位居第三个显示器里,这里有着的都是情报、消息、亲密的朋友状态等。然后事业邮件、Todo列表、伊芙rnote、Instapaper等位居第一个显示屏里,那中间是办事、学习等摆正经事情的地方。首个显示器是电话、短信、个人邮件、天涯论坛私信、微信等,特意用来维系、聊天的。

万一你是商务职员以办事为主,则暗许第二类为主显示器,左滑是首先类,右滑是第三类。假诺你手提式有线电话机平板正是为了获得情报,那么首先类则位居主显示屏上,两侧是别的多少个。当然,你也能够设置主显示屏只是风景照片,三类音信流都放在左右两边。

眼镜、手表:

用作半扩张性荧屏,机械钟近视镜限于体量超越50%状态下并无法独立完毕都部队分划算操作,依旧供给借助智能手提式有线电话机的计算机等(GoogleGlass 是例外)。这类荧屏由于面积十分小,所以就很适合将网络消息流用谷歌(Google)Glass UI的Timeline Card 这种体现格局,像lifestreams 德姆o也是用的这种卡牌式音讯。这种格局非常符合碎片化消息的来得,像照片墙、Google+、推特的内容多数都以这种情势。

此处有三个主题素材,由于手表、老花镜体量都比较小,所以它们须求在竞相上进展一些立异来弥补操作空间的阙如。比方触屏、指纹、触摸感应、手势、语音等输入方式,其交互也是丰裕多样的,比如声音、振动、闪烁等,那样能够越发自然、更相符人性、功效也更加高。以致一旦像MYO这种本事推广以来,当原子钟感应你把手段抬到视界范围内时,便自动点亮显示器,岂不是更棒?

电视、PC:

TV由于许多景色下都在大厅使用,所以其剧情表现方式和交互格局恐怕就归纳非常多了。Timeline Card 能够,现在的智能TVUI也差三错四。而在竞相上,Kinect 手势和话音识别将来也已经很干练了,而像Leap Motion、MYO的产出,让智能电视机操作也会越来越简便易行。比较手提式有线电话机和老花镜,电视承担的机能就少相当多了——游戏、影音娱乐可能录像通话等。

而对此PC,笔者倒感觉前途变化并不会太大。它还是是八个生产力工具,Photoshop在机械上永恒未有在PC上做的好,今后就是语言识别率非常高了,职业职员也不会放任古板的QWERTY键盘。PC,以后恐怕真正会陷于多少个生产性的工具,就如服务器一样,藏在后头默默扛起网络的全套基础……

到这几天截止,也就差十分少把互连网时间流的相关内容讲掌握了,可是实在还应该有众多细节尚未聊起,比方时间流对人认识的影响、隐私难点、本性化推荐谬论等。但鉴于时日少于,在此笔者就十分少做表明了,感兴趣的读者可以留言商量。

【完】

赞 收藏 1 评论

445云顶国际在线娱乐 9

5、大家需求用到怎么事件?

在pc上的浏览器中,结合mousedown、mousemove、mouseup那多少个事件可以扶持大家落实拖拽。

  • mousedown 鼠标按下时接触
  • mousemove 鼠标按下后拖动时接触
  • mouseup 鼠标放手时触发

而在移动端,分别与之对应的则是touchstart、touchmove、touchend

当大家将成分绑定这几个事件时,有四个事件目的将会作为参数字传送递给回调函数,通过事件目的,大家得以得到到日前鼠标的标准地点,鼠标地点音信是完毕拖拽的尤为重要。

事件目的极度要害,在这之中包括了比很多的管用的新闻,这里小编就不扩充了,我们能够在函数中将事件指标打印出来查看里面包车型客车求实性质,这一个主意对于记不清事件指标重要性质的童鞋极其实用。

四、canvas图形效果之薄雾缭绕效果

445云顶国际在线娱乐 10

图是死的,效果是活的,IE9+浏览器下,您能够狠狠地方击这里:canvas达成的云烟缭绕效果demo

本例子,效果看上去要更酷一些,实际上,从能力层面讲,跟上面包车型大巴星空旋转效果差不离一模二样,或然还要比星空更简便一些,因为其运动轨迹直来直往,没有要求转圈圈。

那干什么看起来更酷呢,首要在于感觉气团雾很难去模拟。

没有错,气团雾确实很难用代码间接绘制出来,实际上,这里的云烟,是三个png图片,是应用画笔在PS里绘制导出来的。

旋转星空的例证,大家是运用canvas的fillRect办法绘制了一定量,而本例子,则是使用方面提到的drawImage()艺术把平流雾图片绘制进来了。

其它的位移啊,光滑度变化什么的,原理都以看似。

本例子的难题主要在于模拟是不是充分真实:

  1. 高处不胜寒
    越往上,混合雾越淡,实际上便是越临近上方,发光度越低;
// 越靠近边缘,透明度越低 // 纵向透明度变化要比横向的明显 this.alpha
= (1 - Math.abs(canvasWidth*0.5 - this.x) / canvasWidth) * (0.7 -
Math.abs(canvasHeight*0.5 - this.y) / canvasHeight);

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f4a6436b3d419634939-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f4a6436b3d419634939-2">
2
</div>
<div class="crayon-num" data-line="crayon-5b8f4a6436b3d419634939-3">
3
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f4a6436b3d419634939-1" class="crayon-line">
// 越靠近边缘,透明度越低
</div>
<div id="crayon-5b8f4a6436b3d419634939-2" class="crayon-line crayon-striped-line">
// 纵向透明度变化要比横向的明显
</div>
<div id="crayon-5b8f4a6436b3d419634939-3" class="crayon-line">
this.alpha = (1 - Math.abs(canvasWidth*0.5 - this.x) / canvasWidth) * (0.7 - Math.abs(canvasHeight*0.5 - this.y) / canvasHeight);
</div>
</div></td>
</tr>
</tbody>
</table>
  1. 缭绕
    所谓“缭绕”,便是运动看似不享有规律性。要精晓,所有的事有轨道有套路的移位都是有规律性地,你说那上坡雾上上下下,左左右右运动太过分规律,效果就能压缩,不过,真的没有规律又不佳通过代码调整移动轨迹。由此,为了搞到二个好像缭绕效果的移位函数,还真是烧了非常多头脑细胞。
2.1 Package Control

安装别的插件以前,首先先安装Package Control,具体步骤如下:

使用Ctrl+`快速键也许经过View->Show Console菜单展开命令行,

Sublime text3粘贴如下代码:

JavaScript

import urllib.request,os; pf = 'PackageControl.sublime-package'; ipp = sublime.installed_packages_path();urllib.request.install_opener( urllib.request.build_opener(urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf),'wb').write(urllib.request.urlopen( '; + pf.replace('','%20')).read())

1
import urllib.request,os; pf = &#039;PackageControl.sublime-package&#039;; ipp = sublime.installed_packages_path();urllib.request.install_opener( urllib.request.build_opener(urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf),&#039;wb&#039;).write(urllib.request.urlopen( &#039;http://sublime.wbond.net/&#039; + pf.replace(&#039;&#039;,&#039;%20&#039;)).read())

Sublime text2粘贴如下代码:

JavaScript

import urllib2,os; pf='PackageControl.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs(ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf),'wb' ).write( urllib2.urlopen( '; +pf.replace( '','%20' )).read()); print( 'Please restart Sublime Text to finishinstallation')

1
import urllib2,os; pf=&#039;PackageControl.sublime-package&#039;; ipp = sublime.installed_packages_path(); os.makedirs(ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf),&#039;wb&#039; ).write( urllib2.urlopen( &#039;http://sublime.wbond.net/&#039; +pf.replace( &#039;&#039;,&#039;%20&#039; )).read()); print( &#039;Please restart Sublime Text to finishinstallation&#039;)

万一顺遂的话,此时就能够在Preferences菜单下看看Package Settings和Package Control四个菜单了。

大概出于各个原因,不能够运用代码安装,这能够由此以下步骤手动安装Package Control:

a.Package Control下载地址:
b.点击Preferences>BrowsePackages菜单
c.进去打开的目录的上层目录,然后再进来Installed Packages/目录
d.下载Package Control.sublime-package并复制到Installed Packages/目录
e.重启SublimeText。

6、拖拽的规律

当事件触发时,大家能够透过事件指标获得到鼠标的精切地方。那是促成拖拽的要紧。当鼠标按下(mousedown触发)时,大家须求牢记鼠标的最早地方与指标成分的起第三地方,大家的对象正是达成当鼠标移动时,目的成分也随着移动,遵照原理大家能够得出如下事关:

移步后的鼠标位置 - 鼠标开头地方 = 移动后的指标成分地点 - 目的元素的始发地方

1
移动后的鼠标位置 - 鼠标初始位置 = 移动后的目标元素位置 - 目标元素的初始位置

一旦鼠标地点的差值大家用dis来代表,那么目的成分的岗位就极其:

活动后指标成分的地点 = dis + 指标成分的启幕地方

1
移动后目标元素的位置 = dis + 目标元素的初始位置

经过事件指标,大家可以确切的了解鼠标的当前职责,由此当鼠标拖动(mousemove)时,我们得以不停的估摸出鼠标移动的差值,以此来求出目的成分的此时此刻任务。那一个历程,就兑现了拖拽。

而在鼠标松手(mouseup)结束拖拽时,大家必要管理部分收尾专门的学问。详细的情况见代码。

五、canvas动作效果与结语

正文四个例证都以canvas 2D效果,是入门学习相当好的例证。

canvas极其符合完毕密集型图形和卡通,能够把质量优势给发挥出来,因为正是一块画布渲染;其余一些正是省流量,比如说第4个例证的噪点效果,假使是均等遵循一九一八*500的png图片,科科,小编非常保存了下,286K,1K的代码PK 286K的图样,明显是完爆啊!

canvas还支持3D效果,也就是webGL, 亦称3D Canvas graphics, IE11+支持,目前Android 4.*自由版本都还不协理,行业内部著名的相关库便是threejs了。

唯独,作者没商讨过,也没兴趣,不是自个儿的来头。

好了,就这一个,多谢阅读。

1 赞 7 收藏 1 评论

445云顶国际在线娱乐 11

2.2 Emmet

Emmet是叁个Web开拓者的工具包,可以大大进步你的HTML和CSS的做事流程。

基本上,大好些个的公文编辑器都会允许你存款和储蓄和起用一些代码块,我们称为“片段”。即使部分能很好地推向您得生产力,但非常多的贯彻都有那般二个短处:你无法不先定义你得代码片段,何况不可能再运营时张开实行。Emmet把部分那个定义提升到了八个新的层系:你可以安装CSS形式的能够动态被分析的表明式,然后依据你所输入的缩写来获得相应的内容。Emmet是很干练的还要非常适用于编写HTML/XML 和 CSS 代码的前端开垦职员,但也足以用于编制程序语言。

445云顶国际在线娱乐 12

7、 小编又来推荐思维导图协助写代码了

平常有新妇朋友跑来问笔者,若是逻辑思维本领不强,能或无法写代码做前端。小编的答案是:能。因为依赖思维导图,能够很自在的弥补逻辑的短板。而且比在自身头脑中脑补逻辑更是清晰明了,不易出错。

上边第六点作者介绍了规律,由此如何是好就展现不是那么难了,而实际的步调,则在底下的企图导图中鲜明给出,大家只需求遵守这么些手续来写代码就能够,试试看,一定很自在。

445云顶国际在线娱乐 13

采取思维导图清晰的抒发出整个拖拽进程大家供给干的政工

2.2.1 安装Emmet

a、透过神速键组合ctrl+shift+P唤出命令面板
b、在面板中输入“install package”后回车
c、随之输入“Emmet”,等待安装完毕。

8、代码完毕

part1、希图工作

JavaScript

// 获取指标成分对象 var oElem = document.getElementById('target'); // 注脚2个变量用来保存鼠标开端地方的x,y坐标 var startX = 0; var startY = 0; // 表明2个变量用来保存指标成分开端地点的x,y坐标 var sourceX = 0; var sourceY = 0;

1
2
3
4
5
6
7
8
9
10
// 获取目标元素对象
var oElem = document.getElementById('target');
 
// 声明2个变量用来保存鼠标初始位置的x,y坐标
var startX = 0;
var startY = 0;
 
// 声明2个变量用来保存目标元素初始位置的x,y坐标
var sourceX = 0;
var sourceY = 0;

part2、成效函数

因为以前已经贴过代码,就不再另行

JavaScript

// 获取当前浏览器援助的transform宽容写法 function getTransform() {} // 获取成分属性 function getStyle(elem, property) {} // 获取成分的开首地方function getTargetPos(elem) {} // 设置成分的开端地方 function setTargetPos(elem, potions) {}

1
2
3
4
5
6
7
8
9
10
11
// 获取当前浏览器支持的transform兼容写法
function getTransform() {}
 
// 获取元素属性
function getStyle(elem, property) {}
 
// 获取元素的初始位置
function getTargetPos(elem) {}
 
// 设置元素的初始位置
function setTargetPos(elem, potions) {}

part3、表明多少个事件的回调函数

那八个方式就是贯彻拖拽的大旨所在,作者将严苛遵照地点思维导图中的步骤来成功大家的代码。

JavaScript

// 绑定在mousedown上的回调,event为流传的风云指标 function start(event) { // 获取鼠标开首地点 startX = event.pageX; startY = event.pageY; // 获取成分起首地点 var pos = getTargetPos(oElem); sourceX = pos.x; sourceY = pos.y; // 绑定 document.add伊夫ntListener('mousemove', move, false); document.addEventListener('mouseup', end, false); } function move(event) { // 获取鼠标当前地方 var currentX = event.pageX; var currentY = event.pageY; // 总计差值 var distanceX = currentX - startX; var distanceY = currentY - startY; // 计算并安装元素当前岗位 setTargetPos(oElem, { x: (sourceX + distanceX).toFixed(), y: (sourceY + distanceY).toFixed() }) } function end(event) { document.removeEventListener('mousemove', move); document.remove伊夫ntListener('mouseup', end); // do other things }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 绑定在mousedown上的回调,event为传入的事件对象
function start(event) {
    // 获取鼠标初始位置
    startX = event.pageX;
    startY = event.pageY;
 
    // 获取元素初始位置
    var pos = getTargetPos(oElem);
 
    sourceX = pos.x;
    sourceY = pos.y;
 
    // 绑定
    document.addEventListener('mousemove', move, false);
    document.addEventListener('mouseup', end, false);
}
 
function move(event) {
    // 获取鼠标当前位置
    var currentX = event.pageX;
    var currentY = event.pageY;
 
    // 计算差值
    var distanceX = currentX - startX;
    var distanceY = currentY - startY;
 
    // 计算并设置元素当前位置
    setTargetPos(oElem, {
        x: (sourceX + distanceX).toFixed(),
        y: (sourceY + distanceY).toFixed()
    })
}
 
function end(event) {
    document.removeEventListener('mousemove', move);
    document.removeEventListener('mouseup', end);
    // do other things
}

OK,二个大致的拖拽,就这么喜欢的贯彻了。点击上边包车型客车链接,能够在线查看该例子的demo。

应用原生js实现拖拽

2.2.2 使用Emmet
9、封装拖拽对象

在头里一章笔者给大家大饱眼福了面向对象如何落到实处,基于那多少个基础知识,大家来将方面达成的拖拽封装为三个拖拽对象。大家的目的是,只要大家声澳优个拖拽实例,那么传入的对象成分将电动具有能够被拖拽的效果与利益。

在实质上付出中,一个目的大家平日会独自放在三个js文件中,这么些js文件将单身作为二个模块,利用各样模块的不二诀要组织起来使用。当然这里未有复杂的模块交互,因为那一个事例,大家只须求一个模块就能够。

为了制止变量污染,大家需求将模块放置于二个函数自推市场价格势模拟的块级功能域中。

JavaScript

; (function() { ... })();

1
2
3
4
;
(function() {
    ...
})();

在日常的模块组织中,大家只是单纯的将过多js文件收缩成为三个js文件,由此这里的首先个分店则是为了以免上三个模块的最后不用分号导致报错。至关重要。当然在经过require或许ES6模块等艺术就不会出现那样的情形。

咱俩知晓,在包装叁个对象的时候,大家得以将性能与方法放置于构造函数恐怕原型中,而在扩展了自实施函数之后,大家又能够将品质和措施幸免与模块的个中作用域。那是闭包的知识。

那正是说大家面临的挑衅就在于,怎么着客观的管理属性与艺术的地点。

自然,每四个目的的处境都不雷同,无法一视同仁,大家要求显然的知道这三种职位的特征工夫做出最切合的支配。

  • 构造函数中: 属性与格局为近年来实例单独具备,只好被当下实例访谈,况兼每声美赞臣(Meadjohnson)个实例,当中的方法都会被再一次创立一回。
  • 原型中: 属性与方法为持有实例共同持有,能够被全体实例访谈,新注脚实例不会再也创造方法。
  • 模块功用域中:属性和章程不能被其它实例访谈,可是能被中间方法访问,新证明的实例,不会再也创立一样的办法。

对此艺术的判断比较轻松。

因为在构造函数中的方法总会在声美赞臣个新的实例时被再一次创设,因而大家评释的不二秘技都尽量制止出现在构造函数中。

而一旦你的办法中须要用到构造函数中的变量,只怕想要公开,那就要求放在原型中。

如果措施需求个人不被外面访谈,那么就停放在模块效用域中。

对此属性放置于怎样职位某个时候很难做出准确的决断,由此作者很难交付一个标准的概念告诉您怎样性质一定要放在什么职位,那亟需在实际支付中屡屡的下结论经验。可是总的来讲,还是要组成那三个岗位的性状来做出最合适的决断。

倘使属性值只好被实例单独具有,比方person对象的name,只可以属于某叁个person实例,又举个例子这里拖拽对象中,某一个成分的初叶地点,也仅仅只是这几个成分的近来地点,那么些特性,则适合放在构造函数中。

而一旦两特性质仅仅供内部方法访谈,那么些天性就切合放在模块成效域中。

有关面向对象,上边的几点思量自个儿觉着是那篇作品最值得认真思索的杰出。假诺在封装时未有理念清楚,很大概会遭遇非常多你想不到的bug,所以建议我们结合自身的开采经历,多多怀念,总括出团结的视角。

基于这一个观念,我们能够自身尝尝封装一下。然后与作者的做一些相比,看看大家的主张有如何两样,在底下例子的讲解中,笔者将自己的主见表明出来。

点击查阅已经封装好的demo

js 源码

JavaScript

; (function() { // 那是叁个私家属性,没有须要被实例访谈 var transform = getTransform(); function Drag(selector) { // 放在构造函数中的属性,都以属于每叁个实例单独具有 this.elem = typeof selector == 'Object' ? selector : document.getElementById(selector); this.startX = 0; this.startY = 0; this.sourceX = 0; this.sourceY = 0; this.init(); } // 原型 Drag.prototype = { constructor: Drag, init: function() { // 初步时索要做些什么事情 this.setDrag(); }, // 稍作改造,仅用于获取当前成分的性格,类似于getName getStyle: function(property) { return document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(this.elem, false)[property] : this.elem.currentStyle[property]; }, // 用来收获当前因素的岗位消息,注意与前边的不一样之处 getPosition: function() { var pos = {x: 0, y: 0}; if(transform) { var transformValue = this.getStyle(transform); if(transformValue == 'none') { this.elem.style[transform] = 'translate(0, 0)'; } else { var temp = transformValue.match(/-?d+/g); pos = { x: parseInt(temp[4].trim()), y: parseInt(temp[5].trim()) } } } else { if(this.getStyle('position') == 'static') { this.elem.style.position = 'relative'; } else { pos = { x: parseInt(this.getStyle('left') ? this.getStyle('left') : 0), y: parseInt(this.getStyle('top') ? this.getStyle('top') : 0) } } } return pos; }, // 用来设置当前成分的岗位 setPostion: function(pos) { if(transform) { this.elem.style[transform] = 'translate('+ pos.x +'px, '+ pos.y +'px)'; } else { this.elem.style.left = pos.x + 'px'; this.elem.style.top = pos.y + 'px'; } }, // 该措施用来绑定事件 setDrag: function() { var self = this; this.elem.add伊夫ntListener('mousedown', start, false); function start(event) { self.startX = event.pageX; self.startY = event.pageY; var pos = self.getPosition(); self.sourceX = pos.x; self.sourceY = pos.y; document.add伊芙ntListener('mousemove', move, false); document.add伊芙ntListener('mouseup', end, false); } function move(event) { var currentX = event.pageX; var currentY = event.pageY; var distanceX = currentX - self.startX; var distanceY = currentY - self.startY; self.setPostion({ x: (self.sourceX + distanceX).toFixed(), y: (self.sourceY + distanceY).toFixed() }) } function end(event) { document.removeEventListener('mousemove', move); document.remove伊芙ntListener('mouseup', end); // do other things } } } // 私有方法,仅仅用来得到transform的特出写法 function getTransform() { var transform = '', divStyle = document.createElement('div').style, transformArr = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform'], i = 0, len = transformArr.length; for(; i < len; i++) { if(transformArr[i] in divStyle) { return transform = transformArr[i]; } } return transform; } // 一种对外揭露的措施 window.Drag = Drag; })(); // 使用:表明2个拖拽实例 new Drag('target'); new Drag('target2');

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
;
(function() {
    // 这是一个私有属性,不需要被实例访问
    var transform = getTransform();
 
    function Drag(selector) {
        // 放在构造函数中的属性,都是属于每一个实例单独拥有
        this.elem = typeof selector == 'Object' ? selector : document.getElementById(selector);
        this.startX = 0;
        this.startY = 0;
        this.sourceX = 0;
        this.sourceY = 0;
 
        this.init();
    }
 
 
    // 原型
    Drag.prototype = {
        constructor: Drag,
 
        init: function() {
            // 初始时需要做些什么事情
            this.setDrag();
        },
 
        // 稍作改造,仅用于获取当前元素的属性,类似于getName
        getStyle: function(property) {
            return document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(this.elem, false)[property] : this.elem.currentStyle[property];
        },
 
        // 用来获取当前元素的位置信息,注意与之前的不同之处
        getPosition: function() {
            var pos = {x: 0, y: 0};
            if(transform) {
                var transformValue = this.getStyle(transform);
                if(transformValue == 'none') {
                    this.elem.style[transform] = 'translate(0, 0)';
                } else {
                    var temp = transformValue.match(/-?d+/g);
                    pos = {
                        x: parseInt(temp[4].trim()),
                        y: parseInt(temp[5].trim())
                    }
                }
            } else {
                if(this.getStyle('position') == 'static') {
                    this.elem.style.position = 'relative';
                } else {
                    pos = {
                        x: parseInt(this.getStyle('left') ? this.getStyle('left') : 0),
                        y: parseInt(this.getStyle('top') ? this.getStyle('top') : 0)
                    }
                }
            }
 
            return pos;
        },
 
        // 用来设置当前元素的位置
        setPostion: function(pos) {
            if(transform) {
                this.elem.style[transform] = 'translate('+ pos.x +'px, '+ pos.y +'px)';
            } else {
                this.elem.style.left = pos.x + 'px';
                this.elem.style.top = pos.y + 'px';
            }
        },
 
        // 该方法用来绑定事件
        setDrag: function() {
            var self = this;
            this.elem.addEventListener('mousedown', start, false);
            function start(event) {
                self.startX = event.pageX;
                self.startY = event.pageY;
 
                var pos = self.getPosition();
 
                self.sourceX = pos.x;
                self.sourceY = pos.y;
 
                document.addEventListener('mousemove', move, false);
                document.addEventListener('mouseup', end, false);
            }
 
            function move(event) {
                var currentX = event.pageX;
                var currentY = event.pageY;
 
                var distanceX = currentX - self.startX;
                var distanceY = currentY - self.startY;
 
                self.setPostion({
                    x: (self.sourceX + distanceX).toFixed(),
                    y: (self.sourceY + distanceY).toFixed()
                })
            }
 
            function end(event) {
                document.removeEventListener('mousemove', move);
                document.removeEventListener('mouseup', end);
                // do other things
            }
        }
    }
 
    // 私有方法,仅仅用来获取transform的兼容写法
    function getTransform() {
        var transform = '',
            divStyle = document.createElement('div').style,
            transformArr = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform'],
 
            i = 0,
            len = transformArr.length;
 
        for(; i < len; i++)  {
            if(transformArr[i] in divStyle) {
                return transform = transformArr[i];
            }
        }
 
        return transform;
    }
 
    // 一种对外暴露的方式
    window.Drag = Drag;
})();
 
// 使用:声明2个拖拽实例
new Drag('target');
new Drag('target2');

如此那般多少个拖拽对象就封装完成了。

提出我们根据自家提供的探讨方法,多多尝试封装一些零件。譬喻封装八个弹窗,封装叁个生生不息轮播等。练得多了,面向对象就不再是难题了。这种思维格局,在未来别的时候都是能够运用的。

下一章分析jQuery对象的贯彻,与哪些将我们那边封装的拖拽对象扩张为jQuery插件。

2 赞 1 收藏 评论

445云顶国际在线娱乐 14

1) html初始化

输入“!”或“html:5”,然后按Tab键:

445云顶国际在线娱乐 15

html:5 或!:用以HTML5文书档案类型
html:xt:用于XHTML过渡文书档案类型
html:4s:用于HTML4狠毒文书档案类型

本文由445云顶国际在线娱乐发布于云顶集团手机登录网站,转载请注明出处:【445云顶国际在线娱乐】canvas学习笔记,前端基

相关阅读