css+js瀑布流佈局實現

来源:https://www.cnblogs.com/pp1211/archive/2023/12/27/17931045.html
-Advertisement-
Play Games

記錄一個瀑布流佈局問題的解決過程 最開始使用js實現,將子元素進行絕對定位,根據寬高及順序判斷定位的top與left。 問題:存在新增子元素頁面載入不及時的問題,會出現子元素初始狀態疊加在一起,計算完成後才能正常顯示。 點擊查看代碼 window.onload = () => { /* 傳入wate ...


記錄一個瀑布流佈局問題的解決過程

最開始使用js實現,將子元素進行絕對定位,根據寬高及順序判斷定位的top與left

問題:存在新增子元素頁面載入不及時的問題,會出現子元素初始狀態疊加在一起,計算完成後才能正常顯示。

點擊查看代碼
window.onload = () => {
  /* 傳入waterfall與pic節點,調用函數waterFall */
  waterFall('.waterfall', '.cases-item')
}
// column每行個數
// lineSpace列間距
// rowSpace行間距

function waterFall(waterfall, pic, marginTop=20,lineSpace = 0, rowSpace = 40) {
  let column=3
  let win_w=$(window).width();
  if(win_w>1200){
    column=3
  } else  if(win_w<=1200&&win_w>600){
    column=2
  }
  /*waterfallWidth可視視窗waterfall的寬度  */
  var waterfallWidth = document.querySelector(waterfall).offsetWidth
  /* 計算每個pic的寬度 */
  var line = (column - 1) * lineSpace
  var picWidth = parseInt((waterfallWidth - line) / column)
  /* 獲取所有pic節點 */
  var picNode = document.querySelectorAll(pic)
  /* 通過for迴圈完成瀑布流的設置 */
  var picArr = []
  for (var i = 0; i < picNode.length; i++) {
    /* 設置每一個pic的寬度 */
    picNode[i].style.width = picWidth + 'px'
    /* 獲取每一個pic的高 */
    // console.log('picNode[i]',picNode[i],picNode[i].clientHeight)
    var picHeight = picNode[i].clientHeight
    /* 通過判斷,區分第一行和非第一行 */
    if (i < column) {
      /* 給第一行的進行定位 */
      picNode[i].style.top = marginTop
      picNode[i].style.left = (picWidth + lineSpace) * i+ 'px'
      /* 將獲取的pic的高push到一個數組記錄下來 */
      picArr.push(picHeight)
      // console.log('picHeight',picHeight)
    }else{
      /* 在非第一行中,找到數組的最小值 */
      var picArrMin=Math.min(...picArr)
      // console.log(picArrMin);
      /* 獲取最小值的索引 */
      var mixIndex=picArr.indexOf(picArrMin)
      // console.log(mixIndex);
      /* 對非第一行的pic進行定位,top為最小值的高,left為pic寬加行間距乘以最小值的索引 */
      picNode[i].style.top=(picArrMin+rowSpace+marginTop+marginTop)+'px'
      picNode[i].style.left=(picWidth+lineSpace)*mixIndex+'px'
      /* 對數組中的最小值進行修改 */
      picArr[mixIndex]+=picHeight+rowSpace
    }
  }
  const boxH=Math.max(...picArr)
  $(waterfall).css({height:boxH+'px'})
}


再次嘗試使用css中的column(多列佈局)實現簡單的瀑布流排版。
問題:元素預設為豎向排版,新增子元素不是在最下方更新,用戶體驗不好。

<div class="waterfall">
    <div class="item">內容</div>
    <div class="item">內容</div>
    <div class="item">內容</div>
    <div class="item">內容</div>
    <div class="item">內容</div>
    <div class="item">內容</div>
    <div class="item">內容</div>
</div>

css

.waterfall{
  column-count: 3;//幾列
  column-gap: 10px;//間距
  .item{
    display: inline-block;
    width: 100%;
  }
}

再次更換為另一種方法,使用flex佈局實現,結合css中的:nth-child() 和 order屬性,將子元素橫向排列。
需要為父元素固定高度,才能達到效果,最終使用flex佈局,結合js為父元素的高度賦值,解決了問題。
當添加子元素時,再次調用獲取高度方法,更新父元素高度即可。

佈局同上
css

.waterfall{
  display: flex;
  /* 讓內容按列縱向展示 */
  // flex-flow: column wrap;
  flex-direction:column;
  flex-wrap: wrap;
  height: 5000px;//初始高度,防止在腳本未載入時佈局錯亂
  /* 強制使內容塊分列的隱藏列 */
  &::before,
  &::after {
    content: "";
    flex-basis: 100%;
    width: 0;
    order: 2;
  }
  /* 重新定義內容塊排序優先順序,讓其橫向排序 */
  &.three{//三列
    &:nth-child(3n+1) { order: 1; }
    &:nth-child(3n+2) { order: 2; }
    &:nth-child(3n)   { order: 3; }
  }
  &.two{//兩列
    &:nth-child(2n+1) { order: 1; }
    &:nth-child(2n) { order: 2; }
  }
}

js

function getListHeight(){
  //獲取當前子項list
  let list=document.getElementsByClassName("item")
  if(list&&list.length>0){
    const heightArr=[0,0,0]
    //按順序獲取每列的高度
    for(let i=0;i<list.length;i++){
      if(i%3===0)heightArr[0]+=list[i].offsetHeight
      if(i%3===1)heightArr[1]+=list[i].offsetHeight
      if(i%3===2)heightArr[2]+=list[i].offsetHeight
    }
    //取最大值為父元素設置高度
    const maxHeight=Math.max(...heightArr)+50
    $(".waterfall").css({height:maxHeight+'px'});
  }else{
    //沒有子項則重置高度
    $(".waterfall").css({height:'auto'});
  }
}

以上就是全部解決過程,文中flex佈局方式參考瞭如下文章,感謝分享
https://www.cnblogs.com/xiaoxiaomini/p/17240258.html


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

-Advertisement-
Play Games
更多相關文章
  • 在C/C++中使用WMI(Windows Management Instrumentation)介面查詢系統信息是一種強大的方法。下麵是一個簡單的例子,演示如何使用WMI查詢系統信息,包括安裝的軟體信息、磁碟信息、網路適配器信息、操作系統信息等。請註意,這裡使用的是COM介面,因此需要在代碼中進行C ...
  • 什麼是Json Schema ? Json schema是一種聲明式語言,它可以用來標識Json的結構,數據類型和數據的具體限制,它提供了描述期望Json結構的標準化方法。 利用Json Schema, 你可以定義Json結構的各種規則,以便確定Json數據在各個子系統中交互傳輸時保持相容和一致的格 ...
  • 從昨天發表的《碼農的轉型之路-多年以來的反思》收到了不少猿友的評論和關註,還有幾個加了wx,給了很多正面的反饋。趁著熱度還在:) 也有很多人不知道這個人要幹嘛,索性今天正式介紹一下,但名字還沒有想好,她應該是一款瀏覽器工具。 一、什麼應用場景?1.C/S開發 大概是7年前當時公司接了一個區域品牌羊肉 ...
  • 關係型資料庫的特點 二維表 典型產品Oracle傳統企業,MySQL是互聯網企業 數據存取是通過SQL 最大特點,數據安全性方面強(ACID) • NoSQL:非關係型資料庫(Not only SQL) 不是否定關係型資料庫,做關係型資料庫的的補充 想做老大,先學會做老二 • NoSQL特性總覽 – ...
  • 表單是B端產品中最常見的組件之一,主要⽤於數據收集、校驗和提交。比如登陸流程的賬號密碼填寫,註冊流程的郵箱、用戶名等信息填寫,都是表單應用的常見案例,在數棧產品中也是出現頻率⾮常⾼的組件。 儘管表單應用十分普遍,但在我們對舊版數棧產品進行調研時,發現許多產品同學都反饋了關於表單的問題。所以在實際設計 ...
  • 官答|初始化GreatSQL報錯無法找到數據目錄或初始化數據字典失敗 GreatSQL推出新欄目——官答 官答欄目針對GreatSQL資料庫中的問題,選取官方論壇和討論群中的典型提問進行深入解答。內容涵蓋資料庫安裝部署、配置優化、故障排查、性能測試等方面。 在文章中,我們不僅提供解決方案,還會結合實 ...
  • 前言 經過上一篇文章的介紹,已經將這個計算器的計算功能實現了,接下來就是我們項目當中的一個發包上線階段,我模擬一下,目的就是為了給大家介紹一下,uni-app是如何打包成網頁的。 除了可以打包成網頁,uni-app還可以打包成小程式、App、H5、快應用等等,後面在單獨開文章詳細介紹。 正文 接著上 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 說到try...catch都覺得非常熟悉了,不就是用來捕捉代碼塊中的錯誤嘛,平時也用得比較多的。然而因為瞭解不夠多,我的面試卻栽在了一個簡單的知識點上:try...catch只能捕捉到同步執行代碼塊中的錯誤。 題目是:以下代碼有錯嗎?如果 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...