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

相关文章

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放