簡單瀑布流小外掛(寬度一定)
瀑布流這個東西,學過很久了,現在把它記錄一下。
簡單說一下原理:定義一個數組儲存第一行中的所有div的高度(如果有間隙,加上間隙),找出第一行中的最小高度,然後下一行第一個div的top值就等於這個最小高度,然後更新儲存的最小高度,繼續重複執行。
如果我們要將它做成小外掛的話,需要考慮:
1. 我們要將它放到什麼地方去?
2. 當前顯示的是第幾頁
3. 每頁顯示多少數量
4. jsonp返回的資料
5. 每個div的寬度
6. div與div之間的間隙
7. 傳入進來的圖片的key值
8. 如果有文字說明,傳入進來的文字的key值
以上幾點都是我們要考慮的,因為這些可能是會變化的,所以這些都要做成變數,讓使用者傳入。
好了,以下附上原始碼(還有點小問題,但我還不知哪裡出問題了)。
/**
* 瀑布流
* @param {Object} json:資料
*/
function WaterFall(json){
this.obj = json.obj; // 瀑布流要在哪個物件中顯示
this.page = json.page || 1; // 當前的頁數,預設為1
this.count = json.count || 10; // 每頁顯示的資料量,預設為10
this.data = json.data; // 利用jsonp獲取的資料
this.width = json.width; // 每張圖片的寬度
this.gap = json.gap; // 圖片與圖片之間的間隙
this.path = json.path; // 利用jsonp返回的資料中的圖片路徑的key值,不是value值
this.textName = json.textName; // 文字描述,如果沒有文字,可以不寫或者傳入可以轉換為false的值
this.arrHeight = []; // 記錄一行中每個div高度的陣列
this.divs = []; // 裝著產生的div
this.num = this.page * this.count; // 當前顯示的圖片的總數
this.isEnd = false; // 是否到了利用jsonp獲取的最後一個數據,如果到了,就算繼續滾動滑鼠滾輪,也不會再載入任何資料
}
// 初始化方法
WaterFall.prototype.init = function(){
this.setObj();
this.createElements();
this.updatePosition();
this.mouseEnd();
};
// 主要用於設定傳入進來的物件的position屬性
WaterFall.prototype.setObj = function(){
this.obj.style.position = 'relative';
};
// 獲取最小高度
WaterFall.prototype.getMinHeight = function(){
var min = 0;
for(var i = 0, len = this.arrHeight.length; i < len; i ++){
if(this.arrHeight[i] < this.arrHeight[min]){
min = i;
}
}
return min;
};
// 獲取最大高度
WaterFall.prototype.getMaxHeight = function(){
var max = 0;
for(var i = 0, len = this.arrHeight.length; i < len; i ++){
if(this.arrHeight[i] > this.arrHeight[max]){
max = i;
}
}
return max;
};
// 建立div、建立img
WaterFall.prototype.createElements = function(){
var start = this.count * (this.page - 1); // 當前已經顯示了多少資料
for(var i = start; i < this.num; i ++){
var div = document.createElement('div');
div.style.width = this.width + 'px';
div.style.margin = this.gap/2 + 'px';
div.style.position = 'absolute';
var img = document.createElement('img');
img.src = this.data[i][this.path];
img.style.width = this.width + 'px';
div.appendChild(img);
// 如果有傳入文字,則建立p標籤
if(this.textName){
var p = document.createElement('p');
p.innerHTML = this.data[i][this.textName];
div.appendChild(p);
}
this.divs.push(div);
}
};
// 更新div的位置
WaterFall.prototype.updatePosition = function(){
// 計算一行能放多少個div
var cols = parseInt(this.obj.offsetWidth / (this.width + this.gap));
// 計算更新位置的起始值(上一次的結束位置)
var start = this.count * (this.page - 1); // 當前已經顯示了多少資料
for(var i = start; i < this.num; i ++){
var d = this.divs[i];
this.obj.appendChild(d); // 將建立的div新增到物件中
if(i < cols){ // 計算並設定第一行的div的left
d.style.top = 0;
d.style.left = i * (this.width + this.gap) + 'px';
// 將第一行中每個div的(高度+間隙)新增到陣列中
this.arrHeight.push(d.offsetHeight + this.gap);
}else{
var min = this.getMinHeight(); // 獲得每一行中的最小高度的div的下標
d.style.top = this.arrHeight[min] + 'px';
d.style.left = min * (this.width + this.gap) + 'px';
// 更新陣列中儲存的最小高度,上一行的最小高度加上目前div的高度及間隙
this.arrHeight[min] += (d.offsetHeight + this.gap);
}
}
// 設定最外層obj的高度值
var max = this.getMaxHeight();
this.obj.style.height = this.arrHeight[max] + 'px';
};
// 滑鼠滾動到底部時,頁數加1,繼續載入剩餘的資料,當資料載入完成,不再繼續載入
WaterFall.prototype.mouseEnd = function(){
var t = this;
window.onscroll = function(){
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
if(scrollTop + clientHeight > t.obj.offsetHeight){
if(t.isEnd){
return;
}
// 噹噹前頁面的總資料量大於jsonp傳遞過來的資料量時,將isEnd設定為true
// 並將頁面總資料量設定為jsonp傳遞過來的資料量
// 當前頁數設定為jsonp傳遞過來的資料量除以每頁資料,並向上取整
if(t.num >= t.data.length){
t.isEnd = true;
t.num = t.data.length;
t.page = Math.ceil(t.data.length / t.count);
}else{
// 如果當前頁面的總資料量小於或等於jsonp傳遞過來的資料量時,
// 當前頁數加1,更新當前頁面總資料量
t.page++;
t.num = t.count * t.page;
// 如果當前頁面的總資料量剛好等於jsonp傳遞過來的資料量時,也將isEnd設定為true
if(t.num == t.data.length){
t.isEnd = true;
}
}
// 根據頁面總資料量建立節點及更新節點位置
t.createElements();
t.updatePosition();
}
};
};
相關推薦
簡單瀑布流小外掛(寬度一定)
瀑布流這個東西,學過很久了,現在把它記錄一下。 簡單說一下原理:定義一個數組儲存第一行中的所有div的高度(如果有間隙,加上間隙),找出第一行中的最小高度,然後下一行第一個div的top值就等於這個最小高度,然後更新儲存的最小高度,繼續重複執行。 如果我們要
RecyclerView 實現簡單瀑布流的應用
效果 實現程式碼 需要的jar包 com.android.support:recyclerview-v7:28.0.0 com.android.support:cardview-v7:28.0.0 activitymain的xml程式碼 <?xml version=
js簡單瀑布流實現
什麼是瀑布流 瀑布流其實就是一種佈局方式,比如說有很多模組,這些模組大小不一,怎樣才能把這些模組相對漂亮的排列到一起?瀑布流就可以很好地解決這個問題。首先把這些模組的寬(高)都設定一樣,然後讓他們像瀑布一樣從上到下依次排列。如果還不清楚的話,強烈建議大家去看一
原生JavaScript實現簡單瀑布流
瀑布流,想必大家都有所瞭解,簡單說就是一些等寬不等高的模組組成的頁面,可以一直進行載入,比如淘寶購物介面、百度瀏覽圖片介面,都採用了瀑布流,接下來使用原生JS程式碼進行實現。 html結構: <!DOCTYPE html> <html lang
iOS之簡單瀑布流的實現
前言 超簡單的瀑布流實現,這裡說一下筆者的思路,詳細程式碼在這裡 效果演示 實現思路 collectionView能實現各中吊炸天的佈局,其精髓就在於UICollectionViewLayout,因此我們要自定義一個layout來繼承系統的UICollectionViewLayout,所有工作都在這個
jquery超炫瀑布流相簿外掛特效程式碼--適合做個人部落格相簿
超炫瀑布流相簿--適合做個人部落格相簿,效果蠻不錯的,給大家分享,適合加在個人部落格相簿裡面 檔案結構: 直接執行demo.html就行了,相容目前IE,火狐,谷歌 <html> <head> <meta charset="utf
固定列寬的簡單瀑布流實現
在看JavaScript實戰中看到瀑布流,決定記錄下程式碼,以備不時之需。 首先寫一個HTML程式碼 <!DOCTYPE html> <html> <head> <title>瀑布流</title> <link
Android RecyclerView瀑布流中Item寬度異常的問題(原始碼分析)
問題描述 通過RecyclerView配合StaggeredGridLayoutManager可以很方便的實現瀑布流效果,一般情況下會把作為Item的子View寬度設定為MATCH_PARENT,那麼子View將根據列數(假定是垂直排列)平均分配Recycle
UICollectionViewLayout的簡單使用(簡單瀑布流)
對於需要使用到列表的頁面,一般是使用UITableView或者是UICollectionView來實現。一直以來都是直接使用UICollectionViewFlowLayout,基本都能實現需求功能,但是對於直接利用UICollectionViewLayout來
CSS浮動&簡單瀑布流佈局
浮動(float) float屬性 left:元素向左浮動 right:元素向又浮動 none:元素不浮動 inherit:從父級繼承浮動屬性 clear屬性 l
WPF下制作的簡單瀑布流效果
瀑布流 height value get == protected property loaded rop 原文:WPF下制作的簡單瀑布流效果最近又在搞點小東西,美化界面的時候發現瀑布流效果比較不錯.順便就搬到了WPF,下面是界面 我對WEB前端不熟,JS和CS
微信小程序 瀑布流布局
ear size -m mil item medium app fan height 今天做小程序的時候,碰到一個比較常見的需求,就是要瀑布流布局,兩列,交錯分布,大概如下圖 最終要實現的結果就是如左圖所示。 不過在微信小程序裏面,不能通過JavaScript來直接操
利用JS實現簡單的瀑布流效果
color position func 如何實現 利用 無限 bar 拓展 復制代碼 一.瀑布流之準備工作 首先聲明下, 為了方便演示和聯系, 我使用的是本地圖片, 如果大家有需要的話可以嘗試著寫下網絡的, 不過本地和遠端的大致是相同的. 那麽我就來簡單介紹下本地
微信小程式瀑布流
微信小程式瀑布流 微信小程式瀑布流,使用flex佈局寫的,有好有壞; 好處:程式碼簡單明瞭,易懂 壞處:某列過長,某列過短 看效果圖: 我特意調的,末尾空白,歡迎交流 wxml: <view class='gride'>
小程式瀑布流元件
git倉庫地址:https://github.com/kapeter/mpMasonry 前段時間,接到一個需求,要在小程式中實現不定高度的瀑布流佈局。我首先去萬能的百度上搜索了一波,確實有很多方案,但都是固定高度的,這和需求不符。於是決定自己寫一個,考慮到後面也會有類似的需求,乾
簡單的瀑布流
ctype reg 門店銷售 pla rms .html child wal tran 最近需要一個簡單的瀑布流效果,所以網上找了一個,修改了部分代碼 1、輕量代碼,壓縮2kb。 2、適用寬度自適應布局。瀑布流列由css控制。(先加入空列,獲取寬度,刪除空列,根據總寬計算列
CAD繪圖必備小外掛 :想要快速提高工作效率也很簡單!
相信很多學習相關設計的小夥伴們都煩惱過這個問題吧,特別是那些剛剛入門的設計小白們,都在想怎麼才能設計出一張完美的設計圖紙檔案,我們一直都在學習繪圖的技巧,殊不知在工作上,除了技巧可以提高我們的畫圖效率,用好工具也能事半功倍。怎麼才能快速的提高我們的繪圖效率吧,其實也不是很困難,今天小編就為大
微信小程式實現css 瀑布流佈局方法
在微信小程式中經常使用瀑布流來進行頁面的佈局,今天就遇到了這樣的情況,之前是一直用flex佈局來著,但是flex佈局帶來的問題是圖片高度不同那麼進行佈局的時候有些圖片的下面就會留出很多富餘的空間這樣看著就不是很好了,所以在這裡採用瀑布流的方法:Multi-column,廢話少說上程式碼: ind
【css】最簡單的瀑布流佈局方法
前言:用column-count就能實現簡單的瀑布流佈局 一、程式碼 <body> <style> .parent { width:100%; -moz-co
web頁面和小程式頁面實現瀑布流效果
小程式實現瀑布流效果,和web頁面差不多,都要經過以下步驟: 1)、載入圖片,獲取圖片的寬高度; 2)、根據頁面需要顯示幾列計算每列的寬度; 3)、根據圖片真實寬度和每列的寬度比,計算出圖片需要顯示的高度; 4)、重新對圖片進行定位 1、web頁面瀑布流效果,先看效果圖(瀑布流+無限滾動載入):