avalonjs制作响应式瀑布流特效


Posted in Javascript onMay 06, 2015

avalonjs制作响应式瀑布流特效

  布局不是基于float,也不是基于绝对定位,看最下面的html,css就知道了。也没有满篇烦人的html插入,代码很清爽

function getIndex(index) {
  if (index < 10) {
    index = "00" + index;
  } else if (index < 100) {
    index = "0" + index;
  }
  return index;
}
var $ = function(id) {
  return document.getElementById(id);
};
require([ "avalon-min" ], function(avalon) {
  var waterfall = {
      load_items : null,
      loaded_items:[],
      col_num : 0,// 列数
      waterfall_model : null,
      col_width : 200,
      loaded_num : 0,
      init_num : 0,
      loading : false,
      start:0,
      resizing:false,
      find_shortest_col : function() {
      // 找出最小高度的列
        var a = avalon($('row0')).height(), min_i = 0;
        for ( var i = 1; i < this.col_num; i++) {
          var b = avalon($('row' + i)).height();
          if (b < a) {
            min_i = i;
            a = b;
          }
        }
        return min_i;
      },
      init : function(data) {
        this.load_items = data;
        this.loaded_items=this.loaded_items.concat(data);
        this.waterfall_model = waterfall_model;
        this.col_num = Math.floor(avalon(window).width()
            / this.col_width);
        this.init_num = this.col_num;
        for ( var j = 0; j < this.col_num; j++) {
          waterfall_model.img_list.push([]);
        }
        for ( var j = 0; j < this.col_num; j++) {
         // 第一行图片
          var a={};
          a.src=getIndex(data[j].src);
          a.height=data[j].height;
          a.text=data[j].text;
          waterfall_model.img_list[j].push(a);
        }
        this.start=this.col_num;
      },
      add_item : function(i) {
        var a = this.find_shortest_col();
        var b={};
        var c=this.load_items[this.init_num+i];
        if(c){
          b.src=getIndex(c.src);
          b.height=c.height;
          b.text=c.text;
          waterfall_model.img_list[a].push(b);
        }
      },
      resize_item:function(i){
        //console.log(i);
        var a = this.find_shortest_col();
        var b={};
        var c=this.loaded_items[this.init_num+i];
        if(c){
          b.src=getIndex(c.src);
          b.height=c.height;
          b.text=c.text;
          waterfall_model.img_list[a].push(b);
        }
      }
    };
    var waterfall_model = avalon.define("waterfall",function(vm) {// vm
              vm.img_list = [];
              vm.rendered = function() {// 每次图片加载渲染后执行
                 
                if(waterfall.resizing){
                  if (waterfall.loaded_num+ waterfall.init_num<waterfall.loaded_items.length){
                    waterfall.loaded_num++;
                    waterfall.resize_item(waterfall.loaded_num);
                    //waterfall.start++;
                  }
                }else{
                   
                  if (waterfall.loaded_num + waterfall.init_num <waterfall.load_items.length){
                    waterfall.loaded_num++;
                    waterfall.add_item(waterfall.loaded_num);
                    waterfall.start++;
                  }
                }
              };
    });
  avalon.config({
    debug:false
  });
  avalon.scan();
  function debouncer( func , timeout ) {
      var timeoutID , timeout = timeout || 200;
      return function () {
       var scope = this , args = arguments;
       clearTimeout( timeoutID );
       timeoutID = setTimeout( function () {
         func.apply( scope , Array.prototype.slice.call( args ) );
       } , timeout );
      }
    }
  avalon.post("http://localhost/css/test.php?start=0", function(data) {
  // 加载第一次
    waterfall.init(data);
  }, "json");
  window.onscroll =debouncer( function ( e ) {
    var scrollTop = avalon(window).scrollTop(), windowHeight = avalon(
    window).height(), documentHeight = avalon(document).height();
    if (windowHeight + scrollTop==documentHeight) {
        avalon.post("http://localhost/css/test.php?start="+(waterfall.start), function(data) {
        // 加载第一次
        waterfall.resizing=false;
        waterfall.load_items=data;
        waterfall.loaded_items=waterfall.loaded_items.concat(data);
        waterfall.loaded_num =waterfall.init_num=0;
        waterfall.add_item(0);
        }, "json");
    }
  });
  window.onresize = debouncer( function ( e ) {
    var windowWidth = avalon(window).width(), k = Math
    .floor(windowWidth / 200), detect_left = avalon(
    $('waterFallDetect')).offset().left;
    if (Math.abs(detect_left) >= 199) {
      waterfall.col_num = Math.floor(avalon(window).width()
      / waterfall.col_width);
      waterfall_model.img_list = [];
      for ( var j = 0; j < waterfall.col_num; j++) {
        waterfall_model.img_list.push([]);
      }
      waterfall.resizing=true;
      waterfall.loaded_num =waterfall.init_num=0;
      //waterfall.start=0;
      waterfall.resize_item(0);
    }
  },30) ;
});

html

<div id='wrap' ms-controller="waterfall">
  <ul ms-each-els="img_list" id='wrap_row'>
    <li ms-each-el="els" ms-attr-id='row{{$index}}'
      data-each-rendered='rendered'>
      <p>
        <img
          ms-src="http://cued.xunlei.com/demos/publ/img/P_{{el.src}}.jpg"
          width='192' ms-attr-height='{{el.height}}'> <span>{{el.src}}</span>
      </p>
    </li>
    <li id='waterFallDetect' ms-if='$last'></li>
  </ul>
</div>

css

#wrap ul li {
display: inline-block;
*display: inline;
zoom: 1;
vertical-align: top;
font-size: 16px;
}
#wrap ul li p {
margin: 5px 2.5px;
border: 1px solid red;
min-width: 192px;
min-height: 100px;
}
#wrap span {
display: block;
}
#waterFallDetect {
width: 192px;
height: 100px;
border: 1px solid red;
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
基于jquery的监控数据是否发生改变
Apr 11 Javascript
Vue.js快速入门教程
Sep 07 Javascript
Angular实现响应式表单
Aug 04 Javascript
Vue from-validate 表单验证的示例代码
Sep 26 Javascript
fullpage.js最后一屏滚动方式
Feb 06 Javascript
vue文件树组件使用详解
Mar 29 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 Javascript
深入理解vue-class-component源码阅读
Feb 18 Javascript
elementUI select组件value值注意事项详解
May 29 Javascript
轻松学习JavaScript函数中的 Rest 参数
May 30 Javascript
vue实现扫码功能
Jan 17 Javascript
js验证账户名是否重复
May 26 Javascript
javascript实现简单的html5视频播放器
May 06 #Javascript
js实现的四级左侧网站分类菜单实例
May 06 #Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
May 06 #Javascript
完美实现仿QQ空间评论回复特效
May 06 #Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
May 06 #Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 #Javascript
JS实现CheckBox复选框全选全不选功能
May 06 #Javascript
You might like
PHP超级全局变量数组小结
2012/10/04 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
javascript几个易错点记录
2014/11/26 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python 使用shutil复制图片的例子
2019/12/13 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
市场营销专科应届生求职信
2013/11/24 职场文书
应届毕业生个人自荐信范文
2013/11/30 职场文书
建设投标担保书
2014/05/13 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android
Redis keys命令的具体使用
2022/06/05 Redis