日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

瀑布流

又稱瀑布流式布局,是比較流行的一種網站頁面布局方式。即多行等寬元素排列,后面的元素依次添加到其后,等寬不等高,根據圖片原比例縮放直至寬度達到我們的要求,依次按照規則放入指定位置。

 

web前端入門到實戰:純CSS瀑布流與JS瀑布流

 

 

為什么使用瀑布流

瀑布流布局在我們現在的前端頁面中經常會用的到,它可以有效的降低頁面的復雜度,節省很多的空間,對于整個頁面不需要太多的操作,只需要下拉就可以瀏覽用戶需要看到的數據;并且,在當前這個App至上的時代,瀑布流可以提供很好的用戶體驗,通過結合下拉刷新,上拉加載進行數據的懶加載等操作,對于用戶的體驗感來說是接近于滿分的!

瀑布流的特點

其實瀑布流的特點就是參差不齊的排列方式,以及流式布局的擴展性,可以通過界面展示給用戶多條數據,并且讓用戶可以有向下瀏覽的沖動。

瀑布流的代碼實現

1.純 css 瀑布流:( multi-columns 方法 )

// 這里是第一次接觸到 column-columns 這個屬性,這是一個可以設置將div元素中的文本分成幾列

//默認值是:auto

//寫法:

column-count:3;

-moz-column-count:3; /* Firefox /

-webkit-column-count:3; / Safari and Chrome */

/* 注意:IE9及更早 IE 版本瀏覽器不支持 column-count 屬性 */

//這里還會用到另一個屬性 column-gap,用來調整邊距,實現瀑布流布局

html結構代碼如下:

<div class="demo-1"> 
 <div class="item"> 
 <div class="item_content content-lar" style="height:100px;" > 1</div> 
 </div> 
 <div class="item"> 
 <div class="item_content content-sma"style="height:150px;" > 2</div> 
 </div>
 <div class="item"> 
 <div class="item_content content-mid"style="height:50px;" > 3</div> 
 </div>
 <div class="item"> 
 <div class="item_content content-sma" style="height:200px;" > 4</div> 
 </div>
 <div class="item"> 
 <div class="item_content content-mid"style="height:60px;" > 5 </div> 
 </div>
 <div class="item"> 
 <div class="item_content content-lar"style="height:90px;" > 6</div> 
 </div> 
 <div class="item"> 
 <div class="item_content content-sma"> 7</div> 
 </div>
 <div class="item"> 
 <div class="item_content content-lar"style="height:120px;" > 8</div> 
 </div>
 <div class="item"> 
 <div class="item_content content-lar"> 9</div> 
 </div>
 <div class="item"> 
 <div class="item_content content-sma" style="height:100px;" > 10 </div> 
 </div>
 <div class="item"> 
 <div class="item_content content-mid"> 11 </div> 
 </div>
 <div class="item"> 
 <div class="item_content content-mid"style="height:100px;" > 12</div> 
 </div>
 <!-- more items --> 
</div>
web前端開發學習Q-q-u-n: 767中273后102 ,分享學習的方法和需要注意的小細節

CSS代碼如下:

.demo-1{ 
 -moz-column-count:3; /* Firefox */
 -webkit-column-count:3; /* Safari 和 Chrome */
 column-count:3;
 -moz-column-gap: 1em;
 -webkit-column-gap: 1em;
 column-gap: 1em;
 width: 80%;
 margin:0 auto;
 }
 .item { 
 padding: 2em;
 margin-bottom: 2em;
 -webkit-column-break-inside: avoid;
 break-inside: avoid; /*防止斷點*/
 background: #ccc;
 text-align: center;
 }

效果圖:

 

web前端入門到實戰:純CSS瀑布流與JS瀑布流

 

 

這里有個弊端,這并不符合瀑布流的原理,如果使用純css寫瀑布流,則每一塊都是從上往下排列,不能做到從左到右排列,并且不會識別哪一塊圖片放在哪個地方合適,若是再配合動態加載,效果會特別不好,所以只能通過JS來實現瀑布流。

那么這里用圖片來分析一下我們想要的瀑布流是什么樣的。

瀑布流的位置分析圖解

如下方圖片。假設一排放5張圖片。當第一排排滿足夠多的等寬圖片時,顯示的是這樣的。那么假如我們要放第6張圖片的時候,應該放在什么位置呢?

web前端入門到實戰:純CSS瀑布流與JS瀑布流

 

 

 

如果按照我們的正常邏輯來想,應該是放在第一張圖片下面,依次水平排列過去(如下圖)

 

web前端入門到實戰:純CSS瀑布流與JS瀑布流

 

 

但現實并非如此!在瀑布流中,從第2行開始,接下去的每一張圖片都會放在上行中高度最低的那一列圖片下方。(如下圖)

 

web前端入門到實戰:純CSS瀑布流與JS瀑布流

 

 

為什么呢?因為放置它之前,這一列的高度為所有列中最小,所以會放置在這個地方。

那么如果再繼續放置下去,第七張圖片應該放在第三列圖片下方,以此類推。

 

web前端入門到實戰:純CSS瀑布流與JS瀑布流

 

 

所以每次加載圖片時,會需要判斷哪一列的圖片累計的高度最小,那么下一張圖片就放在哪一列,即瀑布流算法去判斷圖片的確定位置。

JS代碼實現

實現思路:

  1. 設定每一列圖片的寬度和間距
  2. 獲取當前窗口的總寬度,從而根據圖片寬度去旁段分成幾列
  3. 獲取所有圖片元素,定義一個空數組來保存高度
  4. 遍歷所有容器,開始判斷 當頁面加載完成,或頁面寬度發生變化時,調用函數。
  • 如果當前處于第一行時: 直接設置圖片位置【 即 top為間距的大小,left為(當前圖片的寬度+間距) * 當前圖片的值+間距大小 】,并保存當前元素高度。
  • 如果當前不處于第一行時:進行高度對比,通過遍歷循環,拿到最小高度和相對應的索引,設置圖片位置【 即 top為最小高度值+間距*2,left為 (當前圖片的寬度+間距) * 索引 值+間距大小)】,并修改當前索引的高度為當前元素高度。
  1. 當頁面加載完成,或頁面寬度發生變化時,調用函數。

代碼實現

<script type="text/JAVAscript">
 // 定義瀑布流算法函數
 function fall() {
 const minGap = 20; // 最小間距,讓每一列的最小空隙可以自定義,避免太過擁擠的情況發生。但是,會通過計算得到真實的間距。
 const itemWidth = 300; // 每一項的寬度,即當前每一個圖片容器的寬度。保證每一列都是等寬不等高的。
 const scrollBarWidth = getScrollbarWidth(); // 獲取滾動條的寬度
 const pageWidth = window.innerWidth - scrollBarWidth; // 獲取當前頁面的寬度 = window.innerWidth - 滾動條的寬度
 const column = Math.floor(pageWidth / (itemWidth + minGap)); // 實際列數=頁面寬度/(圖片寬度+最小間距)
 const gap = (pageWidth - itemWidth * column) / column/2; // 計算真實間距 = (頁面寬度- 圖片寬度*實際列數)/實際列數/2
 const items = document.querySelectorAll('img'); // 獲取所有的外層元素
 const heightArr = []; // 定義一個空數組,保存最低高度。
 // 獲取滾動條的寬度
 function getScrollbarWidth() {
 const oDiv = document.createElement('div');//創建一個div
 // 給div設置樣式。隨便定義寬高,只要能獲取到滾動條就可以
 oDiv.style.cssText = `width: 50px;height: 50px;overflowY: scroll;` 
 document.body.appendChild(oDiv);//把div添加到body中
 const scrollbarWidth = oDiv.offsetWidth - oDiv.clientWidth;// 使最大寬度和可視寬度相減,獲得到滾動條寬度。
 oDiv.remove();//移除創建的div
 return scrollbarWidth;//返回滾動條寬度
 }
 for (let i = 0; i < items.length; i++) {
 // 遍歷所有的外層容器
 const height = items[i].offsetHeight;
 // 如果當前處在第一行
 if (i < column) {
 // 直接設置元素距離上部的位置和距離左邊的距離。
 items[i].style.cssText = `top: ${gap}px;left: ${(itemWidth + gap) * i + gap}px`;
 // 保存當前元素的高度。
 heightArr.push(height);
 } else {
 // 不是第一行的話,就進行比對。
 let minHeight = heightArr[0]; // 先保存第一項的高度
 let minIndex = 0; // 保存第一項的索引值
 for (let j = 0; j < heightArr.length; j++) {
 // 通過循環遍歷比對,拿到最小值和最小值的索引。
 if (minHeight > heightArr[j]) {
 minHeight = heightArr[j];
 minIndex = j;
 }
 }
 // 通過最小值為當前元素設置top值,通過索引為當前元素設置left值。
 items[i].style.cssText = `top: ${minHeight + gap *2}px; left: ${(itemWidth + gap) * minIndex + gap}px`;
 // 并修改當前索引的高度為當前元素的高度
 heightArr[minIndex] = minHeight + gap + height;
 }
 }
 }
 // 頁面加載完成調用一次。
 window.onload = fall;
 // 頁面尺寸發生改變再次調用。
 window.onresize = fall;
</script>
web前端開發學習Q-q-u-n: 767中273后102 ,分享學習的方法和需要注意的小細節

最終效果圖:


總結瀑布流布局原理

  • 設置圖片寬度一致
  • 根據瀏覽器寬度以及每列寬度計算出列表個數,列表默認0
  • 當圖片加載完成,所有圖片依次放置在最小的列數下面
  • 父容器高度取列表數組的最大值

引申知識點

  • let,const以及var三者的區別
  • 滾動加載圖片(懶加載原理)
  • 反撇號(`)基礎知識
  • style和style.cssTest 的區別

分享到:
標簽:瀑布 CSS
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康