封装 AJAX
function AJAX(options) {
var method = options.method.toUpperCase();
var url = options.url;
var isAsync = options.isAsync;
var data = options.data;
var dataStr = '';
var success = options.success || function() {};
var xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
} else {
return alert('当前浏览器不支持XMLHTTPRequest');
}
if (typeof data === 'object') {
for (var prop in data) {
if (data.hasOwnProperty(prop)) {
dataStr += prop + '=' + data[prop] + '&';
}
}
} else {
dataStr = data.toString();
}
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
success(JSON.parse(xhr.responseText))
}
}
}
var method = options.method.toUpperCase();
if (method === 'GET') {
xhr.open(method, url + '?' + dataStr, isAsync);
xhr.send();
} else {
xhr.open(method, url, isAsync);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(dataStr);
}
}
HTML结构
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AJAX 获取图片数据 实现瀑布流操作</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<ul class="wrapper">
<li class="col"></li>
<li class="col"></li>
<li class="col"></li>
<li class="col"></li>
</ul>
<script src="JS/ajax.js"></script>
<script src="JS/index.js"></script>
</body>
</html>
index.css
* {
margin: 0;
padding: 0;
}
.wrapper {
width: 980px;
margin: 0 auto;
list-style: none;
background-color: #eee;
}
.wrapper li {
float: left;
width: 25%;
}
.wrapper li::after {
content: '';
display: block;
clear: both;
}
.wrapper::after {
content: '';
display: block;
clear: both;
}
.wrapper .col div {
margin: 10px;
padding: 10px;
background-color: #fff;
}
.wrapper .col div img {
width: 100%;
}
index.js
function getData() {
AJAX({
method: 'GET',
url: '../data.json',
isAsync: true,
data: '',
success: function(data) {
console.log(data);
renderDom(data);
}
})
}
var oLi = document.getElementsByClassName('col');
function renderDom(data) {
data.forEach(function(item) {
var itemDom = createPic(item);
var index = getMinLi().minIndex;
oLi[index].appendChild(itemDom);
})
}
var imgWidth = oLi[0].offsetWidth - 20 - 20;
function createPic(data) {
var oItem = document.createElement('div');
oItem.className = 'item';
var oImg = new Image();
oImg.src = data.img;
oImg.height = imgWidth * data.height / data.width;
var oP = document.createElement('p');
oP.innerText = data.desc;
oItem.appendChild(oImg);
oItem.appendChild(oP);
return oItem;
}
function getMinLi() {
var oLi = document.getElementsByClassName('col');
var minIndex = 0;
var minHeight = oLi[minIndex].offsetHeight;
for (var i = 0; i < oLi.length; i++) {
if (oLi[i].offsetHeight < minHeight) {
minHeight = oLi[i].offsetHeight;
minIndex = i;
}
}
return {
minHeight: minHeight,
minIndex: minIndex
}
}
getData()
var timer = null;
window.onscroll = function() {
var scrollYOffset = window.pageYOffset;
var innerHeight = window.innerHeight;
var minHeight = getMinLi().minHeight;
clearTimeout(timer);
if (scrollYOffset + innerHeight > minHeight) {
timer = setTimeout(function() {
getData();
}, 500);
}
}
data.json
[{
"img": "image/0.png",
"desc": "第1张小女孩图片",
"height": 640,
"width": 424
}, {
"img": "image/1.jpg",
"desc": "第2张小女孩图片",
"height": 800,
"width": 533
}, {
"img": "image/2.jpg",
"desc": "第3张小女孩图片",
"height": 333,
"width":500
},{
"img": "image/3.jpg",
"desc": "第4张小女孩图片",
"height": 450,
"width": 253
}, {
"img": "image/4.jpg",
"desc": "第5张小女孩图片",
"height": 500,
"width": 500
}, {
"img": "image/5.jpg",
"desc": "第6张小女孩图片",
"height": 712,
"width": 500
},{
"img": "image/6.jpg",
"desc": "第7张小女孩图片",
"height": 750,
"width": 499
}, {
"img": "image/7.jpg",
"desc": "第8张小女孩图片",
"height": 720,
"width": 480
}, {
"img": "image/8.jpg",
"desc": "第9张小女孩图片",
"height": 750,
"width": 500
},{
"img": "image/9.jpg",
"desc": "第10张小女孩图片",
"height": 500,
"width": 500
}, {
"img": "image/10.jpg",
"desc": "第11张小女孩图片",
"height": 432,
"width": 288
}, {
"img": "image/11.jpg",
"desc": "第12张小女孩图片",
"height": 650,
"width": 447
},{
"img": "image/12.jpg",
"desc": "第13张小女孩图片",
"height": 600,
"width": 500
}, {
"img": "image/13.jpg",
"desc": "第14张小女孩图片",
"height": 951,
"width": 658
}, {
"img": "image/14.jpg",
"desc": "第15张小女孩图片",
"height": 862,
"width": 603
}, {
"img": "image/15.jpg",
"desc": "第16张小女孩图片",
"height": 750,
"width": 499
}]