如何获取 angular 2 中的第一个父 scrollTop 元素?
How to get the first parent scrollTop element in angular 2?
在任何 HTML 元素上使用此方法:
this.viewContainerRef.element.nativeElement.offsetTop
this.viewContainerRef.element.nativeElement.offsetLeft
我已经引用了容器:
constructor(private viewContainerRef)
仅当您不向下滚动(父级或浏览器滚动器的 innerScroll,所有文档)时才会很好地工作。例如,考虑具有内部滚动条的 table。如果我将工具提示添加到任何行,它将起作用,但是当我滚动 table 时,计算是错误的,我需要以某种方式获取滚动条的 offsetTop 并将其减去:
this.viewContainerRef.element.nativeElement.offsetTop - (the scrollTop of first parent)
angular2怎么办?
我发现了一些可能有帮助的东西,但是当把它改成 typescript 时,它在这一行失败了:
while (_el = _el.offsetParent) {
findElePosition(_el){
var _el = this.viewContainerRef.element.nativeElement;
var isIE = navigator.appName.indexOf('Microsoft Internet Explorer') != -1;
var curleft = 0;
var curtop = 0;
var curtopscroll = 0;
var curleftscroll = 0;
if (_el.offsetParent){
curleft = _el.offsetLeft;
curtop = _el.offsetTop;
/* get element scroll position */
var elScroll = _el;
while (elScroll = elScroll.parentNode) {
curtopscroll = elScroll.scrollTop ? elScroll.scrollTop : 0;
curleftscroll = elScroll.scrollLeft ? elScroll.scrollLeft : 0;
curleft -= curleftscroll;
curtop -= curtopscroll;
}
/* get element offset postion */
while (_el = _el.offsetParent) {
curleft += _el.offsetLeft;
curtop += _el.offsetTop;
}
}
/* get window scroll position */
var offsetX = isIE ? document.body.scrollLeft : window.pageXOffset;
var offsetY = isIE ? document.body.scrollTop : window.pageYOffset;
return [curtop + offsetY,curleft + offsetX];
}
另外,我怎么知道元素父滚动不是文档,我的意思是有一个innerDiv滚动。当scroll为document时,根本不需要这个计算。
如果您知道 table 的 class,您可以创建一个循环来查找您的 table,然后获取您的 offsetTop。我的意思是 class 应该在创建滚动的溢出元素上。找到偏移量后,您可以随意使用它。
onMouseOver (event) {
if (!event.target) {
return;
}
// you can search for your table also with id
if (!$(event.target).hasClass("my-table")) {
this.onMouseOver({target: event.target.parentNode});
return;
}
console.log(event.target.scrollTop);
}
如果你不使用 jquery 那么你也可以使用这个。
onMouseOver (event) {
if (!event.target) {
return;
}
if (!~event.target.className.indexOf("my-table")) {
this.onMouseOver({target: event.target.parentNode});
return;
}
console.log(event.target.scrollTop);
}
这不是文档,因为我们会检查 class 或 id 名称,因此您不需要知道它是否是文档。
编辑:
您需要像这样添加鼠标悬停和 class;
<table #my-overflowed-element class="my-table" >
<tr #my-row-with-tooltip on-mouseover='onMouseOver($event)'>
</tr>
</table>
如果它在另一个元素中,class 应该在那里
<div #my-overflowed-element class="my-table">
<table>
<tr #my-row-with-tooltip on-mouseover='onMouseOver($event)'>
</tr>
</table>
</div>
在任何 HTML 元素上使用此方法:
this.viewContainerRef.element.nativeElement.offsetTop
this.viewContainerRef.element.nativeElement.offsetLeft
我已经引用了容器:
constructor(private viewContainerRef)
仅当您不向下滚动(父级或浏览器滚动器的 innerScroll,所有文档)时才会很好地工作。例如,考虑具有内部滚动条的 table。如果我将工具提示添加到任何行,它将起作用,但是当我滚动 table 时,计算是错误的,我需要以某种方式获取滚动条的 offsetTop 并将其减去:
this.viewContainerRef.element.nativeElement.offsetTop - (the scrollTop of first parent)
angular2怎么办?
我发现了一些可能有帮助的东西,但是当把它改成 typescript 时,它在这一行失败了:
while (_el = _el.offsetParent) {
findElePosition(_el){
var _el = this.viewContainerRef.element.nativeElement;
var isIE = navigator.appName.indexOf('Microsoft Internet Explorer') != -1;
var curleft = 0;
var curtop = 0;
var curtopscroll = 0;
var curleftscroll = 0;
if (_el.offsetParent){
curleft = _el.offsetLeft;
curtop = _el.offsetTop;
/* get element scroll position */
var elScroll = _el;
while (elScroll = elScroll.parentNode) {
curtopscroll = elScroll.scrollTop ? elScroll.scrollTop : 0;
curleftscroll = elScroll.scrollLeft ? elScroll.scrollLeft : 0;
curleft -= curleftscroll;
curtop -= curtopscroll;
}
/* get element offset postion */
while (_el = _el.offsetParent) {
curleft += _el.offsetLeft;
curtop += _el.offsetTop;
}
}
/* get window scroll position */
var offsetX = isIE ? document.body.scrollLeft : window.pageXOffset;
var offsetY = isIE ? document.body.scrollTop : window.pageYOffset;
return [curtop + offsetY,curleft + offsetX];
}
另外,我怎么知道元素父滚动不是文档,我的意思是有一个innerDiv滚动。当scroll为document时,根本不需要这个计算。
如果您知道 table 的 class,您可以创建一个循环来查找您的 table,然后获取您的 offsetTop。我的意思是 class 应该在创建滚动的溢出元素上。找到偏移量后,您可以随意使用它。
onMouseOver (event) {
if (!event.target) {
return;
}
// you can search for your table also with id
if (!$(event.target).hasClass("my-table")) {
this.onMouseOver({target: event.target.parentNode});
return;
}
console.log(event.target.scrollTop);
}
如果你不使用 jquery 那么你也可以使用这个。
onMouseOver (event) {
if (!event.target) {
return;
}
if (!~event.target.className.indexOf("my-table")) {
this.onMouseOver({target: event.target.parentNode});
return;
}
console.log(event.target.scrollTop);
}
这不是文档,因为我们会检查 class 或 id 名称,因此您不需要知道它是否是文档。
编辑: 您需要像这样添加鼠标悬停和 class;
<table #my-overflowed-element class="my-table" >
<tr #my-row-with-tooltip on-mouseover='onMouseOver($event)'>
</tr>
</table>
如果它在另一个元素中,class 应该在那里
<div #my-overflowed-element class="my-table">
<table>
<tr #my-row-with-tooltip on-mouseover='onMouseOver($event)'>
</tr>
</table>
</div>