JS通過(guò)ajax + 多列布局 + 自動(dòng)加載實(shí)現(xiàn)瀑布流效果
Ajax
•說(shuō)明:本文效果是無(wú)限加載的,意思就是你一直滾動(dòng)就會(huì)一直加載圖片出現(xiàn),通過(guò)鼠標(biāo)滾動(dòng)距離來(lái)判斷的,所以不是說(shuō)的那種加載一次就停了的那種,那種demo下次我會(huì)再做一次
css部分用的是html5+css3的新屬性,圖片會(huì)自動(dòng)添加到每行的最頂端上去,而不是用js去判斷。去除了一些js計(jì)算的麻煩。
css部分:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #352323 url(images/a.png);
}
img {
display: block;
}
section {
max-width: 95%;
margin: 0 auto;
overflow: hidden;
column-count: 5;
column-gap: 0;
column-fill: auto;
}
figure {
border: 2px solid pink;
margin: 0 5px 10px;
break-inside: avoid;
padding: 5px;
}
figure img {
width: 100%;
}
figcaption {
padding: 10px 0;
text-align: center;
font-weight: 900;
color: #a77869;
}html部分:
通過(guò)js插入節(jié)點(diǎn),因?yàn)楹笈_(tái)不知道多少?gòu)垐D片
<section>
<!-- <figure>
<img src="images/1.jpg" alt="">
<figcaption>往后余生,風(fēng)雪是你</figcaption>
</figure> -->
</section>js有兩個(gè)部分,一個(gè)是我封裝的ajax函數(shù),和一些判斷函數(shù)
第一部分
window.onload = function() {
var section = document.getElementsByTagName('section')[0];
//運(yùn)行ajax函數(shù);
ajax('get', 'active.php', 'num=10', function(data) {
//解析json對(duì)象
let img_data = JSON.parse(data);
console.log(img_data);
//循環(huán)建多少圖片配多少標(biāo)簽
for (let i = 0; i < img_data.length; i++) {
//建立figure標(biāo)簽
let figure = document.createElement('figure');
//創(chuàng)建兩個(gè)子元素img和figcaption,并賦值
let img = document.createElement('img');
img.src = img_data[i];
let figcaption = document.createElement('figcaption');
figcaption.innerHTML = '往后余生,風(fēng)雪是你';
//插節(jié)點(diǎn)
figure.appendChild(img);
figure.appendChild(figcaption);
section.appendChild(figure);
}
});
document.onscroll = function() {
var scrollTop = document.documentElement.scrollTop; //距離網(wǎng)頁(yè)高度
console.log(scrollTop);
// var ks = document.documentElement.clientHeight; //可是化窗口高度
var ks = window.innerHeight || document.documentElement.clientHeight; //可是化窗口高度/兼容方法
var ht = document.documentElement.offsetHeight; //html總高度
// console.log(ht);
if (scrollTop + 1 >= ht - ks) { //鼠標(biāo)滾動(dòng)的距離大于html總高度-窗口的距離(也就是html在可視窗口之下的總高度)時(shí) 觸發(fā)函數(shù);
//執(zhí)行函數(shù)
ajax('get', 'active.php', 'num=10', function(data) {
//解析json對(duì)象
let img_data = JSON.parse(data);
console.log(img_data);
//循環(huán)建多少圖片配多少標(biāo)簽
for (let i = 0; i < img_data.length; i++) {
//建立figure標(biāo)簽
let figure = document.createElement('figure');
//創(chuàng)建兩個(gè)子元素img和figcaption,并賦值
let img = document.createElement('img');
img.src = img_data[i];
let figcaption = document.createElement('figcaption');
figcaption.innerHTML = '往后余生,風(fēng)雪是你';
//插節(jié)點(diǎn)
figure.appendChild(img);
figure.appendChild(figcaption);
section.appendChild(figure);
}
});
}
}
};第二部分:
/**
* ajax封裝
* @param {string} mehod請(qǐng)求數(shù)據(jù)方法
* @param {string} url 請(qǐng)求地址
* @param {string} data 請(qǐng)求參數(shù)
* @param {[functiong]} success [請(qǐng)求成功之后執(zhí)行的函數(shù)0]
* @return {[none]} none
*/
function ajax(mehod, url, data, success) {
var xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject("Microsoft.xmlhttp")
}
//如果有參數(shù)get方法需要拼接字符串url+?+data
if (mehod === 'get' && data) {
url += '?' + data;
}
//open方法
xhr.open(mehod, url, true);
//send方法
if (mehod === 'get') {
xhr.send();
} else {
xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
xhr(data);
}
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
success && success(xhr.responseText);
}
}php后臺(tái)數(shù)據(jù)
因?yàn)橹饕δ芷蚯岸?,所以后端就通過(guò)本地文件載入的
<?php
header("Content-type:text/html;charset=utf-8");
$num = $_GET['num']; // api調(diào)用者傳遞的需要的圖片頁(yè)數(shù)
$img = file("img.txt");
// var_dump($img);
$array_url = array();
for($i=0;$i<$num;$i++){
$url = array_rand($img);
array_push($array_url,$img[$url]);
}
$a = json_encode($array_url);
echo $a;總結(jié)
以上所述是小編給大家介紹的JS通過(guò)ajax + 多列布局 + 自動(dòng)加載來(lái)實(shí)現(xiàn)瀑布流效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
JavaScript使用?for...in?、?for...of?或者?forEach()?遍歷元素的示例
for...in?、?for...of?和?forEach?都是用于循環(huán)遍歷集合元素的方法,但它們之間有一些重要的區(qū)別,本文通過(guò)實(shí)例代碼介紹JavaScript使用?for...in?、?for...of?或者?forEach()?遍歷元素的相關(guān)知識(shí),感興趣的朋友一起看看吧2023-09-09
js獲取當(dāng)前日期時(shí)間及其它日期操作匯總
這篇文章主要介紹了js獲取當(dāng)前日期時(shí)間及其它日期操作匯總,感興趣的小伙伴們可以參考一下2016-03-03
JS實(shí)現(xiàn)統(tǒng)計(jì)字符串中字符出現(xiàn)個(gè)數(shù)及最大個(gè)數(shù)功能示例
這篇文章主要介紹了JS實(shí)現(xiàn)統(tǒng)計(jì)字符串中字符出現(xiàn)個(gè)數(shù)及最大個(gè)數(shù)功能,結(jié)合實(shí)例形式分析了javascript字符串遍歷、統(tǒng)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
JS實(shí)現(xiàn)固定時(shí)間點(diǎn)執(zhí)行某任務(wù)的代碼示例
在Web前端開發(fā)中,有時(shí)我們需要在特定的時(shí)間點(diǎn)執(zhí)行某些任務(wù),例如每日定時(shí)發(fā)送數(shù)據(jù)報(bào)告、每小時(shí)更新一次用戶界面等,JavaScript 提供了多種方法來(lái)實(shí)現(xiàn)這一需求,本文將詳細(xì)介紹如何使用這些工具和技術(shù),并通過(guò)豐富的代碼示例展示其具體應(yīng)用,需要的朋友可以參考下2025-02-02
JavaScript Canvas實(shí)現(xiàn)驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了JavaScript Canvas實(shí)現(xiàn)驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
js實(shí)現(xiàn)表單檢測(cè)及表單提示的方法
這篇文章主要介紹了js實(shí)現(xiàn)表單檢測(cè)及表單提示的方法,涉及javascript表單元素提示效果的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-08-08
鼠標(biāo)拖拽移動(dòng)子窗體的JS實(shí)現(xiàn)
這篇文章主要介紹了鼠標(biāo)拖拽移動(dòng)子窗體的JS實(shí)現(xiàn),需要的朋友可以參考下2014-02-02
javascript實(shí)現(xiàn)的柱狀統(tǒng)計(jì)圖表
下面是完成后的預(yù)覽圖,可以看到,繪制一個(gè)表格,耗時(shí)0.005毫秒,也就是200分之一秒。效率我還是比較滿意的!2010-07-07
如何使用JS獲取世界不同時(shí)區(qū)的當(dāng)前時(shí)間
文章介紹了在前端開發(fā)中使用JavaScript獲取不同時(shí)區(qū)當(dāng)前時(shí)間的幾種方法,文章還提醒開發(fā)者要注意國(guó)際化和本地化最佳實(shí)踐,并進(jìn)行充分的測(cè)試以確保代碼在不同環(huán)境和時(shí)區(qū)中的正確性,感興趣的朋友一起看看吧2024-12-12

