diff --git a/Changelog.md b/Changelog.md index ac7141e..f470db3 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,8 @@ +### 0.4.0(150927) + +* 增加参数scrollArea +* 修复未滑动到底部就加载bug + ### 0.3.0(150410) * 增加`lock()` 和`unlock()` API diff --git a/README.md b/README.md index d0ad5c4..0b33c15 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ ## 背景介绍 +### 0.4.0(150927) + +根据网友提供demo,修改至适用大部分普通列表网页,终于可以大规模使用啦! + ### 0.3.0(150410) 项目中通知列表有可编辑、删除等状态,需要锁定和解锁下拉刷新功能。 @@ -18,8 +22,11 @@ ## 示例 +![扫一扫](examples/news-list.png) +[普通列表DEMO](http://ximan.github.io/dropload/examples/news-list.html) + ![扫一扫](examples/product-list.png) -[DEMO链接](http://ximan.github.io/dropload/examples/product-list.html) +[固定布局DEMO](http://ximan.github.io/dropload/examples/product-list.html) ## 依赖 @@ -27,24 +34,14 @@ Zepto 或者 jQuery ## 使用方法 +引用css和js + + + + ```` $('.element').dropload({ - loadUpFn : function(me){ - $.ajax({ - type: 'GET', - url: 'json/update.json', - dataType: 'json', - success: function(data){ - alert(data); - // 代码执行后必须重置 - me.resetload(); - }, - error: function(xhr, type){ - alert('Ajax error!'); - me.resetload(); - } - }); - }, + scrollArea : window, loadDownFn : function(me){ $.ajax({ type: 'GET', @@ -64,12 +61,13 @@ $('.element').dropload({ }); ```` -CSS样式请自行美化 +进阶用法详见上面[固定布局DEMO](http://ximan.github.io/dropload/examples/product-list.html) ## 参数列表 | 参数 | 说明 | 默认值 | 可填值 | |------------|-------------|--------|----------------| +| scrollArea | 滑动区域 | 绑定元素自身 | window | | domUp | 上方DOM | {
domClass : 'dropload-up',
domRefresh : '<div class="dropload-refresh">↓下拉刷新</div>',
domUpdate : '<div class="dropload-update">↑释放更新</div>',
domLoad : '<div class="dropload-load">○加载中...</div>'
} | 数组 | | domDown | 下方DOM | {
domClass : 'dropload-down',
domRefresh : '<div class="dropload-refresh">↑上拉加载更多</div>',
domUpdate : '<div class="dropload-update">↓释放加载</div>',
domLoad : '<div class="dropload-load">○加载中...</div>'
} | 数组 | | distance | 拉动距离 | 50 | 数字 | @@ -86,9 +84,9 @@ CSS样式请自行美化 ## 最新版本 -### 0.3.0(150410) +### 0.4.0(150927) -* 增加`lock()` 和`unlock()` API -* 修复拉动加载时还可拉动bug +* 增加参数scrollArea +* 修复未滑动到底部就加载bug [所有更新日志](Changelog.md) \ No newline at end of file diff --git a/dist/dropload.css b/dist/dropload.css new file mode 100644 index 0000000..9ea3158 --- /dev/null +++ b/dist/dropload.css @@ -0,0 +1,56 @@ +.dropload-up,.dropload-down{ + position: relative; + height: 0; + overflow: hidden; + -webkit-transform:translate3d(0,0,0); + transform:translate3d(0,0,0); +} +.dropload-refresh,.dropload-update,.dropload-load{ + position: absolute; + left: 50%; + bottom: 0; + width: 100%; + height: 50px; + line-height: 50px; + text-align: center; + -webkit-transform:translate(-50%,0); + transform:translate(-50%,0); +} +.dropload-down .dropload-refresh,.dropload-down .dropload-update,.dropload-down .dropload-load{ + top: 0; + bottom: auto; +} +.dropload-load .loading{ + display: inline-block; + height: 15px; + width: 15px; + border-radius: 100%; + margin: 6px; + border: 2px solid #666; + border-bottom-color: transparent; + vertical-align: middle; + -webkit-animation: rotate 0.75s linear infinite; + animation: rotate 0.75s linear infinite; +} +@-webkit-keyframes rotate { + 0% { + -webkit-transform: rotate(0deg); + } + 50% { + -webkit-transform: rotate(180deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} +@keyframes rotate { + 0% { + transform: rotate(0deg); + } + 50% { + transform: rotate(180deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/dist/dropload.js b/dist/dropload.js index b14f71f..bfab085 100644 --- a/dist/dropload.js +++ b/dist/dropload.js @@ -1,11 +1,13 @@ /** * dropload * 西门 - * 0.3.0(150410) + * 0.4.0(150927) */ ;(function($){ 'use strict'; + var $win = $(window); + var $doc = $(document); $.fn.dropload = function(options){ return new MyDropLoad(this, options); }; @@ -22,23 +24,31 @@ MyDropLoad.prototype.init = function(options){ var me = this; me.opts = $.extend({}, { + scrollArea : me.$element, // 滑动区域 domUp : { // 上方DOM domClass : 'dropload-up', domRefresh : '
↓下拉刷新
', domUpdate : '
↑释放更新
', - domLoad : '
○加载中...
' + domLoad : '
加载中...
' }, domDown : { // 下方DOM domClass : 'dropload-down', domRefresh : '
↑上拉加载更多
', domUpdate : '
↓释放加载
', - domLoad : '
○加载中...
' + domLoad : '
加载中...
' }, distance : 50, // 拉动距离 loadUpFn : '', // 上方function loadDownFn : '' // 下方function }, options); + // 判断滚动区域 + if(me.opts.scrollArea == window){ + me.$scrollArea = $win; + }else{ + me.$scrollArea = me.opts.scrollArea; + } + // 绑定触摸 me.$element.on('touchstart',function(e){ if(!me.loading && !me.isLock){ @@ -69,9 +79,15 @@ // touchstart function fnTouchstart(e, me){ me._startY = e.touches[0].pageY; - me._loadHeight = me.$element.height(); - me._childrenHeight = me.$element.children().height(); - me._scrollTop = me.$element.scrollTop(); + // 判断滚动区域 + if(me.opts.scrollArea == window){ + me._meHeight = $win.height(); + me._childrenHeight = $doc.height(); + }else{ + me._meHeight = me.$element.height(); + me._childrenHeight = me.$element.children().height(); + } + me._scrollTop = me.$scrollArea.scrollTop(); } // touchmove @@ -101,6 +117,7 @@ // 下拉 if(_absMoveY <= me.opts.distance){ me._offsetY = _absMoveY; + // 待解决:move时会不断清空、增加dom,有可能影响性能,下同 me.$domUp.html('').append(me.opts.domUp.domRefresh); // 指定距离 < 下拉距离 < 指定距离*2 }else if(_absMoveY > me.opts.distance && _absMoveY <= me.opts.distance*2){ @@ -115,7 +132,7 @@ } // 加载下方 - if(me.opts.loadDownFn != '' && me._childrenHeight <= (me._loadHeight+me._scrollTop) && me.direction == 'up'){ + if(me.opts.loadDownFn != '' && me._childrenHeight <= (me._meHeight+me._scrollTop) && me.direction == 'up'){ e.preventDefault(); if(!me.insertDOM){ me.$element.append('
'); @@ -139,7 +156,7 @@ } me.$domDown.css({'height': me._offsetY}); - me.$element.scrollTop(me._offsetY+me._scrollTop); + me.$scrollArea.scrollTop(me._offsetY+me._scrollTop); } } diff --git a/dist/dropload.min.css b/dist/dropload.min.css new file mode 100644 index 0000000..9e03306 --- /dev/null +++ b/dist/dropload.min.css @@ -0,0 +1 @@ +.dropload-up,.dropload-down{position:relative;height:0;overflow:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.dropload-refresh,.dropload-update,.dropload-load{position:absolute;left:50%;bottom:0;width:100%;height:50px;line-height:50px;text-align:center;-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.dropload-down .dropload-refresh,.dropload-down .dropload-update,.dropload-down .dropload-load{top:0;bottom:auto}.dropload-load .loading{display:inline-block;height:15px;width:15px;border-radius:100%;margin:6px;border:2px solid #666;border-bottom-color:transparent;vertical-align:middle;-webkit-animation:rotate .75s linear infinite;animation:rotate .75s linear infinite}@-webkit-keyframes rotate{0%{-webkit-transform:rotate(0deg)}50%{-webkit-transform:rotate(180deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes rotate{0%{transform:rotate(0deg)}50%{transform:rotate(180deg)}100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/dist/dropload.min.js b/dist/dropload.min.js index ca2e681..a4211ba 100644 --- a/dist/dropload.min.js +++ b/dist/dropload.min.js @@ -1,6 +1,6 @@ /** * dropload * 西门 - * 0.3.0(150410) + * 0.4.0(150927) */ -!function(a){"use strict";function c(a){a.touches||(a.touches=a.originalEvent.touches)}function d(a,b){b._startY=a.touches[0].pageY,b._loadHeight=b.$element.height(),b._childrenHeight=b.$element.children().height(),b._scrollTop=b.$element.scrollTop()}function e(b,c){c._curY=b.touches[0].pageY,c._moveY=c._curY-c._startY,c._moveY>0?c.direction="down":c._moveY<0&&(c.direction="up");var d=Math.abs(c._moveY);""!=c.opts.loadUpFn&&c._scrollTop<=0&&"down"==c.direction&&(b.preventDefault(),c.insertDOM||(c.$element.prepend('
'),c.insertDOM=!0),c.$domUp=a("."+c.opts.domUp.domClass),h(c.$domUp,0),d<=c.opts.distance?(c._offsetY=d,c.$domUp.html("").append(c.opts.domUp.domRefresh)):d>c.opts.distance&&d<=2*c.opts.distance?(c._offsetY=c.opts.distance+.5*(d-c.opts.distance),c.$domUp.html("").append(c.opts.domUp.domUpdate)):c._offsetY=c.opts.distance+.5*c.opts.distance+.2*(d-2*c.opts.distance),c.$domUp.css({height:c._offsetY})),""!=c.opts.loadDownFn&&c._childrenHeight<=c._loadHeight+c._scrollTop&&"up"==c.direction&&(b.preventDefault(),c.insertDOM||(c.$element.append('
'),c.insertDOM=!0),c.$domDown=a("."+c.opts.domDown.domClass),h(c.$domDown,0),d<=c.opts.distance?(c._offsetY=d,c.$domDown.html("").append(c.opts.domDown.domRefresh)):d>c.opts.distance&&d<=2*c.opts.distance?(c._offsetY=c.opts.distance+.5*(d-c.opts.distance),c.$domDown.html("").append(c.opts.domDown.domUpdate)):c._offsetY=c.opts.distance+.5*c.opts.distance+.2*(d-2*c.opts.distance),c.$domDown.css({height:c._offsetY}),c.$element.scrollTop(c._offsetY+c._scrollTop))}function f(b){var c=Math.abs(b._moveY);b.insertDOM&&("down"==b.direction?(b.$domResult=b.$domUp,b.domLoad=b.opts.domUp.domLoad):"up"==b.direction&&(b.$domResult=b.$domDown,b.domLoad=b.opts.domDown.domLoad),h(b.$domResult,300),c>b.opts.distance?(b.$domResult.css({height:b.$domResult.children().height()}),b.$domResult.html("").append(b.domLoad),g(b)):b.$domResult.css({height:"0"}).on("webkitTransitionEnd",function(){b.insertDOM=!1,a(this).remove()}),b._moveY=0)}function g(a){a.loading=!0,""!=a.opts.loadUpFn&&"down"==a.direction?a.opts.loadUpFn(a):""!=a.opts.loadDownFn&&"up"==a.direction&&a.opts.loadDownFn(a)}function h(a,b){a.css({"-webkit-transition":"all "+b+"ms",transition:"all "+b+"ms"})}a.fn.dropload=function(a){return new b(this,a)};var b=function(b,c){var d=this;d.$element=a(b),d.insertDOM=!1,d.loading=!1,d.isLock=!1,d.init(c)};b.prototype.init=function(b){var g=this;g.opts=a.extend({},{domUp:{domClass:"dropload-up",domRefresh:'
↓下拉刷新
',domUpdate:'
↑释放更新
',domLoad:'
○加载中...
'},domDown:{domClass:"dropload-down",domRefresh:'
↑上拉加载更多
',domUpdate:'
↓释放加载
',domLoad:'
○加载中...
'},distance:50,loadUpFn:"",loadDownFn:""},b),g.$element.on("touchstart",function(a){g.loading||g.isLock||(c(a),d(a,g))}),g.$element.on("touchmove",function(a){g.loading||g.isLock||(c(a,g),e(a,g))}),g.$element.on("touchend",function(){g.loading||g.isLock||f(g)})},b.prototype.lock=function(){var a=this;a.isLock=!0},b.prototype.unlock=function(){var a=this;a.isLock=!1},b.prototype.resetload=function(){var b=this;b.$domResult&&b.$domResult.css({height:"0"}).on("webkitTransitionEnd",function(){b.loading=!1,b.insertDOM=!1,a(this).remove()})}}(window.Zepto||window.jQuery); \ No newline at end of file +!function(a){"use strict";function e(a){a.touches||(a.touches=a.originalEvent.touches)}function f(a,d){d._startY=a.touches[0].pageY,d.opts.scrollArea==window?(d._meHeight=b.height(),d._childrenHeight=c.height()):(d._meHeight=d.$element.height(),d._childrenHeight=d.$element.children().height()),d._scrollTop=d.$scrollArea.scrollTop()}function g(b,c){c._curY=b.touches[0].pageY,c._moveY=c._curY-c._startY,c._moveY>0?c.direction="down":c._moveY<0&&(c.direction="up");var d=Math.abs(c._moveY);""!=c.opts.loadUpFn&&c._scrollTop<=0&&"down"==c.direction&&(b.preventDefault(),c.insertDOM||(c.$element.prepend('
'),c.insertDOM=!0),c.$domUp=a("."+c.opts.domUp.domClass),j(c.$domUp,0),d<=c.opts.distance?(c._offsetY=d,c.$domUp.html("").append(c.opts.domUp.domRefresh)):d>c.opts.distance&&d<=2*c.opts.distance?(c._offsetY=c.opts.distance+.5*(d-c.opts.distance),c.$domUp.html("").append(c.opts.domUp.domUpdate)):c._offsetY=c.opts.distance+.5*c.opts.distance+.2*(d-2*c.opts.distance),c.$domUp.css({height:c._offsetY})),""!=c.opts.loadDownFn&&c._childrenHeight<=c._meHeight+c._scrollTop&&"up"==c.direction&&(b.preventDefault(),c.insertDOM||(c.$element.append('
'),c.insertDOM=!0),c.$domDown=a("."+c.opts.domDown.domClass),j(c.$domDown,0),d<=c.opts.distance?(c._offsetY=d,c.$domDown.html("").append(c.opts.domDown.domRefresh)):d>c.opts.distance&&d<=2*c.opts.distance?(c._offsetY=c.opts.distance+.5*(d-c.opts.distance),c.$domDown.html("").append(c.opts.domDown.domUpdate)):c._offsetY=c.opts.distance+.5*c.opts.distance+.2*(d-2*c.opts.distance),c.$domDown.css({height:c._offsetY}),c.$scrollArea.scrollTop(c._offsetY+c._scrollTop))}function h(b){var c=Math.abs(b._moveY);b.insertDOM&&("down"==b.direction?(b.$domResult=b.$domUp,b.domLoad=b.opts.domUp.domLoad):"up"==b.direction&&(b.$domResult=b.$domDown,b.domLoad=b.opts.domDown.domLoad),j(b.$domResult,300),c>b.opts.distance?(b.$domResult.css({height:b.$domResult.children().height()}),b.$domResult.html("").append(b.domLoad),i(b)):b.$domResult.css({height:"0"}).on("webkitTransitionEnd",function(){b.insertDOM=!1,a(this).remove()}),b._moveY=0)}function i(a){a.loading=!0,""!=a.opts.loadUpFn&&"down"==a.direction?a.opts.loadUpFn(a):""!=a.opts.loadDownFn&&"up"==a.direction&&a.opts.loadDownFn(a)}function j(a,b){a.css({"-webkit-transition":"all "+b+"ms",transition:"all "+b+"ms"})}var d,b=a(window),c=a(document);a.fn.dropload=function(a){return new d(this,a)},d=function(b,c){var d=this;d.$element=a(b),d.insertDOM=!1,d.loading=!1,d.isLock=!1,d.init(c)},d.prototype.init=function(c){var d=this;d.opts=a.extend({},{scrollArea:d.$element,domUp:{domClass:"dropload-up",domRefresh:'
↓下拉刷新
',domUpdate:'
↑释放更新
',domLoad:'
加载中...
'},domDown:{domClass:"dropload-down",domRefresh:'
↑上拉加载更多
',domUpdate:'
↓释放加载
',domLoad:'
加载中...
'},distance:50,loadUpFn:"",loadDownFn:""},c),d.$scrollArea=d.opts.scrollArea==window?b:d.opts.scrollArea,d.$element.on("touchstart",function(a){d.loading||d.isLock||(e(a),f(a,d))}),d.$element.on("touchmove",function(a){d.loading||d.isLock||(e(a,d),g(a,d))}),d.$element.on("touchend",function(){d.loading||d.isLock||h(d)})},d.prototype.lock=function(){var a=this;a.isLock=!0},d.prototype.unlock=function(){var a=this;a.isLock=!1},d.prototype.resetload=function(){var b=this;b.$domResult&&b.$domResult.css({height:"0"}).on("webkitTransitionEnd",function(){b.loading=!1,b.insertDOM=!1,a(this).remove()})}}(window.Zepto||window.jQuery); \ No newline at end of file diff --git a/examples/news-list.html b/examples/news-list.html new file mode 100644 index 0000000..35fc2cc --- /dev/null +++ b/examples/news-list.html @@ -0,0 +1,253 @@ + + + + + 下拉刷新 + + + + +
+

就当我是新闻页吧

+
+
+
+ + +

1文字描述文字描述

+ 2014-14-14 +
+ + +

2文字描述文字描述文字描述文字描述文字描述文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

3文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

4文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

5文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

6文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

7文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

8文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

9文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

10文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

11文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+ + +

12文字描述文字描述文字描述文字描述文字描述

+ 2014-14-14 +
+
+
+ + + + + + \ No newline at end of file diff --git a/examples/news-list.png b/examples/news-list.png new file mode 100644 index 0000000..1a37836 Binary files /dev/null and b/examples/news-list.png differ diff --git a/examples/product-list.html b/examples/product-list.html index 1607579..13d1c01 100644 --- a/examples/product-list.html +++ b/examples/product-list.html @@ -3,187 +3,134 @@ 下拉刷新 - + .inner .item img{ + display: block; + width: 40px; + height: 40px; + border:1px solid #ddd; + } + .inner .item h3{ + display: block; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + width: 100%; + max-height: 40px; + overflow: hidden; + line-height: 20px; + margin: 0 10px; + font-size: 1.2rem; + } + .inner .item .date{ + display: block; + height: 20px; + line-height: 20px; + color: #999; + } + .opacity{ + -webkit-animation: opacity 0.5s linear; + animation: opacity 0.5s linear; + } + @-webkit-keyframes opacity { + 0% { + opacity:0; + } + 100% { + opacity:1; + } + } + @keyframes opacity { + 0% { + opacity:0; + } + 100% { + opacity:1; + } + } + +
@@ -193,62 +140,62 @@

头部

- +

1文字描述文字描述

2014-14-14
- +

2文字描述文字描述文字描述文字描述文字描述文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

3文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

4文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

5文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

6文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

7文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

8文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

9文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

10文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

11文字描述文字描述文字描述文字描述文字描述

2014-14-14
- +

12文字描述文字描述文字描述文字描述文字描述

2014-14-14 @@ -297,9 +244,9 @@

12文字描述文字描述文字描述文字描述文字描述

success: function(data){ var result = ''; for(var i = 0; i < data.lists.length; i++){ - result += '
' + result += '' +'' - +'

'+data.lists[i].title+'

' + +'

'+data.lists[i].title+'

' +''+data.lists[i].date+'' +'
'; } @@ -324,9 +271,9 @@

12文字描述文字描述文字描述文字描述文字描述

success: function(data){ var result = ''; for(var i = 0; i < data.lists.length; i++){ - result += '' + result += '' +'' - +'

'+data.lists[i].title+'

' + +'

'+data.lists[i].title+'

' +''+data.lists[i].date+'' +'
'; } diff --git a/examples/product-list.png b/examples/product-list.png index 5b457ea..932be7c 100644 Binary files a/examples/product-list.png and b/examples/product-list.png differ