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 相关文章推荐
身份证号码前六位所代表的省,市,区, 以及地区编码下载
Apr 12 Javascript
JavaScript 放大镜 移动镜片效果代码
May 09 Javascript
javascript三元运算符用法实例
Apr 16 Javascript
把Node.js程序加入服务实现随机启动
Jun 25 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
Dec 12 Javascript
bootstrap table服务端实现分页效果
Aug 10 Javascript
vue中本地静态图片路径写法
Mar 06 Javascript
vue路由组件按需加载的几种方法小结
Jul 12 Javascript
如何让node运行es6模块文件及其原理详解
Dec 11 Javascript
微信小程序 下拉刷新及上拉加载原理解析
Nov 06 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
Jul 20 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
mac下安装nginx和php
2013/11/04 PHP
php session 写入数据库
2016/02/13 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
会自动逐行上升的文本框
2006/06/30 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
python基础知识小结之集合
2015/11/25 Python
Python程序中的观察者模式结构编写示例
2016/05/27 Python
python 统计代码行数简单实例
2017/05/04 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
python怎么删除缓存文件
2020/07/19 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
python制作抽奖程序代码详解
2021/01/15 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
档案信息化建设方案
2014/05/16 职场文书
中央空调节能方案
2014/06/15 职场文书
创建文明城市倡议书
2015/04/28 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
Nginx配置https的实现
2021/11/27 Servers