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 相关文章推荐
浅谈js中的闭包
Mar 16 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
Apr 12 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
Aug 10 Javascript
JS实现灵巧的下拉导航效果代码
Aug 25 Javascript
用JavaScript获取页面文档内容的实现代码
Jun 10 Javascript
Javascript 动态改变imput type属性
Nov 01 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
Dec 08 Javascript
Vue.js 插件开发详解
Mar 29 Javascript
微信小程序选择图片和放大预览图片功能
Nov 02 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
Jun 19 Javascript
js实现小时钟效果
Mar 25 Javascript
解决Nuxt使用axios跨域问题
Jul 06 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
php ci框架验证码实例分析
2013/06/26 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
javaScript实现一个队列的方法
2020/07/14 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
python3实现磁盘空间监控
2018/06/21 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
杭州-DOTNET笔试题集
2013/09/25 面试题
安全承诺书格式
2014/05/21 职场文书
拓展训练激励口号
2014/06/17 职场文书
合同纠纷调解书
2015/05/20 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js