jQuery實現瀑布流布局
核心思路:用數組存取每一列li的高度,每次添加li都往最小高度那一列上添加,每添加一個li就把它的高度加給最小高度
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> * { margin: 0; padding: 0; list-style: none; } ul { margin: 0 auto; position: relative; } ul li { width: 300px; position: absolute; } ul li img { width: 100%; } </style> </head> <body> <ul></ul> </body> <script src="//cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $.ajax({//請求數據 url: '//rap2.taobao.org:38080/app/mock/257210/json',//請求地址 dataType: 'JSON'//請求數據類型 }).done(a => {//請求成功 a = a.data const teep = 10,//每個li之間的間隙 width = 300,//每個li的寬度,存起來方便以後使用 cols = Math.floor(($(document).innerWidth()) / (width + teep)),//計算圖片列數 list = $('ul')[0].children,//動態獲取ul下的子元素 hh = [] //存取每一列的高度 let num = 0//存取圖片載入完成數量 $('ul').css('width', cols * (width + teep))//設置ul寬度 $(a).each((index, item) => { //遍曆數據 $('<li>').html(`<img src="${item.src}">`).appendTo('ul')//創建li }) $(list).find('img').on('load', function() {//圖片載入完成 num++//每載入完成一張圖片就加1 if(num==$(list).length){//圖片全部載入完成,開始設置每個li的坐標 $(list).each((index,item)=>{//遍歷li if (index < cols) {//設置第一行li的坐標 $(list).eq(index).css({ left: (width + teep) * index, top: teep }) hh.push($(list).eq(index).height() + teep*2)//添加第一行每一列li的高度到數組hh } else {//設置其它li的坐標 let minHeight = Math.min(...hh)//獲取最小高度 let minIndex = hh.indexOf(minHeight)//獲取最小高度的索引 $(list).eq(index).css({ left: (width + teep) * minIndex, top: minHeight }) hh[minIndex]+=$(list).eq(index).height()+teep//更新最小高度 } }) } }) }) </script> </html>