当前位置: 首页 > Web前端 > CSS

2021年了,你还不知道如何使用瀑布流布局?(三个靠谱的JS方案+N个不靠谱的CSS方案)

时间:2023-03-31 13:25:10 CSS

鏈潃瀹炵敤鐨勭簿绁烇紝浠婂ぉ鍒嗕韩涓嬬€戝竷娴佸竷灞€锛堟槰澶╂湁涓皬鍝ラ棶鎴戞€庝箞鍋氾紝鎵句簡涓篃娌℃壘鍒板ソ涔呬簡鍟婏紝鍘熸潵鏄湪鍐呯綉鍐欑殑锛夈€傛紨绀哄湴鍧€锛歨ttp://www.lilnong.top/static/html/waterfall.html浠€涔堟槸鐎戝竷娴佸竷灞€锛熸瘮濡傝姳鐡g綉鍜岃槕鑿囪锛堟垜璐翠簡涓嬪浘锛夛紝杩欎簺缃戠珯鍦ㄥ睍绀哄唴瀹圭殑鏃跺€欓兘閲囩敤浜嗙€戝竷娴佸竷灞€銆傛垜浠繕鎯冲埗浣滀竴涓〉闈㈡潵灞曠ず鎴戜滑鐨勮璁$锛堝浐瀹氬搴︼紝鍙彉楂樺害锛夛紝鐎戝竷娴佹槸涓€涓緢濂界殑瑙e喅鏂规銆傜€戝竷娴佸竷灞€鐨勬牳蹇冩槸鍩轰簬缃戞牸鐨勫竷灞€锛屾瘡琛屽寘鍚殑椤圭洰鍒楄〃鐨勯珮搴︽槸闅忔満鐨勶紙楂樺害闅忓叾鑷韩鍐呭鍔ㄦ€佸彉鍖栵級锛屾瘡涓」鐩垪琛ㄤ互鍫嗘爤鏂瑰紡鎺掑垪銆傛渶閲嶈鐨勬槸锛屽爢鏍堜箣闂存病鏈夎繃澶氱殑闂磋窛宸紓銆傝繕鏄湅涓婂浘锛岀湅鐪嬫垜浠鐨勭€戝竷娴佸竷灞€鏄粈涔堟牱瀛愮殑銆傝槕鑿囪鑺辩摚缃戜含涓淰V鎴浘鏂规鍒嗕负娓犻亾缁濆缃戞牸銆佸唴鑱斻€佹诞鍔ㄩ瓟鏈柟妗堜篃鍙互鐪嬫垚鏄函CSS鏂规锛屾湰璐ㄤ笂鏄緷璧栨枃妗f祦锛屼粠宸﹀埌鍙筹紝浠庝笂鍒颁笅銆傛柟妗坓ridinlinefloatbootstrap-grid鐨勬埅鍥惧彲浠ョ湅鍑烘枃妗f祦甯冨眬涓湁涓€涓潪甯告槑鏄剧殑绾挎蹇点€傚綋涓€鏉$嚎琚媺浼告椂锛屽畠浼氱暀涓嬩竴涓┖鐧斤紝绾夸笉浼氶噸鍙犮€傝繖閲屾渶绁炲鐨勬槸娴姩甯冨眬銆侱OM缁撴瀯div.list//璁剧疆grid鎴朾lock锛屾敞鎰忔竻闄ゆ诞鍔╠iv.item//璁剧疆涓篿nline鎴杅loat锛屼娇鍏跺彲浠ユ祦鍔╥mg//璁剧疆鍥哄畾瀹藉害锛岃嚜閫傚簲楂樺害锛岄棿璺濈瓑gridschemedescription.wrap-waterfall--gridimg{vertical-align:top;width:100px}.wrap-waterfall--grid.list{display:grid;缃戞牸闂撮殭锛?0px锛?*鍙互鐪嬪埌缃戞牸鐨勫ぇ灏忓拰浣嶇疆闇€瑕佹彁鍓嶈缃ソ*/grid-template-columns:repeat(4,1fr);grid-auto-rows:minmax(50px,auto);}grid鍦ㄦ煇浜涙儏鍐典笅浼樹簬flex銆傛瘮濡備綘瑕佺獊鐮磋鏁伴檺鍒讹紝浣嗘槸鍙€傜敤浜庡浐瀹氬竷灞€锛屾瘮濡備笅鍥剧殑甯冨眬锛屼笉浣跨敤grid鎬庝箞瀹炵幇鍛紵缃戜笂鏈変竴涓敤缃戞牸瀹炵幇鐎戝竷娴佸竷灞€鐨勬柟妗堬紝浣嗘槸鎴戠湅鍒版湁鍑犱釜涓嶆槸鑹插潡锛岃€屾槸鍥剧墖鍙樺舰瑁佸壀浜嗐€傛柟妗堟槸鐢╪th-child璁剧疆楂樺害锛屽お鍚撲汉浜嗐€俢olumns鍜宖lexCSS瀹炵幇鐨勪笉鍙潬鏂规涔熸槸绾疌SS鏂规銆備笌涓婅堪鏂规鐩告瘮锛屾柟妗堝彲浠ユ帴鍙楋紝浣嗕粛瀛樺湪涓€浜涢棶棰樸€傞『搴忔槸鍏堝瀭鐩达紝鐒跺悗姘村钩锛堝垪锛夈€傚吋瀹规€ч棶棰橈紙flex锛夐渶瑕佺粰瀹氫竴涓浐瀹氱殑楂樺害锛屼細瓒呭嚭setcolumn锛屾棤娉曞~婊etcolumn銆係chemecolumnsflexscreenshot鏈韩灏辨敮鎸乧olumnsscheme锛屽彧闇€瑕佷负鐖跺垪璁剧疆锛?锛涘垪闂磋窛锛?px锛?寮规€ф柟妗坒lex-flow:columnwrap;楂樺害锛?300px锛涢粯璁ゆ儏鍐典笅锛屽畠鏄按骞虫帓鍒楃殑銆傞€氳繃灏嗗叾淇敼涓哄瀭鐩存帓鍒楀苟鍏佽鎹㈣锛屽唴瀹瑰皢琚浐瀹氶珮搴﹀寘瑁广€侫bsolute锛岄€氶亾楂樺害璁$畻鏂规ReliableschemeAbsolute鍙栧墿浣欓€氶亾璁$畻楂樺害瀛愰€氶亾澶撮儴鎴浘杩欓噷鐨勬柟妗堟槸鍙潬鐨勶紝鍙互婊¤冻鎴戜滑鐨勮姹傘€傚洖鎯充竴涓嬫垜浠殑闇€姹傦細鏄剧ず涓€浜涘唴瀹癸紝鍐呭鍏锋湁鍥哄畾瀹藉害锛屽彲鍙橀珮搴︾殑鐗规€с€傚彲鍙橀珮搴︿竴鑸槸鐢变簬鍐呭闀垮害鎴栭珮搴︿笉涓€鑷撮€犳垚鐨勩€傚父瑙佺殑鍐呭鍒嗕负鏂囧瓧鍜屽浘鐗囦袱绉嶃€傚浜庢枃鏈紝鍦ㄦ病鏈夊紓姝ュ瓧浣撶殑鎯呭喌涓嬶紝鍙互鐞嗚В涓哄悓姝ヨ幏鍙栨鐨勯珮搴﹀嵆鍙€傚浜庡浘鐗囷紝鍥犱负鍔犺浇鏄紓姝ョ殑锛屾墍浠ヨ幏鍙栫洅瀛愮殑鐪熷疄楂樺害涔熸槸寮傛鐨勩€備絾鏄繖閲屼竴鑸垎涓轰袱绉嶆病鏈夐珮搴︾殑鎯呭喌锛岃繖鏃跺彲浠ヤ娇鐢╫nload鏉ョ洃鍚浘鐗囧姞杞藉畬鎴愩€傜瓑鍒板浘鍍忓姞杞藉畬姣曞啀鑾峰彇楂樺害銆傛湁涓€涓珮搴︺€傛瑙e喅鏂规閫氬父鐢ㄤ簬灏侀潰鍥惧儚鎴栨枃绔犮€備笂浼犲浘鐗囨椂锛屽皢淇濆瓨鍘熷鍥剧墖澶у皬銆傝繖鏃跺€欐垜浠彲浠ョ洿鎺ヤ娇鐢ㄥ凡鏈夌殑鏁版嵁銆傝幏鍙栧浘鐗囬珮搴?/鐢ㄤ簬鑾峰彇鍥剧墖鐪熷疄楂樺害naturalHeight:1180//鐢ㄤ簬鑾峰彇鍥剧墖鐪熷疄瀹藉害naturalWidth:1200//鐢ㄦ埛鑾峰彇鍥剧墖褰撳墠娓叉煋楂樺害锛堜細鍙梒ss褰卞搷锛塰eight:98//鐢ㄦ埛鑾峰彇鍥剧墖褰撳墠娓叉煋瀹藉害(鍙梒ss褰卞搷)width:100//杩斿洖娴忚鍣ㄦ槸鍚﹀姞杞藉畬鍥剧墖銆傚鏋滃姞杞藉畬鎴愬垯杩斿洖true锛屽惁鍒欒繑鍥瀎asle銆俢omplete灞炴€?/鍙互鐩戝惉鍥剧墖鍔犺浇瀹屾垚鐨刟ctiononload鏄牴鎹笂闈㈢殑鍐呭锛岄偅涔堟垜浠彲浠ュ厛鍒ゆ柇complete灞炴€э紝functiongetImageSize(img){if(img.complete){returnPromise.resolve({naturalHeight:img.naturalHeight,naturalWidth:img.naturalWidth,height:img.height,width:img.width,})}else{returnnewPromise((resolve,reject)=>{img.addEventListener('load',()=>{resolve({naturalHeight:img.naturalHeight,naturalWidth:img.naturalWidth,height:img.height,width:img.width,})})})}}/*//娴嬭瘯鐢ㄤ緥el=document.createElement('img');el.src='http://cors-www.lilnong.top/favicon.ico?'+Math.random()getImageSize(el).then(console.log).catch(console.error)setTimeout(()=>getImageSize(el).then(console.log).catch(console.error),1000)*/缁濆璁$畻楂樺害鏂规鍥犱负鏅€氱殑甯冨眬宸茬粡涓嶈兘婊¤冻鎴戜滑鐨勯渶姹傦紝鍙互鑰冭檻浣跨敤鏂畾ion:absolute浣垮唴瀹归€氳繃缁濆瀹氫綅鏄剧ず銆傛牳蹇冩搷浣滄槸缁存姢姣忎釜鍏冪礌鐨刲eft鍜宼op锛岀劧鍚庡埄鐢╨eft鍜宼op娓叉煋鍒版纭殑浣嶇疆銆俫etListPosition(){//瑙嗗彛瀹藉害/姣忓垪鐨勫搴﹁鍒嗘垚鑻ュ共鍒條etcol=this.screenWidth/this.itemWidth>>0;鍙橀噺arr=[];for(vari=0;i{//鎵惧埌鏈€浣庣殑鍒梫arcolIndex=0;for(vari=1;iarr[i].height){//colItem=arr[i]colIndex=i}}//淇敼鍏冪礌鐨勪俊鎭?/鎵€灞炲垪item.line=colIndex;//璁$畻鍚庣殑椤堕儴璺濈item.top=arr[colIndex].height+'px';//璁$畻鍚庣殑宸︿晶璺濈item.left=colIndex*(this.itemWidth+10)+'px'//绱姞鎿嶄綔arr[colIndex].list.push(item);arr[colIndex].height+=item.height+10;})returnarr},閫氳繃璁$畻锛屾垜浠彲浠ュ緱鍒扮€戝竷娴佸竷灞€涓瘡涓厓绱犵殑浣嶇疆閮藉彲浠ラ€氳繃缁濆瀹氫綅鏉ュ疄鐜般€傛牴鎹笅鏍囷紝娓叉煋鍒颁笉鍚岀殑閫氶亾idx%4鏃㈢劧鍓嶉潰鐨勬柟妗堥兘鏄敤缁濆瀹氫綅锛岄偅涔堟湁娌℃湁涓嶇敤缁濆瀹氫綅鐨勬柟妗堝憿锛熷洖鍒版垜浠畾瀹藉彉楂樼殑闂锛岄偅涔堟垜浠畬鍏ㄥ彲浠ラ€氳繃鍗曠嫭娓叉煋锛屾斁寮僡bsolute鏉ュ疄鐜般€俲sGroupList(){returnthis.list.reduce((s,n,idx)=>{//鏍规嵁涓嬫爣锛岀洿鎺ョ粰鍒梥[idx%4]璧嬪€?push({idx:idx,item:n})returns},[[],[],[],[],])},寮€澶村疄鐜颁簡绫讳技鐨勫姛鑳斤紝浣嗘槸鏈変釜缂虹偣锛堟潵璇勮鍖哄洖澶嶏級銆傛寜楂樺害璁$畻锛岀劧鍚庡垝鍒嗛€氶亾锛岄伩鍏峚bsolute锛屽洜涓轰箣鍓嶇殑鏂规鏄寜涓嬫爣鍒嗙被鐨勩€傚叾瀹炵€戝竷鏄寜楂樺害鍒嗙被鐨勶紝鎵€浠ユ垜浠妸鍒嗙被鏉′欢鏀规垚鏈€浣庣殑閭d竴鍒椼€俲sGroupHeightList(){varlist=[{height:0,list:[]},{height:0,list:[]},{height:0,list:[]},{height:0,list:[]},]//閬嶅巻姣忎竴涓厓绱爁or(vari=0;i{if(v.height