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 相关文章推荐
$.ajax json数据传递方法
Nov 19 Javascript
js getElementsByTagName的简写方式
Jun 27 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
Aug 21 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
Oct 15 Javascript
JS获取及验证开始结束日期的方法
Aug 20 Javascript
jQuery simpleModal插件的使用介绍
Aug 30 Javascript
Vue.js2.0中的变化小结
Oct 24 Javascript
vue实现nav导航栏的方法
Dec 13 Javascript
mpvue项目中使用第三方UI组件库的方法
Sep 30 Javascript
vue父子组件通信的高级用法示例
Aug 29 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 Javascript
javascript实现移动端轮播图
Dec 09 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
注册页面之前先验证用户名是否存在的php代码
2012/07/14 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
Nginx实现反向代理
2017/09/20 Servers
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
Django设置Postgresql的操作
2020/05/14 Python
抗洪抢险事迹材料
2014/05/06 职场文书
教师节标语大全
2014/10/07 职场文书
甲午大海战观后感
2015/06/02 职场文书
Nginx快速入门教程
2021/03/31 Servers
利用ajax+php实现商品价格计算
2021/03/31 PHP
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
Python之基础函数案例详解
2021/08/30 Python