JavaScript+CSS相册特效实例代码


Posted in Javascript onSeptember 07, 2017

JavaScript+CSS相册特效实例代码

嗯 就是这样一个例子,视频学到的一个特效,实际用处并不大,但是可以帮助理解JS语言和熟悉CSS3样式。

设计:

观察一张图片的变化,发现:

1、图片缩放(随机,并且不是同时运动)

      1、从大到小

       2、从小到大,透明度从1到0(在第一步运动完成后立马开始)

2、图片旋转(随机,并且不是同时运动的。需要在全部运动走完以后开始)

3. 因为每张图片是随机开始变换的,所以起始时间是不同的,这里可设置一个延迟器setTimeout,时间用random随机生成即可。

4. 中间需要用到自执行函数,因为setTimeout无视for循环的i,所以每次延时器运行的时候i可能都出错,用自执行函数保存i的每一次值。

5. 转换期间按钮的div是不能点击的,需要标记和判断。

6.运动共有两个,缩放和旋转,注意缩放全部结束才能开始旋转,这里也要处理好。

笔记:

scale是缩放
transition 过渡,延迟
子函数修改父亲的值,就是闭包
JavaScript+CSS相册特效实例代码
自执行函数 这里主要用来保存i的每一次值
如果直接加定时器,就不管外面循环,1s后才执行,这时的i都不知道到哪里了,可能越界
JavaScript+CSS相册特效实例代码
Math.random()产生的值是setTimeout的一个参数,延迟的时间
setTimeout延迟时间也与电脑卡影响
transitionend只要过渡了就会执行,它是根据 样式来计算的
JavaScript+CSS相册特效实例代码
缩放和透明都会触发transitionend
call()改变this指向的对象

然后就直接实现了,在加载页面的时候就运行这个特效。

补上中间查到的一些资料:

1.CSS3 opacity 属性:

描述
value 指定不透明度。从0.0(完全透明)到1.0(完全不透明)
inherit Opacity属性的值应该从父元素继承


2.HTML DOM scale() 方法:

参数

参数 描述
sx, sy 水平和垂直的缩放因子。
描述

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撑的

剩下就是代码了,注释很详细,回调函数很多。。:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title></title>
 <style>
  /*图片容器整体样式,左右居中 视角景深800px */
  #imgWrap{
  width: 800px;
  height: 400px;
  margin: 80px auto;
  perspective: 800px;
  }

  /*左对齐,高宽*数量=整体div*/
  #imgWrap img{
  float: left;
  width: 80px;
  height: 80px;
  }

  #btn{
  width: 100px;
  /*height: 40px 这里不定义就是跟font大小一样*/
  background: rgb(0,100,0);
  padding: 0 20px;
  /*font-size 和 line-height 中可能的值。*/
  font: 16px/40px "微软雅黑";
  color: #fff;
  margin: 0 auto;
  border-radius: 5px;
  box-shadow: 2px 2px 5px #000;
  cursor: pointer;
  }
 </style>
 <script>
  /*
  * 1、图片缩放(随机,并且不是同时运动)
  * 1、从大到小
  * 2、从小到大,透明度从1到0(在第一步运动完成后立马开始)
  *
  * 2、图片旋转(随机,并且不是同时运动的。需要在全部运动走完以后开始)
  */

  window.onload=function(){
  var btn=document.getElementById("btn");
  // 选择所有元素
  var imgs=document.querySelectorAll("img");
  var endNum=0; //它代表图片运动完成的数量
  var canClick=true; //它代表用户能否再次点击

  btn.onclick=function(){
   if(!canClick){
   return; //以下的代码不要走了
   }
   canClick=false;


   for(var i=0;i<imgs.length;i++){
   (function(i){
    setTimeout(function(){
    /*imgs[i].style.transition='100ms';
    imgs[i].style.transform='scale(0)';
    imgs[i].style.opacity='0';

    imgs[i].addEventListener('transitionend',function(){
     console.log(1);
    });*/

    motion(imgs[i],'50ms',function(){
     this.style.transform='scale(0)';
    },function(){
     motion(this,'1s',function(){
     this.style.transform='scale(1)';
     this.style.opacity='0';
     },function(){
     //在这里表示图片缩放的运动已经全部完成了,接着走第二个运动

     endNum++;
     if(endNum==imgs.length){
      //所有的运动都完成了
      //console.log('所有的运动都完成了')
      rotate();
      //endNum=0;
     }
     });
    });
    },Math.random()*1000);
   })(i);
   }
  };


  //旋转功能
  function rotate(){
   for(var i=0;i<imgs.length;i++){
   //给运动来一下初始化
   imgs[i].style.transition='';
   /*imgs[i].style.opacity=1;*/
   imgs[i].style.transform='rotateY(0deg) translateZ(-'+Math.random()*500+'px)';

   //运动来了,自执行函数
   (function(i){
    setTimeout(function(){
    motion(imgs[i],'2s',function(){
     this.style.opacity=1;
     this.style.transform='rotateY(-360deg) translateZ(0)';
    },function(){
     endNum--; //因为在上次运动结束的时候,endNum的值已经加到了50了
     //console.log(endNum);
     if(endNum==0){
     //所有的运动都完成了
     canClick=true;
     //endNum=0
     }
    });
    },Math.random()*1000);
   })(i);
   }
  }

  //运动函数
  function motion(obj,timer,doFn,callBack){
   //motion(运动对象,运动时间(字符串+单位),运动属性(函数),运动结束后的回调函数)
   obj.style.transition=timer;
   doFn.call(obj);//改变对象

   var end=true; //用来知道过渡有没有完成一次

   //结束事件处理函数
   function endFn(){
   if(end){
    //callBack&&callBack.call(obj);
    if(callBack){
    callBack.call(obj);
    }

    end=false; //改成false,下次就不会走这个if了
   }

   obj.removeEventListener('transitionend',endFn); //结束后就把这个事件取消掉,要不它会一直带在身上
   }

   obj.addEventListener('transitionend',endFn);
  }
  };
 </script>
 </head>
 <body>
 <div id="imgWrap">
  <img src="images/1.jpg" alt="" />
  <img src="images/2.jpg" alt="" />
  <img src="images/3.jpg" alt="" />
  <img src="images/4.jpg" alt="" />
  <img src="images/5.jpg" alt="" />
  <img src="images/6.jpg" alt="" />
  <img src="images/7.jpg" alt="" />
  <img src="images/8.jpg" alt="" />
  <img src="images/9.jpg" alt="" />
  <img src="images/10.jpg" alt="" />
  <img src="images/11.jpg" alt="" />
  <img src="images/12.jpg" alt="" />
  <img src="images/13.jpg" alt="" />
  <img src="images/14.jpg" alt="" />
  <img src="images/15.jpg" alt="" />
  <img src="images/16.jpg" alt="" />
  <img src="images/17.jpg" alt="" />
  <img src="images/18.jpg" alt="" />
  <img src="images/19.jpg" alt="" />
  <img src="images/20.jpg" alt="" />
  <img src="images/21.jpg" alt="" />
  <img src="images/22.jpg" alt="" />
  <img src="images/23.jpg" alt="" />
  <img src="images/24.jpg" alt="" />
  <img src="images/25.jpg" alt="" />
  <img src="images/26.jpg" alt="" />
  <img src="images/27.jpg" alt="" />
  <img src="images/28.jpg" alt="" />
  <img src="images/29.jpg" alt="" />
  <img src="images/30.jpg" alt="" />
  <img src="images/31.jpg" alt="" />
  <img src="images/32.jpg" alt="" />
  <img src="images/33.jpg" alt="" />
  <img src="images/34.jpg" alt="" />
  <img src="images/35.jpg" alt="" />
  <img src="images/36.jpg" alt="" />
  <img src="images/37.jpg" alt="" />
  <img src="images/38.jpg" alt="" />
  <img src="images/39.jpg" alt="" />
  <img src="images/40.jpg" alt="" />
  <img src="images/41.jpg" alt="" />
  <img src="images/42.jpg" alt="" />
  <img src="images/43.jpg" alt="" />
  <img src="images/44.jpg" alt="" />
  <img src="images/45.jpg" alt="" />
  <img src="images/46.jpg" alt="" />
  <img src="images/47.jpg" alt="" />
  <img src="images/48.jpg" alt="" />
  <img src="images/49.jpg" alt="" />
  <img src="images/50.jpg" alt="" />
 </div>
 <div id="btn">点击查看效果</div>
 </body>
</html>

以上这篇JavaScript+CSS相册特效实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
Jan 15 Javascript
javascript中的toFixed固定小数位数 简单实例分享
Jul 12 Javascript
javascript框架设计之种子模块
Jun 23 Javascript
javaScript基础详解
Jan 19 Javascript
javascript中replace使用方法总结
Mar 01 Javascript
ES6新特性之变量和字符串用法示例
Apr 01 Javascript
基于JavaScript实现五子棋游戏
Aug 26 Javascript
javascript标准库(js的标准内置对象)总结
May 26 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
Oct 10 Javascript
浅谈layui 表单元素的选中问题
Oct 25 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
Mar 09 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 Javascript
AngularJS 打开新的标签页实现代码
Sep 07 #Javascript
基于Cookie常用操作以及属性介绍
Sep 07 #Javascript
基于require.js的使用(实例讲解)
Sep 07 #Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 #Javascript
JQuery 获取多个select标签option的text内容(实例)
Sep 07 #jQuery
jQuery UI Draggable + Sortable 结合使用(实例讲解)
Sep 07 #jQuery
jQueryUI Sortable 应用Demo(分享)
Sep 07 #jQuery
You might like
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python实现dict版图遍历示例
2014/02/19 Python
Python字符串详细介绍
2015/05/09 Python
python读写json文件的简单实现
2017/04/11 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
python多任务及返回值的处理方法
2019/01/22 Python
Python阶乘求和的代码详解
2020/02/14 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
Django 解决由save方法引发的错误
2020/05/21 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
C语言基础笔试题
2013/04/27 面试题
传播学毕业生求职信
2013/10/11 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
采购求职信
2014/03/17 职场文书
驻村工作先进事迹
2014/08/14 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书