JS运动应用
多物体运动框架
多个物体同时运动
例子:多个Div,鼠标移入变宽
单定时器,存在问题
每隔Div一个定时器
/*多个div边宽还原*/
window.onload=function(){
var aDiv=document.getElementsByTagName('div');
//遍历div,给每个div添加运动函数
for(var i=0;i<aDiv.length;i++)
{
aDiv[i].timer=null; //每个div有各自的定时器,互不干扰
aDiv[i].onmouseover=function(){
startMove(this,400);
};
aDiv[i].onmouseout=function(){
startMove(this,100);
};
}
};
function startMove(obj,iTarget){
clearInterval(obj.timer)
obj.timer=setInterval(function(){
var speed=(iTarget-obj.offsetWidth)/6;
speed=speed>0?Math.ceil(speed):Math.floor(speed);
if(obj.offsetWidth==iTarget){
clearInterval(obj.timer);
}
else{
obj.style.width=obj.offsetWidth+speed+'px';
}
},30);
};
像这样的程序还是存在问题的,如果样式中含有border,在取offsetWidth的时候系统会把width和border的像素加在一起,这样计时器每次计算下来的width值会比原先的大,在还原时回不到原来的宽度
多物体运动框架
定时器作为物体的属性
参数的传递:物体,目标值
例子:多个Div淡入淡出
所有东西都不能共用
属性与运动对象绑定:速度,其他属性值(如透明度等)
任意值运动框架
offset属性的Bug
有边框的Div改变宽度
用currentStyle代替offset
原有运动框架的问题
只能让某个值运动起来
如果想让其他值运动起来,需要修改程序
扩展的运动框架
运动属性作为参数
封装opacity(小数问题)
/*多物体任意值运动框架*/
//var alpha=30; //多物体框架所有东西都不能共用
window.onload=function(){
//改变div1的高度
var oDiv1=document.getElementById('div1');
oDiv1.onmouseover=function(){
startMove(this,'height',400);
};
oDiv1.onmouseout=function(){
startMove(this,'height',200);
};
//改变div2的宽度
var oDiv2=document.getElementById('div2');
oDiv2.onmouseover=function(){
startMove(this,'width',400);
};
oDiv2.onmouseout=function(){
startMove(this,'width',200);
};
//改变div3的文字大小
var oDiv3=document.getElementById('div3');
oDiv3.onmouseover=function(){
startMove(this,'font-size',30);
};
oDiv3.onmouseout=function(){
startMove(this,'font-size',14);
};
//改变div4的边框粗细
var oDiv4=document.getElementById('div4');
oDiv4.onmouseover=function(){
startMove(this,'border-width',30);
};
oDiv4.onmouseout=function(){
startMove(this,'border-width',10);
};
//改变div5的透明度
var oDiv5=document.getElementById('div5');
oDiv5.onmouseover=function(){
startMove(this,'opacity',100);
};
oDiv5.onmouseout=function(){
startMove(this,'opacity',30);
};
};
//获取非行间样式--(详见深入了解深入了解JavaScript)
function getStyle(obj,name)
{
if(obj.currentStyle)
{
return obj.currentStyle[name];
}
else
{
return getComputedStyle(obj,null)[name];
}
};
//任意值多物体运动框架 参数(物体,改变样式,目标值)
function startMove(obj,attr,iTarget){
clearInterval(obj.timer)
obj.timer=setInterval(function(){
var cur=0
//因为透明度opacity不兼容此运动框架,所以要做单独处理进行封装
if(attr=='opacity')
{
cur=Math.round(parseFloat((getStyle(obj,attr))*100));
//物体当前透明度值,round四舍五入保留整数部分
}
else
{
cur=parseInt(getStyle(obj,attr)); //物体当前的样式值
}
//计算速度
var speed=(iTarget-cur)/6;
speed=speed>0?Math.ceil(speed):Math.floor(speed);
if(cur==iTarget)
{
clearInterval(obj.timer);
}
else
{
//如果修改样式为透明度opacity,则作单独处理
if(attr=='opacity')
{
obj.style.filter='alpha(opacity:'+(cur+speed)+')'; //IE
obj.style.opacity=(cur+speed)/100; //Chrome,FF
}
else
{
obj.style[attr]=cur+speed+'px';
}
}
},30);
};
仿Flash图片展示 -1
效果思路
两边的按钮——淡入淡出
大图下拉——层级,高度变化
下方的li——多物体淡入淡出
下方的ui——位置计算
左右按钮
淡入淡出
鼠标移动到按钮上时按钮会消失
——层级问题
——按钮和遮罩都得加上事件
部分代码
-
获取相应class的元素
function getByClass(oParent,sClass)
{
var aEle=oParent.getElementsByTagName('*');
var aResult=[];
for(var i=0;i<aEle.length;i++)
{
if(aEle[i].className==sClass)
{
aResult.push(aEle[i]);
}
}
return aResult;
}
-
用到的相应的元素赋值
var oDiv=document.getElementById('playimages');
var oBtnPrev=getByClass(oDiv,'prev')[0];
var oBtnNext=getByClass(oDiv,'next')[0];
var oMarkLeft=getByClass(oDiv,'mark_left')[0];
var oMarkRight=getByClass(oDiv,'mark_right')[0];
var oDivSmall=getByClass(oDiv,'small_pic')[0];
var oUlSmall=oDivSmall.getElementsByTagName('ul')[0];
var aLiSmall=oDivSmall.getElementsByTagName('li');
var oUlBig=getByClass(oDiv,'big_pic')[0];
var aLiBig=oUlBig.getElementsByTagName('li');
var nowZIndex=2; //图片层级
var now=0; //第几张图片,也为上一张下一张做准备
-
左右按钮
//鼠标移入显示向左向右滚动按钮
//鼠标移入移出,按钮和遮罩都得加上事件
oBtnPrev.onmouseover=oMarkLeft.onmouseover=function()
{
startMove(oBtnPrev,'opacity',100); //淡入
};
oBtnPrev.onmouseout=oMarkLeft.onmouseout=function()
{
startMove(oBtnPrev,'opacity',0); //淡出
};
oBtnNext.onmouseover=oMarkRight.onmouseover=function()
{
startMove(oBtnNext,'opacity',100);
};
oBtnNext.onmouseout=oMarkRight.onmouseout=function()
{
startMove(oBtnNext,'opacity',0);
};
-
封装函数:小图滚动和透明度改变,大图的缓冲下拉
因为在大图切换中和鼠标选中里都会用到这部分代码,所以将其封装为一个函数
-
小图滚动思路
当选中第一张图片时,left不改变。选中第二张图时left也不改变,选中第三张图时,left变为-li.width
第几张图 | left值 |
---|---|
0 | 0 |
1 | 0 |
2 | -aLiSmall[0].offsetWidth |
3 | -2*aLiSmall[0].offsetWidth |
... | ... |
n | -(n-1)*aLiSmall[0].offsetWidth |
有表格规律可知:当选中的小图为第n张时,小图滚动栏ul的left改变-(n-1)*aLiSmall[0].offsetWidth个px。
当解决完小图滚动问题时又出现了如下问题
这是因为没有设置ul的宽度,按照之前定时器使用无缝滚动中的ul计算公式oUlSmall.style.width=aLiSmall.length*aLiSmall[0].offsetWidth+'px'来给ul的宽度赋值
-
大图缓冲下拉思路
大图缓冲下拉实际上就是:当选中某个ul中小图时,将相应的大图的层级设为最高,也就将z-index+1,然后将大图的初始高度设为0,再用运动框架来将图片缓冲下拉。
下面是封装函数tab的代码:
function tab()
{ //封装函数:小图滚动和透明度改变,大图的缓冲下拉
//将点击图对应的大图层级加一,调为最高
aLiBig[now].style.zIndex=nowZIndex++;
//选中的小图变为不透明
for(var i=0;i<aLiSmall.length;i++)
{
startMove(aLiSmall[i],'opacity',60);
}
startMove(aLiSmall[now],'opacity',100);
//使大图的高度为零,用startMove运动函数让图片从上缓冲拉下
aLiBig[now].style.height=0;
startMove(aLiBig[now],'height',320);
//小图滚动
//特别处理:第0张图片时不动,最后一张图片时也不动
if(now==0)
{
//第0张图时的位置
startMove(oUlSmall,'left',0);
}
else if(now==aLiSmall.length-1)
{
//最后一张图时的位置
startMove(oUlSmall,'left',-(now-2)*aLiSmall[0].offsetWidth);
}
else
{
//小图即不为第一张又不为最后一张时的位置
startMove(oUlSmall,'left',-(now-1)*aLiSmall[0].offsetWidth);
}
};
-
大图切换
//大图切换
for(var i=0;i<aLiSmall.length;i++)
{
aLiSmall[i].index=i;
aLiSmall[i].onclick=function(){
if(this.index==now)return;
now=this.index;
tab();
};
//鼠标移入透明消失,移出还原
aLiSmall[i].onmousemove=function(){
startMove(this,'opacity',100);
};
aLiSmall[i].onmouseout=function(){
if(this.index!=now)
{
startMove(this,'opacity',60);
};
};
};
-
图片左右滑动
//图片左右滑动
oBtnPrev.onclick=function(){
now--; //当前图片位置减一
if(now==-1)
{ //如果小图在第一张时,点击左键直接跳到最后一张
now=aLiSmall.length-1;
}
tab();
};
oBtnNext.onclick=function(){
now++; //当前图片位置加一
if(now==aLiSmall.length)
{ //如果小图在最后一张时,点击右键直接跳到第一张
now=0;
}
tab();
};
-
图片自动播放和鼠标移入暂停移出运动
//图片自动播放
var timer=setInterval(oBtnNext.onclick,2000);
//鼠标移入暂停,移出继续播放
oDiv.onmouseover=function()
{
clearInterval(timer);
};
oDiv.onmouseout=function()
{
timer=setInterval(oBtnNext.onclick,2000);
};
以上就是仿Flash图片展示的全部JS代码。
全部代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" type="text/css" href="css/zns_style.css"/>
<script src="js/move.js"></script>
<script>
function getByClass(oParent,sClass)
{
var aEle=oParent.getElementsByTagName('*');
var aResult=[];
for(var i=0;i<aEle.length;i++)
{
if(aEle[i].className==sClass)
{
aResult.push(aEle[i]);
}
}
return aResult;
}
window.onload=function(){
var oDiv=document.getElementById('playimages');
var oBtnPrev=getByClass(oDiv,'prev')[0];
var oBtnNext=getByClass(oDiv,'next')[0];
var oMarkLeft=getByClass(oDiv,'mark_left')[0];
var oMarkRight=getByClass(oDiv,'mark_right')[0];
var oDivSmall=getByClass(oDiv,'small_pic')[0];
var oUlSmall=oDivSmall.getElementsByTagName('ul')[0];
var aLiSmall=oDivSmall.getElementsByTagName('li');
var oUlBig=getByClass(oDiv,'big_pic')[0];
var aLiBig=oUlBig.getElementsByTagName('li');
var nowZIndex=2; //图片层级
var now=0; //第几张图片,也为上一张下一张做准备
oUlSmall.style.width=aLiSmall.length*aLiSmall[0].offsetWidth+'px'; //ul宽度计算
//鼠标移入显示向左向右滚动按钮
oBtnPrev.onmouseover=oMarkLeft.onmouseover=function()
{
startMove(oBtnPrev,'opacity',100);
};
oBtnPrev.onmouseout=oMarkLeft.onmouseout=function()
{
startMove(oBtnPrev,'opacity',0);
};
oBtnNext.onmouseover=oMarkRight.onmouseover=function()
{
startMove(oBtnNext,'opacity',100);
};
oBtnNext.onmouseout=oMarkRight.onmouseout=function()
{
startMove(oBtnNext,'opacity',0);
};
//大图切换
for(var i=0;i<aLiSmall.length;i++)
{
aLiSmall[i].index=i;
aLiSmall[i].onclick=function(){
if(this.index==now)return;
now=this.index;
tab();
};
//鼠标移入透明消失,移出还原
aLiSmall[i].onmousemove=function(){
startMove(this,'opacity',100);
};
aLiSmall[i].onmouseout=function(){
if(this.index!=now)
{
startMove(this,'opacity',60);
};
};
};
function tab()
{ //封装函数:小图滚动和透明度改变,大图的缓冲下拉
//将点击图对应的大图层级加一,调为最高
aLiBig[now].style.zIndex=nowZIndex++;
//选中的小图变为不透明
for(var i=0;i<aLiSmall.length;i++)
{
startMove(aLiSmall[i],'opacity',60);
}
startMove(aLiSmall[now],'opacity',100);
//使大图的高度为零,用startMove运动函数让图片从上缓冲拉下
aLiBig[now].style.height=0;
startMove(aLiBig[now],'height',320);
//小图滚动
//特别处理:第0张图片时不动,最后一张图片时也不动
if(now==0)
{
//第0张图时的位置
startMove(oUlSmall,'left',0);
}
else if(now==aLiSmall.length-1)
{
//最后一张图时的位置
startMove(oUlSmall,'left',-(now-2)*aLiSmall[0].offsetWidth);
}
else
{
//小图即不为第一张又不为最后一张时的位置
startMove(oUlSmall,'left',-(now-1)*aLiSmall[0].offsetWidth);
}
};
//图片左右滑动
oBtnPrev.onclick=function(){
now--; //当前图片位置减一
if(now==-1)
{ //如果小图在第一张时,点击左键直接跳到最后一张
now=aLiSmall.length-1;
}
tab();
};
oBtnNext.onclick=function(){
now++; //当前图片位置加一
if(now==aLiSmall.length)
{ //如果小图在最后一张时,点击右键直接跳到第一张
now=0;
}
tab();
};
//图片自动播放
var timer=setInterval(oBtnNext.onclick,2000);
//鼠标移入暂停,移出继续播放
oDiv.onmouseover=function()
{
clearInterval(timer);
};
oDiv.onmouseout=function()
{
timer=setInterval(oBtnNext.onclick,2000);
};
};
</script>
</head>
<body>
<div id="playimages" class="play">
<ul class="big_pic">
<div class="prev"></div>
<div class="next"></div>
<div class="text">加载图片说明……</div>
<div class="length">计算图片数量……</div>
<a class="mark_left" href="javascript:;"></a>
<a class="mark_right" href="javascript:;"></a>
<div class="bg"></div>
<li style="z-index:1;"><img src="images/1.jpg" /></li>
<li><img src="images/2.jpg" /></li>
<li><img src="images/3.jpg" /></li>
<li><img src="images/4.jpg" /></li>
<li><img src="images/5.jpg" /></li>
<li><img src="images/6.jpg" /></li>
</ul>
<div class="small_pic">
<ul style="390px;">
<li style="filter: 100; opacity: 1;"><img src="images/1.jpg" /></li>
<li><img src="images/2.jpg" /></li>
<li><img src="images/3.jpg" /></li>
<li><img src="images/4.jpg" /></li>
<li><img src="images/5.jpg" /></li>
<li><img src="images/6.jpg" /></li>
</ul>
</div>
</div>
</body>
</html>
以上是以上就是仿Flash图片展示的全部代码。若有需要源css样式的可以去网易云课堂搜索石川老师的智能社JavaScript从入门到精通,第18课的课件中下载
传送门:https://study.163.com/course/courseLearn.htm?courseId=224014#/learn/video?lessonId=368102&courseId=224014