JRoll,一款能滾起上萬條數據,具備滑動加速、回彈、縮放、滾動條、滑動事件等功能,兼容CommonJS/AMD/CMD模塊規範,開源,免費的輕量級html5滾動插件。javascript
JRoll第二版是在JRoll初版基礎上重寫JRoll滑動算法,基於時間運動,解決幀頻下降時滑動緩慢的問題,更改垂直水平方向判斷方法,使捕獲垂直水平方向更準確靈敏。css
JRoll第二版增減了一些api不徹底兼容JRoll初版。html
http://www.chjtx.com/JRoll/demos/html5
#克隆倉庫 Clone repository git clone https://github.com/chjtx/JRoll.git #進入項目 Go into project cd JRoll #安裝express Install express npm install -g express #若是用蘋果電腦,須要加sudo #If on mac, use sudo sudo npm install -g express #運行 Run node server.js
而後在瀏覽器打開 localhost:3020/demos/node
注意:JRoll專爲移動應用度身設計,對PC瀏覽器的兼容只爲方便開發調試,沒做過多處理,所以強烈建議使用谷歌瀏覽器模擬器進行開發,在移動端使用。git
在UC瀏覽器上表現較差,做者已將UC瀏覽器定義爲資訊類應用,非專業瀏覽器,不會專門去兼容它github
<script src='jroll.js'></script>
var JRoll = require('jroll');
require(['jroll'], function(JRoll) { ... });
seajs.use('jroll', function(JRoll) { ... });
html代碼算法
<div id="wrapper"> <ul id="scroller"> <li>有一美人兮,見之不忘。</li> <li>一日不見兮,思之如狂。</li> <li>鳳飛翱翔兮,四海求凰。</li> <li>無奈佳人兮,不在東牆。</li> <li>將琴代語兮,聊寫衷腸。</li> <li>何日見許兮,慰我彷徨。</li> <li>願言配德兮,攜手相將。</li> <li>不得於飛兮,使我淪亡。</li> </ul> </div>
css代碼express
ul {margin: 0; padding: 0;} li {line-height: 24px; margin-left: 24px;} #wrapper {width: 200px; height: 100px; border: 1px solid;}
js代碼
new JRoll("#wrapper");
var jroll = new JRoll(selector [, options]);
selector是容器,能夠是id選擇器字符串#wrapper,也能夠是dom對象document.getElementById('wrapper'),第二個參數是可選對象,該參數內容決定了建立一個怎樣的JRoll對象
var jroll = new JRoll("#wrapper", {scrollBarY:true});
保存了JRoll對象後,可動態對部分可選參數進行修改
jroll.options.bounce = false;
可選值 | 默認值 | 說明 |
---|---|---|
id | [隨機生成] | id,jroll對象的惟一標記,建議手動提供id,方便在全局JRoll.jrollMap訪問指定jroll對象,不提供時系統自動建立。 |
scrollX | false | 使能水平滑動可動態修改 |
scrollY | true | 使能垂直滑動可動態修改 |
scrollFree | false | 使能自由滑動,默認狀況下,x方向在滑動時,y方向不能滑動,相反亦然,若是應用於對圖片進行放大滑動,可將此參數設爲true可動態修改 |
minX | 0 | 向左滑動的邊界值可動態修改 |
maxX | [負scroller的寬] | 向右滑動的邊界值可動態修改 |
minY | 0 | 向下滑動的邊界值可動態修改 |
maxY | [負scroller的高] | 向上滑動的邊界值可動態修改 |
zoom | false | 使能縮放可動態修改 |
zoomMin | 1.0 | 最小縮放倍數可動態修改 |
zoomMax | 4.0 | 最大縮放倍數可動態修改 |
bounce | true | 容許回彈可動態修改 |
scrollBarX | false | 開啓水平滾動條 |
scrollBarY | false | 開啓垂直滾動條 |
scrollBarFade | false | 滾動條使用漸隱模式 |
preventDefault | true | 禁止touchmove默認事件 |
momentum | true | 開啓滑動加速,慣性過渡可動態修改 |
autoStyle | true | 自動爲wrapper和scroller添加樣式 |
從JRoll v2.2.0版本開始,JRoll刪除了adjustTop選項,自動調整安卓機輸入框位置的功能抽離到jroll-fixedinput.js裏。 |
||
scroller | [wrapper的第一個子元素] | 指定scroller,不可動態更改,能夠是id選擇器字符串#scroller,也能夠是dom對象document.getElementById('scroller') |
var jroll = new JRoll("#wrapper"); console.log(jroll.id);
console.log(JRoll.jrollMap);
var jroll = new JRoll("#wrapper"); //do something,例:動態修改scroller的內容,使scroller的高度發生變化 jroll.refresh();
jroll.scrollTo(x, y, duration [, bool, callback])
var jroll = new JRoll("#wrapper"); //200ms內滑動到0px, -100px位置 jroll.scrollTo(0, -100, 200); //容許超出邊界 jroll.scrollTo(100, 100, 0, true); //回調 jroll.scrollTo(0, 100, 400, false, function() { //滑動結束後執行 });
jroll.enable();
jroll.disable();
jroll.destroy();
//放大1.5倍 jroll.scale(1.5);
/* 例: * jroll1在外層,包裹jroll2 * jroll2在滑動到達指定條件時將滾動權交給jroll1 */ var pos; var jroll1 = new JRoll("#wrapper", {bounce:true}); var jroll2 = new JRoll("#inner", {bounce:true}); jroll2.on("scrollStart", function() { pos = this.y; }); jroll2.on("scroll", function(e) { if ((this.y-pos > 0 && pos === 0) || (this.y-pos < 0 && pos === this.maxScrollY)) { jroll2.call(jroll1, e); //返回jroll1 } });
JRoll一共提供8個事件,每一個事件均可屢次添加行爲。事件裏的this指向jroll對象。
jroll.on("scrollStart", function() { console.log(this.x); //輸出當前x偏移量,this指向jroll對象 });
jroll.on("scroll", function() { //該幹嗎幹嗎去... });
jroll.on("scrollEnd", function() { //該幹嗎幹嗎去... });
jroll.on("touchEnd", function() { //該幹嗎幹嗎去... });
jroll.on("zoomStart", function() { //該幹嗎幹嗎去... });
jroll.on("zoom", function() { //該幹嗎幹嗎去... });
jroll.on("zoomEnd", function() { //該幹嗎幹嗎去... });
jroll.on("refresh", function() { //該幹嗎幹嗎去... });
var jroll = new JRoll("#wrapper"); jroll.on("scroll", function() { if (this.s === "scrollY") { //乾點你想幹的事情 } else { //或者乾點別的事情 } })
jroll.s中的s表示status,6種可能取值
注意:JRoll v2.3.0如下版本的min壓縮文件的jroll.s值用一、二、三、四、5表示preScroll、preZoom、scrollX、scrollY、scrollFree。在JRoll v2.3.0版本開始與未壓縮版保持一致,當初真不該該爲了節省那丁點字節取用數字壓縮的。
var jroll = JRoll("#wrapper"); jroll.on("scrollEnd", function() { if (this.y === this.maxScrollY) { console.log("已滑動到底部"); } });
有關jroll對象更多的屬性請自行在瀏覽器控制檯輸出jroll對象查看。
只要scrollBarX/scrollBarY的值爲字符串,即爲開啓自定義滾動條,須要本身寫樣式。
滾動條對樣式定位有些特殊要求,自定義滾動條大小、顏色時須要先將默認樣式拷貝下來,再對 .jroll-ybar/.jroll-xbar 和 .jroll-ybtn/.jroll-xbtn 進行修改。
var jroll = new JRoll("#wrapper", { scrollBarY: "custom", scrollBarFade: true });
若是您的頁面須要播放視頻,在某些安卓機下沒法滑動<video>,可用如下方法解決。
非播放狀態的<video>其表現像controls同樣沒法捕獲touchstart等事件,所以沒法使用JRoll滑動,可以使用透明div解決。
<div id="parent"> <video id="video" controls="controls"> <source src="./video.ogg" type="video/ogg"> </video> <div class="fixed-video-scroll"></div> </div> <script> var video = document.getElementById("video"); document.addEventListener("click", function(e) { if (e.target.className === "fixed-video-scroll") { if (video.paused) { video.play(); } else { video.pause(); } } }) </script>
評論框貼在底部隨着軟鍵盤升起而升起的功能彷佛很受客戶青睞,這一需求使用H5技術實現非常力不從心,fixed定位失效,第三方輸入法不改變window高度導致input被遮擋,IOS自動移動input到錯誤位置等等問題成了最大的阻力。
現時比較可行的解決方案有:
這兩種設計方案都巧妙地避開了輸入框被軟鍵盤遮擋的狀況,可參考這篇文章WebAPP輸入框被軟鍵盤遮擋腫麼辦?
JRoll使用translate3d滑動頁面,可監聽input聚焦事件,使用scrollTo方法將輸入框移動到可見位置,在Android機上可解決被遮擋的問題,詳見jroll-fixedinput組件
建議:下載文件後將文件名版本號去掉,這樣在JRoll有更新時只須要更新jroll.js文件,不須要更新引用jroll的文件。
下載:jroll-pulldown.js(9k) jroll-pulldown.min.js(6k)
下載:jroll-infinite.js(7k) jroll-infinite.min.js(4k)
下載:jroll-fixedinput.js(2k) jroll-fixedinput.min.js(1k)