init() 方法實作為文件元素新增mousemove和mouseup事件,mousemove實現了在捲軸查看捲軸時查看內容的後續變化。然後計算查看內容應該到的位置。事件處理程序實現了聲音的最後操作的滾動條元素。
//新增滾動條事件
regEvent: function(elem) {
var that = this,
sbody = elem.firstChild,
list = sbody.nextSibling,
list = sbody.nextSibling,
list = sbody.nextSibling,
list = sbody.nextSibling,
//滾動條元素
s = list.firstChild,
//滾動條滾動最小值
min = 0,
//滾動條滾動最大值
max = list.offsetHeight - s.offsetHeight,
_default = parseInt(sbody['data-height'] || sbody.getAttribute('data-height'), 10),
unit = (sbody.scrollHeight - _default) / max ,
//firefox瀏覽器
firefox = 'MozBinding' in document.documentElement.style,
//滑鼠滾輪事件
mousewheel = firefox ? 'DOMMouseScroll' : ' //opera瀏覽器
opera = window.oprea && navigator.userAgent.indexOf('MSIE') === -1,
//is firing mousedown event
firing = false,
/ /滑鼠點擊,定時器執行時間
interval,
//捲軸距離容器高度
top,
//滾動條當前top值
cur,
//每次捲動多少像素
speed = 18;
//變數快取min, max
this.limits[s] = {
min: 0,
max: max
}
//scroll事件滑鼠滑動滾輪移動捲軸
squid.on(elem, mousewheel, function(event) {
var delta;
if(event.wheelDelta) {
delta = opera ? -event.wheelDelta / 120 : event.wheelDelta / 120
}else{
delta = -event.detail / 3
}
curs = 6% .style.top || 0, 10)
//向上捲動
if(delta > 0) {
top = cur - speed
if(top top = min
}
}else{//向下捲動
top = cur speed
if(top > max) {
top = max
}
}
s.style.top = top 'px'
that.doScroll(sbody, top * unit)
//阻止body元素滾動條滾動
event.preventDefault()
})
//ie6, 7, 8下,如果滑鼠連續點擊兩次且時間間隔太短,則第二次事件不會觸發
//拖曳滾動條,點擊滾動條可到達區域
squid.on(list, 'mousedown', function(event) {
var target = event.target,
y = event.clientY;
target = event.target
if(target.tagName.toLowerCase() === 'shape')
target = s
//滑鼠點擊元素是捲軸
if(target === s) {
//invoke elem setCapture
s.setCapture && s.setCapture()
that.scrolling.diffy = y - s.offsetTop
////////////////////////////////////////////////////計動捲軸
that.scrolling.elem = s
}else if(target.className.match('jscroll-list')){
firing = true
interval = setInterval(function() {
if(firing) {
that.mouseHandle(list, y, unit)
}
}, 80)
}
})
///滑鼠鬆開捲軸停止捲動
squid.on(list, 'mouseup', function() {
//invoke elem releaseCapture
s.releaseCapture && s.releaseCapture()
firing = false
clearInterval(interval)
})
//滾動條元素取得焦點,可以觸發keyup事件
squid.on(s, 'click', function() {
this.focus()
})
//滾動條取得焦點後,觸發鍵盤上下鍵,滾動條滾動
squid.on(s, 'keydown', function( event) {
var keyCode = event.keyCode,
state = false;
cur = parseInt(s.style.top || 0, 10)
switch(keyCode) {
case 38:
top = cur - speed
if(top top = min
}
state = true
break
case 40:
top = cur speed
if(top > max) {
top = max
}
state = true
break
default:
break
}
if(state) {
s.style.top = top 'px'
that.doScroll(sbody, top * unit)
}
event.preventDefault()
})
}
regEvent()方法實作了以下功能,應該是jscroll元件的核心方法了:
1. 滑鼠在包含滾動條的元素區域,上下滾動滑鼠滾輪,查看的內容跟隨滾輪上下翻的功能
2. 點選捲軸可到達區域,即捲軸上方或下方,捲軸和檢視的內容向上或向下捲動。滑鼠點選捲軸可到達區域不放開,可連續捲動捲軸和檢視的內容,透過呼叫mouseHandle()方法來具體實現此功能。
3. 點擊滾動條元素後,可以透過鍵盤上下鍵來觸發滾動條和查看內容的滾動
複製代碼
程式碼如下:
//滑鼠點擊捲軸可到達區域上面或下面時,捲軸滾動
mouseHandle: function(elem, place, unit) {
var prev = elem.previousSibling,
//包含捲軸顯示內容元素
a = prev.tagName.toLowerCase() === 'div' ? prev : prev.previousSibling,
//
n = elem.firstChild,
//捲軸元素
s = this.ie6 ? n.lastChild : n.tagName.toLowerCase() === 'div' ? n : n.nextSibling,
//捲軸高度
height ,
//list元素距body的top值
value,
//滾動條距離容器高度
top,
//滾動條距body的top值
sTop,
//滾動條滾動最小值
min,
//滾動條滾動最大值
max,
//每點擊滾動條可到達區域,滾動條向下或向上移動10px
step = 10,
//滑鼠點擊滾動條可到達區域距離最頂端或最底端小於distance時,捲軸能夠自動移動到最頂端或最低端
distance = 20;
min = this.limits[s].min
max = this.limits[s].max
height = s.offsetHeight
top = parseInt(s.style.top || 0, 10)
value = squid.getOffset(elem).top
sTop = squid.getOffset(s).top
//滑鼠點擊滾動條下方區域,滾動條向下滾動
if(place > sTop) {
if(value elem.offsetHeight - place top = max
}else{
if ((sTop height step) top = step
}else{
top = place - value - height
}
}
}else{
//滑鼠點擊區域距捲軸頂端小於捲軸長度時,捲軸會自動捲動到最頂端
if(place - value top = min
}else{
//滾動條距頁面頂部高度減去滑鼠clientY值大於step
if(sTop - place >= step) {
top -= step
}else{
top = place - value
}
}
}
if(top top = min
}else if(top > max) {
top = max
}
s.style.top = top 'px'
this.doScroll(a, top * unit)
}
mouseHandle()方法通過判斷🎜>mouseHandle()方法通過判斷滑鼠點擊位置在頁面中的位置座標,和滾動條元素在頁面中的位置來判斷是點擊了捲軸的上方區域還是下方區域。如果點擊了下方區域則滾動條向下滾動,否則向上滾動,對於點擊的位置在上方區域或下方區域小於distance值時,滾動條會自動滾動到最小值或者最大值。
顯示效果
該控制項的demo使用了淘寶網用戶註冊協議內容,因為firefox、chrome等高級瀏覽器都能保證很好的兼容性和顯示效果,所以這裡只展示ie低版本瀏覽器顯示效果, ie瀏覽器顯示截圖如下:
ie6下
初始化之後
滾動過程中
滾到底部
ie7
捲軸初始化之後
滾動過程中
滾到最底部
ie9
開始滾動前
滾動過程中
捲動到最底部
總結:基本的功能實現程式碼就這麼多了,可能分析的不夠細緻,裡面涉及最多的也許就是位置的計算,事件的綁定處理。如果有什麼問題,歡迎一起溝通、學習、溝通。
注意:PIE.htc檔案路徑要放正確,引用時寫成絕對路徑,否則在ie6, 7, 8下沒有css3的效果(如果那樣我程式碼裡所做的相容處理就沒啥意義了!最後附上原始碼,歡迎有興趣者下載試用。