瀑布流佈局學習

来源:http://www.cnblogs.com/WardLin-blog/archive/2016/10/13/5958095.html
-Advertisement-
Play Games

一、JS實現瀑布流 index.html:頁面結構 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>瀑布流佈局</title> 6 <link rel="stylesheet" href= ...


  1. 特點:等寬不等高。
  2. 實現方式:Javascript/Jquery/CSS3多欄佈局。
  3. 樣例網站:花瓣網-->分類(http://huaban.com/)

一、JS實現瀑布流

      index.html:頁面結構

     

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>瀑布流佈局</title>
 6     <link rel="stylesheet" href="styles/layout.css">
 7 </head>
 8 <body>
 9     <div id="main">
10         <div class="box"><div class="pic"><img src="../waterFall/pic/0.jpg" alt=""></div></div>
11         <div class="box"><div class="pic"><img src="../waterFall/pic/1.jpg" alt=""></div></div>
12         <div class="box"><div class="pic"><img src="../waterFall/pic/2.jpg" alt=""></div></div>
13         <div class="box"><div class="pic"><img src="../waterFall/pic/3.jpg" alt=""></div></div>
14         <div class="box"><div class="pic"><img src="../waterFall/pic/4.jpg" alt=""></div></div>
15         <div class="box"><div class="pic"><img src="../waterFall/pic/5.jpg" alt=""></div></div>
16         <div class="box"><div class="pic"><img src="../waterFall/pic/6.jpg" alt=""></div></div>
17         <div class="box"><div class="pic"><img src="../waterFall/pic/7.jpg" alt=""></div></div>
18         <div class="box"><div class="pic"><img src="../waterFall/pic/8.jpg" alt=""></div></div>
19         <div class="box"><div class="pic"><img src="../waterFall/pic/9.jpg" alt=""></div></div>
20         <div class="box"><div class="pic"><img src="../waterFall/pic/10.jpg" alt=""></div></div>
21         <div class="box"><div class="pic"><img src="../waterFall/pic/11.jpg" alt=""></div></div>
22         <div class="box"><div class="pic"><img src="../waterFall/pic/12.jpg" alt=""></div></div>
23         <div class="box"><div class="pic"><img src="../waterFall/pic/13.jpg" alt=""></div></div>
24         <div class="box"><div class="pic"><img src="../waterFall/pic/14.jpg" alt=""></div></div>
25         <div class="box"><div class="pic"><img src="../waterFall/pic/15.jpg" alt=""></div></div>
26         <div class="box"><div class="pic"><img src="../waterFall/pic/16.jpg" alt=""></div></div>
27         <div class="box"><div class="pic"><img src="../waterFall/pic/17.jpg" alt=""></div></div>
28         <div class="box"><div class="pic"><img src="../waterFall/pic/18.jpg" alt=""></div></div>
29         <div class="box"><div class="pic"><img src="../waterFall/pic/19.jpg" alt=""></div></div>
30         <div class="box"><div class="pic"><img src="../waterFall/pic/20.jpg" alt=""></div></div>
31         <div class="box"><div class="pic"><img src="../waterFall/pic/21.jpg" alt=""></div></div>
32         <div class="box"><div class="pic"><img src="../waterFall/pic/22.jpg" alt=""></div></div>
33         <div class="box"><div class="pic"><img src="../waterFall/pic/23.jpg" alt=""></div></div>
34         <div class="box"><div class="pic"><img src="../waterFall/pic/24.jpg" alt=""></div></div>
35         <div class="box"><div class="pic"><img src="../waterFall/pic/25.jpg" alt=""></div></div>
36         <div class="box"><div class="pic"><img src="../waterFall/pic/26.jpg" alt=""></div></div>
37         <div class="box"><div class="pic"><img src="../waterFall/pic/27.jpg" alt=""></div></div>
38         <div class="box"><div class="pic"><img src="../waterFall/pic/28.jpg" alt=""></div></div>
39         <div class="box"><div class="pic"><img src="../waterFall/pic/29.jpg" alt=""></div></div>
40         <div class="box"><div class="pic"><img src="../waterFall/pic/30.jpg" alt=""></div></div>
41         <div class="box"><div class="pic"><img src="../waterFall/pic/31.jpg" alt=""></div></div>
42         <div class="box"><div class="pic"><img src="../waterFall/pic/32.jpg" alt=""></div></div>
43         <div class="box"><div class="pic"><img src="../waterFall/pic/33.jpg" alt=""></div></div>
44         <div class="box"><div class="pic"><img src="../waterFall/pic/34.jpg" alt=""></div></div>
45         <div class="box"><div class="pic"><img src="../waterFall/pic/35.jpg" alt=""></div></div>
46         <div class="box"><div class="pic"><img src="../waterFall/pic/36.jpg" alt=""></div></div>
47         <div class="box"><div class="pic"><img src="../waterFall/pic/37.jpg" alt=""></div></div>
48         <div class="box"><div class="pic"><img src="../waterFall/pic/38.jpg" alt=""></div></div>
49         <div class="box"><div class="pic"><img src="../waterFall/pic/39.jpg" alt=""></div></div>
50         <div class="box"><div class="pic"><img src="../waterFall/pic/40.jpg" alt=""></div></div>
51         <div class="box"><div class="pic"><img src="../waterFall/pic/41.jpg" alt=""></div></div>
52         <div class="box"><div class="pic"><img src="../waterFall/pic/42.jpg" alt=""></div></div>
53         <div class="box"><div class="pic"><img src="../waterFall/pic/43.jpg" alt=""></div></div>
54     </div>
55     <script src="scripts/waterfall.js"></script>
56 </body>
57 </html>
View Code

      layout.css:頁面元素樣式

 1 *{
 2     pdding:0;
 3     margin:0;
 4 }
 5 div#main{
 6     position: relative;
 7 }
 8 div.box{
 9     padding:15px 0 0 15px;
10     float: left;
11 }
12 div.pic{
13     padding:10px;
14     border:1px solid #ccc;
15     border-radius:5px;
16     box-shadow: 0 0 5px #ccc;
17 }
18 .pic img{
19     height:auto;
20     width:165px;
21 }
View Code

      waterfall.js

 1 window.onload=function(){
 2     waterFall('main','box');
 3     //模擬後臺相應數據json
 4     var dataInt={
 5         "data":
 6         [
 7          {"src":"0.jpg"},
 8          {"src":"1.jpg"},
 9          {"src":"2.jpg"},
10          {"src":"3.jpg"},
11          {"src":"4.jpg"},
12          {"src":"5.jpg"},
13          {"src":"6.jpg"}
14         ]
15     }
16     window.onscroll=function(){
17         if(checkScrollSlide){
18             //將數據塊渲染到當前頁面的尾部
19           var oParent=document.getElementById("main");
20           for(var i=0;i<dataInt.data.length;i++){
21               var oBox=document.createElement("div");
22               oBox.className="box";
23               oParent.appendChild(oBox);
24               var oPic=document.createElement("div");
25               oPic.className="pic";
26               oBox.appendChild(oPic);
27               var img=document.createElement("img");
28               img.setAttribute("src",dataInt.data[i]);
29               img.src="pic/"+dataInt.data[i].src;
30               oPic.appendChild(img);
31          }
32           dataInt=null;//清空數據塊,防止無限載入
33           waterFall('main','box');//對頁面新元素進行佈局渲染
34         }
35     }
36 }
37 function waterFall(parent,box){
38     //將main下的class為box的所有元素取出來
39     var oParent=document.getElementById(parent);
40     var oBoxs=getByClass(oParent,box);
41     console.log(oBoxs.length);
42     //計算整個頁面顯示的列數(頁面寬/box寬)
43     var oBoxW=oBoxs[0].offsetWidth;
44     // console.log(oBoxW);
45     var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
46     // console.log(cols);
47     //設置main的寬
48     oParent.style.cssText="width:"+oBoxW*cols+"px;margin:0 auto;"
49     var hArr=[];//存放每列高度的數組
50     for(var i=0;i<oBoxs.length;i++){
51         if(i<cols){
52             hArr.push(oBoxs[i].offsetHeight);
53         }else{
54             var minH=Math.min.apply(null,hArr);//獲取當前數組最小高度值
55             // console.log(minH);
56             var index=getMinhIndex(hArr,minH);//獲取數組最小高度的索引
57             //console.log(index);
58             oBoxs[i].style.position="absolute";//將之後的圖片依次絕對定位
59             oBoxs[i].style.top=minH+"px";
60             oBoxs[i].style.left=index*oBoxW+"px";//計算新圖片所在的位置並賦值
61             hArr[index]+=oBoxs[i].offsetHeight;//變化數組列的高度值,因為加上了一張圖片
62         }
63         //console.log(hArr);
64     }
65 
66 }
67 //根據class獲取元素
68 function getByClass(parent,clsName){
69    var boxArr=new Array(),//用來存儲獲取到的所有class為box的元素
70        oElements=parent.getElementsByTagName("*");
71        for(var i=0;i<oElements.length;i++){
72            if(oElements[i].className==clsName){
73                boxArr.push(oElements[i]);
74            }
75        }
76     return boxArr;
77 }
78 function getMinhIndex(arr,val){
79     for(var i=0;i<arr.length;i++){
80         if(arr[i]==val){
81             return i;
82         }
83     }
84 
85 }
86 //檢測是否具備滾動條載入數據塊條件
87 function checkScrollSlide(){
88     var oParent=document.getElementById("main");
89     var oBoxs=getByClass(oParent,"box");
90     var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
91     var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;//混雜模式和標準模式下的scrollTop獲取
92     //console.log(scrollTop);
93     var height=document.body.clientHeight||document.documentElement.clientHeight;//混雜模式和標準模式下的瀏覽器視窗高度獲取
94     return (lastBoxH<scrollTop+height)?true:false;//檢測最後一個box高度是否小於滾動高度+視窗高度,返回布爾值
95 
96 }

 二、JQuery

       

 1 $( window ).on( "load", function(){
 2     waterfall('main','pin');
 3     var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
 4     window.onscroll=function(){
 5         if(checkscrollside()){
 6             $.each( dataInt.data, function( index, value ){
 7                 var $oPin = $('<div>').addClass('pin').appendTo( $( "#main" ) );
 8                 var $oBox = $('<div>').addClass('box').appendTo( $oPin );
 9                 $('<img>').attr('src','./images/' + $( value).attr( 'src') ).appendTo($oBox);
10             });
11             waterfall();
12         };
13     }
14 });
15 
16 /*
17     parend 父級id
18     pin 元素id
19 */
20 function waterfall(parent,pin){
21     var $aPin = $( "#main>div" );
22     var iPinW = $aPin.eq( 0 ).width();// 一個塊框pin的寬
23     var num = Math.floor( $( window ).width() / iPinW );//每行中能容納的pin個數【視窗寬度除以一個塊框寬度】
24     //oParent.style.cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//設置父級居中樣式:定寬+自動水平外邊距
25     $( "#main" ).css({
26         'width:' : iPinW * num,
27         'margin': '0 auto'
28     });
29 
30     var pinHArr=[];//用於存儲 每列中的所有塊框相加的高度。
31 
32     $aPin.each( function( index, value ){
33         var pinH = $aPin.eq( index ).height();
34         if( index < num ){
35             pinHArr[ index ] = pinH; //第一行中的num個塊框pin 先添加進數組pinHArr
36         }else{
37             var minH = Math.min.apply( null, pinHArr );//數組pinHArr中的最小值minH
38             var minHIndex = $.inArray( minH, pinHArr );
39             $( value ).css({
40                 'position': 'absolute',
41                 'top': minH + 15,
42                 'left': $aPin.eq( minHIndex ).position().left
43             });
44             //數組 最小高元素的高 + 添加上的aPin[i]塊框高
45             pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了塊框後的列高
46         }
47     });
48 }
49 
50 	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是一個好的開始,過程很漫長,但我卻樂在其中. 在大學之際,這是我的又一個開始,隨便寫點啦. 想把每一次的過程記錄下來 這樣以後對自己 對別人都會有所幫助。 好啦 作為一名大三的學生黨 加油吧! ...
  • 每天一個設計模式-4 單例模式(Singleton) 1.實際生活的例子 有一天,你的自行車的某個螺絲釘鬆了,修車鋪離你家比較遠,而附近的五金店有賣扳手;因此,你決定去五金店買一個扳手,自己把螺絲釘固定緊。不一會兒,自行車就被你修好了;首先,這個扳手你不會扔掉,下次用的時候直接找出來就用了。好,今天 ...
  • Atitit.eclise的ide特性 abt 編譯 為什麼要在Intellij IDEA中使用Eclipse編譯器 如果你使用Intellij Idea,你應該考慮使用Eclipse編譯器來代替Javac。 你的項目所使用的編譯器可在IDE的設置頁面更改。 需要註意,如果你使用的是Java8,只有 ...
  • 一、元素選擇符 1. * 在我們看比較高級的選擇器之前,應該認識下這個眾所周知的清空選擇器。星號呢會將頁面上所有每一個元素都選到。許多開發者都用它來清空`margin`和`padding`。當然你在練習的時候使用這個沒問題,但是我不建議在生產環境中使用它。它會給瀏覽器憑添許多不必要的東西。`*`也可 ...
  • [1]動畫狀態 [2]停止動畫 [3]動畫延遲 [4]全局控制 ...
  • 踩過的坑都將成為路上的風景。隊友在cookie中已存以下值: 仔細觀摩,並無發現任何不妥,只是一種簡簡單單的json格式字元串而已。 但在前臺調用時,百試不爽,屢屢出錯,錯誤代碼如下,一直顯示undefined ... 充電之後 ... 加上JSON.parse()處理後,完美解決 相關學習: JS ...
  • 1.等腰三角形 2.直角三角形 3.圓 4.橢圓 ...
  • css參考手冊: http://www.phpstudy.net/css3/ http://www.css88.com/book/css/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...