三.懒加载及相关9-11 (P93-P96)

70 阅读3分钟

9. 获取元素尺寸

  • 就是获取元素的 "占地面积"

1.offsetWith 和 offsetHeight

  • offsetWidth : 获取的是元素 内容 + padding + border 的宽度
  • offsetHeight : 获取的是元素 内容 + padding + border 的高度

2.clientWidth 和 clientHeight

  • clientWidth : 获取的是元素 内容 + padding 的宽度

  • clientHeight : 获取的是元素 内容 + padding 的高度

注意:

  • 获取到的尺寸是没有单位的数字
  • 当元素在页面中不占位置的时候, 获取到的是 0
    • display: none; 元素在页面不占位
    • visibility: hidden; 元素在页面占位
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        div{
            width: 100px;
            height: 100px;
            padding:10px;
            border:5px solid red;
            background-color: yellow;
            box-sizing: border-box;
            /* display: none; */

            margin:100px; //外边距不会算入
        }
    </style>
</head>
<body>

    <div id="box">

    </div>
    <script>
        // console.log(getComputedStyle(box).width)

        // console.log(box.style.width)
        //offset* (border+padding+content)
        console.log(box.offsetWidth,box.offsetHeight)

        //注意
        /*
          1. 单位是数字类型
          2. box-sizing 计算方法不变(border+padding+content)
          3. display:none 拿不到
        */
        //client* (padding+content)
        console.log(box.clientWidth,box.clientHeight)
    </script>
</body>
</html>

10. 获取元素的偏移量

  • 就是元素在页面上相对于参考父级的左边上边的距离

offsetParent

  • 获取元素的偏移量参考父级
  • 其实就是假设你要给一个元素 绝对定位 的时候
  • 它是根据谁来进行定位的
  • 那么这个元素的偏移量参考父级就是谁

offsetLeft 和 offsetTop

  • 获取的是元左边的偏移量和上边的偏移量
  • offsetLeft : 该元素相对于参考父级的左侧偏移量
  • offsetTop : 该元素相对于参考父级的上侧偏移量

clientLeft和clientTop

  • 内容距离自己左上角的距离
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
        #box{
            width: 500px;
            height: 500px;
            background:yellow;
            overflow: hidden;

        }
        #myparent{
            width: 300px;
            height: 300px;
            background:blue;
            overflow: hidden;
            
        }
        #child{
            width: 100px;
            height: 100px;
            background:red;
        }
        div{
            margin:50px;
        }

        ul{
            width: 200px;
            height: 200px;
            padding:20px;
            border:10px solid black;
            background:red;
            margin:50px;
            border-left-width:50px;
            border-top-width: 50px;
        }
    </style>
</head>
<body>

    <div id="box">
        <div id="myparent">
            <div id="child"></div>
        </div>
    </div>


    <ul id="list"></ul>
    <script>
        console.log(child.offsetLeft,child.offsetTop)
        console.log(myparent.offsetLeft,myparent.offsetTop)
        console.log(box.offsetLeft,box.offsetTop)


        /*
          参考点:是定位父级(什么定位都可以)
          如果父级元素都没有定位, 偏移量相对于body
        */


        console.log(list.clientLeft,list.clientTop)
    </script>
</body>
</html>

11. 获取浏览器窗口尺寸

  • 我们之前学过一个 innerWidthinnerHeight

  • 他们获取到的是窗口包含滚动条的尺寸

  • 下面我们学习两个不包含滚动条的尺寸获取方式

  • document.documentElement.clientWidth : 可视窗口的宽度

  • document.documentElement.clientHeight : 可视窗口的高度

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
        html,body{
            width: 2000px;
            height: 2000px;
        }
    </style>
</head>
<body>
    <script>
        console.log("宽度",innerWidth)
        console.log("高度",innerHeight)
        
        
        console.log("宽度",document.documentElement.clientWidth)
        console.log("高度",document.documentElement.clientHeight)
    </script>
</body>
</html>
案例 懒加载
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        * {
            margin: 0;
            padding: 0;
        }

        html,
        body {
            height: 100%;
        }

        ul li {
            overflow: hidden;
            height: 150px;
        }

        ul li img {
            float: left;
            width: 80px;
        }
    </style>
</head>

<body>
    <h1>标题</h1>
    <ul id="list">

    </ul>
    <script>
        var arr1 = [{
                name: "哆啦A梦:大雄的宇宙小战争2021",
                url: "https://pic.maizuo.com/usr/movie/c151962e41cb282f09b7855261841da7.jpg?x-oss-process=image/quality,Q_70"
            },
            {
                name: "坏蛋联盟",
                url: "https://pic.maizuo.com/usr/movie/594ded98490b61549be7ecb5a9355b79.jpg?x-oss-process=image/quality,Q_70"
            },
            {
                name: "暗恋·橘生淮南",
                url: "https://pic.maizuo.com/usr/movie/d8419057142d94750cfcbaa69f5fd16b.jpg?x-oss-process=image/quality,Q_70"
            },
            {
                name: "海底小纵队:洞穴大冒险",
                url: "https://pic.maizuo.com/usr/movie/e6ee44927d2e3370dcf251c2627ef6d4.jpg?x-oss-process=image/quality,Q_70"
            },
            {
                name: "我要我们在一起",
                url: "https://pic.maizuo.com/usr/movie/ea32c21b19817f0a9d7d799c1262ac8d.jpg?x-oss-process=image/quality,Q_70"
            }
        ]

        var arr2 = [{
                name: "神秘海域",
                url: "https://pic.maizuo.com/usr/movie/a17030216bc281dfc04c0964bd911497.jpg?x-oss-process=image/quality,Q_70"
            },
            {
                name: "边缘行者",
                url: "https://pic.maizuo.com/usr/movie/afdef208d7b72a950b164c007e8a0837.jpg?x-oss-process=image/quality,Q_70"
            },
            {
                name: "五个扑水的少年",
                url: "https://pic.maizuo.com/usr/movie/635c53b2cbd14987870df6b3434e2a28.jpg?x-oss-process=image/quality,Q_70"
            },
            {
                name: "神奇动物:邓布利多之谜",
                url: "https://pic.maizuo.com/usr/movie/46015aa8e08a661e7c559b6e7407ce08.jpg?x-oss-process=image/quality,Q_70"
            },
            {
                name: "开心超人之英雄的心",
                url: "https://pic.maizuo.com/usr/movie/36e714044b7e5d555a81a74f816bde99.jpg?x-oss-process=image/quality,Q_70"
            }
        ]

        renderHTML(arr1)

        function renderHTML(arr) {
            // list.innerHTML += arr.map(function (item) {
            //     return `<li>
            //      <img src="${item.url}" alt="">
            //      <h3>${item.name}</h3>
            //     </li>`
            // }).join("")
            //会闪退一下
            
            //优化方案
            for(var i=0;i<arr.length;i++){
                var oli = document.createElement("li")
                oli.innerHTML = `<img src="${arr[i].url}" alt="">
                    <h3>${arr[i].name}</h3>`

                list.appendChild(oli)
            }
        }
        isLoading = false
        window.onscroll = function(){
            // console.log("1111")
            var listHeight = list.offsetHeight
            var listTop = list.offsetTop

            // console.log(listHeight+listTop)

            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop

            var windowHeight = document.documentElement.clientHeight

            // console.log()
            if(isLoading) return
            if((listHeight+listTop)-Math.round(windowHeight+scrollTop)<50){
                console.log("到底了")
                isLoading = true


                //渲染下一页数据,让数据加载的慢一点
                setTimeout(function(){
                    renderHTML(arr2)

                    isLoading = false //下一次到底事件继续触发
                },1000)
            }
        }
    </script>
</body>
</html>