阅读AngularJS文档,我还没有弄清楚是否$anchorScroll
可以使用持续时间/缓动选项来平滑滚动到元素。
它只说:
$location.hash('bottom');
// call $anchorScroll()
$anchorScroll();
我不使用jQuery,也不想这样做。还有一种聪明而简单的方法$anchorScroll
可以使滚动更平滑吗?
阅读AngularJS文档,我还没有弄清楚是否$anchorScroll
可以使用持续时间/缓动选项来平滑滚动到元素。
它只说:
$location.hash('bottom');
// call $anchorScroll()
$anchorScroll();
我不使用jQuery,也不想这样做。还有一种聪明而简单的方法$anchorScroll
可以使滚动更平滑吗?
Answers:
遗憾的是,无法使用$anchorScroll
。如您所见,$anchorScroll
它没有任何选择,因此无法使用$ngAnimate
。为了使滚动动画,您需要使用自己的服务/工厂或直接使用JavaScript。
为了进行自学,我将示例与平滑的滚动服务结合在一起。可能有更好的方法来执行此操作,因此鼓励您提供任何反馈。
要滚动到某个元素,请将a附加ng-click="gotoElement(ID)"
到任何元素。我认为更好的方法是将该指令作为指令。
更新资料
现在有许多第三方指令可以完成此任务。
<a anchor-smooth-scroll>About 1</a> <a anchor-smooth-scroll>About 2</a>
<div id="my-div">my div</div>
),然后创建如下链接:<a anchor-smooth-scroll="my-div">visit my div</a>
。
您也可以使用angular-scroll,链接“ https://github.com/durated/angular-scroll/ ”。它具有平滑的滚动效果,还具有一些缓和功能,可以使您拥有专业的外观。
布雷特的答案对我很有用。在模块化和可测试性方面,我对他的解决方案做了一些小改动。
这是JsFiddle上的另一个工作示例,其中包括包含测试的其他版本。
为了进行测试,我使用了Karma和Jasmine。签名已作如下轻微修改:
anchorSmoothScroll.scrollTo(elementId, speed);
其中element是滚动到的必填属性,而speed是可选的,其中默认值为20(以前是)。
您也可以使用ngSmoothScroll,链接:https : //github.com/d-oliveros/ngSmoothScroll。
只需将smoothScroll
模块包含为依赖项,然后像这样使用它:
<a href="#" scroll-to="my-element-3">Click me!</a>
实际上,这里的解决方案都没有真正执行OP最初要求的,即使$anchorScroll
滚动平滑。平滑滚动指令之间的区别在于$anchroScroll
它使用/修改$location.hash()
,这在某些情况下可能是理想的。
这是简单模块的要点,该模块将$ anchorScroll滚动替换为平滑滚动。它使用https://github.com/oblador/angular-scroll库进行滚动本身(如果需要,可以用其他东西替换它,这应该很容易)。
https://gist.github.com/mdvorak/fc8b531d3e082f3fdaa9
注意:实际上,它不会使$ anchorScroll平滑滚动,但会替换其处理程序进行滚动。
只需通过引用mdvorakSmoothScroll
应用程序中的模块即可启用它。
艾伦,谢谢。如果有人感兴趣,我会根据John Pappa标准对其进行格式化。
(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);
}
}
}
};
};
})();
我不知道如何制作动画$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;
}