zoukankan      html  css  js  c++  java
  • BOM基础(二)

      跟DOM一样,BOM其实也是由很多的API组成。 不过对于BOM来说,最痛苦的不是不记得API,而是明明记得这个这个API,却没有考虑到它的兼容性。

      之前的文章中讲到了offset系列的属性,他的宽高是由borderpaddingwidth组成的。而它的offsetLeftoffsetTop则是相对于offsetParent的距离。这里的offsetParent指的是子盒子有定位的父级元素,而如果子盒子没有有定位的父级元素,那么它的offsetParent就是body。讲过了offset系列的,就该讲讲scroll系列的了。

      首先就来说说scrollWidthscrollHeight这两个属性分别获取的是元素

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #box {
                width: 100px;
                height: 100px;
                
                border: 5px solid red;
                padding: 10px;;
            }
        </style>
    </head>
    <body>
        <div id="box">
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
            啦啦啦
        </div>
        <script>
            var box = document.getElementById("box");
            console.log(box.scrollHeight);
            console.log(box.offsetHeight);
        </script>
    </body>
    </html>

      上述代码分别输出了divscrollHeightoffsetHeight,在控制台中,这两个属性打印的值分别是297130;第二个值没有问题,他就是盒子上下边框宽加上下内边距加高度后得来的。而第一个值,获取的则是撑开之后的大小。可能对于这个值具体的算法有疑问,不过,在实际开发中一般不会出现有很大的内边距和边框时要你使用scrollHeight值的。所以不必太纠结为什么是这个数值,我们只要知道这个数值是随着内容的改变而改变就好了。scrollHeight值得算法是如果内容区域小于上下内边距加高度,那么它的值就是上下内边距加高度,否则就是内容撑开的高度。scrolltLeft也是同理。

      而说完了scrollHeightscrollLeft之后,就该来说说scrollTopscrollLeft了,这两个值的用法相同。所以就来说说其中的offsetTop;一般来说,这两个属性都会配上鼠标移动事件来使用。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #box {
                width: 100px;
                height: 100px;
                
                overflow: auto;
            }
        </style>
    </head>
    <body>
        <div id="box">
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
            老王走了
        </div>
        <script src="common.js"></script>
        <script>
            var box = my$("box");
            box.onscroll  = function () {
                console.log(box.scrollTop);
            }
    
        </script>
    </body>
    </html>

      上述代码在拉动滚动条的时候执行,输出divscrollTopscrollTop显示的是内容区域向上移动的距离。

      上面的代码获取的只是那个小的div中的滚动事件,那么如果在页面中呢?我们就可以把整个页面看做是一个div。这时候就遇到一个问题了,页面到底是body呢,还是html呢?其实,不同的浏览器有不同的解析方式。这时候,我们就要封装兼容性代码了。

    function scroll() {
        return {
            scrollLeft:document.body.scrollLeft || document.documentElement.scrollLeft,
            scrollTop:document.body.scrollTop || document.documentElement.scrollTop
        };
    }

      在这里,我们封装了一个scroll函数,用来返回一个对象,这个对象有两个属性,这两个属性在调用的时候可以获取页面的滚动距离,并且,如果浏览器是根据body来获取或者根据html来获取他都能兼容。

  • 相关阅读:
    2.7OpenIdConnectHandler 【RemoteAuthenticationHandler、IAuthenticationSignOutHandler】
    2.6OAuthHandler【RemoteAuthenticationHandler】
    2.0AuthenticationHandler【IAuthenticationHandler 】
    2.5RemoteAuthenticationHandler【AuthenticationHandler、IAuthenticationRequestHandler】
    2.4JwtBearerHandler 【AuthenticationHandler】
    在Centos7上安装Nominatim
    .net core使用 ELK
    linux 韩顺平课程笔记 3.11包管理工具(RPM和YUM)
    linux 韩顺平课程笔记 3.10进程管理
    linux 韩顺平课程笔记 3.5实用指令
  • 原文地址:https://www.cnblogs.com/wqc5730/p/5771473.html
Copyright © 2011-2022 走看看