嗯 就是这样一个例子,视频学到的一个特效,实际用处并不大,但是可以帮助理解JS语言和熟悉CSS3样式。
设计:
观察一张图片的变化,发现:
1、图片缩放(随机,并且不是同时运动)
1、从大到小
2、从小到大,透明度从1到0(在第一步运动完成后立马开始)
2、图片旋转(随机,并且不是同时运动的。需要在全部运动走完以后开始)
3. 因为每张图片是随机开始变换的,所以起始时间是不同的,这里可设置一个延迟器setTimeout,时间用random随机生成即可。
4. 中间需要用到自执行函数,因为setTimeout无视for循环的i,所以每次延时器运行的时候i可能都出错,用自执行函数保存i的每一次值。
5. 转换期间按钮的div是不能点击的,需要标记和判断。
6.运动共有两个,缩放和旋转,注意缩放全部结束才能开始旋转,这里也要处理好。
笔记:
scale是缩放
transition 过渡,延迟
子函数修改父亲的值,就是闭包
自执行函数 这里主要用来保存i的每一次值
如果直接加定时器,就不管外面循环,1s后才执行,这时的i都不知道到哪里了,可能越界
Math.random()产生的值是setTimeout的一个参数,延迟的时间
setTimeout延迟时间也与电脑卡影响
transitionend只要过渡了就会执行,它是根据 样式来计算的
缩放和透明都会触发transitionend
call()改变this指向的对象
然后就直接实现了,在加载页面的时候就运行这个特效。
补上中间查到的一些资料:
1.CSS3 opacity 属性:
值 |
描述 |
value |
指定不透明度。从0.0(完全透明)到1.0(完全不透明) |
inherit |
Opacity属性的值应该从父元素继承 |
2.HTML DOM scale() 方法:
参数
描述
scale() 方法为画布的当前变换矩阵添加一个缩放变换。缩放通过独立的水平和垂直缩放因子来完成。例如,传递一个值 2.0 和 0.5 将会导致绘图路径宽度变为原来的两倍,而高度变为原来的 1/2。指定一个负的 sx 值,会导致 X 坐标沿 Y 轴对折,而指定一个负的 sy 会导致 Y 坐标沿着 X 轴对折。
这里我直接一个参数就是同时缩小高度和宽度
3.
div是块标签,现在这种情况此div的标签会被里面图片高度自己撑起来,img标签都是默认向左漂浮的,刚好每行10个每个80px
margin: 0 auto是margin: 0 auto 0 auto的简写,也就是左右自动居中,至于为什么没有紧挨着上面的div,这个应该是上面那个margin: 80px auto,已经设置了跟下面的div外边距80px距离
btn的高度没有设置,靠font撑的
剩下就是代码了,注释很详细,回调函数很多。。:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title></title>
6 <style>
7 /*图片容器整体样式,左右居中 视角景深800px */
8 #imgWrap{
9 width: 800px;
10 height: 400px;
11 margin: 80px auto;
12 perspective: 800px;
13 }
14
15 /*左对齐,高宽*数量=整体div*/
16 #imgWrap img{
17 float: left;
18 width: 80px;
19 height: 80px;
20 }
21
22 #btn{
23 width: 100px;
24 /*height: 40px 这里不定义就是跟font大小一样*/
25 background: rgb(0,100,0);
26 padding: 0 20px;
27 /*font-size 和 line-height 中可能的值。*/
28 font: 16px/40px "微软雅黑";
29 color: #fff;
30 margin: 0 auto;
31 border-radius: 5px;
32 box-shadow: 2px 2px 5px #000;
33 cursor: pointer;
34 }
35 </style>
36 <script>
37 /*
38 * 讲师:陈学辉
39 * QQ:356985332
40 * 微信:kaivon
41 *
42 */
43
44 /*
45 * 1、图片缩放(随机,并且不是同时运动)
46 * 1、从大到小
47 * 2、从小到大,透明度从1到0(在第一步运动完成后立马开始)
48 *
49 * 2、图片旋转(随机,并且不是同时运动的。需要在全部运动走完以后开始)
50 */
51
52 window.onload=function(){
53 var btn=document.getElementById("btn");
54 // 选择所有元素
55 var imgs=document.querySelectorAll("img");
56 var endNum=0; //它代表图片运动完成的数量
57 var canClick=true; //它代表用户能否再次点击
58
59 btn.onclick=function(){
60 if(!canClick){
61 return; //以下的代码不要走了
62 }
63 canClick=false;
64
65
66 for(var i=0;i<imgs.length;i++){
67 (function(i){
68 setTimeout(function(){
69 /*imgs[i].style.transition='100ms';
70 imgs[i].style.transform='scale(0)';
71 imgs[i].style.opacity='0';
72
73 imgs[i].addEventListener('transitionend',function(){
74 console.log(1);
75 });*/
76
77 motion(imgs[i],'50ms',function(){
78 this.style.transform='scale(0)';
79 },function(){
80 motion(this,'1s',function(){
8