如何在不使用jQuery的情况下获取元素的offset()。top值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不使用jQuery的情况下获取元素的offset()。top值?相关的知识,希望对你有一定的参考价值。
我正在使用Angular框架编写单页应用程序。我是新手。我读过this guide来帮助我理解jQuery和Angular之间的根本区别,我想尽可能地遵循这个指导而不是使用jQuery。
除了jQuery有助于解决一些浏览器不兼容问题并提供一个有用的函数库,比如能够从窗口顶部知道元素的顶部位置,就像在$('element').offset().top
中一样。没有简单的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中有更好的方法来实现这一点,我仍然没有得到,我会很感激这个建议。
如果getBoundingClientRect
是实际的DOM对象,请使用$el
:
var top = $el.getBoundingClientRect().top;
小提琴将显示这将获得与jquery的偏移顶部将给你的相同的值
编辑:如评论中所述,这不包括滚动内容,下面是jQuery使用的代码
https://github.com/jquery/jquery/blob/master/src/offset.js(13/05/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
};
}
}
这是一个没有jQuery的功能:
function getElementOffset(element)
{
var de = document.documentElement;
var box = element.getBoundingClientRect();
var top = box.top + window.pageYOffset - de.clientTop;
var left = box.left + window.pageXOffset - de.clientLeft;
return { top: top, left: left };
}
似乎你可以在角元素上使用prop方法:
var top = $el.prop('offsetTop');
适合我。有谁知道这有什么缺点?
Patrick Evans接受的解决方案不考虑滚动。我稍微改变了他的jsfiddle以证明这一点:
css:添加一些随机高度以确保我们有一些空间可以滚动
body{height:3000px;}
js:设置一些滚动位置
jQuery(window).scrollTop(100);
因此,两个报告的值现在不同:http://jsfiddle.net/sNLMe/66/
更新2015年2月14日
有一个jqLite等待的拉取请求,包括它自己的偏移方法(处理当前滚动位置)。如果您想自己实现它,请查看源代码:https://github.com/angular/angular.js/pull/3799/files
您可以尝试元素[0] .scrollTop,在我看来这个解决方案更快。
在这里你有更大的例子 - http://cvmlrobotics.blogspot.de/2013/03/angularjs-get-element-offset-position.html
对于Angular 2+来获取当前元素的偏移量(this.el.nativeElement与jquery中的$(this)等价):
export class MyComponent implements OnInit {
constructor(private el: ElementRef) {}
ngOnInit() {
//This is the important line you can use in your function in the code
//--------------------------------------------------------------------------
let offset = this.el.nativeElement.getBoundingClientRect().top;
//--------------------------------------------------------------------------
console.log(offset);
}
}
以上是关于如何在不使用jQuery的情况下获取元素的offset()。top值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用机器人框架和 python 在不滚动的情况下获取所有匹配的元素?
Angular:如何在不删除子元素的情况下删除包装器(父元素)?
如何在不使用 JavaScript 或 jQuery 的情况下将 div 的文本绑定到隐藏字段?
在不使用 jQuery 的情况下选择具有“data-xxx”属性的所有元素