JS实现滑动门效果的方法详解


Posted in Javascript onDecember 19, 2016

本文实例讲述了JS实现滑动门效果的方法。分享给大家供大家参考,具体如下:

描述:鼠标移动到一副图片上,会显示该副图片的全貌,而其他图片会显示概貌,效果图如下:

JS实现滑动门效果的方法详解

一、没有动画效果的运动

思路:

1.定好每张图片的初始位置(第一张完全显示,234只露出一部分)
2.计算每道门的移动距离(即未显露的部分)
3.绑定鼠标滑过事件

window.onload=function(){
  var box=document.getElementById("box");
  var img=box.getElementsByTagName("img");
  //单张图片宽度
  var imgWidth=img[0].offsetWidth;
  //露出的宽度
  var exposeWidth=160;
  //设置容器总宽度
  var boxWidth=imgWidth+exposeWidth*(img.length-1)
  box.style.width=boxWidth+"px";
  //设置图片初始位置
  function setImgspos(){
    for(var i=1,len=img.length;i<len;i++){ //len在for循环的初始化语句里先定义好,这样就不需要每次都计算img的个数了,比for(var i=1;i<img.length;i++)性能高
      img[i].style.left=imgWidth+exposeWidth*(i-1)+"px";
    }
  }
  setImgspos();
  //计算每道门打开时应移动的距离
  var translate=imgWidth-exposeWidth;
  for(var i=0,len=img.length;i<len;i++){
    (function(i){ //这里为什么需要匿名函数?(简单来说是函数变量作用域的问题)img[i].onmouseover=function(){}这个函数内部使用了变量i,但是i没有定义,于是向外查找,找到for循环里定义的i,点击事件是for循环执行完毕后才开始执行的,即此时i=4,所以会报错img[i]没有定义,这里加一层匿名函数相当于闭包处理,i以形参的方式传递给内层函数
      img[i].onmouseover=function(){
        setImgspos(); //每次移上去先重置位置
        for(var j=1;j<=i;j++){ //第二个循环体作用:可能会移多道门(比如放到第三道门上,二和三都要动,不是只动三,另外第一道门永远不动)
          img[j].style.left=parseInt(img[j].style.left)-translate+"px";
        }
      };
    })(i); //这个i是实参
  }
};

二、展开加速、收拢减速的运动

注意:设置每道门初始位置时,不需要在写一个function了,因为要分别写打开和关闭动画,会造成一个卡顿,瞬间闪烁。

思路:

1.需要鼠标滑过这道门的初始位置
2.需要鼠标滑过这道门的结尾位置
3.需要一个速度和定时器来完成缓缓移动的过程

window.onload=function(){
  var box=document.getElementById("box");
  var img=box.getElementsByTagName("img");
  //单张图片宽度
  var imgWidth=img[0].offsetWidth;
  //露出的宽度
  var exposeWidth=160;
  //设置容器总宽度
  var boxWidth=imgWidth+exposeWidth*(img.length-1)
  box.style.width=boxWidth+"px";
  //设置图片初始位置
  for(var i=1,len=img.length;i<len;i++){
    img[i].pos=img[i].style.left=imgWidth+exposeWidth*(i-1)+"px";
  }
  function openDoor(el,translate){
    var begin=parseInt(el.pos);
    var end=begin-translate;
    var iSpeed=10;
    setTimeout(function(){
      el.style.left=parseInt(el.style.left)-iSpeed+"px"; //为什么不用begin?每次的初始位置会变
      iSpeed*=1.5;  //没有这句话就是匀速运动
      if(parseInt(el.style.left)<=end){
        el.style.left=end+"px";
      }else{
        setTimeout(arguments.callee,25); //定时器有名字可以直接调用,没名字,就用原生js方法arguments.callee
      }
    },25);
  };
  function closeDoor(el,translate){
    var begin=parseInt(el.pos)-translate; //关门默认情况是张开的
    var end=begin+translate; //这里可以直接写var end=parseInt(el.pos);
    var iSpeed=100;
    setTimeout(function(){
      el.style.left=parseInt(el.style.left)+iSpeed+"px"; //为什么不用begin?每次的初始位置会变
      iSpeed=Math.ceil(iSpeed*0.7); //没有这句话就是匀速运动
      if(parseInt(el.style.left)>=end){
        el.style.left=end+"px";
      }else{
        setTimeout(arguments.callee,25); //定时器有名字可以直接调用,没名字,就用原生js方法arguments.callee
      }
    },25);
  };
  var translate=imgWidth-exposeWidth;
  for(var i=0,len=img.length;i<len;i++){
    (function(i){
      img[i].onmouseover=function(){
        //开门 自己和自己左边的全部循环到
        for(var j=1;j<=i;j++){
          openDoor(img[j],translate);
        }
        //关门 自己右边的全部循环到
        for(var j=i+1;j<img.length;j++){
          closeDoor(img[j],translate);
        }
      };
    })(i);
  }
};

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript中使用arguments获得函数传参个数实例
Aug 27 Javascript
jQuery简单验证上传文件大小及类型的方法
Jun 02 Javascript
js判断空对象的实例(超简单)
Jul 26 Javascript
AngularJS Bootstrap详细介绍及实例代码
Jul 28 Javascript
JavaScript数值千分位格式化的两种简单实现方法
Aug 01 Javascript
微信小程序侧边栏滑动特效(左右滑动)
Jan 23 Javascript
jquery中有哪些api jQuery主要API
Nov 20 jQuery
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
JS回调函数简单易懂的入门实例分析
Sep 29 Javascript
js blob类型url的视频下载问题的解决
Nov 29 Javascript
基于jQuery实现挂号平台首页源码
Jan 06 jQuery
关于JavaScript数组去重的一些理解汇总
Sep 10 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 #Javascript
简单理解js的冒泡排序
Dec 19 #Javascript
JS瀑布流实现方法实例分析
Dec 19 #Javascript
移动端日期插件Mobiscroll.js使用详解
Dec 19 #Javascript
JavaScript闭包和范围实例详解
Dec 19 #Javascript
JS前端笔试题分析
Dec 19 #Javascript
利用vue实现模态框组件
Dec 19 #Javascript
You might like
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
自定义php类(查找/修改)xml文档
2013/03/26 PHP
php中{}大括号是什么意思
2013/12/01 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
Python 字典(Dictionary)操作详解
2014/03/11 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
python如何求圆的面积
2020/07/01 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
个人简历自我鉴定
2013/10/11 职场文书
《在家里》教后反思
2014/03/01 职场文书
销售求职信范文
2014/05/26 职场文书
给医院的感谢信
2015/01/21 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android