原生js实现照片墙效果


Posted in Javascript onOctober 13, 2020
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>照片墙一多实例演示</title>
<style type="text/css">
body,div,h2,ul,li{margin:0;padding:0;}
body{font:12px/1.5 Arail;}
.box{width:860px;margin:10px auto;background:#eee;border:1px solid #b8b8b8;overflow:hidden}
.title{height:30px;line-height:30px;font-size:14px;padding:0 15px 0 35px;border-bottom:1px solid #b8b8b8;background:#fafafa url(http://js.alixixi.com/img/mm/ico.gif) 5px 50% no-repeat;}
.title span{float:left;}
.title a{float:right;color:#06f;outline:none;}
.title a:hover{color:red;}
.box ul{float:left;padding:0 15px 15px 0;}
.box li{float:left;width:140px;height:105px;padding:6px;background:#fff;border:1px solid #c3c3c3;display:inline;margin:15px 0 0 15px;list-style:none;}
.box li img{float:left;width:140px;height:105px;}
.box li.hig{padding:5px;border:2px dashed #f30;opacity:0.5;filter:alpha(opacity=50);}
</style>
<script type="text/javascript">
//获取ID
var $ = function (id) {return typeof id === "string" ? document.getElementById(id) : id};
//获取tagName
var $$ = function (tagName, oParent) {return (oParent || document).getElementsByTagName(tagName)};
//获取class
var $$$ = function (sClass, oParent) {
 var aClass = [],
 i = 0,
 reClass = new RegExp("(\\s|^)" + sClass + "($|\\s)"),
 aElement = $$("*", oParent);
 for (i = 0; i < aElement.length; i++)reClass.test(aElement[i].className) && aClass.push(aElement[i]);
 return aClass
};
//获取元素位置
function getPos(obj) {
 var iTop = obj.offsetTop;
 var iLeft = obj.offsetLeft;
 while (obj.offsetParent)
 {
 iTop += obj.offsetParent.offsetTop;
 iLeft += obj.offsetParent.offsetLeft;
 obj = obj.offsetParent;
 }
 return {top:iTop, left:iLeft} 
};
//创建照片墙对象
var PhotoWall = function () {this.initialize.apply(this, arguments)};
PhotoWall.prototype = {
 initialize: function (obj, aData)
 {
 var oThis = this;
 this.oParent = $(obj);
 this.oUl = $$("ul", this.oParent)[0];
 this.oBtn = $$("a", this.oParent)[0];
 this.zIndex = 1;
 this.aPos = [];
 this.aData = aData;
 this.dom = document.documentElement || document.body;
 this.create();
 this.oBtn.onclick = function () {oThis.randomOrder()}
 },
 create: function ()
 {
 var aFrag = document.createDocumentFragment();
 var i = 0;
 for (i = 0; i < this.aData.length; i++)
 {
  var oLi = document.createElement("li");
  var oImg = document.createElement("img");
  oImg.src = this.aData[i];
  oLi.appendChild(oImg);
  aFrag.appendChild(oLi) 
 }
 this.oUl.appendChild(aFrag);
 this.aLi = $$("li", this.oParent);
 this.changeLayout()
 },
 changeLayout: function ()
 {
 var i = 0;
 this.oParent.style.height = this.oParent.offsetHeight - 2 + "px";
 this.aPos.length = 0;
 for (i = 0; i < this.aLi.length; i++) this.aLi[i].style.cssText = ""; 
 for (i = 0; i < this.aLi.length; i++)
 {
  this.aLi[i].index = i;
  this.aLi[i].style.top = getPos(this.aLi[i]).top + "px";
  this.aLi[i].style.left = getPos(this.aLi[i]).left + "px";
  this.aPos.push({left:getPos(this.aLi[i]).left, top:getPos(this.aLi[i]).top})
 }
 for (i = 0; i < this.aLi.length; i++)
 {
  this.aLi[i].style.position = "absolute"; 
  this.aLi[i].style.margin = "0";  
  this.drag(this.aLi[i])
 } 
 },
 drag: function (obj, handle)
 {
 var oThis = this;
 var handle = handle || obj;
 handle.style.cursor = "move";
 handle.onmousedown = function (event)
 {
  var event = event || window.event; 
  var disX = event.clientX - this.offsetLeft;
  var disY = event.clientY - this.offsetTop;
  var oNear = null;
  handle.style.zIndex = oThis.zIndex++;
  
  document.onmousemove = function (event)
  {
  var event = event || window.event;
  var iL = event.clientX - disX;
  var iT = event.clientY - disY;
  var maxL = Math.max(oThis.dom.clientWidth, oThis.dom.scrollWidth) - handle.offsetWidth;
  var maxT = Math.max(oThis.dom.clientHeight, oThis.dom.scrollHeight) - handle.offsetHeight;
  
  iL < 0 && (iL = 0);
  iT < 0 && (iT = 0);
  iL > maxL && (iL = maxL);
  iT > maxT && (iT = maxT);
    
  handle.style.left = iL + "px";
  handle.style.top = iT + "px";
  
  oNear = oThis.findNearest(obj);
  
  for (var i = 0; i < oThis.aLi.length; i++) oThis.aLi[i].className = "";
  
  oNear && (oNear.className = "hig");
  
  return false
  };
  document.onmouseup = function ()
  {
  document.onmousemove = null;
  document.onmouseup = null;
  
  if (oNear)
  {
   handle.index = [handle.index, oNear.index];
   oNear.index = handle.index[0];
   handle.index = handle.index[1];
   oNear.style.zIndex = oThis.zIndex++;
   oThis.doMove(handle, oThis.aPos[handle.index]);
   oThis.doMove(oNear, oThis.aPos[oNear.index]);   
   oNear.className = "";
  }
  else
  {
   oThis.doMove(handle, oThis.aPos[handle.index]) 
  }
  
  handle.releaseCapture && handle.releaseCapture()
  };
  this.setCapture && this.setCapture();
  return false
 };
 },
 doMove: function (obj, iTarget, callback)
 {
 var oThis = this;
 clearInterval(obj.timer);
 obj.timer = setInterval(function ()
 {
  var iCurL = getPos(obj).left;
  var iCurT = getPos(obj).top;
  var iSpeedL = (iTarget.left - iCurL) / 5;
  var iSpeedT = (iTarget.top - iCurT) / 5;
  iSpeedL = iSpeedL > 0 ? Math.ceil(iSpeedL) : Math.floor(iSpeedL);
  iSpeedT = iSpeedT > 0 ? Math.ceil(iSpeedT) : Math.floor(iSpeedT);
  
  if (iCurL == iTarget.left && iCurT == iTarget.top)
  {
  clearInterval(obj.timer);
  callback && callback() 
  }
  else
  {
  obj.style.left = iCurL + iSpeedL + "px";
  obj.style.top = iCurT + iSpeedT + "px" 
  }
 }, 30)
 },
 findNearest: function (obj)
 {
 var aDistance = [];
 var i = 0;
 for (i = 0; i < this.aLi.length; i++) aDistance[i] = this.aLi[i] == obj ? Number.MAX_VALUE : this.getDistance(obj, this.aLi[i]);
 
 var minNum = Number.MAX_VALUE;
 var minIndex = -1;
 for (i = 0; i < aDistance.length; i++) aDistance[i] < minNum && (minNum = aDistance[i], minIndex = i);
 
 return this.isButt(obj, this.aLi[minIndex]) ? this.aLi[minIndex] : null
 },
 getDistance: function(obj1, obj2)
 {
 var a = (obj1.offsetLeft + obj1.offsetWidth / 2) - (obj2.offsetLeft + obj2.offsetWidth / 2);
 var b = (obj1.offsetTop + obj1.offsetTop / 2) - (obj2.offsetTop + obj2.offsetTop / 2);
 return Math.sqrt(a * a + b * b)
 },
 isButt: function (obj1, obj2)
 {
 var l1 = obj1.offsetLeft;
 var t1 = obj1.offsetTop;
 var r1 = l1 + obj1.offsetWidth;
 var b1 = t1 + obj1.offsetHeight;
 
 var l2 = obj2.offsetLeft;
 var t2 = obj2.offsetTop;
 var r2 = l2 + obj2.offsetWidth;
 var b2 = t2 + obj2.offsetHeight;
 
 return !(r1 < l2 || b1 < t2 || r2 < l1 || b2 < t1)
 },
 randomOrder: function ()
 {
 this.aPos.sort(function () {return Math.random() > 0.5 ? 1 : -1});
 for (var i = 0; i < this.aLi.length; i++)
 {
  this.aLi[i].index = i;
  this.doMove(this.aLi[i], this.aPos[i])
 }
 }
};
window.onload = function ()
{
 var aBox = $$$("box");
 var aData = [];
 var aExample = [];
 var i = 0;
 //生成图片数据
 for (i = 0; i < 20; i++) aData[aData.length] = "http://js.alixixi.com/img/mm/" + i + ".jpg";
 //循环创建多个实例
 for (i = 0; i < aBox.length; i++)
 {
 var oExample = new PhotoWall(aBox[i], aData);
 aExample.push(oExample)
 }
 this.onresize = function ()
 {
 for (var p in aExample) aExample[p].changeLayout() 
 };
 this.onresize()
};
</script>
</head>
<body>
<div class="box">
  <h2 class="title"><span>一堆90后</span><a href="javascript:;" rel="external nofollow" rel="external nofollow" class="order">随机排序</a></h2>
  <ul></ul>
</div>
<div class="box">
  <h2 class="title"><span>一堆90后</span><a href="javascript:;" rel="external nofollow" rel="external nofollow" class="order">随机排序</a></h2>
  <ul></ul>
</div>
</body>
</html>

效果:

原生js实现照片墙效果

以上就是原生js实现照片墙效果的详细内容,更多关于js 照片墙的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JS写的数字拼图小游戏代码[学习参考]
Oct 29 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
Apr 24 Javascript
JS判断是否360安全浏览器极速内核的方法
Jan 29 Javascript
js实现带有介绍的Select列表菜单实例
Aug 18 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
Dec 14 Javascript
总结JavaScript三种数据存储方式之间的区别
May 03 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
jQuery 判断元素整理汇总
Feb 28 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 Javascript
angular实现spa单页面应用实例
Jul 10 Javascript
jquery之基本选择器practice(实例讲解)
Sep 30 jQuery
详解JavaScript中的强制类型转换
Apr 15 Javascript
js轮播图之旋转木马效果
Oct 13 #Javascript
Vue中正确使用Element-UI组件的方法实例
Oct 13 #Javascript
JavaScript数组常用的增删改查与其他属性详解
Oct 13 #Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 #Javascript
JavaScript实现拖动对话框效果的实现代码
Oct 12 #Javascript
react的hooks的用法详解
Oct 12 #Javascript
微信小游戏中three.js离屏画布的示例代码
Oct 12 #Javascript
You might like
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
jQuery实现tab标签自动切换的方法
2015/02/28 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
Python内置函数dir详解
2015/04/14 Python
20招让你的Python飞起来!
2016/09/27 Python
Python简单读取json文件功能示例
2017/11/30 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
python模块smtplib学习
2018/05/22 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
python字符串格式化方式解析
2019/10/19 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
《童年》教学反思
2014/02/18 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
初中生操行评语大全
2014/04/24 职场文书
小学重阳节活动总结
2015/03/24 职场文书
幽灵公主观后感
2015/06/09 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python