[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 ...
随机推荐
- Linux_常用命令_01
PS:一些不涉及其他软件的操作,OS本来就支持的命令. 1.压缩/解压: 压缩: tar -zcvf /home/android1.6_cmdCompress.tar.gz /root/manifes ...
- JavaWeb学习总结(十二)--事务
一.事务的介绍 1.1 什么是事务 银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句: 给张三的账户减去10000元: 给李四的账户加上10000元. 如果在第一条SQL语句执行成功 ...
- gcc常用指令及相关知识
1,gcc与g++的问题: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序. 2.编译阶段,g++会调用gcc,对于c++代码,两者是等 ...
- SVN标准目录结构
Trunk 这是SVN目录的主分支,表示日常开发中的项目,任何时候Trunk里包含的都是最新的开发代码. 这里的代码将会工作到你的下一个主要发布版本. Trunk应该只被用来开发将会成为你的下一个重要 ...
- android学习---- WindowManager 接口 (
The interface that apps use to talk to the window manager. 这个接口用于与 window manager (窗口管理器, 应用框架层) 进行交 ...
- 数据库事物四大特性-ACID
事务的:原子性.一致性.分离性.持久性 事物(transaction)是由一些列操作序列构成的执行单元,这些单元要么都做,要么不做,是一个不可分割的工作单元. 数据库事物的四个基本性质(ACID) 1 ...
- Java中for循环遍历List的两种方法
我们平常使用的方法: List<WebElement> element = driver.findElements(By.tagName("input")); ...
- google_apactest_round_A_problem_D
先尝试过小数据 题目 有8张卡牌,每个卡牌都可以有不同的等级,每个卡牌的不同等级具有不同的攻击力,可以通过花钱给卡牌充值从而升级,且每次只能升一级,比如可以花1个硬币将卡牌2从1级升级到2级,同时卡牌 ...
- ObjectMapper处理从远程获取的Object对象
微服务中从其他服务获取过来的对象,如果从Object强转为自定义的类型会报错,利用ObjectMapper转换. ObjectMapper mapper = new ObjectMapper(); D ...
- 2016-6-15-de novo文献阅读
准备读四篇denovo的文献: Nature Biotechnology(2015) - Sequencing of allotetraploid cotton (Gossypium hirsutum ...