阅读AngularJS docs我还没弄清楚$anchorScroll
是否可以使用持续时间/缓动选项来平滑滚动到元素。
它只说:
$location.hash('bottom');
// call $anchorScroll()
$anchorScroll();
我不使用jquery而不想;是否还有一种聪明而简单的方法来制作或扩展$anchorScroll
以使滚动更加流畅?
答案 0 :(得分:151)
不幸的是,使用$anchorScroll
无法做到这一点。如您所见,$anchorScroll
没有任何选项,也不适用于$ngAnimate
。要为滚动设置动画,您需要使用自己的服务/工厂或直接使用javascript。
为了自学,我用一个平滑的滚动服务组合了一个例子。可能有更好的方法来做到这一点,所以鼓励任何反馈。
要滚动到元素,请将ng-click="gotoElement(ID)"
附加到任何元素。我认为更好的方法是将其作为指令。
这是working example on jsFiddle。
<强>更新强>
现在有许多第三方指令可用于实现此目的。
答案 1 :(得分:20)
您还可以使用角度滚动,链接&#34; https://github.com/durated/angular-scroll/&#34;。它平滑滚动也很少的缓动功能,以获得专业的外观。
答案 2 :(得分:10)
布雷特的答案对我很有帮助。我在模块化和可测试性方面对他的解决方案做了一些小改动。
这是另一个working example on JsFiddle,其中包括包含测试的其他版本。
为了测试,我正在使用Karma和Jasmine。签名略有修改如下:
anchorSmoothScroll.scrollTo(elementId, speed);
其中element是要滚动到的必需属性,而speed是可选的,默认值为20(就像之前一样)。
答案 3 :(得分:2)
您还可以使用ngSmoothScroll,链接:https://github.com/d-oliveros/ngSmoothScroll。
只需将smoothScroll
模块包含为依赖项并使用它:
<a href="#" scroll-to="my-element-3">Click me!</a>
答案 4 :(得分:2)
这里的所有解决方案都没有实际执行OP最初提出的要求,即make $anchorScroll
顺利滚动。
平滑滚动指令与$anchroScroll
之间的区别在于它使用/修改$location.hash()
,这在某些情况下可能是理想的。
这是简单模块的要点,用平滑滚动替换$ anchorScroll滚动。它使用https://github.com/oblador/angular-scroll库进行滚动(如果需要,可以用其他东西替换它,这应该很容易)。
https://gist.github.com/mdvorak/fc8b531d3e082f3fdaa9
注意:它实际上没有让$ anchorScroll顺利滚动,但是它会替换它的滚动处理程序。
只需在应用程序中引用mdvorakSmoothScroll
模块即可启用它。
答案 5 :(得分:0)
(function() {
'use strict';
var moduleId = 'common';
var serviceId = 'anchorSmoothScroll';
angular
.module(moduleId)
.service(serviceId, anchorSmoothScroll);
anchorSmoothScroll.$inject = ['$document', '$window'];
function anchorSmoothScroll($document, $window) {
var document = $document[0];
var window = $window;
var service = {
scrollDown: scrollDown,
scrollUp: scrollUp,
scrollTo: scrollTo,
scrollToTop: scrollToTop
};
return service;
function getCurrentPagePosition(currentWindow, doc) {
// Firefox, Chrome, Opera, Safari
if (currentWindow.pageYOffset) return currentWindow.pageYOffset;
// Internet Explorer 6 - standards mode
if (doc.documentElement && doc.documentElement.scrollTop)
return doc.documentElement.scrollTop;
// Internet Explorer 6, 7 and 8
if (doc.body.scrollTop) return doc.body.scrollTop;
return 0;
}
function getElementY(doc, element) {
var y = element.offsetTop;
var node = element;
while (node.offsetParent && node.offsetParent !== doc.body) {
node = node.offsetParent;
y += node.offsetTop;
}
return y;
}
function scrollDown(startY, stopY, speed, distance) {
var timer = 0;
var step = Math.round(distance / 25);
var leapY = startY + step;
for (var i = startY; i < stopY; i += step) {
setTimeout('window.scrollTo(0, ' + leapY + ')', timer * speed);
leapY += step;
if (leapY > stopY) leapY = stopY;
timer++;
}
};
function scrollUp(startY, stopY, speed, distance) {
var timer = 0;
var step = Math.round(distance / 25);
var leapY = startY - step;
for (var i = startY; i > stopY; i -= step) {
setTimeout('window.scrollTo(0, ' + leapY + ')', timer * speed);
leapY -= step;
if (leapY < stopY) leapY = stopY;
timer++;
}
};
function scrollToTop(stopY) {
scrollTo(0, stopY);
};
function scrollTo(elementId, speed) {
var element = document.getElementById(elementId);
if (element) {
var startY = getCurrentPagePosition(window, document);
var stopY = getElementY(document, element);
var distance = stopY > startY ? stopY - startY : startY - stopY;
if (distance < 100) {
this.scrollToTop(stopY);
} else {
var defaultSpeed = Math.round(distance / 100);
speed = speed || (defaultSpeed > 20 ? 20 : defaultSpeed);
if (stopY > startY) {
this.scrollDown(startY, stopY, speed, distance);
} else {
this.scrollUp(startY, stopY, speed, distance);
}
}
}
};
};
})();
答案 6 :(得分:0)
我不知道如何为$anchorScroll
制作动画。以下是我在项目中的表现:
/* Scroll to top on each ui-router state change */
$rootScope.$on('$stateChangeStart', function() {
scrollToTop();
});
JS功能:
function scrollToTop() {
if (typeof jQuery == 'undefined') {
return window.scrollTo(0,0);
} else {
var body = $('html, body');
body.animate({scrollTop:0}, '600', 'swing');
}
log("scrollToTop");
return true;
}
答案 7 :(得分:0)
我们可以使用 JQuery 和 Javascript 和 Directive 在锚点标签点击时滚动到特定的 div。
请检查以下链接上的工作示例 -