原生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 相关文章推荐
ajax 缓存 问题 requestheader
Aug 01 Javascript
基于jQuery的公告无限循环滚动实现代码
May 11 Javascript
js获取URL的参数的方法(getQueryString)示例
Sep 29 Javascript
JS中的构造函数详细解析
Mar 10 Javascript
IE6已终止操作问题的2种情况及解决
Apr 23 Javascript
Node.js中require的工作原理浅析
Jun 24 Javascript
javascript批量修改文件编码格式的方法
Jan 27 Javascript
微信支付如何实现内置浏览器的H5页面支付
Sep 25 Javascript
浅谈关于angularJs中使用$.ajax的注意点
Aug 12 Javascript
详解vue路由篇(动态路由、路由嵌套)
Jan 27 Javascript
一文帮你理解PReact10.5.13源码
Apr 03 Javascript
TypeScript 使用 Tuple Union 声明函数重载
Apr 07 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 高级课程笔记 面向对象
2009/06/21 PHP
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
js图片延迟加载(Lazyload)三种实现方式
2017/03/01 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
django Serializer序列化使用方法详解
2018/10/16 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
python selenium循环登陆网站的实现
2019/11/04 Python
使用python turtle画高达
2020/01/19 Python
django admin 添加自定义链接方式
2020/03/11 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
Python自省及反射原理实例详解
2020/07/06 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
银行实习人员自我鉴定
2013/09/22 职场文书
法律六进活动方案
2014/03/13 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
起诉书格式范文
2015/05/20 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
解决 redis 无法远程连接
2022/05/15 Redis