Ionic3实现图片瀑布流布局


Posted in Javascript onAugust 09, 2017

瀑布流布局是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。

瀑布流布局一般使用在网页中,在移动端用的比较少但是也不可缺。下面就介绍一下如何在ionic3中使用瀑布流布局。

首先创建一个项目,这里不多做介绍。我们用about这个模块来进行瀑布流的开发。

这里先介绍一下实现的流程:

Ionic3实现图片瀑布流布局

我们先要定义一个container,在container中存在有多个box,box里面放置图片。

1、首先获取container中的所有box。

2、获取box的宽度和屏幕的宽度。

3、获取在当前屏幕宽度下一行可以放置多少个box。

4、将所有的box的高度放到一个数组当中。

5、遍历数组,获取到第一行中最高度最小的box。

6、遍历数组的下标到达第二行的时候将第二排的首元素放在第一行的高度最低的元素下面。(比如一行放了三个box,其中第三个高度最低,那么第四个就放在第三个box的下面。)

7、将元素放在最低元素下面后,则将第三个元素和第四个元素高度相加成为一个新的第三个元素,同样重复即可实现。

下面是详细代码

about.html

<ion-content>
  <div id="container">
    <div class="box" *ngFor="let image of img_data">
      <div class="box_img">
        ![]({{image.src}})
      </div>
    </div>
  </div>
  <ion-infinite-scroll (ionInfinite)="doInfinite($event)">
    <ion-infinite-scroll-content loadingSpinner="circles" loadingText="正在加载...">
    </ion-infinite-scroll-content>
  </ion-infinite-scroll>
</ion-content>

about.scss

page-about {
  ion-content {
    #container {
      position: relative;
      .box {
        padding: 5px;
        float: left;
        .box_img {
          padding: 5px;
          border: 1px solid #cccccc;
          box-shadow: 0 0 5px #ccc;
          border-radius: 5px;
          img {
            width: 150px!important;
            height: auto;
          }
        }
      }
    }
  }
}

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(public navCtrl: NavController) {

 }

 ngAfterViewInit() {

 }
 ionViewWillEnter() {
  this.getNode();
 }
 getNode() {
  let parentNode = document.getElementById("container");
  let childNodeArray: any = parentNode.getElementsByClassName("box");
  let screenWidth = document.documentElement.clientWidth;
  let childWidth = childNodeArray[0].offsetWidth;
  let num = Math.floor(screenWidth / childWidth); //获得一排摆的个数 用Math.floor()转换为整数
  parentNode.style.cssText = "width:" + childWidth * num + "px; margin:0 auto"; //固定container的宽并设置居中
  this.setImagePosition(num, childNodeArray);
 }

 setImagePosition(num, childArray) {
  var imgHeightArray = [];//定义数组用于存放所有图片的高度
  for (var i = 0; i < childArray.length; i++) { //遍历所有图片
   if (i < num) {
    imgHeightArray[i] = childArray[i].offsetHeight; //取得第一排图片的高度
   } else {
    var minHeight = Math.min.apply(null, imgHeightArray); //获取第一排图片中高度最小的图片
    var minIndex = 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 (var i in imgHeightArray) {
   if (imgHeightArray[i] == minHeight) { //循环所有数组的高度 让它等于最小图片的高度 返回i值
    return i;
   }
  }
 }
//这里是借助ionic的上拉加载代替网页的滚动监听实现加载更多
 doInfinite(infiniteScroll) {
  let parentNode = document.getElementById("container");
  for (var i = 0; i < this.img_data.length; i++) {
   let divNode = document.createElement("div"); //创建div节点
   divNode.className = "box";//为节点添加box类名
   parentNode.appendChild(divNode);//添加根元素
   let subDivNode = document.createElement("div");//创建节点
   subDivNode.className = "box_img";//为节点添加类名
   divNode.appendChild(subDivNode);//添加根元素
   var img = document.createElement("img");//创建节点
   img.src = this.img_data[i].src;//图片加载路径
   subDivNode.appendChild(img);//添加根元素
  }
  this.getNode();
  setTimeout(() => { infiniteScroll.complete() }, 1000);
 }
}

最终效果:

Ionic3实现图片瀑布流布局

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript div 弹出可拖动窗口
Feb 26 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
Apr 13 Javascript
jquery让指定的元素闪烁显示的方法
Mar 17 Javascript
微信小程序-详解数据缓存
Nov 24 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
Dec 04 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
Oct 25 Javascript
jquery中done和then的区别(详解)
Dec 19 jQuery
vue scroller返回页面记住滚动位置的实例代码
Jan 29 Javascript
Vue 项目代理设置的优化
Apr 17 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
Aug 16 Javascript
js实现微信聊天界面
Aug 09 Javascript
javascript实现贪吃蛇游戏(娱乐版)
Aug 17 Javascript
JavaScript闭包和回调详解
Aug 09 #Javascript
ionic 3.0+ 项目搭建运行环境的教程
Aug 09 #Javascript
JavaScript实现的浏览器下载文件的方法
Aug 09 #Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 #Javascript
详解用node搭建简单的静态资源管理器
Aug 09 #Javascript
vue页面使用阿里oss上传功能的实例(二)
Aug 09 #Javascript
vue.js框架实现表单排序和分页效果
Aug 09 #Javascript
You might like
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
php简单统计在线人数的方法
2016/05/10 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
js实现简单的验证码
2015/12/25 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
python定义类self用法实例解析
2020/01/22 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
如何填写个人简历自我评价
2013/12/10 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
学校宣传标语
2014/06/18 职场文书
平面设计专业求职信
2014/08/09 职场文书
学校创先争优活动总结
2014/08/28 职场文书
高一军训的心得体会
2014/09/01 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书