通过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 相关文章推荐
JS创建优美的页面滑动块效果 - Glider.js
Sep 27 Javascript
心扬JS分页函数代码
Sep 10 Javascript
jQuery文本框(input textare)事件绑定方法教程
Apr 24 Javascript
js如何取消事件冒泡
Sep 23 Javascript
js分页代码分享
Apr 28 Javascript
极易被忽视的javascript面试题七问七答
Feb 15 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
Express下采用bcryptjs进行密码加密的方法
Feb 07 Javascript
JavaScript学习笔记之DOM操作实例分析
Jan 08 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
Apr 16 Javascript
一文搞懂ES6中的Map和Set
May 20 Javascript
jQuery实现图片下载代码
Jul 18 jQuery
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
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
详解参数传递四种形式
2015/07/21 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
JS实现留言板功能
2017/06/17 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
python实现关键词提取的示例讲解
2018/04/28 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
python实现自动解数独小程序
2019/01/21 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
python_mask_array的用法
2020/02/18 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
中软国际Java程序员笔试题
2014/07/19 面试题
新书吧创业计划书
2014/01/31 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
护理目标管理责任书
2014/07/25 职场文书
医德医魂心得体会
2014/09/11 职场文书
应急管理工作总结2015
2015/05/04 职场文书
活动新闻稿范文
2015/07/17 职场文书
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA