js图片瀑布流(触底加载)

2023-11-30 05:01
文章标签 加载 图片 js 瀑布 触底

本文主要是介绍js图片瀑布流(触底加载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

html: 

    <div id="scroll-view"><div class="container"></div><!-- 结尾加载区域 --><div id="loading-block"></div></div>

css:

      #scroll-view {width: 800px;height: 800px;overflow-y: auto;background: #000;}.container {position: relative;width: 100%;}.container img {position: absolute;}#loading-block {width: 100%;height: 50px;line-height: 50px;font-size: 18px;text-align: center;color: #fff;}

js:

      let loadFinish = false // 图片是否加载完毕// 创建元素是否进入可视区域实例const obs = new IntersectionObserver((e) => {const isVisible = e[0].isIntersectingif (isVisible) {loadMore()}if (loadFinish) {// 加载完毕,移除监听obs.unobserve(document.getElementById('loading-block'))// 可以移除加载区域document.getElementById('scroll-view').removeChild(document.getElementById('loading-block'))}})obs.observe(document.getElementById('loading-block'))const option = { column: 4, space: 10 }/*** 根据外层盒子容器计算出每个图片的宽度以及间隔* @param {HTMLElement} dom 外层容器* @param {object} option* @param {number | undefined} option.column 需要几列展示* @param {number | undefined} option.space 图片间距* @param {number | undefined} option.width 图片宽度*/function calc(dom, option) {const parentWidth = dom.getBoundingClientRect().widthlet { column, space, width } = optionif (column) {// 给定列数和父级,求每张图片的宽度width = (parentWidth - (column + 1) * space) / column} else if (width && space) {// 给定图片宽度和父级dom,求可以分几列和间隔column = Math.floor(parentWidth / width)space = (parentWidth - column * width) / column + 1}return { column, space, width }}// 为图片设置位置function setPos(dom, { column, space, width }) {const pics = [...document.querySelectorAll('img')]const nextTops = Array(column).fill(space) // 保存当前每一列的下一行距离顶部的值pics.forEach((img) => {img.setAttribute('width', width + 'px')const minTop = Math.min.apply(null, nextTops) // 取最小值放置下一张图片img.style.top = minTop + 'px'const index = nextTops.indexOf(minTop)// 图片原始宽高const naturalWidth = img.naturalWidthconst naturalHeight = img.naturalHeight// 图片实际高度const realHeight = (width * naturalHeight) / naturalWidthnextTops[index] += realHeight + space // 更新距离顶部的值const x = (index + 1) * space + index * widthimg.style.left = x + 'px' // 设置当前图片left值})// 设置外层容器的高度,防止塌陷const max = Math.max.apply(null, nextTops)dom.style.height = max + 'px'}// 加载更多图片function loadMore() {console.log('loadmore')document.getElementById('loading-block').innerText = '加载中……'let timeout = setTimeout(() => {for (let index = 0; index < 20; index++) {let img = document.createElement('img')img.setAttribute('src',index % 3 == 1? './images/1.jpeg': index % 3 == 2? './images/2.jpg': './images/3.jpeg')document.querySelector('.container').appendChild(img)}init()document.getElementById('loading-block').innerText = ''// 加载完毕if (document.querySelector('.container').childNodes.length >= 60) {loadFinish = true}clearTimeout(timeout)}, 1000)}function init() {const dom = document.querySelector('.container')const newOption = calc(dom, option)const { column, space, width } = newOptionsetPos(dom, { column, space, width })}

这篇关于js图片瀑布流(触底加载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/435722

相关文章

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

利用Python将PDF文件转换为PNG图片的代码示例

《利用Python将PDF文件转换为PNG图片的代码示例》在日常工作和开发中,我们经常需要处理各种文档格式,PDF作为一种通用且跨平台的文档格式,被广泛应用于合同、报告、电子书等场景,然而,有时我们需... 目录引言为什么选择 python 进行 PDF 转 PNG?Spire.PDF for Python

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码