瀑布流布局是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。
瀑布流布局一般使用在网页中,在移动端用的比较少但是也不可缺。下面就介绍一下如何在ionic3中使用瀑布流布局。
首先创建一个项目,这里不多做介绍。我们用about这个模块来进行瀑布流的开发。
这里先介绍一下实现的流程:
我们先要定义一个container,在container中存在有多个box,box里面放置图片。
1、首先获取container中的所有box。
2、获取box的宽度和屏幕的宽度。
3、获取在当前屏幕宽度下一行可以放置多少个box。
4、将所有的box的高度放到一个数组当中。
5、遍历数组,获取到第一行中最高度最小的box。
6、遍历数组的下标到达第二行的时候将第二排的首元素放在第一行的高度最低的元素下面。(比如一行放了三个box,其中第三个高度最低,那么第四个就放在第三个box的下面。)
7、将元素放在最低元素下面后,则将第三个元素和第四个元素高度相加成为一个新的第三个元素,同样重复即可实现。
下面是详细代码
about.html
1
2
3
4
5
6
7
8
9
10
11
12
13
about.scss
page-about { ion-content{#container{position: relative;.box{padding:5px;float: left;.box_img{padding:5px;border:1px solid#cccccc;box-shadow:005px#ccc;border-radius:5px;img{width:150px!important;height: auto;} } } } }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
about.ts
import { Component }from'@angular/core';import { NavController, IonicPage }from'ionic-angular';@IonicPage({ name:'about'})@Component({ selector:'page-about', templateUrl:'about.html'})export class AboutPage { img_data = [{ src:"assets/images/a.jpg"}, { src:"assets/images/b.jpg"}, { src:"assets/images/c.jpg"}, { src:"assets/images/d.jpg"}, { src:"assets/images/e.jpg"}, { src:"assets/images/f.jpg"}, { src:"assets/images/g.jpg"}, { src:"assets/images/h.jpg"}, { src:"assets/images/i.jpg"}, { src:"assets/images/j.jpg"}, { src:"assets/images/k.jpg"}, { src:"assets/images/l.jpg"}, { src:"assets/images/m.jpg"}, { src:"assets/images/n.jpg"}, { src:"assets/images/o.jpg"}] constructor(publicnavCtrl: NavController) { } ngAfterViewInit() { } ionViewWillEnter() {this.getNode(); } getNode() {letparentNode = document.getElementById("container");letchildNodeArray: any = parentNode.getElementsByClassName("box");letscreenWidth = document.documentElement.clientWidth;letchildWidth = childNodeArray[0].offsetWidth;letnum = Math.floor(screenWidth / childWidth);//获得一排摆的个数 用Math.floor()转换为整数parentNode.style.cssText ="width:"+ childWidth * num +"px; margin:0 auto";//固定container的宽并设置居中this.setImagePosition(num, childNodeArray); } setImagePosition(num, childArray) {varimgHeightArray = [];//定义数组用于存放所有图片的高度for(vari =0; i < childArray.length; i++) {//遍历所有图片if(i < num) { imgHeightArray[i] = childArray[i].offsetHeight;//取得第一排图片的高度}else{varminHeight = Math.min.apply(null, imgHeightArray);//获取第一排图片中高度最小的图片varminIndex =this.getMinHeight(imgHeightArray, minHeight);//函数获得高度最小的图片的位置childArray[i].style.position ="absolute";//绝对定位图片childArray[i].style.top = minHeight +"px";//图片距顶部像素childArray[i].style.left = childArray[minIndex].offsetLeft +"px";//图片距左的像素imgHeightArray[minIndex] = imgHeightArray[minIndex] + childArray[i].offsetHeight;//将最低高度的box的高度加上它下方的box高度} } } getMinHeight(imgHeightArray, minHeight) {for(variinimgHeightArray) {if(imgHeightArray[i] == minHeight) {//循环所有数组的高度 让它等于最小图片的高度 返回i值returni; } } }//这里是借助ionic的上拉加载代替网页的滚动监听实现加载更多doInfinite(infiniteScroll) {letparentNode = document.getElementById("container");for(vari =0; i { infiniteScroll.complete() },1000); }}