我编程使用Angular框架的单页应用程序。我是新来的。我读了
this guide,以帮助我理解jQuery和Angular之间的根本区别,我想尽可能多地遵循这个指导,不使用jQuery。
除了jQuery帮助解决一些浏览器不兼容性,并提供了一个有用的函数库,例如能够从窗口顶部知道元素的顶部位置,如$(‘element’)。offset()。最佳。没有普通的Javascript似乎能够接近没有重写这个函数,在这一点不是一个更好的主意,使用jQuery或jQuery的库?
具体来说,我想做的是设置一个指令,一旦元素的顶部被滚动到窗口中的某个位置,就将其固定到位。这是它的外观:
directives.scrollfix = function () { return { restrict: 'C',link: function (scope,element,$window) { var $page = angular.element(window) var $el = element[0] var elScrollTopOriginal = $($el).offset().top - 40 $page.bind('scroll',function () { var windowScrollTop = $page[0].pageYOffset var elScrollTop = $($el).offset().top if ( windowScrollTop > elScrollTop - 40) { elScrollTopOriginal = elScrollTop - 40 element.css('position','fixed').css('top','40px').css('margin-left','3px'); } else if ( windowScrollTop < elScrollTopOriginal) { element.css('position','relative').css('top','0').css('margin-left','0'); } }) } } }
如果有一个更好的方式来实现这一点在Angular,我仍然只是没有得到,我会感激的建议。
解决方法
如果$ el是实际的DOM对象,则使用
getBoundingClientRect
:
var top = $el.getBoundingClientRect().top;
Fiddle将显示这将获得相同的值,jquery的offset top会给你
编辑:如评论中所述,这不考虑滚动内容,下面是jQuery使用的代码
https://github.com/jquery/jquery/blob/master/src/offset.js(5/13/2015)
offset: function( options ) { //... var docElem,win,rect,doc,elem = this[ 0 ]; if ( !elem ) { return; } rect = elem.getBoundingClientRect(); // Make sure element is not hidden (display: none) or disconnected if ( rect.width || rect.height || elem.getClientRects().length ) { doc = elem.ownerDocument; win = getWindow( doc ); docElem = doc.documentElement; return { top: rect.top + win.pageYOffset - docElem.clientTop,left: rect.left + win.pageXOffset - docElem.clientLeft }; } }