【问题标题】:Get DOM element's in-flow position获取 DOM 元素流入位置
【发布时间】:2016-08-02 18:07:58
【问题描述】:

alert("Wrong (red): " + document.getElementById("target").getBoundingClientRect().top);
alert("Correct (blue): " + document.getElementById("wrapper").getBoundingClientRect().top);
#target {
  transform: translate(20px, -20px) rotateZ(20deg);
  background: red;
  width: 50px;
  height: 50px;
}
#wrapper {
  background: blue;
  display: inline-block;
}
Text
<div id="wrapper">
  <div id="target">
  </div>
</div>
further text

在上面的示例中,蓝色方块具有确切的位置,如果没有transform,红色方块会有。它也恰好具有红色方块占用的空间和位置,作为流入元素。我想在 JavaScript 中得到的位置是蓝色方块的位置。我唯一的问题是,在我的原始代码中,没有#wrapper,我无法创建一个。那么我如何获得可能在或可能不在该位置的元素的流入位置(由于transformposition: relative; 或其他 - 如果有的话)?

欢迎使用纯 JS 或 jQuery 解决方案。但我寻找一个相当简单/简短的解决方案,而不是一些 50 多行的怪物。

我的尝试:

  • jQuery('#target').offset():考虑transform(在上面的示例中返回一些负数)。
  • document.getElementById('target').getBoundingClientRect():与 jQuery 的 offset 相同
  • jQuery('#target').position() 遍历 offsetParent可能 目前可以工作,但根据@987654321,jQuery 在这方面的行为被认为是 错误 或至少会发生变化@site(如果我正确解释了该网站)。

【问题讨论】:

    标签: javascript jquery css position transform


    【解决方案1】:

    使用WebKitCSSMatrix

      var node = document.getElementById("target");
      var curTransform = new   WebKitCSSMatrix(window.getComputedStyle(node).webkitTransform);
      console.log(node.offsetLeft + curTransform.m41); //real offset left
      console.log(node.offsetTop + curTransform.m42); //real offset top
    

    浏览器兼容性:

    • 查看this answer 了解如何处理不支持WebKitCSSMatrix 的浏览器

    【讨论】:

    • 感谢您的宝贵时间。如果您想要复选标记,请再次仔细阅读问题,并将其作为实际的答案。是的,这是 一些 答案的提示的一部分,但 StackOverflow 的设计初衷不是猜谜游戏,而是问题的解决方案池。我的问题(获取元素的流入位置)应该很常见。顺便提一句。我认为(或希望)这不是实现目标的最佳方式,因为它很老套(不考虑所有可能性)。
    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多