在實際開發中,經常會遇到圖片排序處理的問題,進過多次嘗試,我在這里總結兩種圖片水平排序的方式:
第一種:CSS屬性直接設置圖片樣式
具體是使用CSS中的column-count屬性,給圖片的外部box設置后,里面的img可以直接根據數量來進行排序
頁面效果就是以下這樣:

html和css代碼如下:


可能細心的你會發現,但是這個屬性可以進行水平對齊,但是排序會出現問題,所以應用場景有限,但是優勢也很明顯,就是省事(*^▽^*)。
第二種:使用js代碼來動態進行設置
原理是通過一個數學邏輯來對圖片進行計算,假設我們需要把4張大小不同的圖片進行水平瀑布流對齊,我們需要先計算好所有圖片的高寬比,然后給一個統一的高度,根據這個統一的高度進行排序,我們可以獲得一個長方形,
這個長方形也是有寬高比的,我們把它計算出來,然后將寬度調整為頁面寬度,那么這個時候高度我們自需要調整寬高比就可以確定,根據這個調整好的高度,我們再根據4張圖片的寬高比,來獲取這個時候的寬度,對圖片進行排序即可。
案例如下:
第一張圖片:400*300,寬高比為4:3
第二張圖片:500*100,寬高比為5:1
第三張圖片:200*500,寬高比為2:5
第四張圖片:200*100,寬高比為2:1
我們首先確定一個高度,這里設定為300
那么總的長方形寬度為2620,
這個長方形的寬高比為131:15
接下來我們需要獲取頁面寬度,這里以1920為例,
那么安裝這個比例來調整總長方形,它的高度為219.84,這里小數點兩位后的可以直接舍棄,從頁面顯示來看無關痛癢
那么安裝這個高度,我們再反推4張圖片的寬度為:
第一張圖片:293.12*219.84
第二張圖片:1099.2*219.84
第三張圖片:87.963*219.84
第四張圖片:439.68*219.84
這四張圖片的總寬度為:1919.963
根據這個邏輯來設置js代碼,對所有的圖片進行分組,在分組中進行這樣的操作,就可以實現圖片水平瀑布流布局,代碼設計的好,可以兼容所有寬度,一切隨心所欲,但缺點也是有的,就是麻煩,麻煩,麻煩,而且考慮到這套邏輯實現,
對內存的占用量較大,對懶加載也很不友好,需要改邏輯才可以兼容欄加載和圖片緩存︿( ̄︶ ̄)︿。
這里提供一個案例dome給大家進行觀看和調試
http://www.linheng.xyz/project/sppbl/index.html
效果如下(具備簡單的懶加載功能):

主要代碼如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>水平瀑布流懶加載</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
h1 {
text-align: center;
}
.box {
overflow: auto;
/* width:80%; */
border: 1px black solid;
margin: 0 auto;
}
.box img {
float: left;
display: block;
}
</style>
<body>
<h1>水平瀑布流</h1>
<div class="box"></div>
</body>
<script>
var box = document.getElementsByClassName("box")[0];
var imglist = [];
var img,
length = 0,
count = 0,
line = 3;
// console.log(box);
var maxwidth = window.innerWidth - 100;
box.style.width = maxwidth + "px";
addimg(20);
function fomate() {
var row = Math.floor(length / line);
// console.log(row);
for (var i = 0; i < row; i++) {
var w = 0; //每行的寬度和
for (var j = 0; j < line; j++) {
if (imglist[i * line + j].prop != undefined) {
w += imglist[i * line + j].prop * 300; //單張圖片以300為高的寬度累加到w中
}
}
// console.log(w);
var h = 300 * maxwidth / w;
for (var j = 0; j < line; j++) {
if (imglist[i * line + j].prop != undefined) {
imglist[i * line + j].style.height = h + "px";
imglist[i * line + j].style.width = h * imglist[i * line + j].prop + "px";
}
}
}
}
window.onresize = function () {
maxwidth = window.innerWidth - 100;
box.style.width = maxwidth + "px";
fomate();
}
window.onscroll = function () {
var scroll = document.documentElement.scrollTop;
var screen = window.innerHeight;
var offsetTop = box.offsetTop;
var height = box.offsetHeight;
if (scroll + screen - offsetTop - height > -20) {
addimg(20);
}
;
}
function addimg(i) {
length += i;
// console.log(length);
for (var i = 1; i <= 20; i++) {
img = createimg("img/pics (" + i + ").jpg", box);
imglist.push(img);
// console.log(imglist.length);
}
}
function createimg(src, pad) {
//創建圖片的方法
var length = 20;
count = 0;
var img = document.createElement("img");
img.src = src;
pad.appendChild(img);
img.onload = function () {
this.prop = this.width / this.height;
count++;
// console.log(count);
if (count == length) {
fomate();
}
}
return img;
}
</script>
</html>
以上是我總結出的兩種方法,如果有更好的方法,歡迎你在評論進行補充ヾ(◍°∇°◍)ノ゙。
