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 相关文章推荐
jQuery 全选/反选以及单击行改变背景色实例
Jul 02 Javascript
jquery和javascript的区别(常用方法比较)
Jul 04 Javascript
页面加载完后自动执行一个方法的js代码
Sep 06 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
深入剖析JavaScript编程中的对象概念
Oct 21 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
Oct 15 Javascript
Angular实现表单验证功能
Nov 13 Javascript
学习jQuery中的noConflict()用法
Sep 28 jQuery
JQuery实现ajax请求的示例和注意事项
Dec 10 jQuery
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
vue自定义组件实现双向绑定
Jan 13 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+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
node.js中的path.basename方法使用说明
2014/12/09 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
jquery.uploadView 实现图片预览上传功能
2017/08/10 jQuery
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
python编程使用协程并发的优缺点
2018/09/20 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
行政专员求职信范文
2014/05/03 职场文书
招商银行收入证明
2015/06/17 职场文书
担保书格式范文
2015/09/22 职场文书
《月光曲》教学反思
2016/02/16 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
Java字符串逆序方法详情
2022/03/21 Java/Android