<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html, body {
background: #000;
}
.wrap-wrap {
position: absolute;
top: 100px;
left: 600px;
width: 700px;
height: 500px;
background-color: wheat;
}
#wrap {
position: absolute;
top: 20px;
left: 30px;
width: 500px;
height: 100px;
background: #fff;
margin: 0 auto;
}
#wrap div {
position: absolute;
}
</style>
</head>
<body>
<div class="wrap-wrap">
<div id="wrap"></div>
</div>
<script src="./jquery3.6.0.js"></script>
<script>
function pubu ($wrap, $items, margin_left, margin_top) {
margin_left = margin_left || 0
margin_top = margin_top || 0
var parent_width = $wrap.width()
var child_width = $items.eq(0).outerWidth()
// 可以放几列
var max_column = Math.floor(parent_width / (child_width + margin_left))
// 每一列的left值
var column_pos = []
for (var i = 0; i < max_column; i++) {
var cur_left = (child_width + margin_left) * i
column_pos.push(cur_left)
}
// 遍历设置位置, 插入DOM
$items.each(function (index, item) {
var $item = $(item)
var $childrens = $wrap.children()
// 第一列的位置顺序插入即可
if ($childrens.length < max_column) {
$item.css({
left: column_pos[index],
top: 0
})
$wrap.append($item)
return
}
// --- 第二列开始要判断高度
// 取出所有列最后一项的高度
var column_heights = []
$childrens.each(function (child_index, child_item) {
var $child_item = $(child_item)
var pos = $child_item.position()
var left = pos.left
var top = pos.top
// 判断是这是哪一列
var column_num = 0
for (var i = 0, len = column_pos.length; i < len; i++) {
if (left == column_pos[i]) {
column_num = i
break
}
}
var pre_height = column_heights[column_num] || 0
var cur_height = top + $child_item.outerHeight()
column_heights[column_num] = Math.max(pre_height, cur_height)
})
// 取出目标位置的left和top, top是column_heights里最小的那一项
var target_top = column_heights[0]
var target_left = column_pos[0]
for (var i = 1, len = column_heights.length; i < len; i++) {
var cur_h = column_heights[i]
if (cur_h < target_top) {
target_top = cur_h
target_left = column_pos[i]
}
}
// 设置位置
$item.css({
top: (target_top + margin_top) + 'px',
left: target_left + 'px'
})
// 追加
$wrap.append($item)
})
}
</script>
<script>
var colors = [
'#374151',
'#B91C1C',
'#B45309',
'#047857',
'#1D4ED8',
'#4338CA',
'#6D28D9',
'#BE185D',
]
function randomNum(minNum,maxNum){
switch(arguments.length){
case 1:
return parseInt(Math.random()*minNum+1,10);
break;
case 2:
return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
break;
default:
return 0;
break;
}
}
var $items = $()
for (var i = 1; i <= 20; i++) {
var $div = $(`<div>${i}</div>`)
var height = randomNum(50, 200) + 'px'
$div.css({
width: '68px',
height: height,
background: colors[randomNum(0, 7)],
color: '#fff',
textAlign: 'center',
lineHeight: height,
border: '1px solid #000'
})
$items = $items.add($div)
}
pubu($('#wrap'), $items, 10, 10)
</script>
</body>
</html>