原理是經過一個數學邏輯來對圖片進行計算,假設咱們須要把4張大小不一樣的圖片進行水平瀑布流對齊,咱們須要先計算好全部圖片的高寬比,而後給一個統一的高度,根據這個統一的高度進行排序,咱們能夠得到一個長方形,ui
這個長方形也是有寬高比的,咱們把它計算出來,而後將寬度調整爲頁面寬度,那麼這個時候高度咱們自須要調整寬高比就能夠肯定,根據這個調整好的高度,咱們再根據4張圖片的寬高比,來獲取這個時候的寬度,對圖片進行排序便可。this
根據這個邏輯來設置js代碼,對全部的圖片進行分組,在分組中進行這樣的操做,就能夠實現圖片水平瀑布流佈局,代碼設計的好,能夠兼容全部寬度,一切爲所欲爲,但缺點也是有的,就是麻煩,麻煩,麻煩,並且考慮到這套邏輯實現,
<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>