瀑布流代码PHP,js实现图片瀑布流的两种方式(附代码)

ad502fc9f2697e9fa1d8010a3994df6a.png

什么是图片瀑布流

用一张花瓣网页的图片布局可以很清楚看出图片瀑布流的样子:

b28c4faa6cf683723757d4b064c780f5.png

简单来说,就是有很多图片平铺在页面上,每张图片的宽度相同,但是高度不同,这样错落有致的排列出 n 列的样子很像瀑布,于是就有了瀑布流图片一说。

实现原理

1、第一种方式第一种方式前提是:图片的宽度固定,但是列可变(根据屏幕大小)

通过上面的介绍,我们知道要实现瀑布流的前提是宽度一致(假如为100px),高度可以不相同。

我们首先确定排布的列数(假如为4列),那么第一行只能放4张图片,然后将每个图片的高度放入一个数组中(假如为 heightArr = [100,50, 200,30]),当我们在放入下一张图片的时候就要判断这个数组中哪个高度是最小的(这里是30),然后还要知道最小的高度所在高度数组的索引(这里是i = 3),然后我们就可以对这张图片进行定位:{

position: absolute;

left: i*100 + 'px';

top: 30 + 'px'

}

如此遍历剩下的图片即可。

实现代码

下面是未处理的原始代码,图片之间间隔很多空白,影响美观。

Document

.box {

position: relative;

}

img {

width: 200px;

vertical-align: top;

padding: 5px;

}

47e56b87daf03ee53ce49757f8f5aecd.png

下面是处理后的代码:

Document

.box {

position: relative;

}

img {

width: 200px;

vertical-align: top;

padding: 5px;

}

$(function () {

// 获取图片的宽度(200px)

let imgWidth = $('img').outerWidth(); // 200

waterfallHandler();

// 瀑布流处理

function waterfallHandler() {

// 获取图片的列数

let column = parseInt($(window).width() / imgWidth);

// 高度数组

let heightArr = [];

for(let i=0; i

heightArr[i] = 0;

}

// 遍历所有图片进行定位处理

$.each($('img'), function (index, item) {

// 当前元素的高度

let itemHeight = $(item).outerHeight();

// 高度数组最小的高度

let minHeight = Math.min(...heightArr);

// 高度数组最小的高度的索引

let minIndex = heightArr.indexOf(minHeight);

$(item).css({

position: 'absolute',

top: minHeight + 'px',

left: minIndex * imgWidth + 'px'

});

heightArr[minIndex] += itemHeight;

});

}

// 窗口大小改变

$(window).resize(function () {

waterfallHandler();

});

});

3b9cf41268c3661e6195423548a17137.gif

2、第二种方式第二种方式前提是:列是固定的个数,然后图片根据屏幕的宽度进行自适应缩放。

这种方式由于图片是可以缩放的,宽高不好确定,因此不好用定位的方式处理。

我们可以这样处理,既然知道了列,那么每一列做一个容器。然后遍历图片,将图片放入容器高度最小的容器中即可。这里我们使用js来添加图片,而不是事先写好在html中了。

实现代码

Document

* {

margin: 0;

padding: 0;

}

ul li {

list-style: none;

float: left;

}

$(function () {

const COLUMN = 4; // 4列

let arr = []; // 存储4列li

let minHeight = [] // 存储4列的高度

create();

function create() {

// 创建ul li作为每一列的容器

$("

for (let i = 0; i < COLUMN; i++) {

var li = document.createElement("li");

$(li).appendTo($("ul"))

.css({

"width": "24%",

"margin": "0 0.5%"

});

arr.push(li);

// console.log(arr);

minHeight.push(0);

}

createImg();

}

function createImg() {

let img = new Image();

img.num = 2;

img.src = `./images/img/${img.num}-.jpg`; // 素材图片的规律为 2-.jpg 3-.jpg 4-.jpg ...

$(img).css("width", "100%");

// 当图片加载完后

$(img).on("load", loadHandler);

}

function loadHandler() {

// 高度数组的最小值

let min = Math.min.apply(null, minHeight);

// 高度数组的最小值索引

let minIndex = minHeight.indexOf(min);

// 克隆一份图片

let im = this.cloneNode(true);

// 将图片假如对应最小值索引的容器中

arr[minIndex].append(im);

// 更新最小值索引的容器的高度

minHeight[minIndex] += im.getBoundingClientRect().height;

this.num++;

// 图片的个数只有79张

if (this.num > 79) {

$(this).off("load", loadHandler);

return;

}

this.src = `./images/img/${this.num}-.jpg`;

}

});

d42a8523dea6c592d2d9ce7161adfa8b.gif

本文来自 js教程 栏目,欢迎学习!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Hbuilder 中实现图片瀑布流,可以使用循环代码结合 CSS 样式来实现。具体步骤如下: 1. 在 HTML 文件中创建一个容器,用于存放瀑布流中的图片,如下所示: ``` <div class="waterfall-container"> <!-- 这里用循环代码动态生成图片 --> </div> ``` 2. 在 CSS 文件中设置容器的样式,包括宽度、边距等: ``` .waterfall-container { width: 100%; margin: 0 auto; } ``` 3. 在 JavaScript 文件中使用循环代码动态生成图片,并为图片设置样式,包括宽度、高度、边距等。具体代码如下: ``` // 图片数据,用于循环生成图片 var imgData = [ "image1.jpg", "image2.jpg", "image3.jpg", // ...更多图片地址 ]; // 循环生成图片 for (var i = 0; i < imgData.length; i++) { var imgSrc = imgData[i]; var img = document.createElement("img"); img.src = imgSrc; // 设置图片样式 img.style.width = "100%"; // 图片宽度 img.style.height = "auto"; // 图片高度自适应 img.style.margin = "10px"; // 图片边距 // 将图片添加到容器中 document.querySelector(".waterfall-container").appendChild(img); } ``` 4. 最后,为了实现瀑布流的效果,可以使用 CSS 的 column-count 属性,将容器中的图片分成多列。具体代码如下: ``` .waterfall-container { width: 100%; margin: 0 auto; column-count: 3; /* 将容器中的图片分成 3 列 */ column-gap: 20px; /* 列与列之间的间距 */ } ``` 以上就是使用循环代码在 Hbuilder 中实现图片瀑布流的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值