Heim > Artikel > Web-Frontend > Pure js implementiert das Wasserfall-Flow-Layout und Ajax fügt dynamisch data_javascript-Fähigkeiten hinzu
In diesem Artikel wird reiner JS-Code verwendet, um einen Wasserfall-Flow-Webseiteneffekt von Hand zu schreiben. Dabei wird zunächst ein grundlegendes Wasserfall-Flow-Layout realisiert und nach dem Scrollen nach unten die Funktion zum Laden neuer Bilder mit Ajax-Daten simuliert.
Nachteile:
1. Das Programm reagiert nicht und kann die Seitenbreite nicht in Echtzeit anpassen
2. Nach dem Hinzufügen von Ajax-Simulationsdatenbildern zum Programm werden alle Bilder auf der gesamten Seite neu positioniert.3. Das Programm wartet, bis alle Bilder geladen sind, bevor es die Bildgröße liest. Dies ist in der Praxis nicht möglich.
4. In tatsächlichen Projekten sollte der Bildgrößenwert vom Hintergrundprogramm angegeben werden und das Breitenattribut des Bildes sollte direkt im JS-Code verwendet werden.
Die Idee dieses Programms:
HTML-Struktur:
<body> <div id="container"> <div class="box"> <div class="box_img"> <img src="img/1.jpg" /> </div> </div> <div class="box"> <div class="box_img"> <img src="img/2.jpg" /> </div> </div> ... </div> </body>
1. Initialisierungslayout
1. Setzen Sie #container auf position:relative;2. Setzen Sie .box auf float:left;
3. Positionieren Sie alle Bilder, nachdem die Webseite geladen wurde;
3.1 Die Bildbreite ist festgelegt. Berechnen Sie die Anzahl der Bilder, die in jeder Zeile der aktuellen Seite untergebracht werden können, ermitteln Sie die Breite des #Containers und stellen Sie dann die Seite so ein, dass sie zentriert ist
3.2 Alle Bilder durchlaufen standardmäßig das Float-Layout als erste Zeile und werden im Array BoxHeightArr = [];
gespeichert3.3 Nachdem das Layout der ersten Zeile fertiggestellt ist, ordnen Sie das nächste Bild an und aktualisieren Sie BoxHeightArr[]:
3.3.1 Platzieren Sie das nächste Bild unter dem kürzesten Bild in der ersten Zeile (Position mithilfe von position:absolute), dh der Spalte mit der kleinsten Höhe in BoxHeightArr[], und zeichnen Sie den Indexwert der folgenden Zahl auf: minIndex ;
3.3.2 Aktualisieren Sie den kleinsten Wert in BoxHeightArr[] (BoxHeightArr[minIndex]+Höhe des aktuellen Bildes);
3.4 Wiederholen Sie Schritt 3.3, bis alle Bilder angeordnet sind
2. Überwachen Sie die Scrollhöhe in Echtzeit und bestimmen Sie, ob neue Daten geladen werden sollen1. Nachdem die Initialisierung abgeschlossen ist, ermitteln Sie die Höhe des letzten Bildes von oben: lastContentHeight
2. Verwenden Sie window.onscroll = function(){...}
Überwachen Sie die Scrollhöhe der aktuellen Seite in Echtzeit: scrollTop
Echtzeitüberwachung der aktuellen Seitenfensterhöhe ist: pageHeight
3. Wenn die Seite Folgendes erkennt: lastContentHeight < scrollTop + pageHeight, verwenden Sie Ajax, um die JSON-Daten des neu hinzugefügten Bildes abzurufen.
3. Neuer Inhalt am Ende der Seite1. Erstellen Sie zunächst mit einer Schleife einen neuen Bildcontainer, fügen Sie ihn unten hinzu und schreiben Sie dann die entsprechenden Bilddaten wie den Pfad und andere Informationen in den JSON-Daten in den Container, um das Hinzufügen des Bildes abzuschließen.
2. Nachdem alle neuen Bilder hinzugefügt wurden, führen Sie den Initialisierungsvorgang in Schritt 1 für alle Bilder und Layouts auf der gesamten Seite erneut aus.
Projektordner:
index.html: Platzieren Sie einige Bilddaten vorab
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" type="text/css" href="css/style.css"/> <script src="js/app.js"></script> <title>JavaScript瀑布流</title> </head> <body> <div id="container"> <div class="box"> <div class="box_img"> <img src="img/1.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/2.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/3.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/4.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/5.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/6.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/7.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/8.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/9.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/10.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/1.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/2.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/3.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/4.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/5.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/6.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/7.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/8.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/9.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/10.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/1.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/2.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/3.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/4.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/5.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/6.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/7.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/8.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/9.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/9.jpg"/> </div> </div> <div class="box"> <div class="box_img"> <img src="img/10.jpg"/> </div> </div> </div> </body> </html>style.css:
*{ margin: 0; padding: 0; } #container{ position: relative; } .box{ padding: 5px; float: left; } .box_img{ padding: 5px; border: 1px solid #ccc; box-shadow: 0 0 5px #ccc; border-radius: 5px; } .box_img img{ width: 150px; height: auto; }app.js:
window.onload = function(){ imgLocation("container", "box"); //ajax模拟数据 var imgData = {"data":[{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"8.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"8.jpg"}]} window.onscroll = function(){ if(checkFlag()){ //判断是否到底部要加载新的数据 var cparent = document.getElementById("container"); //把ajax数据加载进页面 for(var i=0; i<imgData.data.length; i++){ var ccontent = document.createElement("div"); ccontent.className="box"; cparent.appendChild(ccontent); var boximg = document.createElement("div"); boximg.className = "box_img"; ccontent.appendChild(boximg); var img = document.createElement("img"); img.src = "img/"+imgData.data[i].src; boximg.appendChild(img); } //把所有图片数据重新定位一次 imgLocation("container", "box"); } } }; function checkFlag(){ var cparent = document.getElementById("container"); var ccontent = getChildElement(cparent, "box"); //得到最后一张图距顶部的高度,滚动高度,窗口高度 var lastContentHeight = ccontent[ccontent.length-1].offsetTop; var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; var pageHeight = document.documentElement.clientHeight || document.body.clientHeight; console.log(lastContentHeight+":"+scrollTop+":"+pageHeight); if(lastContentHeight < scrollTop + pageHeight){ return true; } } function imgLocation(parent, content){ //将parent下所有的content全部取出 var cparent = document.getElementById(parent); var ccontent = getChildElement(cparent, content); //根据当前浏览器窗口的宽度,确定每行图片数并固定,居中 var imgWidth = ccontent[0].offsetWidth; //offsetWidth = width + padding + border var num = Math.floor(document.documentElement.clientWidth / imgWidth); cparent.style.cssText = "width:"+imgWidth*num+"px;margin:0 auto"; //alert("pause"); //设置一个数组,用来承载第一行的图片信息 var BoxHeightArr = []; for(var i=0; i<ccontent.length; i++){ if(i<num){ //第一行的图片的高度记录下来 BoxHeightArr[i] = ccontent[i].offsetHeight; //当ajax数据加载后,程序是将所有图片重新定位,所以第一行的图片要清除position:absolute ccontent[i].style.position = "static"; }else{ var minHeight = Math.min.apply(null, BoxHeightArr); var minIndex = getminheightLocation(BoxHeightArr, minHeight); //把图放在第一行图索引值最小的下面 ccontent[i].style.position = "absolute"; ccontent[i].style.top = minHeight+"px"; ccontent[i].style.left = ccontent[minIndex].offsetLeft+"px"; //图片放好位置后更新“第一行图片信息的最小高度”, //然后利用for循环重复这个动作到结束 BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight; } } ;} //获取第一行图片高度最小的索引值 function getminheightLocation(BoxHeightArr, minHeight){ for(var i in BoxHeightArr){ if(BoxHeightArr[i] == minHeight){ return i; } } } //获取所有box function getChildElement(parent, content){ contentArr = parent.getElementsByClassName(content); return contentArr; }Rendering:
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für alle beim Erlernen der Javascript-Programmierung hilfreich sein wird.