zoukankan      html  css  js  c++  java
  • Offset等一些类似属性的使用

    1.offset系列

    // offset 系列
    var father = document.querySelector('.father');
    var son = document.querySelector('.son');
    // 1.可以得到元素的偏移 位置 返回的不带单位的数值  
    console.log(father.offsetTop);
    console.log(father.offsetLeft);
    // 它以带有定位的父亲为准  如果么有父亲或者父亲没有定位 则以 body 为准
    console.log(son.offsetLeft);
    var w = document.querySelector('.w');
    // 2.可以得到元素的大小 宽度和高度 是包含padding + border + width 
    console.log(w.offsetWidth);
    console.log(w.offsetHeight);
    // 3. 返回带有定位的父亲 否则返回的是body
    console.log(son.offsetParent); // 返回带有定位的父亲 否则返回的是body
    console.log(son.parentNode); // 返回父亲 是最近一级的父亲 亲爸爸 不管父亲有没有定位
    ript>

    offset和style有关属性的比较

    1.是否可读写:

    拿offsetWidth和style.width来说,我们执行一下以下代码:

            .box {
                width: 200px;
                height: 200px;
                background-color: pink;
                padding: 10px;
            }

    我们把盒子的长度和宽度都设置为了200px,log一下二者:

            var box = document.querySelector('.box');
            console.log(box.offsetWidth);
    // 220 console.log(box.style.width);
    // 200px

    从中我们得到了3个信息

    1.二者都是可读的。

    2.style会带单位。

    并且根据规范对其赋值的时候也应该带单位,所以当我们通过offset获得的值再使用style时应在其后方加上px;

    3.offset会把padding包含在内。

    再分别对其进行赋值操作:

            var box = document.querySelector('.box');
            box.offsetWidth = '300';
            console.log(box.offsetWidth); //220
            console.log(box.style.width); //200px
            box.style.width = '300px';
            console.log(box.offsetWidth); //320
            console.log(box.style.width); //300px

    发现前者并不能对元素的属性进行写的操作,这也意味着如果我们如果通过offset得到的属性而要对页面元素进行操作的时候,应该选用与style配合的方法;

    这里有个动态拖拽框的小案例,有兴趣的朋友不妨试试。

    <!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;
            }
            
            .login_header {
                 100%;
                /* height: 30px; */
                line-height: 30px;
                text-align: center;
                font-size: 24px;
                margin-top: 8px;
            }
            
            a {
                text-decoration: none;
                color: #000;
            }
            
            .login {
                position: fixed;
                left: 50%;
                top: 50%;
                transform: translate(-50%, -50%);
                 512px;
                height: 280px;
                background-color: #fff;
                border: 1px solid #cccccc;
                box-shadow: 0px 0px 20px #dddddd;
                display: none;
            }
            
            .login_title {
                margin-top: 20px;
                text-align: center;
                font-size: 20px;
                cursor: move;
            }
            
            .login_uname,
            .login_password {
                margin: 20px 0;
            }
            
            .login_uname input,
            .login_password input {
                outline: none;
                text-indent: 5px;
                height: 38px;
                 350px;
                border: 1px solid #cccccc;
            }
            
            .login_button {
                text-align: center;
                line-height: 40px;
                position: absolute;
                left: 50%;
                transform: translateX(-50%);
                 256px;
                height: 40px;
                font-size: 16px;
                border: 1px solid #cccccc;
            }
            
            label {
                text-align: right;
                display: inline-block;
                 100px;
                height: 35px;
                padding-right: 10px;
                /*  20px; */
            }
            
            .login_close a {
                position: absolute;
                top: -15px;
                right: -15px;
                display: block;
                 35px;
                height: 35px;
                line-height: 35px;
                text-align: center;
                font-size: 14px;
                background-color: #fff;
                border-radius: 50%;
                box-shadow: 0px 0px 20px #dddddd;
            }
            
            .mask {
                position: fixed;
                top: 0;
                 100%;
                height: 100%;
                background-color: #B2B2B2;
                z-index: -99;
                display: none;
            }
        </style>
    </head>
    
    <body>
        <div class="login_header"><a href="javascript:;" id="enter_login">点击,弹出登录框</a></div>
        <div class="login">
            <div class="login_title" id="title">登录会员</div>
            <div class="login_uname">
                <label for="uname">用户名:</label>
                <input type="text" placeholder="请输入用户名" id="uname">
            </div>
            <div class="login_password">
                <label for="password">登录密码:</label>
                <input type="password" placeholder="请输入密码" id="password">
            </div>
            <a class="login_button" href="javascript:;">登录会员</a>
            <div class="login_close">
                <a href="javascript:;" id="close">关闭</a>
            </div>
        </div>
        <div class="mask"></div>
        <script>
            var title = document.querySelector('#title');
            var enter_login = document.querySelector('#enter_login');
            var login = document.querySelector('.login');
            var login_uname = document.querySelector('.login_uname').querySelector('input');
            var login_password = document.querySelector('.login_password').querySelector('input');
            var close_button = document.querySelector('#close');
            var mask = document.querySelector('.mask');
            enter_login.addEventListener('click', function() {
                login.style.display = 'block';
                mask.style.display = 'block';
    
            })
            close_button.addEventListener('click', function() {
                login.style.display = 'none';
                mask.style.display = 'none';
            })
    
            function onFocus(input) {
                input.addEventListener('focus', function() {
                    this.style.borderColor = 'skyblue';
                })
                input.addEventListener('blur', function() {
                    this.style.borderColor = '#ccc';
                })
            }
            onFocus(login_uname);
            onFocus(login_password);
            title.addEventListener('mousedown', function(e) {
                var x = e.pageX - login.offsetLeft;
                var y = e.pageY - login.offsetTop;
    
                function move(e) {
                    var moveX = e.pageX - x;
                    var moveY = e.pageY - y;
                    login.style.left = moveX + 'px';
                    login.style.top = moveY + 'px';
                }
                title.addEventListener('mousemove', move);
                title.addEventListener('mouseup', function() {
                    title.removeEventListener('mousemove', move);
                })
    
            })
        </script>
    </body>
    
    </html>
    View Code

    2.鼠标当前的坐标及其在某盒子内的坐标

    在事件的函数中传入e,通过e.pageX,e.pageY获取当前鼠标在页面中的位置坐标。

    这里我们综合上面的offset来计算一下鼠标在当前盒子中的坐标:

    思路:盒子中的x坐标为鼠标再页面中距离左端的距离e.pagex减去盒子距离左端的长度box.offsetLeft。

            window.addEventListener('load', function() {
                var div = document.querySelector('div');
                div.addEventListener('mousemove', function(e) {
                    var x = e.pageX - div.offsetLeft;
                    var y = e.pageY - div.offsetTop;
                    console.log(x);
                    console.log(y);
                    div.innerHTML = '鼠标在盒子内的X坐标是' + x + '  y坐标是' + y;
                })
            })

    3.Client系列

    我们使用 client 系列的相关属性来获取元素可视区的相关信息。通过 client 系列的相关属性可以动态的得到该元素的边框大小、元素大小等。

    用法与offset一致,同样含有Left Top Width Height区别在于client不包含边框!

    4.Scroll系列

    这里我们用一张图来解释一下

    scrollTop是指被卷曲的长度,Height是文字的总长度。

  • 相关阅读:
    基于docker的MongoDB复制(副本集)
    (已解决)ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib
    【洛谷3530】[POI2012] FES-Festival(差分约束+Tarjan)
    【洛谷4765】[CERC2014] The Imp(贪心+DP)
    【洛谷7093】[CERC2014] Can't stop playing(搜索)
    【CF755G】PolandBall and Many Other Balls(倍增FFT)
    【洛谷3896】[湖南集训] Clever Rabbit(搜索)
    【洛谷7215】[JOISC2020] 首都(点分治+BFS)
    【BZOJ4173】数学(欧拉函数)
    【洛谷5748】集合划分计数(多项式exp)
  • 原文地址:https://www.cnblogs.com/dokom666/p/12861007.html
Copyright © 2011-2022 走看看