通过vue写一个瀑布流插件代码实例


Posted in Javascript onSeptember 07, 2019

这篇文章主要介绍了通过vue写一个瀑布流插件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

效果如图所示:

通过vue写一个瀑布流插件代码实例

采用了预先加载图片,再计算高度的办法。。网络差的情况下,可能有点卡

新建 vue-water-easy.vue 组件文件

<template>
  <div class="vue-water-easy" ref="waterWrap">
    <div v-for="(items,clos) in list" :key="clos" :style="waterStyle" class="colsW">
      <ul>
        <li v-for="(item,index) in items" :key="index" :style="{marginBottom:gap+'px'}">
          <slot :item="item" :index="index" :clos="clos"></slot>
        </li>
      </ul>
    </div>
  </div>
</template>
<script>
 
export default {
  props:{
    maxCols:{
      type:Number,
      default:3,
      validator(value){
        return value > 1;
      }
    },
    srcKey:{
      type:String,
      default:"src"
    },
    gap:{
      type:Number,
      default:10,
      validator(value){
        return value > 0;
      }
    },
    imgsArr:{
      type:Array,
      required:true
    }
  },
  computed:{
    waterStyle(){
      if(this.gap <= 0){
        this.gap = 10;
      }
      return {
        margin:`0 ${this.gap/2}px`
      }
    }
  },
  watch:{
    imgsArr(val){
      this.$nextTick(()=>{
        this.list = this.initData();
        this.start(0);
      })
    }
  },
  data(){
    let list = this.initData();
    return {
      list:list
    }
  },
  mounted(){
    this.start(0);
  },
  methods:{
    initData(){
      let list = new Array(this.maxCols);
      for(let i = 0; i < this.maxCols ; i++){
        list[i] = [];
      }
      return list;
    },
    start(i){
      const me = this;
      let imgsArr = me.imgsArr;
      if(i >= imgsArr.length && this.$refs.waterWrap){
        return ;
      }
       me.loadImg(imgsArr[i],i).catch(()=>{
       }).finally(()=>{
         me.start(++i);
       });
      // for(let i = 0; i < imgsArr.length; i++ ){
      //   let item = imgsArr[i];
      //   me.loadImg(item,i);
      // }
    },
    loadImg(item){
      const me = this;
      let srcKey = me.srcKey;
      return new Promise(function(resolve,reject){
        if(item && item[srcKey]){
          let src = item[srcKey];
          let img = new Image();
          img.src = src;
          img.crossOrigin = "anonymous";
          img.onload = function(){
            var index = me.getMinHeight();
            me.list[index].push(item);
            me.$nextTick(()=>{
              resolve(img)
            });
          }
          img.onerror = function(e){
            reject(e);
          }
         }else{
           reject('数据错误');
         }
      })
       
    },
    getMinHeight(){
      let index = 0;
      try{
        if(!this.$refs.waterWrap){
          return index;
        }
        let childs = this.$refs.waterWrap.children || [];
        let minx = childs[0].children[0].offsetHeight;
        for(let i = 1; i < childs.length; i++){
          let element = childs[i];
          let h = element.children[0].offsetHeight;
          if(h < minx){
            minx = h ;
            index = i;
          }
        }
      }catch(e){
        console.warn(e);
        return index;
      }
       
      return index;
    } 
  }
}
</script>
<style lang="scss" scoped>
.vue-water-easy{
  width: 100%;
  display: flex;
  justify-content: space-between;
  div.colsW{
    flex: 1;
    box-sizing: border-box;
    position: relative;
    &:last-child{
      margin-right: 0 !important;
    }
    &:first-child{
      margin-left: 0 !important;
    }
    ul{
      list-style: none;
      width: 100%;
      li{
        width: 100%;
      }
    }
  }  
}
</style>

使用

<vueWaterEasy :imgsArr="imgsArr" srcKey="url">
      <template v-slot="{item}">
        <img :src="item.url" alt="">
      </template>
</vueWaterEasy>

imgsArr:为图片数据的数组,内部包含对象 [ { src:"xxxx" } ]

srckey : 为图片路径的属性,默认为 src

maxCols: 多少列 默认为 3

gap : 每列的间距默认 10px

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

Javascript 相关文章推荐
3种不同方式的焦点图轮播特效分享
Oct 30 Javascript
js中小数转换整数的方法
Jan 26 Javascript
form.submit()不能提交表单的原因分析
Oct 23 Javascript
JS函数this的用法实例分析
Feb 05 Javascript
BootStrap智能表单demo示例详解
Jun 13 Javascript
微信小程序 MINA文件结构
Oct 17 Javascript
使用Vue制作图片轮播组件思路详解
Mar 21 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
Aug 10 Javascript
脚手架vue-cli工程webpack的基本用法详解
Sep 29 Javascript
React手稿之 React-Saga的详解
Nov 12 Javascript
IDEA安装vue插件图文详解
Sep 26 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
Nov 04 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
Sep 07 #Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
Sep 06 #Javascript
解决layer.open后laydate失效的问题
Sep 06 #Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 #Javascript
layui在form表单页面通过Validform加入简单验证的方法
Sep 06 #Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
Sep 06 #Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 #Javascript
You might like
php adodb分页实现代码
2009/03/19 PHP
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
django模板语法学习之include示例详解
2017/12/17 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
python使用RNN实现文本分类
2018/05/24 Python
Win8下python3.5.1安装教程
2020/07/29 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
经销商会议欢迎词
2014/01/11 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
中国梦团日活动总结
2014/07/07 职场文书
商务经理岗位职责
2014/08/03 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
生产现场禁烟通知
2015/04/23 职场文书
离婚协议书范文2016
2016/03/18 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python