Skip to content

Commit a956917

Browse files
committed
Decrease scroll overs when scroll up.
1 parent 7473755 commit a956917

File tree

1 file changed

+37
-26
lines changed

1 file changed

+37
-26
lines changed

index.js

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@
6262
var keeps = this.remain + (this.bench || this.remain)
6363

6464
this.delta = {
65+
direction: '', // current scroll direction, D: down, U: up.
66+
scrollTop: 0, // current scroll top, use to direction.
6567
start: start, // start index.
6668
end: start + keeps - 1, // end index.
6769
keeps: keeps, // nums keeping in real dom.
@@ -75,6 +77,7 @@
7577
}
7678
},
7779

80+
// use alter to identify which prop change.
7881
watch: {
7982
size: function () {
8083
this.alter = 'size'
@@ -106,6 +109,9 @@
106109
var vsl = this.$refs.vsl
107110
var offset = (vsl.$el || vsl).scrollTop || 0
108111

112+
delta.direction = offset > delta.scrollTop ? 'D' : 'U'
113+
delta.scrollTop = offset
114+
109115
if (delta.total > delta.keeps) {
110116
this.updateZone(offset)
111117
} else {
@@ -133,11 +139,16 @@
133139

134140
// update render zone by scroll offset.
135141
updateZone: function (offset) {
142+
var delta = this.delta
136143
var overs = this.variable
137144
? this.getVarOvers(offset)
138145
: Math.floor(offset / this.size)
139146

140-
var delta = this.delta
147+
// if scroll up, we'd better decrease it's numbers.
148+
if (delta.direction === 'U') {
149+
overs = overs - this.remain + 1
150+
}
151+
141152
var zone = this.getZone(overs)
142153
var bench = this.bench || this.remain
143154

@@ -160,6 +171,31 @@
160171
}
161172
},
162173

174+
// return the right zone info base on `start/index`.
175+
getZone: function (index) {
176+
var start, end
177+
var delta = this.delta
178+
179+
index = parseInt(index, 10)
180+
index = Math.max(0, index)
181+
182+
var lastStart = delta.total - delta.keeps
183+
var isLast = (index <= delta.total && index >= lastStart) || (index > delta.total)
184+
if (isLast) {
185+
end = delta.total - 1
186+
start = Math.max(0, lastStart)
187+
} else {
188+
start = index
189+
end = start + delta.keeps - 1
190+
}
191+
192+
return {
193+
end: end,
194+
start: start,
195+
isLast: isLast
196+
}
197+
},
198+
163199
// public method, force render ui list if we needed.
164200
// call this before the next repaint to get better performance.
165201
forceRender: function () {
@@ -292,31 +328,6 @@
292328
this.getVarOffset(index, true)
293329
},
294330

295-
// return the right zone info base on `start/index`.
296-
getZone: function (index) {
297-
var start, end
298-
var delta = this.delta
299-
300-
index = parseInt(index, 10)
301-
index = Math.max(0, index)
302-
303-
var lastStart = delta.total - delta.keeps
304-
var isLast = (index <= delta.total && index >= lastStart) || (index > delta.total)
305-
if (isLast) {
306-
end = delta.total - 1
307-
start = Math.max(0, lastStart)
308-
} else {
309-
start = index
310-
end = start + delta.keeps - 1
311-
}
312-
313-
return {
314-
end: end,
315-
start: start,
316-
isLast: isLast
317-
}
318-
},
319-
320331
// trigger a props event on parent.
321332
fireEvent: function (event) {
322333
if (this[event]) {

0 commit comments

Comments
 (0)