vuejs和webpack项目(VueComponent)初尝试——瀑布流组件

碎碎念:
     好久不见,最近自己有些懈怠没更过多少博,主要原因之一是对自己学习方式的一些思考,翻看之前的博客多是记录学习笔记这反映出了自己对于前端还停留在学习-复习知识点的阶段压根没多少实践经验啊这让我有些惶恐,原因之二是前段时间接触并了解性地学习了amd,cmd模块,angular和vue,一些模板引擎,less预编译语言,以及开发相关的各种构建工具...讲真前端真的好杂,心有余而力不足有时就挺迷茫,所以这些仅仅只是接触是接触跟着官网了解学习并没有深入原理性的探索学习。
曾经我在一开始就尝试深入原理的学习,实践后发现这种学习方式并不适合初学新知识,对于新知识的学习应该还是要循序渐进由浅入深,想不通的点可以先放下到后来理解多了再领悟,不然一开始就探索原理会导致自己进入过度思考的误区深陷不出来,嗯,还是等有实践经验和时间的积累后自然而然就会想明白。就比如虽然我这次用VueJs和webpack工具流实现了一个简单的瀑布流组件,其实我是经历了如下心里路程:
1.因实验室项目需要学习了下瀑布流(JS方式)布局的实现,当然还有用纯css实现的方式(CSS3的学习--实现瀑布流),理清实现原理(瀑布流布局)后用HTML,CSS,JS快速实现了瀑布流的初版,对于JS的执行过程和页面的渲染过程我还是相对了解的于是也就没什么难度。

2.但是程序员不能总停留在编写这些没有复用的程序,开发过程效率低的阶段吧,他们说聚聚们都在玩转各种构建工具和框架,作为菜鸟的我碰巧最近在学习vueJS和Less,于是想把一些有趣的东西用vue写成组件的形式,一来作为一次自我尝试二来熟悉一下vue+webpack的开发流程(即使现在的我对于webpack的执行机制还是有些云里雾里的)。

3.于是需要对瀑布流小项目进行包装,vue框架还好本质上还是JS嘛,因为多了一层webpack构建工具让这个小项目看起来略复杂(如果你要究webpack的执行机制的话)。但是现阶段作为初学者的我只是会用但并没吃透webpack的原理,这个不急,项目先实现了再说。

4.对于nodeJS和npm,AMD,CMD,ES6有所了解这是前提,之后该项目需要用到如下技术和知识,没关系用的时候再翻看文档

vue-cli项目引用.vue组件

安装 | vue-router文档 npm package

Less快速入门

Vue组件

用vue-cli初始化本项目,和webpack搭配完成一套集开发,测试,发布的流程(简单起见我的项目省略了测试的步骤);
vue-router用于index主页的路由管理,因为之后想把VueComponent做成一个项目用来收纳各种有趣的组件,Waterfall.vue只是本次尝试实现的一个组件模块,后续可能还会有其它的组件;Less用于Waterfall.vue组件中css的编写。

项目代码

Waterfall.vue组件的完整代码如下(后期可以完善ajax请求数据加载的功能):

<template>
  <div id="wf">
    <div v-for="item in items">
      <img v-bind:src="item.src">
    </div>
  </div>
</template>

<script type="text/javascript">
/**
 * init
 */
var $items, itemWidth, time;
window.addEventListener(‘resize‘, function(){
    clearTimeout(time);
    time = setTimeout(function(){
     wf.arrange();
    }, 500);
});

/**
 * 时间大小的设置决定是先加载img还是arrange布局
 */
setTimeout(function(){
  $items = document.querySelectorAll(‘#wf div‘);
  itemWidth = $items[0].offsetWidth;
  wf.arrange();
}, 0);

/**
 * 随机高度,随机图片,布局函数
 */
var wf = {
  rdmImg: function(){
    var width = Math.floor(Math.random() * 100) + 300,
        height = Math.floor(Math.random() * 500) + 300;
    return "http://placekitten.com/" + height + ‘/‘ + width;
  },
  rdmHeight: function(){
    return Math.round(Math.random() * 200) + itemWidth;
  },
  arrange: function(){
    var viewWidth = document.documentElement.clientWidth || document.body.clientWidth,
        cols = Math.floor( viewWidth / itemWidth );

    //存放每列当前长度的数组并初始化
    var colsHeight = [];
    for(var i = 0; i< cols; i++){
        colsHeight.push(0);
     }
    //安置每一项item
    $items.forEach( function(ele, idx) {
    var curHeight = colsHeight[0], col = 0;
    for(var i = 0; i< colsHeight.length; i++){
    if(colsHeight[i] < curHeight){
        curHeight = colsHeight[i];
        col = i;
      }
    }
    ele.style.left = col * itemWidth + ‘px‘;
    ele.style.top = curHeight + ‘px‘;
    ele.style.height = wf.rdmHeight() + ‘px‘;
    //console.log(ele.querySelector(‘img‘).src); // http://localhost:8080/

    colsHeight[col] += ele.offsetHeight;
    });
  },
}

/**
 * export数据层
 */
var items = (function(){
       var arr = new Array();
        for(var i= 0; i< 10; i++){
            var img = {};
            img.src = wf.rdmImg();
            arr.push(img);
        }
        return arr;
  })();
export default{
    data () {
      return {
        items: items,
      }
    }
}

</script>

<style lang="less">
@width: 200px;
@padding: 20px;

#wf{
  position: relative;
  margin: 0 auto;
  div{
    width: @width;
    position: absolute;
    top: 0;
    left: 0;
    padding: @padding;
    border: solid 1px grey;
    border-radius: 4px;
    .transition(left 1s);
    img{
      width: 100%;
      position: relative;
      top: 50%;
      transform: translateY(-50%);
    }
  }
}

.transition(@transition){
  -webkit-transition: @transition;
  -moz-transition: @transition;
  -o-transition: @transition;
  transition: @transition;
}
</style>

完整项目放于github:https://github.com/venoral/VueComponent

效果图:index主页略丑,仅实现路由功能了,后期会完善的。

最后想给自己说的话就是
      有想法就去实现啊,list列了一大堆而拖欠的人不配拥有想法。

时间: 2024-11-07 06:48:53

vuejs和webpack项目(VueComponent)初尝试——瀑布流组件的相关文章

vue-waterfall2 基于Vue.js 瀑布流组件

vue-waterfall2 1.宽度自适应,数据绑定特效(适用于上拉加载更多) 2.自定义程度高 3.使用极为简便,适用于PC/移动端 4.提供resize(强制刷新布局-适用于下拉刷新)/mix(扰乱布局) API,一般情况下不需要用到 5.后期将持续更新,提供animation(过渡动画) Demo DEMOGITHUB Installation npm install --save vue-waterfall2 Usage 注意: 1.itemWidth需要与gutterWidth一起使

一种瀑布流效果的实现

最近一个项目使用到了瀑布流效果,在这里总结一下.使用jquery框架. 最终效果: 思路: 使用五个并列的div:     首次加载n条数据:     之后由scroll触发ajax数据加载:     加载每条数据时,判断5个div的高度,把数据加载到高度最短的div里. 数据加载代码: $(document).bind('scroll',(function(){     //离底部100px时触发加载     var closeToBottom = ($(window).scrollTop()

搭建自己的Webpack项目:入门

转自:http://www.tuicool.com/articles/YFZRniq 作为当下最流行的前端打包工具,webpack有自己无与伦比的优势和功能特性,使用webpack打包自己的项目能够大大地提高我们的开发效率.小编整理了一下webpack在项目中的最佳实战分享给大家. 一.什么是webpack 随着网页内容的越来越丰富,在我们的网页上我们经常要用到很多的脚本文件,比如幻灯模块的脚本.列表模块的脚本和搜索模块的脚本等等.如果不对这些文件进行统一的打包,整个页面就会非常的凌乱. 于是,

如何为编程爱好者设计一款好玩的智能硬件(五)——初尝试&#183;把温湿度给收集了(中)!

一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! 三.MCU选型:如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢? 四.温湿度传感器DHT11驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(四)——初尝试·把温湿度给收集了(上)! 五.温湿度传感器DHT11驱动封装(中): 先打个预防针——本篇可能比较枯燥!与上一篇

如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试&#183;把温湿度给收集了(下)!

一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! 三.MCU选型:如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢? 四.温湿度传感器DHT11驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(四)——初尝试·把温湿度给收集了(上)! 五.温湿度传感器DHT11驱动封装(中):如何为编程爱好者设计一款好玩的智能硬件(五)

vue+webpack项目结构介绍

对vue已经有了一定的了解,所以希望可以在github上找到一些项目实践,但是无奈不知道vue的整体架构是如何的,往往不知道该如何着手看,所以这里在网上找了相关的文章作为参考,对结构有一个大致的了解.参考文章如下: 用vue+webpack搭建的前端项目结构 vue+webpack项目实践 这里插一句话,搜索谷歌做的确实好,支持原创,搜索精准,不知道比度娘高到哪里去~

R语言爬虫初尝试-基于RVEST包学习

R语言爬虫初尝试-基于RVEST包学习 Thursday, February 26, 2015 在学完coursera的getting and Cleaning data后,继续学习用R弄爬虫网络爬虫.主要用的还是Hadley Wickham开发的rvest包.再次给这位矜矜业业开发各种好用的R包的大神奉上膝盖 查阅资料如下: rvest的github rvest自身的帮助文档 rvest + CSS Selector 网页数据抓取的最佳选择-戴申: 里面有提及如何快速获得html的位置.看完这

RecycleView初尝试

最近上了Study Jams的课程,布置了一个小作业.为了完成小作业,自己就顺便尝试用了一下RecycleView. 从整体上看RecyclerView的架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人惊艳的效果. 控制其排列显示的方式,通过布局管理器LayoutManager(抽象类,系统提供了3个实现类) 控制Item间的间隔(可绘制),通过ItemDecoration(抽

block初尝试。

1, @class seatObject; typedef void (^touchButtom) (seatObject *); @interface seatObject : UIView<VShowRoomServiceDelegate> { } @property (nonatomic ,strong)touchButtom block; @end 2, @implementation seatObject @synthesize seatView,userNameLable,user