最終效果以下:
css
思路分析:
html
咱們有不少圖片,設置相同的寬度,高度不作設置,後面自動獲取。
當對全部圖片浮動後,圖片會自動換行排列。數組
瀑布流:對圖片進行設置,進行一個最優的排列。如上圖所示,當一行排列完成後,後續的圖片該如何排列?瀏覽器
這裏有,對後續圖片進行處理,找出圖片高度最小的那張圖片,將它排列到第一行(上一列高度最小的那一列)。
這裏圖片7最小,將它放置到圖片1下面。以下所示:
app
上圖組成新的一行,圖片3爲高度最小那一列,重複操做,將後續圖片最小放置到圖片3下。
佈局
一直循環,直至全部圖片排列結束。完成瀑布流樣式佈局。3d
具體代碼以下:
html部分代碼,圖片能夠放不少張。
htm
css代碼:blog
<style type="text/css"> *{ margin: 0; padding: 0; } .box{ position: relative; } .box>div{ float: left; padding: 5px; } .pic img{ border: 1px solid silver; padding: 5px; width: 167px; border-radius: 10px; } </style>
js代碼:索引
`//讓圖片加載完成在執行JS代碼 方便93行 打印每張照片的高度 window.onload=function(){ // 獲取元素 //獲取全部圖片 var pic=document.querySelectorAll(".pic"); //獲取大盒子 由於要box容器居中 var box=document.querySelector(".box"); ``` //求出單個pic元素的寬度 var picWidth=pic[0].offsetWidth; // console.log(picWidth);作的習慣打印,看看是否是正確 //求出瀏覽器的寬度 var screenWidth=document.body.offsetWidth; // console.log(screenWidth); //求出一行能夠放多少列 var cols=Math.floor(screenWidth/picWidth); // console.log(cols);6 //給box容器設置寬度 box.style.width=cols*picWidth+"px"; // console.log(box.offsetWidth); //讓main容器在頁面中水平居中 box.style.margin="0 auto"; //對第二行圖片進行設置 將第一張定位到第一行高度最小的位置 //使用數組保存第一行元素的高度 var arrHeight=[]; for(var i=0;i<pic.length;i++){ //定義一個變量 用來表示每一個圖片的高度 var picHeight=pic[i].offsetHeight; // console.log(picHeight); //若是小於第一行6張照片 if(i<cols){ //把高度儲存到定義的數組中 arrHeight.push(picHeight); // console.log(arrHeight); }else{ //找出除第一行外其餘圖片中高度最小的 並賦值給minHeightbox var minHightbox= Math.min.apply(" ",arrHeight); // console.log(minHightbox) //z最矮元素高度的索引 是第幾張 var minIndex=getMinIndex(arrHeight,minHightbox); //定位 pic[i].style.position="absolute"; //設置pic[i]的top值 pic[i].style.top = minHightbox + "px"; //設置pic[i]的left值 pic[i].style.left = picWidth * minIndex + "px"; //更新最矮元素的高度 arrHeight[minIndex]+=picHeight; } }//循環到這裏 //獲取下標方法 function getMinIndex(arr, val){ for(var j=0; j<arr.length; j++){ if(arr[j] === val){ return j; } } // console.log(j); // 第六張最小 } }`