# 瀑布流思路
1.獲取屏幕的width,看一排能放置幾個box
2.對所有的box遍歷,將一排box,放入一個數組
~~~
box.forEach(function(value,index){
if(index<num){
arr.push(value.offsetHeight)
}
})
~~~
3.從高度最小的下標位置,放置圖片(使用定位 left=最小高度圖片的offsetLeft top=數組.indexOf(minHeight))
~~~
left=minIndex-->offsetLeft
top=minHeight
~~~
4.對數組的最小位置的值進行從新設置
5.當scrollHeight+clientHeight>最后一個元素距離頂部高度+自身高度一邊時滾動
### 代碼如下:
~~~
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="js/index.js"></script>
<style>
* {
margin: 0;
padding: 0
}
img {
width: 230px;
padding: 5px;
vertical-align: bottom;
}
.box {
/* position: relative; */
float: left;
width: 240px;
border: 1px solid rgba(51, 51, 51, 0.1);
border-radius: 5px
}
#container {
overflow: hidden;
margin-left: auto;
margin-right: auto;
}
</style>
</head>
<body>
<div id="container">
<div class="box">
<img src="images/01.jpg" alt="">
</div>
<div class="box">
<img src="images/02.jpg" alt="">
</div>
<div class="box">
<img src="images/03.jpg" alt="">
</div>
<div class="box">
<img src="images/04.jpg" alt="">
</div>
<div class="box">
<img src="images/05.jpg" alt="">
</div>
<div class="box">
<img src="images/06.jpg" alt="">
</div>
<div class="box">
<img src="images/07.jpg" alt="">
</div>
<div class="box">
<img src="images/08.jpg" alt="">
</div>
<div class="box">
<img src="images/09.jpg" alt="">
</div>
<div class="box">
<img src="images/10.jpg" alt="">
</div>
<div class="box">
<img src="images/11.jpg" alt="">
</div>
<div class="box">
<img src="images/12.jpg" alt="">
</div>
</div>
<script>
window.onload = function () {
var url = {
dataUrl: [{
src: "01.jpg"
}, {
src: "02.jpg"
}, {
src: "03.jpg"
}, {
src: "04.jpg"
}, {
src: "05.jpg"
}, {
src: "06.jpg"
}, {
src: "07.jpg"
}, {
src: "08.jpg"
}, {
src: "09.jpg"
}, {
src: "10.jpg"
}, {
src: "11.jpg"
}, {
src: "12.jpg"
}]
}
var container = document.getElementById("container");
var box = document.getElementsByClassName("box");
//放置圖片
place_img();
//當滾動條滾動時執行函數
window.onscroll = function () {
//判斷是否到達底部
if (sCondition()) {
//添加img元素
scrollShow();
}
}
function scrollShow() {
var arr = url.dataUrl;
for (var i = 0; i < arr.length; i++) {
var box = document.createElement("box");
box.className = "box";
// 創建img元素
var img = document.createElement("img");
//img內容
img.setAttribute("src", "images/" + arr[i].src);
//添加img元素
box.appendChild(img);
container.appendChild(box);
place_img();
}
}
function place_img() {
// 1.獲取屏幕的width,看一排能放幾張圖片
var dw = window.innerWidth;
var boxWidth = box[0].offsetWidth;
var num = Math.floor(dw / boxWidth)
container.style.width = boxWidth * num + "px";
// 2.獲取前五張圖片的height,將其存入一個數組
var box_arr = Array.prototype.slice.call(box, 0);
var height_arr = []
box_arr.forEach(function (value, index) {
if (index < num) {
var height = value.offsetHeight;
height_arr.push(height);
} else {
// 3.從數組中高度最小的地方開始放置圖片
var minHeight = Math.min(...height_arr);
var minIndex = height_arr.indexOf(minHeight);
var offsetLeft = box[minIndex].offsetLeft;
box_arr[index].style.position = "absolute";
// left為最大高度位置圖片的offsetLeft
box_arr[index].style.left = offsetLeft + "px";
// top為最小高度
box_arr[index].style.top = minHeight + "px"
// 4.重新設置最小位置的高度
height_arr[minIndex] += box_arr[index].offsetHeight;
}
})
}
//當滾動條在最底部時的判定條件
function sCondition() {
//滾動條距離頂部的高度
var sH = document.documentElement.scrollTop;
//可視區域的高度
var cH = document.documentElement.clientHeight;
var lastH = box[box.length - 1].offsetTop + box[box.length - 1].offsetHeight / 2;
return (sH + cH > lastH) ? true : false;
}
}
</script>
</body>
</html>
~~~
- JavaScript介紹
- js基本語法
- 調試方法
- 標識符
- 數據類型(基本,引用)
- 基本數據類型
- 引用數據類型
- 嚴格模式.
- 全局變量和局部變量
- DOM 節點
- DOM 改變元素內容(樣式 內容)
- 節點改變元素內容(通過父子節點找到元素然后操作)
- 添加元素
- 設置 移除 屬性
- DOM下的事件
- 知識點整理
- 異步
- Ajax
- this指向問題
- 設備類型檢測(手機 平板 電腦)
- 函數
- 函數的參數
- 重載
- 數據類型
- 構造函數
- 返回上一個網頁
- 數組 (重點)
- 增加數組內容
- 刪除數組元素
- 復制數組
- 修改數組元素(功能強大實現 增 刪 改)
- 數組元素查詢
- 數組遍歷
- 最值
- 展開語法
- join
- 排序問題
- 求和
- 顛倒數組
- 判斷是不是一個數組
- 二維數組
- 數組和字符串之間轉換
- 數組去重
- 將jquery對象轉為javascript對象
- 元素偏移量
- 獲取一個元素距離頂部的距離
- 可視區域寬高
- 布局視口 (移動設備)
- 文檔碎片
- 表格中的 thead tbody
- 獲取元素寬度
- 滾動區域寬高
- div滾動條設置
- 使用 offsetWidth 設置父元素寬度和子元素寬度之和一樣
- 字符串的方法
- js功能實現
- 點擊顯示 隱藏
- 點擊變色 兄弟元素隱藏.
- 點擊顯示隱藏區域.
- 兼容性問題.
- 選擇按鈕,
- 獲取外部樣式
- 點擊彈出下標
- 通過屬性改變img 的src
- 小米登錄 es6實現js
- try catch
- 小米登錄es5實現js
- js實現導航欄點擊加載多個頁面
- js實現網頁之間的跳轉和在指定div加載頁面
- iframe 高度實現自適應
- js 獲取滾動條距離頂端的距離
- jQuery animate() 方法 動畫效果
- fade(js實現遮罩層漸變色)
- js輪播實現
- 超哥輪播js
- 輪播動畫原理
- 數組實現瀑布流
- 電子表計時器date
- 從豆瓣接口上取數據實現搜索功能(重點!!!!)
- 封裝
- 不使用js-ajax 使用VueResource實現數據請求
- 需要常看的知識點
- 移動端響應布局rem
- rem+vw
- 原型
- JS的模塊化如何解決
- ES5和ES6模塊化寫法
- js內置對象
- 結構賦值es6
- 字符串模板 分割字符串
- 談基本數據類型中的方法(本不帶有方法)
- Math
- date
- 正則
- 備選字符集
- 連號的備選字符集
- replace() 查找替換(過濾)
- 量詞
- 不確定的數量
- search找下標
- test()檢驗是否包含正則表達式
- 實例
- 驗證電話號碼
- 郵箱驗證
- 將指定內容過濾(天貓 淘寶)
- 預定義字符集(簡化)
- 嚴格匹配 ^ $
- Ajax
- http get post
- $.get()和$.post()詳解
- jquery-ajax 數據請求
- 使用Vue Ajax在網頁中渲染數據
- axios向服務器端get,post數據(重點)
- 跨域
- 原生Ajax
- 原理步驟 json解析字符串
- 多態
- js中的面向對象
- js中的類和繼承
- 原型和原型鏈
- 參數表達式
- 字符串中常用的方法
- mock.js
- scrollReveal 滾動顯示
- Node.js模塊里exports與module.exports的區別