美文网首页
js管理页面元素位置大小

js管理页面元素位置大小

作者: 蛋炒饭_By | 来源:发表于2018-02-06 18:03 被阅读10次

    网页文档的大小和浏览器窗口的大小

    首先,要明确两个基本概念。
    一张网页的全部面积,就是它的大小。通常情况下,网页的大小由网页内容的多少和CSS样式表决定。
    浏览器窗口的大小,则是指在浏览器窗口中看到的那部分网页面积,又叫做viewport(视口)。
    很显然,如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,则滚动浏览器窗口,可以显示出网页的各个部分。

    获取视口的大小

    网页上的每个元素,都有clientHeight和clientWidth属性。这两个属性指元素的内容部分再加上padding的所占据的视觉面积,不包括border和滚动条占用的空间。


    image

    document元素的clientHeight和clientWidth属性,就代表了视口的大小。

    document.documentElement.clientWidth
     document.documentElement.clientHeight
    
    

    使用的时候,有2个地方需要注意:

    • 这个函数必须在页面加载完成后才能运行,否则document对象还没生成,浏览器会报错。
    • clientWidth和clientHeight都是只读属性,不能对它们赋值。

    元素.clientHeight 是元素内容的height+padding
    比如:div.clientHeight

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #test{
                width: 100px;
                height: 150px;
                padding: 20px;
                border: 1px solid red;
            }
        </style>
    </head>
    <body>
    <div id="test">
    aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaa
    </div>
    
    <script>
       console.log(document.documentElement.clientWidth);
       console.log(document.documentElement.clientHeight);
        var div = document.getElementById('test')
    
       console.log(div.clientWidth);
       console.log(div.clientHeight);
    </script>
    </body>
    </html>
    
    

    获取网页文档内容大小的方法(不包括溢出的内容)

    document.documentElement.offsetWidth

    获取DOM文档的根节点html元素对象的宽度,即offsetWidth=width+padding+border,不包括margin。

    document.documentElement.offsetHeight

    获取DOM文档的根节点html元素对象的高度,有可能小于视口高度(由文档内容高度决定,不包括溢出的内容),即offsetHeight=height+padding+border,不包括margin。

    元素.offsetHeight是元素设定的height+padding+border(不包括溢出的内容)
    比如:div.offsetHeight

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            *{
                padding: 0;
                margin: 0;
            }
            #test{
                width: 100px;
                height: 150px;
                padding: 20px;
                border: 1px solid red;
            }
        </style>
    </head>
    <!--可以去掉style="height: 2000px"观察一下-->
    <body style="height: 2000px">
    <div id="test">
    aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
    </div>
    
    <script>
       console.log(document.documentElement.offsetWidth);
       console.log(document.documentElement.offsetHeight);
        var div = document.getElementById('test')
    
       console.log(div.offsetWidth);
       console.log(div.offsetHeight);
    </script>
    </body>
    </html>
    
    

    js实现小球触壁反弹

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #mainBox {
                width: 300px;
                height: 500px;
                background: lavender;
                border: 1px solid gold;
                margin: auto;
                position: relative;
            }
    
            .ball {
                width: 30px;
                height: 30px;
                background: cyan;
                border-radius: 50%;
                position: absolute;
                left: 0px;
                top: 0px;
            }
    
        </style>
    </head>
    
    <body>
    <div id="mainBox">
        <div class="ball">
    
        </div>
    </div>
    
    </body>
    <script type="text/javascript">
        //公共变量
        var ball_ = document.getElementsByClassName('ball')[0]
        var mainBox = document.getElementById("mainBox")
    
        //小球移动变量
        var x = 0;
        var y = 0;
        var speedX = 2;
        var speedY = 2;
        //定时器
        var timer = null;
    
        timer = setInterval('move()', 10)
        function move() {
            x += speedX;
            y += speedY;
            //判断小球是否碰到边界
            if(x <= 0 || x > mainBox.offsetWidth - ball_.offsetWidth) {
                speedX = -speedX
            }
            if(y <= 0 || mainBox.offsetHeight - ball_.offsetHeight <= y) {
                speedY = -speedY
            }
            //改变小球的left和top值
            ball_.style.left = x + 'px';
            ball_.style.top = y + 'px';
    
           }
        move();
    
    </script>
    
    </html>
    
    

    获取网页文档内容大小的方法(包括溢出的内容)

    网页上的每个元素还有scrollHeight和scrollWidth属性,指包含滚动条在内的该元素的视觉面积。
    那么,document对象的scrollHeight和scrollWidth属性就是网页的大小,意思就是滚动条滚过的所有长度和宽度。

            document.documentElement.scrollWidth
            document.documentElement.scrollHeight
    
    

    元素.scrollHeight 可以获得元素内容的实际高度,包括溢出的内容。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            *{
                padding: 0;
                margin: 0;
            }
            #test{
                width: 100px;
                height: 150px;
                padding: 20px;
                border: 1px solid red;
            }
        </style>
    </head>
    <!--可以去掉style="height: 2000px"观察一下-->
    <body>
    <div id="test">
    aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
        aaaaaaaaaaaaaaaaaaa
    </div>
    
    <script>
       console.log(document.documentElement.scrollWidth);
       console.log(document.documentElement.scrollHeight);
        var div = document.getElementById('test')
    
       console.log(div.scrollWidth);
       console.log(div.scrollHeight);
    </script>
    </body>
    </html>
    
    

    获取网页元素的绝对位置

    网页元素的绝对位置,指该元素的左上角相对于整张网页左上角的坐标。
    这个绝对位置要通过计算才能得到。
    首先,每个元素都有offsetTop和offsetLeft属性,表示该元素的左上角与父容器(offsetParent对象)左上角的距离。所以,只需要将这两个值进行累加,就可以得到该元素的绝对坐标。

    image

    下面两个函数可以用来获取绝对位置的横坐标和纵坐标。

    function getElementLeft(element){
        var actualLeft = element.offsetLeft;
        var current = element.offsetParent;
    
        while (current !== null){
          actualLeft += current.offsetLeft;
          current = current.offsetParent;
        }
    
        return actualLeft;
      }
    
      function getElementTop(element){
        var actualTop = element.offsetTop;
        var current = element.offsetParent;
    
        while (current !== null){
          actualTop += current.offsetTop;
          current = current.offsetParent;
        }
    
        return actualTop;
      }
    
    

    body的offsetTop是0;body的offsetParent是null

    offsetLeft与style.left的区别

    offsetLeft 获取的是相对于父对象的左边距

    left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距

    如果父div的position定义为relative,子div的position定义为absolute,那么子div的style.left的值是相对于父div的值,
    这同offsetLeft是相同的,区别在于:

    1. style.left 返回的是字符串,如28px,offsetLeft返回的是数值28,如果需要对取得的值进行计算,
      还用offsetLeft比较方便。
    2. style.left是读写的,offsetLeft是只读的,所以要改变div的位置,只能修改style.left。
    3. style.left的值需要事先定义,否则取到的值为空。而且必须要定义在html里,我做过试验,如果定义在
      css里,style.left的值仍然 为空,这就是我刚开始碰到的问题,总是取不到style.left的值。

    offsetLeft则仍然能够取到,无需事先定义div的位置。

    获取网页元素的相对位置

    网页元素的相对位置,指该元素左上角相对于浏览器窗口左上角的坐标。
    有了绝对位置以后,获得相对位置就很容易了,只要将绝对坐标减去页面的滚动条滚动的距离就可以了。滚动条滚动的垂直距离,是document对象的scrollTop属性;滚动条滚动的水平距离是document对象的scrollLeft属性。

    image

    滚动距离

    document.body.scrollTop/scrollLeft
    scrollTop是可视区顶部到整个页面顶部的距离(就是滚动条滚动距离);想要得到谁的滚动距离,scrollTop和scrollLeft的前面就写哪个元素

    document.documentElement.scrollTop/scrollLeft

    兼容性问题

    chrome浏览器,认为滚动距离是在body上的

    其他浏览器,认为滚动距离是documentElement上的

    可以用如下方式解决兼容性问题:

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

    对上一节中的两个函数进行相应的改写,获得元素的相对位置:

    function getElementViewLeft(element){
        var actualLeft = element.offsetLeft;
        var current = element.offsetParent;
    
        while (current !== null){
          actualLeft += current.offsetLeft;
          current = current.offsetParent;
        }
    
        var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft
    
        return actualLeft-scrollLeft ;
      }
    
      function getElementViewTop(element){
        var actualTop = element.offsetTop;
        var current = element.offsetParent;
    
        while (current !== null){
          actualTop += current. offsetTop;
          current = current.offsetParent;
        }
    
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
    
        return actualTop-scrollTop;
      }
    
    

    js实现返回顶部功能

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>test</title>
        <style>
            body {
                height: 5000px;
            }
            a {
                position: fixed;
                right: 100px;
                width: 50px;
                height: 50px;
                background: red;
                color: white;
                text-align: center;
                line-height: 50px;
                display: block;
            }
            .toTop {
                bottom: 160px;
            }
            .toBottom {
                bottom: 100px;
            }
        </style>
        <script>
            window.onload = function() {
                var oA = document.getElementsByTagName('a');
    
                oA[0].onclick = function() {
                    toScroll("top")
                }
                oA[1].onclick = function() {
                    toScroll("bottom")
                }
            }
            function toScroll(target) {
                clearInterval(this.timer)
                var scrollHeight = document.body.offsetHeight - document.documentElement.clientHeight;
                this.timer = setInterval(function() {
                    var scrolltop = document.documentElement.scrollTop || document.body.scrollTop;
                    switch (target) {
                        case 'top':
                            console.log(scrolltop);
                            //把内容滚动指定的像素数(第一个参数向右滚动的像素数,第二个参数向下滚动的像素数)
                            window.scrollBy(0, -100);
                            if (Math.ceil(scrolltop) <= 0) {
                                clearInterval(this.timer)
                            };
                            break;
                        case 'bottom':
                            console.log(scrolltop);
                            window.scrollBy(0, 100);
                            if (Math.ceil(scrolltop) >= scrollHeight) {
                                clearInterval(this.timer)
                            };
                            break;
                    }
                }, 30)
            }
        </script>
    </head>
    
    <body>
    <a href="javascript:;" class="toTop">上</a>
    <a href="javascript:;" class="toBottom">下</a>
    </body>
    
    </html>
    
    

    获取元素相对位置的快速方法

    除了上面的函数以外,还有一种快速方法,可以立刻获得网页元素的位置。
    那就是使用getBoundingClientRect()方法。它返回一个对象,其中包含了left、right、top、bottom四个属性,分别对应了该元素的左上角和右下角相对于浏览器窗口(viewport)左上角的距离。
    所以,网页元素的相对位置就是

    var X= 元素.getBoundingClientRect().left;
    
     var Y =元素.getBoundingClientRect().top;
    
    

    再加上滚动距离,就可以得到绝对位置

     var X=元素.getBoundingClientRect().left+document.documentElement.scrollLeft;
    
     var Y =元素.getBoundingClientRect().top+document.documentElement.scrollTop;
    

    相关文章

      网友评论

          本文标题:js管理页面元素位置大小

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