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 FLASH幻灯片字符串中有连接符&的处理方法
Mar 01 Javascript
全面解析Javascript无限添加QQ好友原理
Jun 15 Javascript
jQuery实现文章图片弹出放大效果
Apr 06 jQuery
详解vue.js+UEditor集成 [前后端分离项目]
Jul 07 Javascript
基于JavaScript实现前端数据多条件筛选功能
Aug 19 Javascript
jQuery替换节点元素的操作方法
Mar 18 jQuery
vue+springmvc导出excel数据的实现代码
Jun 27 Javascript
详解JavaScript添加给定的标签选项
Sep 17 Javascript
微信小程序实现留言板(Storage)
Nov 02 Javascript
手把手15分钟搭一个企业级脚手架
Sep 16 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
Jun 19 Javascript
vue缓存之keep-alive的理解和应用详解
Nov 02 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编程中八种常见的文件操作方式
2006/11/19 PHP
PHPMailer 中文使用说明小结
2010/01/22 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
jquery $.each() 使用小探
2013/08/23 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
jQuery功能函数详解
2015/02/01 Javascript
JavaScript简介
2015/02/15 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
JS实现可切换图片的幻灯切换效果示例
2019/05/24 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
浅谈python连续赋值可能引发的错误
2018/11/10 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
Pytorch之parameters的使用
2019/12/31 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
一年级学生期末评语
2014/04/21 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
Mysql 如何批量插入数据
2021/04/06 MySQL
详解java如何集成swagger组件
2021/06/21 Java/Android
java项目构建Gradle的使用教程
2022/03/24 Java/Android
Redis全局ID生成器的实现
2022/06/05 Redis
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers