瀑布流效果图:

特点:
1.数据异步请求;
2.图片不用算高度,可以定宽,等比例缩放;
3.可以用页码组件来分页
4.兼容ie678、FF、chrome等主流浏览器
kissy本身组件库里有瀑布流(http://docs.kissyui.com/1.2/docs/html/demo/component/waterfall/demo2.html
),但是对于图片尺寸的处理,定宽等比缩放的话,需要预先知道图片尺寸,所以自己写了一个不依赖图片尺寸生成的瀑布流组件。
用法:
1.先引入组件
<script src="http://a.tbcdn.cn/??s/kissy/1.1.6/kissy-min.js,p/global/1.0/global-min.js" ></script>
KISSY.add({
'waterfall': {
fullpath:"waterfall.js",//组件路径
cssfullpath:"waterfall.css"//这个需要自己根据视觉稿自己写,也可直接引入在页面里
}
});
KISSY.use("waterfall,ajax", function(S, Waterfall, io) {
var _A = S.all,D = S.DOM,_O = S.one,E = S.Event,UA = S.UA;
//这里写初始化代码
}
2.初始化代码
new S.Waterfall("#ColumnContainer", //容器选择器
{
load : function(requestSuccess, end) {//异步请求发送,请求成功后的html片段集合用requestSuccess渲染, end函数可以用于停止发送请求
S.ajax({
url : url,//数据接口
dataType : "jsonp",
jsonp : "jsoncallback",
success : function(d) {
var data = d.data;
var items = [];//此处用的kissy里的模板引擎生成的html片段,都压入items
for(var i = 0; i < data.length; i++) {
var item = new S.Node(tpl.render(data[i]));
//把一次请求的各项生成一系列对应html片段
items.push(item);
}
requestSuccess(items, "#ColumnContainer");
}
});
},
colCount : 4,//瀑布流的列数
colWidth : 222//瀑布流的一列的宽度
});
组件源码如下:
KISSY.add("waterfall", function(S) {
var D = S.DOM,E = S.Event,UA = S.UA;
function Waterfall(container, config) {
var self = this;
if(S.isString(container)) {
self.container = D.get(container);
}
if(!container) {
S.log('请配置正确的id.');
return;
}
self._init(config || {});
}
S.augment(Waterfall, {
_init: function(config){
var self = this;
window.isEnd = false;
self._bindParam(config);
self._bindStructure();
self._bindEvent();
},
_bindParam: function(o){//配置参数
var self = this;
self.load = (typeof o.load == 'undefined' || o.load == null || typeof o.load != 'function') ? false : o.load;
self.colCount = (typeof o.colCount == 'undefined' || o.colCount == null) ? false : parseInt(o.colCount);
self.colWidth = (typeof o.colWidth == 'undefined' || o.colWidth == null) ? false : parseInt(o.colWidth);
if(!(self.load && self.colCount && self.colWidth)){
alert('param error!');
return;
}
},
_bindStructure: function(){//渲染几列结构
var self = this;
var conWidth = D.width(self.container);
var marginValue = parseInt((conWidth - self.colWidth*self.colCount)/(self.colCount - 1));
marginValue = marginValue >= 0? marginValue : 0;
var structure = '';
for(var i = 0; i < self.colCount; i++){
if(i == self.colCount - 1){
structure += '<div class="J_brook" style="float:left;width:'+ self.colWidth +'px;"></div>'
}else{
structure += '<div class="J_brook" style="float:left;margin-right:'+ marginValue +'px;width:'+ self.colWidth +'px;"></div>';
}
}
D.append(D.create(structure), self.container);
},
isGetBottom: function(){//判断是否滚动条达到底部临界点
/********************
* 取窗口滚动条高度
******************/
function getScrollTop(){
var scrollTop=0;
if(document.documentElement&&document.documentElement.scrollTop){
scrollTop=document.documentElement.scrollTop;
}else if(document.body){
scrollTop=document.body.scrollTop;
}
return scrollTop;
}
/********************
* 取窗口可视范围的高度
*******************/
function getClientHeight(){
var clientHeight=0;
if(document.body.clientHeight&&document.documentElement.clientHeight){
var clientHeight = (document.body.clientHeight<document.documentElement.clientHeight)?document.body.clientHeight:document.documentElement.clientHeight;
}else{
var clientHeight = (document.body.clientHeight>document.documentElement.clientHeight)?document.body.clientHeight:document.documentElement.clientHeight;
}
return clientHeight;
}
/********************
* 取文档内容实际高度
*******************/
function getScrollHeight(){
return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);
}
if(getScrollTop()+getClientHeight() >= getScrollHeight() - 400){
return true;
}
return false;
},
success: function(items, container){//把一次请求来的多项依次渲染
function getShortBrook(){//获取最小溪流
var sBrook;
var brooks = D.query(container+' .J_brook');
for(var i = 0; i < brooks.length; i++){
if(!sBrook){
sBrook = brooks[i];
}else if(D.height(brooks[i]) < D.height(sBrook)){
sBrook = brooks[i];
}
}
return sBrook;
}
function showItems(items){
var num = 0,maxNum = items.length;
showItem(items,num);
function showItem(items, num){
function delay(items, num){
return function(){
var con = getShortBrook();
D.css(items[num], 'opacity', '0');
D.append(items[num], con);
new S.Anim(items[num] , {'opacity' : '1'} , 2 , 'easeOut').run();
num++;
if(num < maxNum){
showItem(items, num);
}
if(items[num-1] == items[num]){
alert('error')
}
}
}
var dl = setTimeout(delay(items, num), 0);
}
}
showItems(items);
},
end: function(){//停止异步请求
window.isEnd = true;
E.remove(window, 'scroll');
},
_bindEvent: function(){//绑定事件
var self = this;
E.on(window, 'scroll', function(e){
if(!self.isGetBottom())return;//滚动条未达到页尾则返回
self.load(self.success, self.end);
E.remove(window, 'scroll');
setTimeout(function(){
self._bindEvent();
},2000);
});
self.load(self.success, self.end);
}
});
S.Waterfall = Waterfall;
return Waterfall;
});
附件中是瀑布流源码供下载,欢迎建议指点~!
分享到:
相关推荐
1. **瀑布流组件**: 这个项目中提到的瀑布流已经被封装成组件,这意味着开发者可以将这个功能作为一个独立的模块来引入到自己的小程序中,无需从头开始编写代码。组件化是现代前端开发中的重要概念,它提高了代码...
在这个项目中,我们关注的是如何使用Vue3结合TypeScript来模仿小红书的瀑布流组件。TypeScript是JavaScript的一个超集,它提供了静态类型检查,有助于提高代码的可维护性和可靠性。 首先,我们要理解瀑布流布局。这...
下面我们将深入探讨瀑布流布局的实现原理、核心组件以及如何在Android中创建一个瀑布流Demo。 一、瀑布流布局原理 瀑布流布局的核心思想是通过计算每个元素的宽度和高度,动态调整元素的位置,使其在屏幕中形成多...
Stick响应式瀑布流组件是一款基于JavaScript的开源工具,专门用于创建动态、自适应的布局,尤其适用于图片或内容展示类的网页设计。瀑布流布局,也称为Masonry布局,其特点是容器中的元素会根据浏览器窗口的大小变化...
在给定的“WinforDataGridView实现瀑布流.rar”压缩包中,包含了一个尝试将瀑布流布局应用于Windows Forms DataGridView的示例项目。瀑布流布局通常在网页设计中用于展示图片或内容,它具有自适应和动态排列的特点,...
然后,在Activity中初始化RecyclerView,设置布局管理器,并创建自定义的Adapter来绑定数据。Adapter通常包含一个ViewHolder类,用于持有每个列表项的视图,这样可以复用已存在的视图,提高性能。 在Adapter中,...
1. **index.php**:这是ThinkPHP框架的入口文件,通常用于引导整个应用,包括初始化配置、路由解析、加载必要组件等。在这个案例中,瀑布流的展示很可能就是通过这个文件进行控制,调用相应的控制器和视图来完成。 ...
1. **初始化ImageLoader**:首先,你需要在应用程序的初始化阶段配置和实例化ImageLoader。这通常在Application或Activity的onCreate()方法中完成。设置网络请求的配置,如缓存策略、线程池大小等,并绑定到一个用于...
1. **初始化布局**:页面加载时,首先对现有图片元素进行布局。每个元素的宽度固定,高度根据内容自动调整。 2. **计算列数**:根据浏览器窗口宽度确定能容纳多少列元素。 3. **监听滚动**:使用JavaScript监听滚动...
Vue组件的生命周期钩子,如`mounted`和`updated`,可以用来初始化布局和在图片加载或窗口大小改变时重新计算布局。在`mounted`中,我们可以先设置一个默认的列数,然后在`updated`中处理窗口大小变化。 此外,对于...
- 在Activity或Fragment中初始化RecyclerView,设置布局管理器和适配器。 2. **StaggeredGridLayoutManager的使用**: - 创建StaggeredGridLayoutManager实例,传入列数和流向(默认垂直流向)。 - 设置...
然后,编写jQuery代码来初始化Masonry和imagesLoaded,同时添加滚动事件监听器以实现延迟加载。最后,配置Lightbox以便用户可以预览图片。 总的来说,这个项目涵盖了前端开发中的多个重要概念和技术,包括响应式...
4. **ViewController.swift**:演示瀑布流效果的主控制器,这里包含了数据源的设置、UICollectionView的初始化、header和footer的添加以及数据加载的逻辑。开发者可以通过查看这个文件了解如何在实际项目中使用...
2. 初始化RecyclerView:在XML布局文件中添加RecyclerView,并在Java或Kotlin代码中初始化并设置布局管理器: ```xml android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_...
在`onCreateViewHolder()`中初始化视图,`onBindViewHolder()`中绑定数据到视图,以及`getItemCount()`返回数据集大小。 4. **自定义视图**: 为每个图片项创建一个自定义的视图,如`ImageViewHolder`,其中包含...
1. **初始化布局**:设置容器宽度和列数,确定每个元素的基础宽度。例如,假设我们有三列,每列的宽度可以是容器宽度的三分之一。 2. **计算高度**:因为元素的大小可能不一,我们需要根据元素的实际高度调整列的...
首先,我们需要了解瀑布流布局的核心组件——`StaggeredGridView`。在Android原生SDK中并没有提供现成的瀑布流视图,但可以通过第三方库实现,如开源项目AndroidStaggeredGrid。这个库提供了一个`StaggeredGridView`...
这个类会初始化RecyclerView,并设置其布局管理器。在Android中,通常使用`GridLayoutManager`或者自定义的布局管理器来实现瀑布流效果,因为它们能够支持多列布局和不同高度的条目。 其次,DEMO可能包含一个`...
3. **初始化 Masonry**:在文档加载完成之后,使用 jQuery 来初始化 Masonry。通常在 `$(document).ready()` 函数中进行,代码如下: ```javascript var container = document.querySelector('#masonry-grid'); ...