美文网首页
精确获取offsetTop

精确获取offsetTop

作者: 刘永胜 | 来源:发表于2021-03-04 14:14 被阅读0次

    目的:精确获取offsetTop,解决H5滚动监听的时候,获取的offsetTop有问题,解决安卓和IOS上的表现不一致

    先简单写个demo,学习一下基础的知识

    
    <!DOCTYPE html>
    
    <html lang="en">
    
    <head>
    
        <meta charset="UTF-8">
    
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
    
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
        <title>Document</title>
    
        <style>
    
            body {
    
                margin: 0;
    
                padding: 0;
    
            }
    
            .div1 {
    
                width: 100px;
    
                height: 700px;
    
                background: red;
    
                margin-top: 50px;
    
                padding-top: 20px;
    
                position: relative;
    
            }
    
            .div2 {
    
                width: 50px;
    
                height: 200px;
    
                background: blue;
    
                margin-top: 50px;
    
                padding-top: 20px;
    
                position: fixed;
    
            }
    
            .div3 {
    
                width: 100px;
    
                height: 200px;
    
                background: blue;
    
                margin-top: 50px;
    
                padding-top: 20px;
    
            }
    
        </style>
    
    </head>
    
    <body>
    
        <!--
    
            offsetParent定位父级
    
              偏移量属性一般就是offsetLeft、offsetTop、offsetHeight、offsetWidth这四种了,然后还有一个offsetParent属性作为偏移的参照点。在网上看到的offsetParent的定义是:与当前元素最近的经过定位(position不等于static)的父级元素(感觉和绝对定位的定位点很类似?)。然后具体情况分为下面几种:
    
            1. position为fixed时,offsetParent为null,offsettop的值和top相等。此时元素是以视口来定位的。
    
            2. position非fixed,父级元素无定位(static)时,offsetParent为body。
    
            3. position非fixed,父级元素有定位时,offsetParent为最近的有定位的父级元素。
    
            4. body元素,offsetParent为null,offsettop为0(似乎是废话)。
    
        -->
    
        <div id="div1" class="div1">
    
            <div class="div2" id="div2"></div>
    
            div1
    
        </div>
    
        <div class="div3" id="div3">
    
            div3
    
        </div>
    
        <script>
    
            window.addEventListener('DOMContentLoaded', function () {
    
                var div1 = document.querySelector('#div1');
    
                var div2 = document.querySelector('#div2');
    
                var div3 = document.querySelector('#div3');
    
                console.log('div1.offsetTop', div1.offsetTop, div1.offsetParent);
    
                console.log('div2.offsetTop', div2.offsetTop, div2.offsetParent);
    
                console.log('div3.offsetTop', div3.offsetTop, div3.offsetParent);
    
            });
    
        </script>
    
    </body>
    
    </html>
    
    

    下面是大招

    
    function getOffsetTop () {
    
        let actualTop = element.offsetTop;
    
        let current = element.offsetParent;
    
        while (current !== null) {
    
            actualTop += current.offsetTop;
    
            current = current.offsetParent;
    
        }
    
        return actualTop;
    
    }
    
    

    相关文章

      网友评论

          本文标题:精确获取offsetTop

          本文链接:https://www.haomeiwen.com/subject/ofkkqltx.html