JS를 사용하여 Waterfall Flow 플러그인을 구현하는 방법
이 글에는 네이티브 JS 워터폴 플러그인에 대한 자세한 분석과 코드 관련 설명이 나와 있으니 관심 있는 독자분들은 참고하시기 바랍니다.
폭포 흐름 레이아웃의 그림에는 동일한 너비와 가변 높이라는 핵심 기능이 있습니다. 폭포 흐름 레이아웃은 Pinterest, Huaban.com 등과 같은 국내 웹사이트에서 특정 규모로 사용됩니다. 그런 다음 이 기능을 기반으로 폭포 흐름 탐색 여정을 시작합니다.
기본 함수 구현
먼저 20개의 그림이 포함된 컨테이너를 정의합니다.
<body> <style> #waterfall { position: relative; } .waterfall-box { float: left; width: 200px; } </style> </body> <p id="waterfall"> <img src="images/1.png" class="waterfall-box"> <img src="images/2.png" class="waterfall-box"> <img src="images/3.png" class="waterfall-box"> <img src="images/4.png" class="waterfall-box"> <img src="images/5.png" class="waterfall-box"> <img src="images/6.png" class="waterfall-box"> ... </p> 由于未知的 css 知识点,丝袜最长的妹子把下面的空间都占用掉了。。。 接着正文,假如如上图,每排有 5 列,那第 6 张图片应该出现前 5 张图片哪张的下面呢?当然是绝对定位到前 5 张图片高度最小的图片下方。 那第 7 张图片呢?这时候把第 6 张图片和在它上面的图片当作是一个整体后,思路和上述是一致的。代码实现如下: Waterfall.prototype.init = function () { ... const perNum = this.getPerNum() // 获取每排图片数 const perList = [] // 存储第一列的各图片的高度 for (let i = 0; i < perNum; i++) { perList.push(imgList[i].offsetHeight) } let pointer = this.getMinPointer(perList) // 求出当前最小高度的数组下标 for (let i = perNum; i < imgList.length; i++) { imgList[i].style.position = 'absolute' // 核心语句 imgList[i].style.left = `${imgList[pointer].offsetLeft}px` imgList[i].style.top = `${perList[pointer]}px` perList[pointer] = perList[pointer] + imgList[i].offsetHeight // 数组最小的值加上相应图片的高度 pointer = this.getMinPointer(perList) } }
주의 깊은 친구들은 offsetHeight
속성이 코드에서 그림의 높이를 얻는 데 사용된다는 것을 발견했을 것입니다. 이는 속성 높이의 합이 이미지 높이 + 패딩 + 테두리
와 동일하기 때문에 이미지 사이의 거리를 설정하기 위해 여백 대신 패딩을 사용합니다. offsetHeight
속성 외에도 offsetHeight
, clientHeight
, offsetTop
및 scrollTop도 이해해야 합니다. </code > 속성의 차이점을 비교해야만 이 프로젝트를 더 잘 이해할 수 있습니다. CSS 코드는 다음과 같이 간단합니다. <code>offsetHeight
这个属性,这个属性的高度之和等于图片高度 + 内边距 + 边框
,正因为此,我们用了 padding 而不是 margin 来设置图片与图片之间的距离。此外除了offsetHeight
属性,此外还要理解 offsetHeight
、clientHeight
、offsetTop
、scrollTop
等属性的区别,才能比较好的理解这个项目。css 代码简单如下:
.waterfall-box { float: left; width: 200px; padding-left: 10px; padding-bottom: 10px; }
scroll、resize 事件监听的实现
实现了初始化函数 init 以后,下一步就要实现对 scroll 滚动事件进行监听,从而实现当滚到父节点的底部有源源不断的图片被加载出来的效果。这时候要考虑一个点,是滚动到什么位置时触发加载函数呢?这个因人而异,我的做法是当满足 父容器高度 + 滚动距离 > 最后一张图片的 offsetTop
这个条件,即橙色线条 + 紫色线条 > 蓝色线条时触发加载函数,代码如下:
window.onscroll = function() { // ... if (scrollPX + bsHeight > imgList[imgList.length - 1].offsetTop) {// 浏览器高度 + 滚动距离 > 最后一张图片的 offsetTop const fragment = document.createDocumentFragment() for(let i = 0; i < 20; i++) { const img = document.createElement('img') img.setAttribute('src', `images/${i+1}.png`) img.setAttribute('class', 'waterfall-box') fragment.appendChild(img) } $waterfall.appendChild(fragment) } }
因为父节点可能自定义节点,所以提供了对监听 scroll 函数的封装,代码如下:
proto.bind = function () { const bindScrollElem = document.getElementById(this.opts.scrollElem) util.addEventListener(bindScrollElem || window, 'scroll', scroll.bind(this)) } const util = { addEventListener: function (elem, evName, func) { elem.addEventListener(evName, func, false) }, }
resize 事件的监听与 scroll 事件监听大同小异,当触发了 resize 函数,调用 init 函数进行重置就行。
使用发布-订阅模式和继承实现监听绑定
既然以开发插件为目标,不能仅仅满足于功能的实现,还要留出相应的操作空间给开发者自行处理。联想到业务场景中瀑布流中下拉加载的图片一般都来自 Ajax 异步获取,那么加载的数据必然不能写死在库里,期望能实现如下调用(此处借鉴了 waterfall 的使用方式),
const waterfall = new Waterfall({options}) waterfall.on("load", function () { // 此处进行 ajax 同步/异步添加图片 })
观察调用方式,不难联想到使用发布/订阅模式来实现它,关于发布/订阅模式,之前在 Node.js 异步异闻录 有介绍它。其核心思想即通过订阅函数将函数添加到缓存中,然后通过发布函数实现异步调用,下面给出其代码实现:
function eventEmitter() { this.sub = {} } eventEmitter.prototype.on = function (eventName, func) { // 订阅函数 if (!this.sub[eventName]) { this.sub[eventName] = [] } this.sub[eventName].push(func) // 添加事件监听器 } eventEmitter.prototype.emit = function (eventName) { // 发布函数 const argsList = Array.prototype.slice.call(arguments, 1) for (let i = 0, length = this.sub[eventName].length; i < length; i++) { this.sub[eventName][i].apply(this, argsList) // 调用事件监听器 } }
接着,要让 Waterfall 能使用发布/订阅模式,只需让 Waterfall 继承 eventEmitter 函数,代码实现如下:
function Waterfall(options = {}) { eventEmitter.call(this) this.init(options) // 这个 this 是 new 的时候,绑上去的 } Waterfall.prototype = Object.create(eventEmitter.prototype) Waterfall.prototype.constructor = Waterfall
继承方式的写法吸收了基于构造函数继承和基于原型链继承两种写法的优点,以及使用 Object.create
隔离了子类和父类,关于继承更多方面的细节,可以另写一篇文章了,此处点到为止。
小优化
为了防止 scroll 事件触发多次加载图片,可以考虑用函数防抖与节流实现。在基于发布-订阅模式的基础上,定义了个 isLoading 参数表示是否在加载中,并根据其布尔值决定是否加载,代码如下:
let isLoading = false const scroll = function () { if (isLoading) return false // 避免一次触发事件多次 if (scrollPX + bsHeight > imgList[imgList.length - 1].offsetTop) { // 浏览器高度 + 滚动距离 > 最后一张图片的 offsetTop isLoading = true this.emit('load') } } proto.done = function () { this.on('done', function () { isLoading = false ... }) this.emit('done') }
这时候需要在调用的地方加上 waterfall.done
const waterfall = new Waterfall({}) waterfall.on("load", function () { // 异步/同步加载图片 waterfall.done() })
초기화 함수 init를 구현한 후 다음 단계는 스크롤 이벤트 모니터링을 구현하는 것입니다. 스크롤이 도달하면 인식합니다. 상위 노드의 맨 아래에는 그림이 꾸준히 로드되는 효과가 있습니다. 이때 고려해야 할 점은 스크롤할 때 로딩 기능이 어느 위치에서 실행되는지입니다. 이는 사람마다 다릅니다. 내 접근 방식은 상위 컨테이너 높이 + 스크롤 거리> 마지막 이미지의 offsetTop
조건, 즉 주황색 선 + 보라색 선 > 파란색이 충족될 때 로드를 트리거하는 것입니다. line 함수의 코드는 다음과 같습니다.
상위 노드가 노드를 맞춤화할 수 있으므로 스크롤 모니터링 기능의 캡슐화를 제공합니다. rrreeeResize 이벤트 모니터링은 스크롤 이벤트 모니터링과 유사합니다. 크기 조정 기능이 실행되면 init를 호출하여 기능을 재설정하면 됩니다.
게시-구독 모델과 상속을 사용하여 리스닝 바인딩 구현플러그인 개발이 목표이기 때문에 기능 구현에만 만족할 수 없고 개발자가 스스로 처리할 수 있도록 해당 운영 공간을 남겨둡니다. . 비즈니스 시나리오에서 워터폴 흐름의 그림 드롭다운 로드를 생각하면 일반적으로 Ajax를 통해 비동기적으로 가져오므로 로드된 데이터를 라이브러리에 하드 코딩하면 안 됩니다(여기에서는). 우리는 폭포수 사용에서 교훈을 얻었습니다),
rrreee호출 방법을 살펴보면 게시/구독 모델을 사용하여 구현하는 것을 생각하는 것은 어렵지 않습니다. .js 비동기 비동기 레코드. 핵심 아이디어는 구독 기능을 통해 캐시에 함수를 추가한 다음 게시 기능을 통해 비동기 호출을 구현하는 것입니다. 코드 구현은 다음과 같습니다. rrreee 다음으로 Waterfall이 게시/구독 모드를 사용하도록 하려면 Waterfall이 eventEmitter 함수를 상속하도록 하기만 하면 코드는 다음과 같이 구현됩니다.
rrreee상속 방법은 생성자 상속과 프로토타입 체인 상속을 기반으로 하는 두 가지 작성 방법의 장점을 흡수하고 Object.create
이제 하위 클래스와 상위 클래스가 있으므로 상속에 대한 자세한 내용을 설명하는 또 다른 기사를 작성할 수 있으므로 여기서 멈추겠습니다. 🎜🎜🎜작은 최적화🎜🎜🎜스크롤 이벤트로 인해 이미지가 여러 번 로드되는 것을 방지하려면 흔들림 방지 및 조절 기능을 사용하는 것을 고려할 수 있습니다. 게시-구독 모델을 기반으로 로드 여부를 나타내는 isLoading 매개변수가 정의되어 있으며, 해당 부울 값에 따라 로드 여부가 결정됩니다. 🎜rrreee
여기서 현재 이미지가 로드되었음을 알리려면 waterfall.done
을 추가하세요. 코드는 다음과 같습니다. 🎜rrreee🎜위는 제가 모두를 위해 컴파일한 것입니다. . 앞으로 모든 사람에게 도움이 되기를 바랍니다. 🎜🎜관련 기사: 🎜🎜🎜Vue 구성 요소 및 Route의 수명 주기(자세한 튜토리얼) 🎜🎜🎜🎜SpringMVC를 사용하여 vue 도메인 간 요청 해결🎜🎜🎜🎜webpack 4.0.0-beta.0 버전의 새로운 기능( 자세한 튜토리얼) 🎜 🎜
위 내용은 JS를 사용하여 Waterfall Flow 플러그인을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











순수 CSS를 통해 폭포 흐름 레이아웃을 구현하는 방법 및 기법 폭포 레이아웃(Waterfall Layout)은 웹 디자인에서 일반적인 레이아웃 방법으로, 높이가 일정하지 않은 여러 열에 콘텐츠를 배열하여 폭포와 같은 시각적 효과를 만듭니다. 이 레이아웃은 사진 디스플레이, 제품 디스플레이 등 많은 양의 콘텐츠를 표시해야 하는 상황에서 자주 사용되며 좋은 사용자 경험을 제공합니다. 폭포식 레이아웃을 구현하는 방법에는 여러 가지가 있으며 JavaScript나 CSS를 사용하여 구현할 수 있습니다.

기본 js에서 append() 메서드를 구현하려면 특정 코드 예제가 필요합니다. JavaScript 코드를 작성할 때 웹 페이지의 지정된 요소에 새 콘텐츠를 추가해야 하는 경우가 많습니다. 일반적인 작업은 innerHTML 속성을 통해 요소의 HTML 콘텐츠를 설정하는 것입니다. 그러나 innerHTML 속성을 사용하면 요소 내부의 이벤트 리스너, 스타일 등이 손실되는 경우가 있습니다. 콘텐츠 추가 기능을 더 잘 구현하기 위해 우리는 스스로append() 메소드를 구현할 수 있습니다. Append() 메소드는 다음을 수행할 수 있습니다.

CSS에서 폭포 흐름을 구현하는 방법은 무엇입니까? 다음 기사에서는 CSS를 사용하여 폭포 흐름을 구현하는 두 가지 방법을 소개합니다. 도움이 되기를 바랍니다.

HTML 및 CSS를 사용하여 폭포 흐름 카드 레이아웃을 구현하는 방법 웹 개발에서 폭포 흐름 카드 레이아웃은 일반적이고 멋진 표시 방법입니다. 폭포형 흐름 레이아웃은 불규칙한 모양의 카드가 특징이며, 높이와 위치가 콘텐츠 양과 화면 크기에 따라 자동으로 조정되어 페이지를 더욱 매력적이고 대화형으로 만듭니다. 이 문서에서는 HTML과 CSS를 사용하여 폭포 흐름 카드 레이아웃을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTML 구조 먼저 HTML 구조를 만들어야 합니다. 이 예에서는

CSS 레이아웃 튜토리얼: 폭포형 카드 레이아웃을 구현하는 가장 좋은 방법 소개: 현대 웹 디자인에서 폭포형 카드 레이아웃은 매우 인기 있는 레이아웃 방법입니다. 많은 양의 콘텐츠를 효과적으로 표시하고 다양한 화면 크기에 적응하여 사용자에게 좋은 탐색 경험을 제공할 수 있습니다. 이 문서에서는 폭포형 카드 레이아웃을 구현하는 가장 좋은 방법을 설명하고 구체적인 코드 예제를 제공합니다. 1. 폭포 흐름 레이아웃 구현 원리 폭포 흐름 레이아웃의 원리는 다양한 콘텐츠의 높이에 따라 특정 규칙에 따라 카드를 다양한 위치에 배열하는 것입니다.

Vue를 사용하여 폭포 흐름 레이아웃 효과를 구현하는 방법 폭포 흐름 레이아웃은 다양한 높이에 따라 콘텐츠를 자동으로 배열하여 폭포와 같은 효과를 형성할 수 있는 일반적인 웹 페이지 레이아웃 방법입니다. 프런트 엔드 개발에서는 Vue 프레임워크를 사용하여 폭포 레이아웃 효과를 구현할 수 있습니다. 다음은 구체적인 구현 방법을 소개하고 코드 예제를 제공합니다. Vue 및 Masonry 레이아웃 라이브러리를 소개합니다. 먼저 HTML 파일에 Vue 및 Masonry 레이아웃 라이브러리의 CDN 링크를 소개합니다. <script

모바일 장치의 인기로 인해 WeChat 미니 프로그램은 점점 더 많은 기업과 개인의 선택이 되었습니다. 그러나 작은 프로그램의 개발 과정에서 폭포수 흐름 효과를 구현하는 것은 어려운 작업입니다. 이 기사에서는 PHP를 사용하여 WeChat 애플릿에서 텍스트 폭포 흐름 효과를 구현하는 방법을 소개합니다. 1. 폭포 흐름 효과 구현 방법 폭포 흐름 효과란 높이가 다른 요소를 배열하여 폭포처럼 보이도록 하는 시각적 효과를 말합니다. 웹에서 폭포 흐름 효과를 구현할 때 일반적으로 사용되는 방법은 CSS 열 레이아웃을 사용하는 것입니다.

HTML 및 CSS를 사용하여 폭포 흐름 그리드 레이아웃을 구현하는 방법 폭포 흐름 그리드 레이아웃은 웹 페이지 요소가 폭포와 같은 효과를 나타내도록 하여 사용자에게 더 나은 시각적 경험을 제공할 수 있는 일반적인 레이아웃 방법입니다. 이 기사에서는 HTML과 CSS를 사용하여 폭포 흐름 그리드 레이아웃을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 먼저 HTML 구조와 CSS 스타일을 준비해야 합니다. 다음은 표시해야 하는 여러 요소를 포함하는 기본 HTML 구조입니다. <!DOCTYPEhtml&
