我的第一个jQuery插件--瀑布流插件

在上篇博客中已经完成了瀑布流的js代码,现在就要把这个js代码抽出并写成插件。

1.首先把html中的js代码抽离成为单独js文件

2.$.fn.waterfall = function(data) {    //定义插件的名称,这里名为waterfall

var set = {
   //这里写插件定义的变量和默认值

}

var opt = $.extend({}, set, data);   //这是把插件的默认值set和调用插件时传入的参数值data合并在一起,若值重复后面的数组data会覆盖掉前面的数组set

...

}

3.调用插件:

<script type="text/javascript">
$(function(){
   $(‘.box‘).waterfall(  //要应用插件的容器div名
  {

//需要修改和传递的参数
  }
)
});
</script>

4.源代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0,minimal-ui" />
    <title>waterfall</title>
    <style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    .container{
        margin: 10px auto 10px;
        position: relative;
    }
    .container img{
        position: absolute;
    }
    .loader{
        width: 100%;
        height: 60px;
        background: url(‘loader.gif‘) no-repeat center #fff;
        position: fixed;
        bottom: 0;
        left: 0;
    }
    </style>
    <script type="text/javascript" src="jquery-1.9.1.min.js"></script>
    <script type="text/javascript" src="waterfall.js"></script>
    <script type="text/javascript">
    $(function(){
        $(‘.box‘).waterfall(
            {
                oContainer: ‘.container‘,
                sUrl:‘http://www.wookmark.com/api/json/popular?callback=?‘ ,
                iWidth:50
            }
        )
    });
</script>
</head>
<body>
    <div class="box">
        <div class="container"></div>
        <div class="loader"></div>
    </div>
</body>
</html>
$(function(){

    $.fn.waterfall = function(data) {
        var set = {
            ‘oContainer‘ : ‘.container‘,    //放瀑布流图片的div的类名
            ‘oloader‘ : ‘.loader‘,   //放加载图片的div的类名
            ‘iWidth‘ : 200,     //列宽
            ‘iSpace‘ : 10,     //间隙
            ‘sUrl‘ :‘http://www.wookmark.com/api/json/popular?callback=?‘,    //数据的url
            ‘type‘ : ‘img‘,   //数据的类型
            ‘ipage‘:0,     //数据的页数
        }
        //合并两个数组,后面数组data的数据覆盖前面数组set的数据,
        var opt = $.extend({}, set, data);
        // console.log(opt)
        var iBtn=true;//设置一个变量使得一页数据输出完成后再获取输出下一页数据
        var that=this;
        var iCells=0;  //初始化列数为0
        var container=$(opt.oContainer);
        var iOuterWidth=opt.iWidth+opt.iSpace;  //图片实际宽度=列宽+间隙
        var arrL=[];                   //定位的左边的宽度数组
        var arrT=[];                   //定位的上边的高度数组

        //根据窗口的大小和列宽设置列数
        function setCells(){
            iCells=Math.floor(that.innerWidth()/iOuterWidth);
            container.css(‘width‘,iOuterWidth*iCells-opt.iSpace);

        }
        setCells();

        //先初始化数组,确定第一行图片定位的宽高
        for(var i=0;i<iCells;i++){
            arrT.push(0);
            arrL.push(i*iOuterWidth);
        }

        //获取一行中高度最小的列,把新图片加到最小高度的列
        function getMin(){
            var iv=arrT[0];
            var _index=0;
            for(var i=0;i<arrT.length;i++){
                if(arrT[i]<iv){
                    iv=arrT[i];
                    _index=i;
                }
            }
            return _index;
        }
        function getMax(){
            var iv=arrT[0];
            var _index=0;
            for(var i=0;i<arrT.length;i++){
                if(arrT[i]>iv){
                    iv=arrT[i];
                    _index=i;
                }
            }
            return _index;
        }

        // 获取数据输出
        function getData(){
            if(iBtn){
                iBtn=false;
                $(opt.oloader).show();//显示加载图片
                $.getJSON(opt.sUrl,‘page+=opt.ipage‘,function(data){
                     // console.log(data);
                    $.each(data,function(index,obj){
                        //设置图片的链接,追加在放瀑布流图片的div里
                        var oImg=$(‘<img />‘);
                        oImg.attr(‘src‘,obj.preview);
                        container.append(oImg);

                        //算出图片的实际高度
                        var iHeight=opt.iWidth/obj.width*obj.height;

                        //设置图片的实际宽高
                        oImg.css({
                            width : opt.iWidth,
                            height : iHeight
                        })

                        //获取上一行图片中的最小高度,把新图片追加在最小高度的图片之下
                        var iMinIndex=getMin();
                        var iMaxIndex=getMax();
                        container.css(‘height‘,arrT[iMaxIndex]);
                        // 设置定位
                        oImg.css({
                            left : arrL[iMinIndex],
                            top : arrT[iMinIndex]
                        });

                        //上下图片加多10px的间隙
                        arrT[iMinIndex]+=iHeight+10;

                        //图片加载完成就把加载图片隐藏
                        $(opt.oloader).hide();
                        iBtn=true;

                    })
                    //使其一开始时就触发scroll事件来判断数据是否需要加载下一页
                    if(opt.ipage<2){
                        $(window).trigger(‘scroll‘);
                    }
                })
            }
        }

        getData();

        //当滑动鼠标时触发函数判断是否需要加载下一页的数据
        $(window).on(‘scroll‘,function(){
            var iH=$(window).scrollTop()+$(window).innerHeight();
            var iMinIndex=getMin();
            if(arrT[iMinIndex]+container.offset().top<iH){
                opt.ipage++;
                getData();
            }
        });

        //当窗口大小改变时,重新调整图片。即响应式设计
        $(window).on(‘resize‘, function() {
            var iLen = iCells;
            setCells();
            if (iLen == iCells) {
                return ;
            }
            arrT = [];
            arrL = [];
            for (var i=0; i<iCells; i++) {
                arrT[i] = 0;
                arrL[i] = iOuterWidth * i;
            }
            container.find(‘img‘).each(function() {

                var _index = getMin();
                // $(this).css({
                //     left    :    arrL[_index],
                //     top        :    arrT[_index]
                // });
                $(this).animate({
                    left    :    arrL[_index],
                    top        :    arrT[_index]
                }, 1000);
                arrT[_index] += $(this).height() + 10;

            });
        })
    }
})
    
时间: 2024-08-25 20:28:26

我的第一个jQuery插件--瀑布流插件的相关文章

利用jQuery来扩展一个瀑布流插件

  简单了解jQuery.fn.extend() jQuery.fn.extend()函数用于为jQuery扩展一个或多个实例属性和方法(主要用于扩展方法). (截图来自jQuery文档) 为了更清晰的理解我将需求写成了注释 扩展代码如下 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 1 (function($){ 2 3 $.fn.WaterFall = function () { 4 5 /* 6 * 瀑布流插件 7 * 容器的宽度固定 8

瀑布流插件|jquery.masonry|使用demo

Maonsry+Infinite-Scroll实现滚动式分页,网上有很多,这里只说: 瀑布流插件的一个基本使用,附上基本功能的demo <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jquery.masonry的跑通demo</title> <script type=

8款实用的Jquery瀑布流插件

1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机浏览,效果非常棒,遗憾的是不支持IE9以下版本,所以网友们在演示的时候请使用谷歌.火狐等浏览器... 分享JquerySchool网站里面的8款Jquery瀑布流插件 2.网友sole分享23行Jquery代码实现定位瀑布流布局特效 首先非常感谢网友sole的无私分享,此Jquery特效是我从互联网

一款很实用的jQuery鼠标悬浮有动画效果的响应式瀑布流插件

在线预览 下载地址 实例代码 <!doctype html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content=&

Wookmark-jQuery-master 瀑布流插件使用介绍,含个人测试DEMO

要求 必备知识 本文要求基本了解 Html/CSS,  JavaScript/JQuery. 开发环境 Dreamweaver CS6 / Chrome浏览器 演示地址 演示地址 资料下载 测试预览截图(抬抬你的鼠标就可以看到演示地址哦): 程序核心代码看这里: $(function(){ function show(){ var colors=["#BA4A3A","#5BB5D6","#8EA83B","#EE5C92",

响应式瀑布流插件Grid-A-Licious

Grid-A-Licious是一款遵守MIT协议的响应式瀑布流插件.该插件总代码行不超过400行,实现很巧妙,使用时也很流畅.实现原理也很简单,根据屏幕宽度和参数中设置的列宽度以及每项之间的间隔宽度,计算出当前屏幕宽度下应该生成几个等宽列:列生成好之后,再把每项放到等宽列中:当屏幕尺寸改变时,重新计算列表,然后再重新填充项. 使用该插件也很方便.使用实例: <html> <head> <meta charset="utf-8" /> <titl

【前端】用jQuery实现瀑布流效果

jQuery实现瀑布流效果 何为瀑布流: 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pinterest,逐渐在国内流行开来.国内大多数清新站基本为这类风格. 瀑布流的应用: 瀑布流对于图片的展现,是高效而具有吸引力的,用户一眼扫过的快速阅读模式可以在短时间内获得更多的信息量,而瀑布流里懒加载模式又避免了用户鼠标点击的翻页操作,瀑布流的主要特性便是错落有致,定宽而不

blocksit.js插件瀑布流

<!DOCTYPE html> <html> <head> <title>jQuery瀑布流插件BlocksIt </title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel='stylesheet' href='css/style.css' media='screen' /

jquery版瀑布流

原文:jquery版瀑布流 一个月前用jquery实现了瀑布流效果,看着当时的代码有点难过……今天抽时间稍微修改了一下.额,现在看起来不是那么难受了,就来和大家分享一下.废话不多说,开始正题~ 一.演示效果 二.html代码 <div class="header">header</div> <div class="box clearfix"> <div class="waterFall"> <