通过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 相关文章推荐
JavaScript读取中文cookie时的乱码问题的解决方法
Oct 14 Javascript
jQuery下的几个你可能没用过的功能
Aug 29 Javascript
JQuery中form验证出错信息的查看方法
Oct 08 Javascript
在JS方法中返回多个值的方法汇总
May 20 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 Javascript
JavaScript中boolean类型之三种情景实例代码
Nov 21 Javascript
JavaScript实现垂直滚动条效果
Jan 18 Javascript
JavaScript轮播图简单制作方法
Feb 20 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
Oct 24 jQuery
vue源码入口文件分析(推荐)
Jan 30 Javascript
JS前端基于canvas给图片添加水印
Nov 11 Javascript
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
jQuery 表单验证扩展(三)
2010/10/20 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
python抓取网页内容示例分享
2014/02/24 Python
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
python自动识别文本编码格式代码
2019/12/26 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
毕业生个人投资创业计划书
2014/01/04 职场文书
联谊会主持词
2014/03/26 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
德劲DE1102数字调谐收音机机评
2022/04/07 无线电