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 模拟实现类似c#下的hashtable的简单功能代码
Jan 24 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
Nov 07 Javascript
extjs 分页使用jsp传递数据示例
Jul 29 Javascript
JavaScript输出当前时间Unix时间戳的方法
Apr 06 Javascript
javascript实现table表格隔行变色的方法
May 13 Javascript
javascript设计模式之module(模块)模式
Aug 19 Javascript
React如何利用相对于根目录进行引用组件详解
Oct 09 Javascript
微信小程序倒计时功能实现代码
Nov 09 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
Sep 28 Javascript
利用es6 new.target来对模拟抽象类的方法
May 10 Javascript
微信小程序bindtap事件与冒泡阻止详解
Aug 08 Javascript
JS实现简易留言板增删功能
Feb 08 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
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
Grid得到选择行数据的方法总结
2011/01/17 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
获取input标签的所有属性的方法
2016/06/28 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
python安装与使用redis的方法
2016/04/19 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
python 读取数据库并绘图的实例
2019/12/03 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
如何通过python实现全排列
2020/02/11 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
新媒传信软件测试面试题
2013/02/24 面试题
人力资源经理的岗位职责
2014/03/02 职场文书
文化活动实施方案
2014/03/28 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers