JS 폭포 흐름 레이아웃에 대해 자세히 알아보기
이 글의 예시는 참고용으로 js 폭포 흐름 레이아웃 학습 자료를 공유합니다.
특징: 동일한 너비와 다른 높이.
구현 방법: Javascript/Jquery/CSS3 다중 열 레이아웃.
샘플 웹사이트: Huaban.com --> 카테고리
1. JS는 폭포 흐름을 구현합니다.
index.html: 페이지 구조
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>瀑布流布局</title> <link rel="stylesheet" href="styles/layout.css"> </head> <body> <div id="main"> <div><div><img src="../waterFall/pic/0.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/1.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/2.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/3.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/4.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/5.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/6.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/7.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/8.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/9.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/10.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/11.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/12.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/13.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/14.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/15.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/16.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/17.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/18.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/19.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/20.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/21.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/22.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/23.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/24.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/25.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/26.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/27.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/28.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/29.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/30.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/31.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/32.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/33.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/34.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/35.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/36.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/37.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/38.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/39.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/40.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/41.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/42.jpg" alt=""></div></div> <div><div><img src="../waterFall/pic/43.jpg" alt=""></div></div> </div> <script src="scripts/waterfall.js"></script> </body> </html>
레이아웃 .css: 페이지 요소 스타일
*{ pdding:0; margin:0; } div#main{ position: relative; } div.box{ padding:15px 0 0 15px; float: left; } div.pic{ padding:10px; border:1px solid #ccc; border-radius:5px; box-shadow: 0 0 5px #ccc; } .pic img{ height:auto; width:165px; }
waterfall.js
window.onload=function(){ waterFall('main','box'); //模拟后台相应数据json var dataInt={ "data": [ {"src":"0.jpg"}, {"src":"1.jpg"}, {"src":"2.jpg"}, {"src":"3.jpg"}, {"src":"4.jpg"}, {"src":"5.jpg"}, {"src":"6.jpg"} ] } window.onscroll=function(){ if(checkScrollSlide){ //将数据块渲染到当前页面的尾部 var oParent=document.getElementById("main"); for(var i=0;i<dataInt.data.length;i++){ var oBox=document.createElement("div"); oBox.className="box"; oParent.appendChild(oBox); var oPic=document.createElement("div"); oPic.className="pic"; oBox.appendChild(oPic); var img=document.createElement("img"); img.setAttribute("src",dataInt.data[i]); img.src="pic/"+dataInt.data[i].src; oPic.appendChild(img); } dataInt=null;//清空数据块,防止无限加载 waterFall('main','box');//对页面新元素进行布局渲染 } } } function waterFall(parent,box){ //将main下的class为box的所有元素取出来 var oParent=document.getElementById(parent); var oBoxs=getByClass(oParent,box); console.log(oBoxs.length); //计算整个页面显示的列数(页面宽/box宽) var oBoxW=oBoxs[0].offsetWidth; // console.log(oBoxW); var cols=Math.floor(document.documentElement.clientWidth/oBoxW); // console.log(cols); //设置main的宽 oParent.style.cssText="width:"+oBoxW*cols+"px;margin:0 auto;" var hArr=[];//存放每列高度的数组 for(var i=0;i<oBoxs.length;i++){ if(i<cols){ hArr.push(oBoxs[i].offsetHeight); }else{ var minH=Math.min.apply(null,hArr);//获取当前数组最小高度值 // console.log(minH); var index=getMinhIndex(hArr,minH);//获取数组最小高度的索引 //console.log(index); oBoxs[i].style.position="absolute";//将之后的图片依次绝对定位 oBoxs[i].style.top=minH+"px"; oBoxs[i].style.left=index*oBoxW+"px";//计算新图片所在的位置并赋值 hArr[index]+=oBoxs[i].offsetHeight;//变化数组列的高度值,因为加上了一张图片 } //console.log(hArr); } } //根据class获取元素 function getByClass(parent,clsName){ var boxArr=new Array(),//用来存储获取到的所有class为box的元素 oElements=parent.getElementsByTagName("*"); for(var i=0;i<oElements.length;i++){ if(oElements[i].className==clsName){ boxArr.push(oElements[i]); } } return boxArr; } function getMinhIndex(arr,val){ for(var i=0;i<arr.length;i++){ if(arr[i]==val){ return i; } } } //检测是否具备滚动条加载数据块条件 function checkScrollSlide(){ var oParent=document.getElementById("main"); var oBoxs=getByClass(oParent,"box"); var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2); var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;//混杂模式和标准模式下的scrollTop获取 //console.log(scrollTop); var height=document.body.clientHeight||document.documentElement.clientHeight;//混杂模式和标准模式下的浏览器窗口高度获取 return (lastBoxH<scrollTop+height)?true:false;//检测最后一个box高度是否小于滚动高度+窗口高度,返回布尔值 }
2. JQuery
$( window ).on( "load", function(){ waterfall('main','pin'); var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; window.onscroll=function(){ if(checkscrollside()){ $.each( dataInt.data, function( index, value ){ var $oPin = $('<div>').addClass('pin').appendTo( $( "#main" ) ); var $oBox = $('<div>').addClass('box').appendTo( $oPin ); $('<img>').attr('src','./images/' + $( value).attr( 'src') ).appendTo($oBox); }); waterfall(); }; } }); /* parend 父级id pin 元素id */ function waterfall(parent,pin){ var $aPin = $( "#main>div" ); var iPinW = $aPin.eq( 0 ).width();// 一个块框pin的宽 var num = Math.floor( $( window ).width() / iPinW );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】 //oParent.style.cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//设置父级居中样式:定宽+自动水平外边距 $( "#main" ).css({ 'width:' : iPinW * num, 'margin': '0 auto' }); var pinHArr=[];//用于存储 每列中的所有块框相加的高度。 $aPin.each( function( index, value ){ var pinH = $aPin.eq( index ).height(); if( index < num ){ pinHArr[ index ] = pinH; //第一行中的num个块框pin 先添加进数组pinHArr }else{ var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH var minHIndex = $.inArray( minH, pinHArr ); $( value ).css({ 'position': 'absolute', 'top': minH + 15, 'left': $aPin.eq( minHIndex ).position().left }); //数组 最小高元素的高 + 添加上的aPin[i]块框高 pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了块框后的列高 } }); } function checkscrollside(){ var $aPin = $( "#main>div" ); var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载) var scrollTop = $( window ).scrollTop()//注意解决兼容性 var documentH = $( document ).height();//页面高度 return (lastPinH < scrollTop + documentH ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数 }
3. CSS 다중 열 레이아웃
.container{ -webkit-column-width:160px; -moz-column-width:160px; -webkit-column-gap:5px; -moz-column-gap:5px; } /*数据块 砖块*/ .container div{width:160px; margin:4px 0;}
[css3과 js 구현 방법 비교]
--css3 방법--
1: 계산이 필요하지 않으며 브라우저가 자동으로 계산하며 열 너비를 1개만 설정하면 고성능
2: 브라우저 너비에 따라 열 너비가 변경되고 사용자 경험이 좋지 않습니다.
3: 이미지가 세로 순서로 정렬되어 이미지 표시 순서가 혼란스럽습니다.
4 이미지 로딩에는 여전히 js가 필요합니다. >--js 방법--
js로 구현한 워터폴 흐름은 위와 같은 단점은 없으나 성능이 상대적으로 좋지 않습니다!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

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

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

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

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

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

뜨거운 주제











기사는 JavaScript 라이브러리 작성, 게시 및 유지 관리, 계획, 개발, 테스트, 문서 및 홍보 전략에 중점을 둡니다.

이 기사는 브라우저에서 JavaScript 성능을 최적화하기위한 전략에 대해 설명하고 실행 시간을 줄이고 페이지로드 속도에 미치는 영향을 최소화하는 데 중점을 둡니다.

프론트 엔드 개발시 프론트 엔드 열지대 티켓 인쇄를위한 자주 묻는 질문과 솔루션, 티켓 인쇄는 일반적인 요구 사항입니다. 그러나 많은 개발자들이 구현하고 있습니다 ...

이 기사는 브라우저 개발자 도구를 사용하여 효과적인 JavaScript 디버깅, 중단 점 설정, 콘솔 사용 및 성능 분석에 중점을 둡니다.

기술 및 산업 요구에 따라 Python 및 JavaScript 개발자에 대한 절대 급여는 없습니다. 1. 파이썬은 데이터 과학 및 기계 학습에서 더 많은 비용을 지불 할 수 있습니다. 2. JavaScript는 프론트 엔드 및 풀 스택 개발에 큰 수요가 있으며 급여도 상당합니다. 3. 영향 요인에는 경험, 지리적 위치, 회사 규모 및 특정 기술이 포함됩니다.

이 기사는 소스 맵을 사용하여 원래 코드에 다시 매핑하여 미니어링 된 JavaScript를 디버그하는 방법을 설명합니다. 소스 맵 활성화, 브레이크 포인트 설정 및 Chrome Devtools 및 Webpack과 같은 도구 사용에 대해 설명합니다.

Console.log 출력의 차이의 근본 원인에 대한 심층적 인 논의. 이 기사에서는 Console.log 함수의 출력 결과의 차이점을 코드에서 분석하고 그에 따른 이유를 설명합니다. � ...

엔트리 레벨 타입 스크립트 자습서를 마스터 한 후에는 TypeScript를 지원하고 JavaScript로 컴파일하는 IDE에서 자신의 코드를 작성할 수 있어야합니다. 이 튜토리얼은 TypeScript의 다양한 데이터 유형으로 뛰어납니다. JavaScript에는 NULL, UNDEFINED, BOOLEAN, 번호, 문자열, 기호 (ES6에 의해 소개 됨) 및 객체의 7 가지 데이터 유형이 있습니다. TypeScript는이 기반으로 더 많은 유형을 정의 하며이 튜토리얼은이 모든 튜토리얼을 자세히 다룹니다. 널 데이터 유형 JavaScript와 마찬가지로 Null in TypeScript
