使用 C# 获取 HTML 元素在 Web 浏览器控件中的绝对位置

本文关键字:控件 位置 浏览器 Web 获取 HTML 元素 使用 | 更新日期: 2023-09-27 17:55:47

我想知道是否可以获得我在 C# 的 Web 浏览器控件中加载的特定 HTML 元素的绝对位置。

我尝试了.Net提供的几乎所有选项。他们都没有给我正确的位置。他们都给我 0 作为 Y 坐标。.该元素绝对不在 0 中。

有人有任何解决方案或想法来解决这个问题吗?

使用 C# 获取 HTML 元素在 Web 浏览器控件中的绝对位置

这是我到目前为止得到的解决方案:

将网络浏览器的大小设置为与图像相同的大小 整数宽度、高度; width = webBrowser1.Document.Images[0]。客户端矩形.宽度; height = webBrowser1.Document.Images[0]。客户端矩形.高度;

webBrowser1.Width = width;
webBrowser1.Height = height;
//scroll vertically to that element
webBrowser1.Document.Images[0].OffsetParent.ScrollIntoView(true);
//calculate x, y offset of the element
int x = webBrowser1.Document.Images[s].OffsetRectangle.Left + 
webBrowser1.Document.Images[s].OffsetParent.OffsetRectangle.Left + 
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetRectangle.Left+
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetParent.OffsetRectangle.Left+
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetParent.OffsetParent.OffsetRectangle.Left;
int y = webBrowser1.Document.GetElementsByTagName("HTML")[0].ScrollTop;
//now scroll to that element
webBrowser1.Document.Window.ScrollTo(x, y);

现在这段代码运行良好.. 但是计算偏移量存在问题。我需要计算元素的偏移量父级,然后计算偏移量父级的偏移量父级等。我需要动态地执行此操作,而不是一一添加。.我不知道该怎么做。有什么想法吗?

编辑:这是我的最后一个也是最终版本,它适用于任何 HTML 元素,它将找到我想要的任何元素的绝对位置。

   public int getXoffset(HtmlElement el)
     {
         //get element pos
         int xPos = el.OffsetRectangle.Left;
         //get the parents pos
         HtmlElement tempEl = el.OffsetParent;
         while (tempEl != null)
         {
             xPos += tempEl.OffsetRectangle.Left;
             tempEl = tempEl.OffsetParent;
         }
         return xPos; 
     }  
     public int getYoffset(HtmlElement el)
     {
         //get element pos
         int yPos = el.OffsetRectangle.Top;
         //get the parents pos
         HtmlElement tempEl = el.OffsetParent;
         while (tempEl != null)
         {
             yPos += tempEl.OffsetRectangle.Top;
             tempEl = tempEl.OffsetParent;
         }
         return yPos;
     }

然后将该位置与以下位置一起使用:

 //now scroll to that element
 webBrowser1.Document.Window.ScrollTo(x, y);

做!

我喜欢

以前的答案,但两次遍历父对象不是很有效。请记住 - 您在这里使用 COM/ActiveX。这工作得更快:

public Point GetOffset(HtmlElement el)
{
    //get element pos
    Point pos = new Point(el.OffsetRectangle.Left, el.OffsetRectangle.Top);
    //get the parents pos
    HtmlElement tempEl = el.OffsetParent;
    while (tempEl != null)
    {
        pos.X += tempEl.OffsetRectangle.Left;
        pos.Y += tempEl.OffsetRectangle.Top;
        tempEl = tempEl.OffsetParent;
    }
    return pos;
}

然后

var point = GetOffset(element);
var x = point.X;
var y = point.Y;

谢谢,它就像一个魅力。我不得不将其重写为 VB,只想分享解决方案:

Function GetXOffSet(ByVal elem As HtmlElement) As Integer
    Dim xPos As Integer = elem.OffsetRectangle.Left
    Dim tElm As HtmlElement = elem.OffsetParent
    Dim trig As Boolean = False
    While Not trig
        Try
            xPos += tElm.OffsetRectangle.Left
            tElm = tElm.OffsetParent
        Catch ex As Exception
            trig = True
        End Try
    End While
    Return xPos
End Function
Function GetYOffSet(ByVal elem As HtmlElement) As Integer
    Dim yPos As Integer = elem.OffsetRectangle.Top
    Dim tElm As HtmlElement = elem.OffsetParent
    Dim trig As Boolean = False
    While Not trig
        Try
            yPos += tElm.OffsetRectangle.Top
            tElm = tElm.OffsetParent
        Catch ex As Exception
            trig = True
        End Try
    End While
    Return yPos
End Function

有一种直接的方法来获取坐标。IHTMLElement2 具有提供元素坐标的方法getBoundingClientRect

IHTMLDocument3 doc = (IHTMLDocument3)this.webbrowser.Document;
IHTMLElement2 element = (IHTMLElement2)doc.getElementById(idElement);
IHTMLRect rect = element.getBoundingClientRect();
int x = rect.left;
int y= rect.top;

只是根据我的需要共享一个略有不同的实现来获得绝对定位矩形:

public Rectangle GetAbsoluteRectangle(HtmlElement element) {
    //get initial rectangle
    Rectangle rect = element.OffsetRectangle;
    //update with all parents' positions
    HtmlElement currParent = element.OffsetParent;
    while (currParent != null) {
            rect.Offset(currParent.OffsetRectangle.Left, currParent.OffsetRectangle.Top);
            currParent = currParent.OffsetParent;
    }
    return rect;
}

不知道为什么,但偏移量父没有全部返回(IE11 的情况,映射对象)当未提供 parentOffset 时,我必须在循环中添加 parentElement

    While parent IsNot Nothing
            y += parent.offsetTop
            x += parent.offsetLeft
            If  parent.offsetParent IsNot Nothing Then
                parent = parent.offsetParent  
            Else
                parent = parent.parentElement
            End If
    End While

并且您需要添加IE浏览器位置,菜单空间和边框...

对我来说最干净的方法是:

HtmlElement elem = webBrowser.Document.GetElementById(idElement); IHTMLRect rect = ((IHTMLElement2) elem.DomElement).getBoundingClientRect(); // rect.top and rect.left represent absolute coordinates.