精确获取offsetTop

2021-03-04  本文已影响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;

}

上一篇下一篇

猜你喜欢

热点阅读