zoukankan      html  css  js  c++  java
  • js实现照片墙效果

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

    首先,我们需要简单的结构处理图片,为了方便操作,引用了一个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>

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

  • 相关阅读:
    Java Web系统经常使用的第三方接口
    ExtJS笔记--applyTo和renderTo的差别
    ORACLE触发器具体解释
    java多线程样例
    RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)
    排序——选择排序
    常见hash算法的原理
    jdk和jre是什么?都有什么用?(转帖)
    Ubuntu下deb包的安装方法
    參加《全流程全要素的研发项目管理》培训记录与心得
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/9588672.html
Copyright © 2011-2022 走看看