您现在的位置是:网站首页> 编程资料编程资料
HTML+CSS+JS实现图片的瀑布流布局的示例代码3种方式实现瀑布流布局小结小程序瀑布流解决左右两边高度差距过大的问题css3 column实现卡片瀑布流布局的示例代码HTML5 canvas 瀑布流文字效果的示例代码用CSS3实现瀑布流布局的示例代码CSS3实现瀑布流布局与无限加载图片相册的实例代码CSS3使用多列制作瀑布流css和js实现瀑布流效果示例HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2021-08-30
1605人已围观
简介 这篇文章主要介绍了HTML+CSS+JS实现图片的瀑布流布局的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言
瀑布流布局简而言之就是类似瀑布流的布局嘛,这么一讲大家可能还是不是了解的很明白,来来来,那现在我给大家上一个常见的实例:

相信大家在百度上搜索图片时的时候,网页图片的布局就是这样子的吧,什么?你还是不清楚瀑布流,那咱就再我看一个那没关系,淘宝大家应该再熟悉不过了吧!

我们可以发现图中每个商品框的高度不同的,因此导致我们的商品图片的高度布局都不在一个高度上。在百度搜索图片的时候我们发现每张图片的宽度都是不一样的那为什么所用图片的宽度它能刚刚好的占满一行呢?
这就是我今天今天教大家的布局方式——waterfall 布局,那该怎么实现呢?那我们就不多说啦,直接上干货!
一、总体效果
瀑布流的搭建完的效果如下:
二、HTML+CSS简单布局
首先大家在网上搜索一些图片或者用一下自己喜欢的图片均可,用html搭建好框架网页的框架将图片存放好,我们这里使用的了20张图为例。其次使用html+css实现一个简单的布局,这有个关键的步骤:我们对比上面百度和淘宝页面的瀑布流布局就不难发现,要实现瀑布流所有图片都得有个相同的高度或者高度。因此我们这就给所用照片设置一个固定的宽度,但不限定的图片的高度保证每图片都按其原始比例完整展示出来。
HTML,CSS代码如下:
css代码
*{ margin: 0; padding: 0; } #container{ position: relative; } .box{ float: left;/* 给每个存放照片box设置为浮动元素,让所有的图片浮动到网页的第一行*/ padding: 5px; } .box-img{ width: 150px; padding: 5px; border: 1px solid #ccc; box-shadow: 0 0 5px #ccc; border-radius: 5px; } .box-img img { width: 100%; height: auto; }html代码
js 瀑布流
html和css修饰后的网页的效果是怎样的的呢?

我们给每个盒子都使用了一个float:left属性,让图片脱离文档来到网页的最上端,但是图片过多时有部分图片被挤到了第二行,可是他们并没有像我们设想的那样像瀑布式的排列,那我们该怎么实现呢,这时我们的的JS就要派上用场啦。
三、JS实现后续布局
通过js实现将第一行后的图片排列在紧凑的排列在每一列中
代码如下代码(附带有详细注释):
window.onload = function() { imgLocation('container', 'box') } // 获取到当前有多少张图片要摆放 function imgLocation(parent, content) { // 将containerd下所有的内容全部取出 var cparent = document.getElementById(parent) //获取container盒子的标签 var ccontent = getChildElemnt(cparent, content)//图片时放在container盒子里的box盒子里的,因此我们还需要定义一个函数getChildElemnt()获取出box里的图片 var imgWidth = ccontent[0].offsetWidth//获取css中我们给每张图片设置的固定宽度 var num = Math.floor(document.documentElement.clientWidth / imgWidth) //获取浏览器body的宽度计算最多能放几张我们的图片 cparent.style.cssText = `width: ${imgWidth * num} px` //摆放图片 var BoxHeightArr = [] for (var i = 0; i < ccontent.length; i++) { if (i < num) { //我们先将第一行摆满 BoxHeightArr[i] = ccontent[i].offsetHeight //这里我们通过BoxHeightArr[]数组存放每列的高度 } else { //剩下的图片我们依次次优先选择摆在高度最低的一列后面 var minHeight = Math.min.apply(null, BoxHeightArr) //通过将Math.min()中求最小值的方法应用到数组中,求出高度最低的列 var minIndex = getMinHeightLocation(BoxHeightArr, minHeight) //确定了高度最低的列后我们就差求出列的位置了,我们通过编写一个函数实现 //最后将我们的图片相对于container盒子进行定位放在每一列下就可以啦 ccontent[i].style.position = 'absolute' ccontent[i].style.top = minHeight +'px' ccontent[i].style.left =ccontent[minIndex].offsetLeft + 'px' //最后不忘记跟新每一列的高度哦 BoxHeightArr[minIndex] =BoxHeightArr[minIndex] + ccontent[i].offsetHeight } } // console.log(BoxHeightArr); } function getChildElemnt(parent, content) { const contentArr = [] const allContent = parent.getElementsByTagName('*')//通过内置函数getElementsByTagName()将container中的所有元素取出来 // console.log(allContent); for (var i = 0; i < allContent.length; i++) {//但是container中所有的元素中我们只需要的是所有的img,为此我们写个for循环将所用img筛选出来存放在一个数组中 if (allContent[i].className == content) { contentArr.push(allContent[i]) } } // console.log(contentArr); return contentArr } //获取列最高度最小列的位置下标函数 function getMinHeightLocation(BoxHeightArr, minHeight) { for (var i in BoxHeightArr) { if (BoxHeightArr[i] === minHeight) { return i } } } JS算法思路及操作:
- 将所有的需要排列的图像获取出来
- 因为图片时放在container盒子里的box盒子里的,因此我们定义了一个函数getChildElemnt()获取出box的里的图片,在这个函数中通过内置函数getElementsByTagName()将container中的所有元素取出来,但是container中所有的元素中我们只需要的是所有的img,为此我们写个for循环将所用img筛选出来存放在一个我们定义的content[]数组中。
- 提取到所有图片后我们就要需要确定图片排列的位置,我们先将在第一行排满,剩下的图排列时依次排在在高度最小的列后面,为此我们在排列每张图片的时候都需要求出高度最小列以及确定其位置
通过 ccontent[0].offsetWidth (每一张图片的宽度都是一样的,因此取数组中任意元素均可)获取css中我们给每张图片设置的固定宽度,其次利用 document.documentElement.clientWidth 获取当前网页比例下浏览器的宽度,求出一行最多能整存多少张图片(即多少列),再使用for循环摆放图片,先将第一行摆满,创建BoxHeightArr[]数组存放每列的高度,将Math.min() 方法应用于 BoxHeightArr[]数组中,求出高度最低的列,创建 getMinHeightLocatio()函数获取列高度最小列的位置下标,与container div 绝对定位摆放,完成后更新每列列高,直至图片摆放完成。
总结
到此这篇关于HTML+CSS+JS实现图片的瀑布流布局的示例代码的文章就介绍到这了,更多相关HTML瀑布流内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
相关内容
- html+css+jquery模仿搜索风云榜选项卡效果有截图html5使用html2canvas实现浏览器截图的示例HTML5+CSS3模仿优酷视频截图功能示例canvas与html5实现视频截图功能示例Html5新特性用canvas标签画多条直线附效果截图HTML5在canvas中绘制复杂形状附效果截图HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)使用HTML截图并保存为本地图片的实现代码
- html+css+javascript实现列表循环滚动示例代码利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端) 用CSS3实现无限循环的无缝滚动的实例代码
- textarea文本域宽度和高度width及height自动适应实现代码如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度div模拟textarea文本域实现高度自适应效果代码css textarea 高度自适应,无滚动条做一个能自适应高度的textarea的示例代码
- HTML中div与span的区别(共同点与不同点)关于div中img,span垂直居中的问题深入理解DIV和SPAN的区别浅谈Span和Div的区别div与span的区别和使用示例DIV和SPAN垂直居中对齐的实现方法div与span之间有什么区别html的基本使用包括链接、样式表、span和div等等区别div和span、relative和absolute、display和visibilityHTML中div和span比较_动力节点Java学院整理
- HTML仿命令行界面具体实现纯html+css实现Element loading效果纯html+css实现奥运五环的示例代码HTML+CSS实现导航条下拉菜单的示例代码html+css实现滚动到元素位置显示加载动画效果纯html+css实现打字效果html+css实现环绕倒影加载特效html输入两个数实现加减乘除功能html中显示特殊符号(附带特殊字符对应表)关于html选择框创建占位符的问题html css3不拉伸图片显示效果
- 谈谈html转义字符如何通过代码识别在线HTML转义/反转义工具HTML/XML转义字符对照表HTML字符实体(Character Entities) 转义字符串(Escape Sequence)最常用的HTML转义字符 Escape Sequencehtml中常用的转义字符总结
- a标签中写有文字并有图片如何隐藏文字只显示图片纯html+css实现Element loading效果纯html+css实现奥运五环的示例代码HTML+CSS实现导航条下拉菜单的示例代码html+css实现滚动到元素位置显示加载动画效果纯html+css实现打字效果html+css实现环绕倒影加载特效html输入两个数实现加减乘除功能html中显示特殊符号(附带特殊字符对应表)关于html选择框创建占位符的问题html css3不拉伸图片显示效果
- Html 元素隐藏的几种方式纯html+css实现Element loading效果纯html+css实现奥运五环的示例代码HTML+CSS实现导航条下拉菜单的示例代码html+css实现滚动到元素位置显示加载动画效果纯html+css实现打字效果html+css实现环绕倒影加载特效html输入两个数实现加减乘除功能html中显示特殊符号(附带特殊字符对应表)关于html选择框创建占位符的问题html css3不拉伸图片显示效果
- Html注释 Html中标记文字注释的符号【HTML 元素】标记文字详解详解HTML编程的标记与文档结构css 滤镜效果主要对HTML标记设置滤镜效果html body标签详解与html常用的控制标记 html入门教程 html标记符号快速掌握HTML5 新旧语法标记对我们有什么好处Html长文本超出标记宽度后自动截取实现代码html中的meta标记简单对照浅谈HTML中的标记
- HTML网页头部代码实例详解CSS失效怎么办?请检查网页最头部是否包含Doctype标签HTML 网页头部代码全清楚网页头部css代码优化实例网页头部优化建议










