【问题标题】:Getting the nearest positioned ancestor of an Element获取元素的最近定位祖先
【发布时间】:2018-08-02 02:25:57
【问题描述】:

根据https://www.w3schools.com/css/css_positioning.asp,

带有position: absolute; 的元素相对于最近的定位祖先定位(而不是相对于视口定位,如固定)。

如何在原生 Javascript 或 JQuery 中获取元素的最近定位祖先?


offsetParent() 呢? https://api.jquery.com/offsetParent/

说明: 获取定位的最近的祖先元素。

【问题讨论】:

  • 你是说你想在 DOM 树中找到最近的父元素,它的 position 不是 static 吗?另外,请不要使用 W3Schools 作为参考。他们的文章经常过时,有时甚至完全是错误的。 MDN 更加全面和准确。
  • 我是说我想获得一个'元素位置:绝对'是相对定位的元素。
  • 在那种情况下@TemaniAfif 刚刚回答了解决方案:)

标签: javascript jquery css


【解决方案1】:

编辑:我假设您正在寻找两个元素之间的距离。 @TemaniAfif 有正确的答案


您可以使用parentNode 导航祖先树并将每个元素的offsetTop 与手头元素的offsetTop 进行比较。如果您只对 Y 距离感兴趣。

另一方面,如果您在考虑 X 和 Y 时需要完整距离,则可以使用此处描述的方法

Measure distance between two HTML elements' centers

【讨论】:

  • 这是关于以像素为单位测量字面距离,而 OP 似乎只想简单地获得对控制绝对元素定位的父级的引用 - How can I get the nearest positioned ancestor of an Element
【解决方案2】:

您可以测试位置是否是父级的静态,如果不是,则继续直到到达位置与静态不同的第一个祖先。

这是一个您可以调整的简化代码:

$('.box').each(function() {
  var p = $(this).parent();
  while (p && p.css('position') === 'static') {
    p = p.parent();
  }
  console.log(p.attr('class'));
})
.box {
  position: absolute;
}

.f2 {
  position: relative;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="f1">
  <div class="f2">
    <div class="f3">
      <div class="box"> <!-- This one relative to f2 -->
        <div class="box"> <!-- This one relative to box -->
        </div>
      </div>
    </div>
  </div>
</div>
<div class="f1">
  <div class="f2">
    <div class="f3" style="position:absolute;">
      <div class="box"> <!-- This one relative to f3 -->
      </div>
    </div>
  </div>
</div>

【讨论】:

  • 我建议再添加一个条件,以防循环到达“文档”(“html”元素上方)和位置检查错误,所以基本上是while (p &amp;&amp; p.parent()[0].nodeType === 1 &amp;&amp; p.css('position') === 'static') 或while (p &amp;&amp; p.parent().prop('nodeType') === 1 &amp;&amp; p.css('position') === 'static')跨度>
猜你喜欢
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多