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>

下載完整詳細代碼:點這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM