kissy waterfall插件实现的瀑布流

本文介绍使用KISSY库实现瀑布流布局的过程。通过KISSY提供的Waterfall插件,结合AJAX异步加载数据,成功实现了动态加载图片的瀑布流效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

忙活了几天,终于瀑布流实现了。

首先准备用的jquery的masonry和infinitescroll两个插件实现的,结果在网上找了好久,都没有实现,而且觉得这两个插件用着很不顺手,于是改用kissy的waterfall插件,最终实现了瀑布流。

KISSY 是由阿里集团前端工程师们发起创建的一个开源 JS 类库。它具备模块化、高扩展性、组件齐全、适合国情等特性。并且提供了详细的api文档和演示例子,非常容易学习。不多说了 直接上代码吧:

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'index.jsp' starting page</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
 
 <style type="text/css">

*{ padding:0; margin:0; font:"宋体" 12px;  }
body{background:#eee; color:#333p;}
ul li{ list-style:none;}
a{ text-decoration:none; background-color:none;}
a:hover{ text-decoration:none;}
.main{ width:1340px; margin:0 auto;}
.container{position: relative; width: auto; margin: 0 auto; border: none;}
#article {width: auto; min-width: 932px; padding: 8px 0 0 0;}
#ColumnContainer {position: relative; min-width: 692px; min-height: 500px; margin: 0 auto;}

#loadingPins {display: none; height: 20px; padding: 15px 0; text-align: center; font-weight: bold; border-top: 1px solid #ccc;}
#loadingPins img {display: inline-block; margin-right: 6px;}
#loadingPins span {font-size: 1.3em;}

#unloading {display: none; height: 20px; padding: 15px 0; text-align: center; font-weight: bold; border-top: 1px solid #ccc;}
#unloading img {display: inline-block; margin-right: 6px;}
#unloading span {font-size: 1.3em;}

.ks-waterfall{
  position: absolute;
        width: 200px;
        overflow: hidden;
        padding: 10px;
        border: 2px solid #ddd;
        margin-bottom: 20px;
        text-align: center;
        left:-9999px;
        top:-9999px;
}
.ks-waterfall img{ border:none; text-align: center; }

#BackToTop {position: fixed; right: 9px; bottom: 9px; width: 50px; padding: 20px 10px; text-align: center; text-transform: uppercase; color: #41545F; text-decoration: none; background-color: #fff; border: 1px solid #ececec; opacity: 0.9;  filter: alpha(opacity=90); cursor: pointer; border-radius: 8px; -moz-border-radius: 8px; -webkit-border-radius: 8px;}
#BackToTop:hover {color: #211922; opacity: 1.0; filter: alpha(opacity=100);}

</style>
 <script src="page/js/kissy.js"></script>
 <script src="page/js/base.js"></script>
 <script src="page/js/loader.js"></script>
 <script src="page/js/waterfall.js"></script>
 
  </head>
 
  <body>
  <div class="main">
 <div class="container">
     <div id="button_container"></div>
     <div id="article">
         <div id="ColumnContainer"> </div>
         <a id="BackToTop" href="#">Scroll to Top</a>
         <div id="loadingPins"><img src="page/images/loading.gif" alt="Pin Loader Image"/><span>正在加载!&hellip;</span></div>
         <div id="unloading"><img src="page/images/loading.gif" alt=""/><span>无数据可加载!!!&hellip;</span></div>
     </div>
 </div>
  <script type="tpl" id="tpl">
   <div class="pin ks-waterfall" data-id="">
          <a href="#" class="image">
              <img width="200" alt="{{url}}" src="{{url}}" />
          </a>
   <p>Title</p>
      </div>
  </script>
 
 <script  language="javascript">
 KISSY.use("waterfall,ajax,template,node,button", function(S, Waterfall, io, Template, Node, Button) {
    var $ = Node.all;//在文档根节点开始依据选择器字符串开始匹配元素查找
    var tpl = S.Template($('#tpl').html()),
        nextpage = 1,
   //Waterfall.Loader (config)   继承自 Waterfall , 异步获取数据后, 再进行排列.
        waterfall = new Waterfall.Loader({
        container:"#ColumnContainer",
        load:function(success, end) {
            $('#loadingPins').show();
            $('#unloading').hide();
            S.ajax({
                data:{
                 //   'method': 'flickr.photos.search',
                 //   'api_key': '5d93c2e473e39e9307e86d4a01381266',
                 //   'tags': 'rose',
                    'page': nextpage,
                 //   'per_page': 20,
                    'format': 'json'
                },
                url: 'PhotosSer',
                dataType:"json",
             //   dataType: "jsonp",
             //   jsonp: "jsoncallback",  //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
                success: function(d) {
               //   alert("======");
                    // 如果数据错误, 则立即结束
                 /*
                   if (d.stat != 'ok') {
                        alert('load data error!');
                        end();
                        return;
                    }
                    */
                    // 如果到最后一页了, 也结束加载
                    /*
                    if (nextpage > d.photos.pages) {
                     alert("++++");
                        end();
                        return;
                    }
                    */
                    if(nextpage > d.pages){
                     $('#unloading').show();
                        end();
                        return;
                    }
                    nextpage = nextpage+1;
                    // 拼装每页数据
                    var items = [];
                    S.each(d.photo, function(item) {
                        item.height = Math.round(Math.random()*(300 - 180) + 180); // fake height//注释掉则没有瀑布流的效果
                        items.push(new S.Node(tpl.render(item)));//render渲染
                    });
                    success(items);
                },
                complete: function() {
                    $('#loadingPins').hide();
                }
            });
        },
        // align:'left', // center (default), right
        minColCount:2,
        colWidth:246
    });
    
     waterfall.on('adjustComplete', function () {  
            S.log('after adjust complete!');  
          });  
          waterfall.on('addComplete', function () {  
            S.log('after add complete!');  
          });  
          // scrollTo  
          $('#BackToTop').on('click', function (e) {  
            e.halt();  
            e.preventDefault();  
            $(window).stop();  
            $(window).animate({  
              scrollTop:0  
            }, 1, "easeOut");  
          });  
 
          $("#ColumnContainer").on("click", ".del", function (event) {  
 
            var w = $(this).parent().parent(".ks-waterfall");  
            waterfall.removeItem(w, {  
              callback:function () {  
                alert("删除完毕");  
              }  
            });  
          });   
          $("#ColumnContainer").on("click", ".grow", function (event) {  
            var w = $(this).parent().parent(".ks-waterfall");  
            waterfall.adjustItem(w, {  
              process:function () {  
                w.append("<img src='http://farm9.static.flickr.com/8167/7688895968_25ed78629e_m.jpg' width='220' height='200px;'>");  
              },  
              callback:function () {  
                alert("调整完毕");  
              }  
            });  
          }); 
});
 </script>

</div>
  </body>
</html>

 

下载kissy官网上的kissy库,下面是瀑布流需要的夹包:

有一些代码是直接从demo上直接复制过来的,修改后没有吧注释的部分删除。kissy瀑布流提供了一个模板:

<script type="tpl" id="tpl">
   <div class="pin ks-waterfall" data-id="">
          <a href="#" class="image">
              <img width="200" alt="{{url}}" src="{{url}}" />
          </a>
   <p>Title</p>
      </div>
  </script>

其中{{}}中的内容,会自动寻找服务端返回的json对象中相同名字的数据。

详细源码:详细源码

 

1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值