[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);
}
};
[Js]滑动门效果的更多相关文章
- JS切割图片-滑动门效果
转载请注明来源:https://www.cnblogs.com/hookjc/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...
- HTML+CSS技术实现网页滑动门效果
一.什么是滑动门 大家在网页中经常会见到这样一种导航效果,因为使用频率广泛,所以广大的程序员给它起了一个名字,叫做滑动门.在学习滑动门之前,首先你要了解什么是滑动门. 小米官网,网页滑动门效果 二.实 ...
- js 滑动门的实现
原理:滑动门,这里以图片进行实例,首先设定主盒子div的宽度和高度设定,并进行图片初始化位置的设定,然后将图片绑定事件,并设定要达到的效果 html代码: <!DOCTYPE html> ...
- JS滑动门,JQuery滑动门
<a href="#" id="one1" onmouseover="setTab('one',1,2)" class="h ...
- JS实现滑动门效果
html部分 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin ...
- 【原生JS】滑动门效果
效果图: 思路:通过每次鼠标移动至目标上使所有图片重置为初始样式再向左移动目标及其左侧每个图片隐藏部分距离即实现. HTML: <!DOCTYPE html> <html> & ...
- js滑动提示效果
js代码 漂亮的动画效果:在靠右上角:背景颜色为红,字体颜色为白色 滑动 变大 上移 缓慢渐变消失 function tishi() { $("#tishi").attr(&q ...
- DIV+CSS滑动门效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [Jquery]滑动门效果
$(function(){ var $box=$("#box"); var $img=$box.find("img"); var imgWid ...
随机推荐
- LCM兼容
1.project-1998-trunk-bootable-bootloader-lk-project: 复制zaw1998aa_platform.mk为zaw2000aa_platform.mk ...
- flexbox弹性伸缩布局
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- @responseBody注解的使用
1. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML 数 ...
- VirtualBox没有64位选项,无法安装64位的解决方法(zhuan)
http://www.askmaclean.com/archives/vbox-virtualbox-64-bit.html ************************************* ...
- Python Paramiko模块安装和使用
1.简介 大家会发现,常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了. 使用par ...
- Convention插件 struts零配置
http://blog.csdn.net/spyjava/article/details/13631961系列课程使用 注解:http://www.yiibai.com/struts_2/struts ...
- DRUPAL点滴
1 admin/config/user-interface/xxx在hook_menu里定义这样一个path,就会在configuration界面看到xxx的链接 2 $news_items = db ...
- 浅谈全区全服架构的SNS游戏后台
版权声明:本文由梁本志原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/198 来源:腾云阁 https://www.qclo ...
- java 集合(ArrayList)
ArrayList: ------------|Collection 单列集合的跟接口 ----------------------|List 有序,可重复. ------------------- ...
- 鸟哥的linux私房菜勘误表
博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://ww ...