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

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(