zoukankan      html  css  js  c++  java
  • 关于获取控件的offset

    问题

    通过点击一控件,在控件的下面显示一个浮动层,通常的做法是:获取此控件的offset值,再计算出浮动层的top,left等css属性的值,赋值即可。

    那么下面就看一下如何获取控件的offset值。

    纯JS的实现

    首先想到的是这样的一段js。

    document.getElementById("divFloat").style.top=document.getElementById("Button").offsetLeft+25;

    发现需要添加值单位,那么就修改成下面这样子。

    document.getElementById("divFloat").style.top=(document.getElementById("Button").offsetLeft+25)+"px";

    IETester和FireFox再测试下,IE6+下都可以,如以前一样,写出的纯js的方法无情地被FireFox鄙视了,获取的值不正确。

    网上再查了下,发现应该这样写,通过循环,层层向上计算,最后得到准确的offset值。

    function getOffsetLeft(o)
    {
        
    var left=0;
        
    var offsetParent = o;
        
    while (offsetParent!=null && offsetParent!=document.body) 
        {
            left
    +=offsetParent.offsetLeft;
            offsetParent
    =offsetParent.offsetParent;
        }
        
    return left;
    }

    jQuery的实现

    再细一步去查相关问题时发现jQuery中已经包含了实现此功能的函数:offset(),很好地兼容了各浏览器。

    $("#Button").offset().left

     还有一个函数是:position(),两者详细的对比分析在这里:深入剖析Jquery中的offset()和position()

    下载源码后发现jQuery是这样实现的

    jQuery.fn.extend({
        position: 
    function() {
            
    if ( !this[0] ) {
                
    return null;
            }

            
    var elem = this[0],

            
    // Get *real* offsetParent
            offsetParent = this.offsetParent(),

            
    // Get correct offsets
            offset       = this.offset(),
            parentOffset 
    = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();

            
    // Subtract element margins
            // note: when an element has margin: auto the offsetLeft and marginLeft
            // are the same in Safari causing offset.left to incorrectly be 0
            offset.top  -= parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) || 0;
            offset.left 
    -= parseFloat( jQuery.curCSS(elem, "marginLeft"true) ) || 0;

            
    // Add offsetParent borders
            parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
            parentOffset.left 
    += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth"true) ) || 0;

            
    // Subtract the two offsets
            return {
                top:  offset.top  
    - parentOffset.top,
                left: offset.left 
    - parentOffset.left
            };
        },

        offsetParent: 
    function() {
            
    return this.map(function() {
                
    var offsetParent = this.offsetParent || document.body;
                
    while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position"=== "static") ) {
                    offsetParent 
    = offsetParent.offsetParent;
                }
                
    return offsetParent;
            });
        }
    });

    没有太理解,先贴在这里了!

  • 相关阅读:
    商用 三色灯 显示屏 原理概述
    高速LVDS时序到底怎么看
    quartus qsys sdram IP 使用
    Avalon 总线 时序 介绍
    以太网 mac层传输 verilog 测试程序
    quartus15.1 下程程序 电脑蓝屏 解决方法
    vivado 波形保存以及arp
    quartus timequest 使用过程中的笔记
    Modelsim 仿真指令force用法
    开发笔记(一)Kintex
  • 原文地址:https://www.cnblogs.com/parry/p/Get_Offset_By_JavaScript.html
Copyright © 2011-2022 走看看