Skip to content

Commit f35df54

Browse files
committed
clip items fix
1 parent 36ce4f7 commit f35df54

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/ui-scroll.coffee

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ angular.module('ui.scroll', [])
7272
Buffer = (itemName, $scope, linker, bufferSize)->
7373

7474
buffer = Object.create Array.prototype
75-
75+
7676
origin = 1 # starting index for initial load
7777

7878
reset = ->
@@ -175,6 +175,7 @@ angular.module('ui.scroll', [])
175175

176176
topPadding = null
177177
bottomPadding = null
178+
averageItemHeight = 0
178179

179180
bufferPadding = -> viewport.outerHeight() * Math.max(0.1, +attrs.padding || 0.1) # some extra space to initiate preload
180181

@@ -203,46 +204,51 @@ angular.module('ui.scroll', [])
203204
viewport.clipBottom = ->
204205
# clip the invisible items off the bottom
205206
overage = 0
206-
overageBottom = viewport.bottomVisiblePos() + viewport.averageItemHeight * (buffer.size)
207207
for i in [buffer.length-1..0]
208208
item = buffer[i]
209-
if item.element.offset().top > overageBottom
209+
if item.element.offset().top - viewport.offset().top > viewport.outerHeight() + bufferPadding()
210210
overage++
211211
else break
212212
if overage > 0
213213
buffer.eof = false
214214
buffer.remove(buffer.length - overage, buffer.length)
215215
buffer.next -= overage
216+
viewport.adjustPadding()
216217

217218
viewport.shouldLoadTop = ->
218219
!buffer.bof && (viewport.topDataPos() > viewport.topVisiblePos() - bufferPadding())
219220

220221
viewport.clipTop = ->
221222
# clip the invisible items off the top
222223
overage = 0
223-
heightIncrement = 0
224-
overageTop = viewport.topVisiblePos() - viewport.averageItemHeight * buffer.size
224+
overageHeight = 0
225225
for item in buffer
226-
if item.element.offset().top < overageTop
227-
heightIncrement += item.element.outerHeight()
226+
if item.element.offset().top - viewport.offset().top + item.element.outerHeight(true) < (-1) * bufferPadding()
227+
overageHeight += item.element.outerHeight(true)
228228
overage++
229229
else break
230230
if overage > 0
231+
# we need to adjust top padding element before items are removed from top
232+
# to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom
233+
viewport.adjustTopPaddingIntro overageHeight
231234
buffer.bof = false
232235
buffer.remove(0, overage)
233236
buffer.first += overage
234237

235-
viewport.adjustPadding = ->
238+
viewport.adjustTopPaddingIntro = (height) ->
239+
topPadding.height topPadding.height() + height
240+
241+
viewport.adjustPadding = () ->
236242
return if not buffer.length
237-
viewport.averageItemHeight = (buffer[buffer.length-1].element.offset().top +
238-
buffer[buffer.length-1].element.outerHeight(true) -
243+
averageItemHeight = (buffer[buffer.length - 1].element.offset().top +
244+
buffer[buffer.length - 1].element.outerHeight(true) -
239245
buffer[0].element.offset().top) / buffer.length
240-
topPadding.height (buffer.first - buffer.minIndex) * viewport.averageItemHeight
241-
bottomPadding.height (buffer.maxIndex - buffer.next + 1) * viewport.averageItemHeight
246+
topPadding.height (buffer.first - buffer.minIndex) * averageItemHeight
247+
bottomPadding.height (buffer.maxIndex - buffer.next + 1) * averageItemHeight
242248

243249
viewport.syncDatasource = (datasource) ->
244250
return if not buffer.length
245-
delta = buffer.syncDatasource(datasource) * viewport.averageItemHeight
251+
delta = buffer.syncDatasource(datasource) * averageItemHeight
246252
topPadding.height topPadding.height() + delta
247253
viewport.scrollTop viewport.scrollTop() + delta
248254
viewport.adjustPadding()

0 commit comments

Comments
 (0)