通过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 相关文章推荐
IE中JS跳转丢失referrer问题的2个解决方法
Jul 18 Javascript
Node.js中的缓冲与流模块详细介绍
Feb 11 Javascript
JavaScript返回网页中锚点数目的方法
Apr 03 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
Oct 16 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
Aug 04 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 Javascript
利用three.js画一个3D立体的正方体示例代码
Nov 19 Javascript
vue axios请求超时的正确处理方法
Apr 02 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
Jul 26 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
Sep 14 Javascript
微信小程序dom操作的替代思路实例分析
Dec 06 Javascript
Javascript实现关闭广告效果
Jan 29 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下读取文本文件的代码
2008/07/02 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
Symfony2之session与cookie用法小结
2016/03/18 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
javaScript语法总结
2016/11/25 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
在校生钳工实习自我鉴定
2013/09/19 职场文书
大专生的学习自我评价
2013/12/04 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
大学军训感言300字
2014/03/09 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
赢在执行观后感
2015/06/16 职场文书
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技