使用$anchorScroll 的角度解决方案取自现在存档的blog post by Ben Lesh,在他贡献的this SO answer 上也有一些详细的复制(包括重写如何在路由中执行此操作):
app.controller('MainCtrl', function($scope, $location, $anchorScroll) {
var i = 1;
$scope.items = [{ id: 1, name: 'Item 1' }];
$scope.addItem = function (){
i++;
//add the item.
$scope.items.push({ id: i, name: 'Item ' + i});
//now scroll to it.
$location.hash('item' + i);
$anchorScroll();
};
});
这里是 plunker,来自提供此解决方案的博客:http://plnkr.co/edit/xi2r8wP6ZhQpmJrBj1jM?p=preview
需要注意的是,该 plunker 的模板包含此内容,它设置了您正在使用 $anchorScroll 滚动到的 id:
<li ng-repeat="item in items"
id="item{{item.id}}"
>{{item.name}</li>
如果您喜欢纯 JavaScript 解决方案,这里有一个:
在您的代码中使用父容器 ID 和目标滚动 ID 调用 runScroll:
function runScroll(parentDivId,targetID) {
var longdiv;
longdiv = document.querySelector("#" + parentDivId);
var div3pos = document.getElementById(targetID).offsetTop;
scrollTo(longdiv, div3pos, 600);
}
function scrollTo(element, to, duration) {
if (duration < 0) return;
var difference = to - element.scrollTop;
var perTick = difference / duration * 10;
setTimeout(function () {
element.scrollTop = element.scrollTop + perTick;
if (element.scrollTop == to) return;
scrollTo(element, to, duration - 10);
}, 10);
}
参考:Cross browser JavaScript (not jQuery...) scroll to top animation