本次要实现的是一个照片墙的效果,如下图,很多图片随机的摆放在窗口中,当点击到某一张的时候,该张图片出现出现在窗口的水平垂直居中的位置。

首先,我们需要简单的结构处理图片,为了方便操作,引用了一个js库:underscore.js,因为图片的数量是不固定的,这里我们采用动态添加的方式生成li,再在li里面添加图片。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
border: none;
list-style: none;
} html, body, ul{
width: 100%;
height: 100%;
} #ps{
position: relative;
} #ps li{
width: 250px;
height: 360px;
box-shadow: 0 0 10px #000;
}
</style>
</head>
<body>
<ul id="ps"></ul>
<script src="js/Underscore-min.js"></script>
<script>
window.onload = function () {
var ps = document.getElementById("ps"); //动态创建li标签
for(var i=0; i<10; i++){
//创建li标签
var li = document.createElement("li");
ps.appendChild(li); //创建img标签
var img = document.createElement("img");
img.src = "images/pic" + (i + 1) + ".jpg";
li.appendChild(img);
}
}
</script>
</body>
</html>

此时是这种常规的li列表形式,我们需要让他们随机的出现在屏幕上,就需要使用定位处理,定位后的位置通过随机数产生,在随机分布前,还需要计算出可分布的范围。

//获取所有的li
var allLis = ps.children;
var screenW = document.documentElement.clientWidth - 250;
var screenH = document.documentElement.clientHeight - 360;
//遍历
for(var j=0; j<allLis.length; j++){
  //取出单个li标签
  var li = allLis[j];
  //随机分布
  li.style.left = _.random(0, screenW) + 'px';
  li.style.top = _.random(0, screenH) + 'px';
  //随机角度
  li.style.transform = 'rotate(' + _.random(0, 360) +'deg)';
}

最后就添加点击事件了,当点击到某张图片时,该图片出现在屏幕居中位置,且层级最高,这里也是用css产生的效果,需要注意的是,前面的位置参数是通过js生成的,属于行内样式,所以在css的样式中,我们需要添加!important

#ps li.current{
  left: 50% !important;
  top: 50% !important;
  transform: rotate(0deg) translate(-50%, -50%) scale(1.2, 1.2) !important;
  z-index: 99;
}
//点击事件
li.onclick = function () {
  for(var i = 0; i<allLis.length; i++){
    allLis[i].className = '';
  }
  this.className = 'current';
}

至此,我们就实现了最开始想要的目标效果了,完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
border: none;
list-style: none;
} html, body, ul{
width: 100%;
height: 100%;
} #ps{
position: relative;
} #ps li{
width: 250px;
height: 360px;
box-shadow: 0 0 10px #000; position: absolute; transition: all 1s;
} #ps li.current{
left: 50% !important;
top: 50% !important;
transform: rotate(0deg) translate(-50%, -50%) scale(1.2, 1.2) !important;
z-index: 99;
}
</style>
</head>
<body>
<ul id="ps"></ul>
<script src="js/Underscore-min.js"></script>
<script>
window.onload = function () {
var ps = document.getElementById("ps"); //动态创建li标签
for(var i=0; i<10; i++){
//创建li标签
var li = document.createElement("li");
ps.appendChild(li); //创建img标签
var img = document.createElement("img");
img.src = "images/pic" + (i + 1) + ".jpg";
li.appendChild(img);
} //获取所有的li
var allLis = ps.children; var screenW = document.documentElement.clientWidth - 250;
var screenH = document.documentElement.clientHeight - 360; //遍历
for(var j=0; j<allLis.length; j++){
//取出单个li标签
var li = allLis[j]; //随机分布
li.style.left = _.random(0, screenW) + 'px';
li.style.top = _.random(0, screenH) + 'px'; //随机角度
li.style.transform = 'rotate(' + _.random(0, 360) +'deg)'; //点击事件
li.onclick = function () {
for(var i = 0; i<allLis.length; i++){
allLis[i].className = '';
}
this.className = 'current';
}
}
}
</script>
</body>
</html>

下载完整详细代码:点这里

js实现照片墙效果的更多相关文章

  1. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  2. 用js实现动画效果核心方式

    为了做好导航菜单,有时候需要在菜单下拉的时候实现动画效果,所以这几天就研究了研究如何用js实现动画效果,实现动画核心要用到两个函数,一个是setTimeOut,另一个是setInterval. 下边我 ...

  3. js拖拽效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 原生JS实现分页效果2.0(新增了上一页和下一页,添加当前元素样式)

    虽然写的很烂,但至少全部都是自己写的,因为这个没有固定的顺序,所以就没有封装,如果你技术好的话,可以你写的分享给我,谢谢. <!DOCTYPE html><html lang=&qu ...

  5. 原生JS实现分页效果1.0

    不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...

  6. 使用JS实现手风琴效果

    想要实现简单的手风琴切换效果,需要使用JS实现,如下是使用javascript源码实现,后续会更新使用jQuery实现. 1. 先进行简单的布局:我们可以再ul下添加几个li实现html的简单布局,再 ...

  7. 使用CSS3动画实现绚丽的照片墙效果

    临近毕业了,一大波毕业照又要来袭了!如何使用CSS3属性制作出自己的网页版照片墙呢? 闲话少说,先来看看效果图 效果要求: 1,照片要求有一定的白色边框. 2,照片都要有一定的倾斜角度. 3,鼠标移动 ...

  8. js弹窗登录效果(源码)--web前端

    1.JS弹窗登录效果 <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  9. 原生JS实现弹幕效果

    纯属无聊写的,可能有很多问题,欢迎批评指教. 效果图:图一是预设的一些弹幕,图二是自己发射的弹幕,效果是一样的.   首先是弹幕的位置,是要从最右滑到最左,为了防止随机高度弹幕会覆盖的问题,设置了通道 ...

随机推荐

  1. int &p

    int &p为引用,而int p为定义变量.二者区别如下:1 引用在定义的时候必须赋值,否则编译会出错.正确的形式为int &p = a;其中a为int型变量.2 引用在定义时不会分配 ...

  2. 【BZOJ2120】数颜色

    看代码学习好,好学好懂好ac 原题: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中 ...

  3. gdb入门

    下面是我自己写的一个测试用例 a.c #include<stdio.h> int add(int a,int b){ return a+b; } int main(){ int n=add ...

  4. windows知识

    文章目录 系统 修改远程桌面的端口号 IE选项中reset web setting不可用(灰色)的解决办法 重装系统后,修改默认程序安装目录.我的文档.桌面 路径 Keep network addre ...

  5. tailor multi fragment && cutom-amd script demo 说明

    tailor 官方demo 中提供了一个multi fragment 的demo,这个比较简单,就是使用不同的 后端server 做为fragment ,然后使用 html tag 进行加载就可以了. ...

  6. cocos2d-x游戏开发 跑酷(三) 人物跑动

    原创.转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21245881 好吧.最终要跑起来了. 要实现跑酷须要用到帧动画,什么是帧动画,不 ...

  7. Ubuntu安装时怎样分区

    1./swap交换分区,一般为你机器内存的两倍.少于这个容量.系统无法进入休眠. 实质是硬盘上的交换空间而非分区.所以没有格式,默认休眠将数据储存于此 能够取消(如不用swap必须再设定方可休眠)-- ...

  8. jQuery -> 基于当前元素的遍历

    版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/FeeLang/article/details/26257549 假设我们已经通过jQuery方法选中了一组元 ...

  9. JSON数据的优化

    JSON数据的可以优化吗?肯定可以,之前都是使用XML,但之后用XML越来越少了,就是因为XML包含的冗余信息太多了.那么JSON数据有没有冗余呢? 肯定有,名称就是重复的!! 例如如下的JSON数据 ...

  10. 编写一个函数 reverse_string(char * string)实现:将参数字符串中的字符反向排列 。(递归实现)

    要求:不能使用C函数库中的字符串操作函数. 思路:在递归函数的调用时,先应该定义一个指针型char字符串.函数内部应先调用自己,在打印,这样才能保证字符串是从最后一个开始输出. #include< ...