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 相关文章推荐
Add Formatted Text to a Word Document
Jun 15 Javascript
利用javascript移动div层-javascript 拖动层
Mar 22 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
Sep 01 Javascript
jQuery 行级解析读取XML文件(附源码)
Oct 12 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
Mar 05 Javascript
JS判断字符串字节数并截取长度的方法
Mar 05 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
Aug 25 Javascript
在网页中插入百度地图的步骤详解
Dec 02 Javascript
react-native-tab-navigator组件的基本使用示例代码
Sep 07 Javascript
vue实现列表滚动的过渡动画
Jun 29 Javascript
jQuery中getJSON跨域原理的深入讲解
Sep 02 jQuery
vue实现列表垂直无缝滚动
Apr 08 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
php 空格,换行,跳格使用说明
2009/12/18 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
angular2 ng2 @input和@output理解及示例
2017/10/10 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
python字符串的常用操作方法小结
2016/05/21 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
Python中的Numpy矩阵操作
2018/08/12 Python
python实现字符串和数字拼接
2020/03/02 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
怎样写好自我鉴定
2013/12/04 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
会议欢迎标语
2014/06/30 职场文书
法制演讲稿
2014/09/10 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
保洁员岗位职责
2015/02/04 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
深入理解go缓存库freecache的使用
2022/02/15 Golang