javascript制作照片墙及制作过程中出现的问题
作者:bea
本文主要做了一个照片墙,整个制作过程,主要需要解决一下几个问题: 1、如何进行布局转换? 2、如何对图片进行拖拽处理? 3、如何检测图片碰撞问题?进行碰撞检测 4、当多个图片进行碰撞,如何取其中距离对象最小的物体? 5、如何将相互碰撞的两个物体的位置相互交换?涉及到运动的类库 代码如下: <html><head><style>body{background:black;margin: 0;padding: 0;color: white;
本文主要做了一个照片墙,整个制作过程,主要需要解决一下几个问题:
1、如何进行布局转换?
2、如何对图片进行拖拽处理?
3、如何检测图片碰撞问题?进行碰撞检测
4、当多个图片进行碰撞,如何取其中距离对象最小的物体?
5、如何将相互碰撞的两个物体的位置相互交换?涉及到运动的类库
代码如下:
<html>
<head>
<style>
body{background:black;margin: 0;padding: 0;color: white;font-size: 50px;}
p{position: absolute;width:20px;margin-left: 50px;}
#ul1{width: 690px;position: relative;margin: 20px auto;}
#ul1 li{list-style: none;float: left;margin: 10px;width: 200px;height: 150px;z-index: 1;border: 5px solid white;}
#ul1 .active{border: 5px solid yellow;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="move2.js"></script>
<script type="text/javascript">
window.onload=function ()
{
var oUl=document.getElementById('ul1');
var oLi=oUl.getElementsByTagName('li');
var sTore=[];
var i;
var iMinZindex=2;
//进行布局转换
for(i=0;i<oLi.length;i++)
{
sTore[i]={left:oLi[i].offsetLeft,top:oLi[i].offsetTop};//用数组存储每个li的左边距和高度
}
for(i=0;i<oLi.length;i++)
{
oLi[i].style.left=sTore[i].left+'px';
oLi[i].style.top=sTore[i].top+'px';
oLi[i].style.position='absolute';
oLi[i].style.margin=0;
oLi[i].index=i;
}
//图片拖拽处理
for(i=0;i<oLi.length;i++)
{
setDrags(oLi[i]);
}
function setDrags(obj)
{
obj.onmousedown=function(ev)
{
//层级问题
obj.style.zIndex=iMinZindex++;
var oEvent=ev||event;
var disx=oEvent.clientX-obj.offsetLeft;
var disy=oEvent.clientY-obj.offsetTop;
document.onmousemove=function(ev)
{
var oEvent=ev||event;
obj.style.left=oEvent.clientX-disx+'px';//注意加px
obj.style.top=oEvent.clientY-disy+'px';
for(i=0;i<oLi.length;i++)
{
oLi[i].className='';
}
var oNear=findNearest(obj);
if(oNear)//如果是最近的那个物体
{
oNear.className='active';
}
};
document.onmouseup=function()
{
document.onmousemove=null;
document.onmousedown=null;
//交换两物体的位置
var oNear=findNearest(obj);
if(oNear)
{
startMove(oNear,sTore[obj.index]);
startMove(obj,sTore[oNear.index]);
//交换索引值
var temp;
temp=obj.index;
obj.index=oNear.index;
oNear.index=temp;
}
else
{
startMove(obj,sTore[obj.index])//回到自己的位置
}
return false;
};
clearInterval(obj.timer);
return false;
};
}
//发生碰撞,使被碰的图片加边框,进行碰撞检测
function IBoundTest(obj1,obj2)
{
var l1=obj1.offsetLeft;
var r1=obj1.offsetLeft+obj1.offsetWidth;
var t1=obj1.offsetTop;
var b1=obj1.offsetTop+obj1.offsetHeight;
var l2=obj2.offsetLeft;
var r2=obj2.offsetLeft+obj2.offsetWidth;
var t2=obj2.offsetTop;
var b2=obj2.offsetTop+obj2.offsetHeight;
if(r1<l2||l1>l2||b1<t2||t1>b2)//没有碰撞
{
return false;
}
else
{
return true;
}
}
//得到两个物体之间的距离
function getDis(obj1,obj2)
{
var a=obj1.offsetLeft-obj2.offsetLeft;
var b=obj1.offsetTop-obj2.offsetTop;
return Math.sqrt(a*a+b*b);
}
//发生碰撞,当与多个碰撞时,取其距离最小的图片
function findNearest(obj)
{
var iMin=9999999;
var iMindex=-1;
var i;
for(i=0;i<oLi.length;i++)
{
if(obj==oLi[i]){continue;}
if(IBoundTest(obj,oLi[i]))//如果两个物体碰撞上
{
var dis=getDis(obj,oLi[i]);
if(iMin>dis)
{
iMin=dis;
iMindex=i;
}
}
}
if(iMindex==-1){return null;}
else
{
return oLi[iMindex];//返回最近的那个
}
}
}
</script>
</head>
<body >
<p>照片墙</p>
<ul id="ul1">
<li><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/1.jpg"></li>
<li><img src="images/2.jpg"></li>
<li><img src="images/3.jpg"></li>
<li><img src="images/4.jpg"></li>
</ul>
</body>
</html>
以上就是本文的全部内容,希望对大家的学习有所帮助。
有用 | 无用
1、如何进行布局转换?
2、如何对图片进行拖拽处理?
3、如何检测图片碰撞问题?进行碰撞检测
4、当多个图片进行碰撞,如何取其中距离对象最小的物体?
5、如何将相互碰撞的两个物体的位置相互交换?涉及到运动的类库
代码如下:
<html>
<head>
<style>
body{background:black;margin: 0;padding: 0;color: white;font-size: 50px;}
p{position: absolute;width:20px;margin-left: 50px;}
#ul1{width: 690px;position: relative;margin: 20px auto;}
#ul1 li{list-style: none;float: left;margin: 10px;width: 200px;height: 150px;z-index: 1;border: 5px solid white;}
#ul1 .active{border: 5px solid yellow;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="move2.js"></script>
<script type="text/javascript">
window.onload=function ()
{
var oUl=document.getElementById('ul1');
var oLi=oUl.getElementsByTagName('li');
var sTore=[];
var i;
var iMinZindex=2;
//进行布局转换
for(i=0;i<oLi.length;i++)
{
sTore[i]={left:oLi[i].offsetLeft,top:oLi[i].offsetTop};//用数组存储每个li的左边距和高度
}
for(i=0;i<oLi.length;i++)
{
oLi[i].style.left=sTore[i].left+'px';
oLi[i].style.top=sTore[i].top+'px';
oLi[i].style.position='absolute';
oLi[i].style.margin=0;
oLi[i].index=i;
}
//图片拖拽处理
for(i=0;i<oLi.length;i++)
{
setDrags(oLi[i]);
}
function setDrags(obj)
{
obj.onmousedown=function(ev)
{
//层级问题
obj.style.zIndex=iMinZindex++;
var oEvent=ev||event;
var disx=oEvent.clientX-obj.offsetLeft;
var disy=oEvent.clientY-obj.offsetTop;
document.onmousemove=function(ev)
{
var oEvent=ev||event;
obj.style.left=oEvent.clientX-disx+'px';//注意加px
obj.style.top=oEvent.clientY-disy+'px';
for(i=0;i<oLi.length;i++)
{
oLi[i].className='';
}
var oNear=findNearest(obj);
if(oNear)//如果是最近的那个物体
{
oNear.className='active';
}
};
document.onmouseup=function()
{
document.onmousemove=null;
document.onmousedown=null;
//交换两物体的位置
var oNear=findNearest(obj);
if(oNear)
{
startMove(oNear,sTore[obj.index]);
startMove(obj,sTore[oNear.index]);
//交换索引值
var temp;
temp=obj.index;
obj.index=oNear.index;
oNear.index=temp;
}
else
{
startMove(obj,sTore[obj.index])//回到自己的位置
}
return false;
};
clearInterval(obj.timer);
return false;
};
}
//发生碰撞,使被碰的图片加边框,进行碰撞检测
function IBoundTest(obj1,obj2)
{
var l1=obj1.offsetLeft;
var r1=obj1.offsetLeft+obj1.offsetWidth;
var t1=obj1.offsetTop;
var b1=obj1.offsetTop+obj1.offsetHeight;
var l2=obj2.offsetLeft;
var r2=obj2.offsetLeft+obj2.offsetWidth;
var t2=obj2.offsetTop;
var b2=obj2.offsetTop+obj2.offsetHeight;
if(r1<l2||l1>l2||b1<t2||t1>b2)//没有碰撞
{
return false;
}
else
{
return true;
}
}
//得到两个物体之间的距离
function getDis(obj1,obj2)
{
var a=obj1.offsetLeft-obj2.offsetLeft;
var b=obj1.offsetTop-obj2.offsetTop;
return Math.sqrt(a*a+b*b);
}
//发生碰撞,当与多个碰撞时,取其距离最小的图片
function findNearest(obj)
{
var iMin=9999999;
var iMindex=-1;
var i;
for(i=0;i<oLi.length;i++)
{
if(obj==oLi[i]){continue;}
if(IBoundTest(obj,oLi[i]))//如果两个物体碰撞上
{
var dis=getDis(obj,oLi[i]);
if(iMin>dis)
{
iMin=dis;
iMindex=i;
}
}
}
if(iMindex==-1){return null;}
else
{
return oLi[iMindex];//返回最近的那个
}
}
}
</script>
</head>
<body >
<p>照片墙</p>
<ul id="ul1">
<li><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/1.jpg"></li>
<li><img src="images/2.jpg"></li>
<li><img src="images/3.jpg"></li>
<li><img src="images/4.jpg"></li>
</ul>
</body>
</html>
以上就是本文的全部内容,希望对大家的学习有所帮助。
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- javascript实现验证IP地址等相关信息代码
- 招聘网站基于jQuery实现自动刷新简历
- javascript实现获取字符串hash值
- 关于JS中的apply,call,bind的深入解析
- javascript中apply、call和bind的使用区别
- JavaScript数组去重的两种方法推荐
- jquery Deferred 快速解决异步回调的问题
- JS模拟简易滚动条效果代码(附demo源码)
- JS中的forEach、$.each、map方法推荐
- javascript HTML5 canvas实现打砖块游戏
- jQuery EasyUI中DataGird动态生成列的方法
- 基于jquery fly插件实现加入购物车抛物线动画效果
- JS简单编号生成器实现方法(附demo源码下载)
- JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
- JavaScript图像延迟加载库Echo.js
- jQuery技巧之让任何组件都支持类似DOM的事件管理
- JS+CSS实现闪烁字体效果代码
- js拖拽的原型声明和用法总结
- javascript如何实现360度全景照片问题汇总