瀑布流的實現

来源:https://www.cnblogs.com/ruo-shui-yi-fang/archive/2019/09/07/11478201.html
-Advertisement-
Play Games

現在很多網站都會使用瀑布流的一個效果,什麼是瀑布流呢,用在哪些地方呢? 大概就是這樣的一個效果,一般用於無法保證圖片大小的網站。 先看下佈局+css 實現的一個大概思路: 瀑布流:第一行正常浮動,從第二行開始,每個元素都定位到上一行的最小高度的元素下 1.獲取元素 2.佈局 3.區分第一行和後面的行 ...


現在很多網站都會使用瀑布流的一個效果,什麼是瀑布流呢,用在哪些地方呢?

大概就是這樣的一個效果,一般用於無法保證圖片大小的網站。

先看下佈局+css

 1     .cont{margin: 0 auto;position: relative;}
 2         .box{float: left;padding: 6px}
 3         .imgbox{border: solid 1px black;border-radius: 6px;padding: 6px}
 4         .imgbox img{width:200px;display: block;}
 5 
 6 
 7     <div class="cont">
 8         <div class="box">
 9             <div class="imgbox">
10                 <img src="images/4.jpg" alt="">
11             </div>
12         </div>
13     </div>

 實現的一個大概思路:

  瀑布流:第一行正常浮動,從第二行開始,每個元素都定位到上一行的最小高度的元素下           1.獲取元素           2.佈局           3.區分第一行和後面的行           4.在第一行,找到第一行所有的高度           5.在後面的行,找到最小高度                 設置定位,left,top           6.修改之前的最小高度 思路就是這樣,這裡的難點在於找到第一行和最小高度;將思路列出就會很清晰的知道自己要做些什麼;所以還是比較推薦用面向對象去寫,後續的使用會更多。可以用這些小案例來練手,增加熟練度。
 1     function Waterfall(){
 2             // 1.獲取元素
 3             this.ocont = document.querySelector(".cont");
 4             this.abox = document.querySelectorAll(".box");
 5 
 6             // 將來準備存放第一行元素所有高度的數組
 7             this.heightArr = [];
 8 
 9             // 2.佈局
10             this.init()
11         }
12         Waterfall.prototype.init = function(){
13             // 佈局
14             this.num = Math.floor(document.documentElement.clientWidth / this.abox[0].offsetWidth)
15 
16             this.ocont.style.width = this.num * this.abox[0].offsetWidth + "px";
17             // 3.區分第一行
18             this.firstLine();
19             // 和後面的行
20             this.otherLine();
21         }
22         Waterfall.prototype.firstLine = function(){
23             // 4.在第一行,找到第一行所有的高度
24             for(var i=0;i<this.num;i++){
25                 this.heightArr.push(this.abox[i].offsetHeight)
26             }
27         }
28         Waterfall.prototype.otherLine = function(){
29             // 5.在後面的行,找到最小高度
30             for(var i=this.num;i<this.abox.length;i++){
31                 var min = getMin(this.heightArr);
32                 var minIndex = this.heightArr.indexOf(min);
33                 // 設置定位,left,top
34                 this.abox[i].style.position = "absolute";
35                 this.abox[i].style.top = min + "px";
36                 this.abox[i].style.left = minIndex * this.abox[0].offsetWidth + "px";
37                 // 6.修改之前的最小高度
38                 this.heightArr[minIndex] += this.abox[i].offsetHeight;
39             }
40         }
41 
42         function getMin(arr){
43             // 註意數組的深淺拷貝:深拷貝
44             var myarr = [];
45             arr.forEach(val => {
46                 myarr.push(val);
47             });
48             return myarr.sort((a,b)=>a-b)[0];
49         }

還有一個無限載入的小功能,我簡單說下思路吧,可以自己寫寫看!

  W1.準備數據--->自己模擬數組,假裝後臺給的         W2-0.綁定滾動事件         W2.找到頁面是否到底--->可視區域的高度+滾走的距離 >= 總高度-100(數值自己感受)         W3.渲染頁面         W4.生效瀑布流佈局 思路就是這樣,有疑問可以找我哈!加油沖吧!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 前面幾篇文章為大家介紹了 MySQL 各種語句語法的用法及用戶許可權相關知識。本篇文章將主要講解 MySQL 資料庫數據備份與恢復相關知識,主要聚焦於邏輯備份,介紹mysqldump工具的使用以及恢復方法。 這裡簡單講下物理備份和邏輯備份的概念: 物理備份 :備份數據文件,轉儲資料庫物理文件到 ...
  • Resource from StackOverflow 使用存儲過程,如何傳遞數組參數? 1.分割解析字元串,太麻煩 2.添加Sql Server 自定義類型 sp_addtype 問題需求:需要向SP 傳遞數組類型的參數 select from Users where ID IN (1,2,3 ) ...
  • 服務端啟動與客戶端連接 查看redis負載狀態 redis-cli命令控制行中獲取客戶端信息命令 借鑒:https://blog.csdn.net/weixin_37288522/article/details/78778755 借鑒:https://blog.csdn.net/weixin_339 ...
  • 數據挖掘 推薦演算法(Mahout工具) 一、簡介 Apache頂級項目(2010.4) Hadoop上的開源機器學習庫 可伸縮擴展的 Java庫 推薦引擎(協同過濾)、聚類和分類 二、機器學習介紹 通常問題都歸為這幾類問題 分類問題 回歸問題 聚類問題 推薦問題 三、安裝方法 3.1 下載Mahou ...
  • ### 前言 最近項目中又一次需要集成友盟的三方登錄與分享,之前沒有記錄過,所以這次來寫一下... ### 準備工作 1.註冊友盟賬號創建應用,獲取key:申請地址http://www.umeng.com 2.對對應的平臺(騰訊、微信、新浪等等)申請第三方賬號,獲取key和密碼 ### 集成步驟 因 ...
  • 一、源碼地址 https://github.com/imxiaoer/WeChatMiniSelect 二、效果圖 錄屏圖片質量較差,所以大家會看到殘影(捂臉) 三、組件源碼 1. select.wxml 說明:用 catchtap 而不用 bindtap 是為了阻止事件冒泡,為了實現點擊頁面其他地 ...
  • 一、float基礎用法示例 1、我們先建兩個div盒子,設置高度、寬度和背景顏色; 最開始兩個盒子在網頁上的位置如下: 然後我們將紅色盒子浮動到右邊 然後我們會發現紅色盒子浮動到了右邊,但是藍色盒子就直接上移到了原先紅色盒子的位置。 然後我們將藍色盒子也浮動到右邊看看效果: 我們會發現它會緊跟著紅色 ...
  • Vue路由系統 一切分離都是為了更好的結合,本文詳細介紹了前後端分離架構之後,前端如何實現路由控制,即Vue路由系統。 一、VueRouter實現原理 VueRouter的實現原理是根據監控錨點值的改變,從而不斷修改組件內容來實現的,我們來試試不使用VueRouter,自己實現路由控制,如下代碼: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...