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中的prototype使用说明
Apr 13 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
用C/C++来实现 Node.js 的模块(一)
Sep 24 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
Jan 23 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
Oct 27 Javascript
JS实现简单抖动效果
Jun 01 Javascript
Angularjs添加排序查询功能的实例代码
Oct 24 Javascript
vue中路由验证和相应拦截的使用详解
Dec 13 Javascript
vue中注册自定义的全局js方法
Nov 15 Javascript
jQuery实现可编辑的表格
Dec 11 jQuery
原生JS实现相邻月份日历
Oct 13 Javascript
Vue的生命周期一起来看看
Feb 24 Vue.js
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
一个图形显示IP的PHP程序代码
2007/10/19 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
JQuery 常用操作代码
2010/03/14 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
MySQL适配器PyMySQL详解
2017/09/20 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
python实现滑雪游戏
2020/02/22 Python
基于Python fminunc 的替代方法
2020/02/29 Python
django orm模块中的 is_delete用法
2020/05/20 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
入党自我鉴定范文
2013/10/04 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
2014年纪检工作总结
2014/11/12 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
聘用合同范本
2015/09/21 职场文书
会议主持词通用版
2019/04/02 职场文书
如何理解及使用Python闭包
2021/06/01 Python
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫
深入理解 Golang 的字符串
2022/05/04 Golang