zoukankan      html  css  js  c++  java
  • jQuery position() 源码解读

    position的代码比较简单。。。

        position: function() {
            if ( !this[ 0 ] ) {
                return;
            }
    
            var offsetParent, offset,
                elem = this[ 0 ],
                parentOffset = { top: 0, left: 0 };
    
            // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
            if ( jQuery.css( elem, "position" ) === "fixed" ) {
                // Assume getBoundingClientRect is there when computed position is fixed
                offset = elem.getBoundingClientRect();
    
            } else {
                // Get *real* offsetParent
                offsetParent = this.offsetParent();
    
                // Get correct offsets
                offset = this.offset();
                if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
                    parentOffset = offsetParent.offset();
                }
    
                // Add offsetParent borders
                parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
                parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
            }
    
            // Subtract parent offsets and element margins
            return {
                top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
                left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
            };
        }

    如果当前元素是固定定位,可以直接使用getBoundingClientRect()方法获取其相对于视口的位置。

    如果不是固定定位,这时候我们首先需要获取自身的offset,然后找到最近的有定位的父元素,来获取这个父元素的offset

    因为position求的是元素相对于最近的有定位的父元素的位置

    所以,你需要根据当前元素的offset-父元素的offset-负元素的边框-当前元素的外边距来获取

    有一个疑问就是为什么要去排除margin的距离,看了几篇文章,说是position是类似把元素当初一个有定位的元素来处理,这样的话,确实可以理解的通,那么,此时position.left position.top 就相当于css中的left 和 top ?

  • 相关阅读:
    PHPCMS的自增长标签
    discuz!X2头像无法显示解决方法
    屏蔽“您目前使用的Discuz!程序有新版本发布,请及时升级!”提示
    python +Django 搭建web开发环境初步,显示当前时间
    Java之美[从菜鸟到高手演变]之设计模式四
    Java之美[从菜鸟到高手演变]之设计模式三
    Java之美[从菜鸟到高手演变]之设计模式二
    Java开发中的23种设计模式详解
    Cglib动态代理
    JSP 对象的作用范围
  • 原文地址:https://www.cnblogs.com/qianlegeqian/p/4460035.html
Copyright © 2011-2022 走看看