1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> 6 <meta name="apple-mobile-web-app-capable" content="yes"> 7 <meta name="apple-mobile-web-app-status-bar-style" content="black"> 8 <title>html5+css3实现上拉和下拉刷新</title> 9 10 <script type="text/javascript" src="http://statics.webkfa.com/js/iscroll.js"></script> 11 12 <script type="text/javascript"> 13 14 var myScroll, 15 pullDownEl, pullDownOffset, 16 pullUpEl, pullUpOffset, 17 generatedCount = 0; 18 19 function pullDownAction () { 20 setTimeout(function () { // <-- Simulate network congestion, remove setTimeout from production! 21 var el, li, i; 22 el = document.getElementById('thelist'); 23 24 for (i=0; i<3; i++) { 25 li = document.createElement('li'); 26 li.innerText = 'Generated row ' + (++generatedCount); 27 el.insertBefore(li, el.childNodes[0]); 28 } 29 30 myScroll.refresh(); // Remember to refresh when contents are loaded (ie: on ajax completion) 31 }, 1000); // <-- Simulate network congestion, remove setTimeout from production! 32 } 33 34 function pullUpAction () { 35 setTimeout(function () { // <-- Simulate network congestion, remove setTimeout from production! 36 var el, li, i; 37 el = document.getElementById('thelist'); 38 39 for (i=0; i<3; i++) { 40 li = document.createElement('li'); 41 li.innerText = 'Generated row ' + (++generatedCount); 42 el.appendChild(li, el.childNodes[0]); 43 } 44 45 myScroll.refresh(); // Remember to refresh when contents are loaded (ie: on ajax completion) 46 }, 1000); // <-- Simulate network congestion, remove setTimeout from production! 47 } 48 49 function loaded() { 50 pullDownEl = document.getElementById('pullDown'); 51 pullDownOffset = pullDownEl.offsetHeight; 52 pullUpEl = document.getElementById('pullUp'); 53 pullUpOffset = pullUpEl.offsetHeight; 54 55 myScroll = new iScroll('wrapper', { 56 useTransition: true, 57 topOffset: pullDownOffset, 58 onRefresh: function () { 59 if (pullDownEl.className.match('loading')) { 60 pullDownEl.className = ''; 61 pullDownEl.querySelector('.pullDownLabel').innerHTML = 'Pull down to refresh...'; 62 } else if (pullUpEl.className.match('loading')) { 63 pullUpEl.className = ''; 64 pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Pull up to load more...'; 65 } 66 }, 67 onScrollMove: function () { 68 if (this.y > 5 && !pullDownEl.className.match('flip')) { 69 pullDownEl.className = 'flip'; 70 pullDownEl.querySelector('.pullDownLabel').innerHTML = 'Release to refresh...'; 71 this.minScrollY = 0; 72 } else if (this.y < 5 && pullDownEl.className.match('flip')) { 73 pullDownEl.className = ''; 74 pullDownEl.querySelector('.pullDownLabel').innerHTML = 'Pull down to refresh...'; 75 this.minScrollY = -pullDownOffset; 76 } else if (this.y < (this.maxScrollY - 5) && !pullUpEl.className.match('flip')) { 77 pullUpEl.className = 'flip'; 78 pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Release to refresh...'; 79 this.maxScrollY = this.maxScrollY; 80 } else if (this.y > (this.maxScrollY + 5) && pullUpEl.className.match('flip')) { 81 pullUpEl.className = ''; 82 pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Pull up to load more...'; 83 this.maxScrollY = pullUpOffset; 84 } 85 }, 86 onScrollEnd: function () { 87 if (pullDownEl.className.match('flip')) { 88 pullDownEl.className = 'loading'; 89 pullDownEl.querySelector('.pullDownLabel').innerHTML = 'Loading...'; 90 pullDownAction(); // Execute custom function (ajax call?) 91 } else if (pullUpEl.className.match('flip')) { 92 pullUpEl.className = 'loading'; 93 pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Loading...'; 94 pullUpAction(); // Execute custom function (ajax call?) 95 } 96 } 97 }); 98 99 setTimeout(function () { document.getElementById('wrapper').style.left = '0'; }, 800); 100 } 101 102 document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false); 103 104 document.addEventListener('DOMContentLoaded', function () { setTimeout(loaded, 200); }, false); 105 </script> 106 107 <style type="text/css" media="all"> 108 body,ul,li { 109 padding:0; 110 margin:0; 111 border:0; 112 } 113 114 body { 115 font-size:12px; 116 -webkit-user-select:none; 117 -webkit-text-size-adjust:none; 118 font-family:helvetica; 119 } 120 121 #header { 122 position:absolute; z-index:2; 123 top:0; left:0; 124 width:100%; 125 height:45px; 126 line-height:45px; 127 background-color:#d51875; 128 background-image:-webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #fe96c9), color-stop(0.05, #d51875), color-stop(1, #7b0a2e)); 129 background-image:-moz-linear-gradient(top, #fe96c9, #d51875 5%, #7b0a2e); 130 background-image:-o-linear-gradient(top, #fe96c9, #d51875 5%, #7b0a2e); 131 padding:0; 132 color:#eee; 133 font-size:20px; 134 text-align:center; 135 } 136 137 #header a { 138 color:#f3f3f3; 139 text-decoration:none; 140 font-weight:bold; 141 text-shadow:0 -1px 0 rgba(0,0,0,0.5); 142 } 143 144 #footer { 145 position:absolute; z-index:2; 146 bottom:0; left:0; 147 width:100%; 148 height:48px; 149 background-color:#222; 150 background-image:-webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #999), color-stop(0.02, #666), color-stop(1, #222)); 151 background-image:-moz-linear-gradient(top, #999, #666 2%, #222); 152 background-image:-o-linear-gradient(top, #999, #666 2%, #222); 153 padding:0; 154 border-top:1px solid #444; 155 } 156 157 #wrapper { 158 position:absolute; z-index:1; 159 top:45px; bottom:48px; left:-9999px; 160 width:100%; 161 background:#aaa; 162 overflow:auto; 163 } 164 165 #scroller { 166 position:absolute; z-index:1; 167 /* -webkit-touch-callout:none;*/ 168 -webkit-tap-highlight-color:rgba(0,0,0,0); 169 width:100%; 170 padding:0; 171 } 172 173 #scroller ul { 174 list-style:none; 175 padding:0; 176 margin:0; 177 width:100%; 178 text-align:left; 179 } 180 181 #scroller li { 182 padding:0 10px; 183 height:40px; 184 line-height:40px; 185 border-bottom:1px solid #ccc; 186 border-top:1px solid #fff; 187 background-color:#fafafa; 188 font-size:14px; 189 } 190 191 #myFrame { 192 position:absolute; 193 top:0; left:0; 194 } 195 196 197 198 /** 199 * 200 * Pull down styles 201 * 202 */ 203 #pullDown, #pullUp { 204 background:#fff; 205 height:40px; 206 line-height:40px; 207 padding:5px 10px; 208 border-bottom:1px solid #ccc; 209 font-weight:bold; 210 font-size:14px; 211 color:#888; 212 } 213 #pullDown .pullDownIcon, #pullUp .pullUpIcon { 214 display:block; float:left; 215 width:40px; height:40px; 216 background:url(http://statics.webkfa.com/img/pull-icon@2x.png) 0 0 no-repeat; 217 -webkit-background-size:40px 80px; background-size:40px 80px; 218 -webkit-transition-property:-webkit-transform; 219 -webkit-transition-duration:250ms; 220 } 221 #pullDown .pullDownIcon { 222 -webkit-transform:rotate(0deg) translateZ(0); 223 } 224 #pullUp .pullUpIcon { 225 -webkit-transform:rotate(-180deg) translateZ(0); 226 } 227 228 #pullDown.flip .pullDownIcon { 229 -webkit-transform:rotate(-180deg) translateZ(0); 230 } 231 232 #pullUp.flip .pullUpIcon { 233 -webkit-transform:rotate(0deg) translateZ(0); 234 } 235 236 #pullDown.loading .pullDownIcon, #pullUp.loading .pullUpIcon { 237 background-position:0 100%; 238 -webkit-transform:rotate(0deg) translateZ(0); 239 -webkit-transition-duration:0ms; 240 241 -webkit-animation-name:loading; 242 -webkit-animation-duration:2s; 243 -webkit-animation-iteration-count:infinite; 244 -webkit-animation-timing-function:linear; 245 } 246 247 @-webkit-keyframes loading { 248 from { -webkit-transform:rotate(0deg) translateZ(0); } 249 to { -webkit-transform:rotate(360deg) translateZ(0); } 250 } 251 252 </style> 253 </head> 254 <body> 255 256 <div id="header"><a href="http://cubiq.org/iscroll">iScroll</a></div> 257 <div id="wrapper"> 258 <div id="scroller"> 259 <div id="pullDown"> 260 <span class="pullDownIcon"></span><span class="pullDownLabel">Pull down to refresh...</span> 261 </div> 262 263 <ul id="thelist"> 264 <li>Pretty row 1</li> 265 <li>Pretty row 2</li> 266 <li>Pretty row 3</li> 267 <li>Pretty row 4</li> 268 <li>Pretty row 5</li> 269 <li>Pretty row 6</li> 270 <li>Pretty row 7</li> 271 <li>Pretty row 8</li> 272 <li>Pretty row 9</li> 273 <li>Pretty row 10</li> 274 <li>Pretty row 11</li> 275 <li>Pretty row 12</li> 276 <li>Pretty row 13</li> 277 <li>Pretty row 14</li> 278 <li>Pretty row 15</li> 279 <li>Pretty row 16</li> 280 <li>Pretty row 17</li> 281 <li>Pretty row 18</li> 282 <li>Pretty row 19</li> 283 <li>Pretty row 20</li> 284 <li>Pretty row 21</li> 285 <li>Pretty row 22</li> 286 <li>Pretty row 23</li> 287 <li>Pretty row 24</li> 288 <li>Pretty row 25</li> 289 <li>Pretty row 26</li> 290 <li>Pretty row 27</li> 291 <li>Pretty row 28</li> 292 <li>Pretty row 29</li> 293 <li>Pretty row 30</li> 294 <li>Pretty row 31</li> 295 <li>Pretty row 32</li> 296 <li>Pretty row 33</li> 297 <li>Pretty row 34</li> 298 <li>Pretty row 35</li> 299 <li>Pretty row 36</li> 300 <li>Pretty row 37</li> 301 <li>Pretty row 38</li> 302 <li>Pretty row 39</li> 303 <li>Pretty row 40</li> 304 </ul> 305 <div id="pullUp"> 306 <span class="pullUpIcon"></span><span class="pullUpLabel">Pull up to refresh...</span> 307 </div> 308 </div> 309 </div> 310 <div id="footer"></div> 311 312 </body> 313 </html>