通过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 相关文章推荐
Jquery 例外被抛出且未被接住原因介绍
Sep 04 Javascript
PHP结合jQuery实现红蓝投票功能特效
Jul 22 Javascript
js实现商品抛物线加入购物车特效
Nov 18 Javascript
JavaScript动态检验密码强度的实现方法
Nov 09 Javascript
JavaScript实现按键精灵的原理分析
Feb 21 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
Feb 21 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 Javascript
javascript中this用法实例详解
Apr 06 Javascript
详解Vue路由开启keep-alive时的注意点
Jun 20 Javascript
js中getBoundingClientRect的作用及兼容方案详解
Feb 01 Javascript
利用Dectorator分模块存储Vuex状态的实现
Feb 05 Javascript
深入浅析React中diff算法
May 19 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.MVC的模板标签系统(三)
2006/09/05 PHP
php FPDF类库应用实现代码
2009/03/20 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
PHP7.0版本备注
2015/07/23 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
使用Python绘制图表大全总结
2017/02/11 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
企业金融服务方案
2014/06/03 职场文书
年底个人总结范文
2015/03/10 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
redis 解决库存并发问题实现数量控制
2022/04/08 Redis