Вот пример того, как вычислить scrollTop
после добавления объектов в массив.
Логика:
- Сохранить
scrollTop
и scrollHeight
перед добавлением.
- Добавить предметы.
- Установите
scrollTop
, вычитая дельту высоты (добавив новые предметы) и прокрутите до этой высоты + старый scrollTop
.
Имейте в виду, что между добавочными предметами и новым scrollTop
есть «прыжок». Я не думаю, что вы можете справиться с этим, если вы не сделаете fadeOut/fadeIn или scrollTo с переходом на этот «прыжок».
Сообщите мне, если что-то непонятное.
angular.module('app', []).
controller('ctrl', function($scope, $timeout) {
$scope.index = 0;
$scope.convert = function(arr) {
for(var i = 0; i < arr.length; i++) {
arr[i] = $scope.index++;
}
return arr;
};
$scope.items = $scope.convert(new Array(50));
$scope.add = function() {
var $container = $('.container');
var container = $container[0];
var scrollTop = $container.scrollTop();
var oldHeight = container.scrollHeight;
Array.prototype.unshift.apply($scope.items, $scope.convert(new Array(50)));
$timeout(function(){
var diff = container.scrollHeight - oldHeight;
$container.scrollTop(diff + scrollTop);
});
}
});
.container {
height: 100px;
overflow-y:scroll;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
<div class="container">
<div ng-repeat="item in items track by $index" class="scroll">
Item {{item}}
</div>
</div>
<button ng-click="add()">Add items</button>
</div>
Вы должны сделать это вручную. Я имею в виду, сохраните позицию перед прокруткой и высоту, а после изменения DOM вычислите, какая позиция прокрутки должна быть. Добавьте фрагмент, чтобы нам было легче помочь. –
Могу ли я вычислить позицию снизу в текущую позицию прокрутки и после запроса ajax отправить тахат в ту же позицию? или ti отключить каким-то образом, что beheviour? – Vladimir
'снизу' = scrollTop - высота. –