【问题标题】:What is the equivalent of getBoundingClientRect on iPhone Mobile Safari 3?iPhone Mobile Safari 3 上的 getBoundingClientRect 等价物是什么?
【发布时间】:2011-02-17 01:02:31
【问题描述】:

iPhone Mobile Safari 似乎缺少 element.getBoundingClientRect。 iPhone Mobile Safari 上的等效方法是什么?这个方法在 iPad 上有。

【问题讨论】:

    标签: javascript mobile-safari ios-3.x


    【解决方案1】:

    编辑 1:此代码 (webkitConvertPointFromNodeToPage) 仅适用于非常旧和过时的手机...请参阅 these comments

    编辑 2:我不建议您使用此代码...我记得更改它以处理带有触摸缩放的 IE10 的一些问题。我会尽量记住用修复更新代码。

    以前:我认为以下适用于 IE6+、FF3+、Safari 2+(桌面和移动)、Chrome(桌面和安卓)、Opera:

    function offset(el) {
        var convertPoint = window.webkitConvertPointFromNodeToPage;
        if ('getBoundingClientRect' in el) {
            var
                boundingRect = el.getBoundingClientRect(),
                body = document.body || document.getElementsByTagName("body")[0],
                clientTop = document.documentElement.clientTop || body.clientTop || 0,
                clientLeft = document.documentElement.clientLeft || body.clientLeft || 0,
                scrollTop = (window.pageYOffset || document.documentElement.scrollTop || body.scrollTop),
                scrollLeft = (window.pageXOffset || document.documentElement.scrollLeft || body.scrollLeft);
            return {
                top: boundingRect.top + scrollTop - clientTop,
                left: boundingRect.left + scrollLeft - clientLeft
            }
        } else if (convertPoint) {
            var
                zeroPoint = new WebKitPoint(0, 0),
                point = convertPoint(el, zeroPoint),
                scale = convertPoint(document.getElementById('scalingEl'), zeroPoint);
            return {
                top: Math.round(point.y * -200/scale.y),
                left: Math.round(point.x * -200/scale.x)
            }
        }
    }
    

    以下是 body 的子节点:

    <div id="scalingEl" style="position:absolute;top:-200px;left:-200px;visibility:hidden;"></div>
    

    方法确实需要一些错误检查(例如元素必须在文档中)。 Scale 可以在页面缩放时工作,但可能不是必需的(我在 Windows Safari 中测试 webkitConvertPointFromNodeToPage 时确实需要它)。

    【讨论】:

      【解决方案2】:

      对于在 iOS 3 上寻找 ele.getBoundingClientRect().width 方法的任何人,您可以使用 ele.offsetWidth

       if("getBoundingClientRect" in this.container) {
          this.width = this.container.getBoundingClientRect().width ;    
      }else {
          this.width = this.container.offsetWidth;    //http://help.dottoro.com/ljvmcrrn.php
      }
      

      【讨论】:

      • 更简单的检查可以是'if(div.getBoundingClientRect){}else{}'
      猜你喜欢
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多