• DOM之js盒子模型


      我们可以用一些属性和方法来获取到当前元素的样式信息,一共分为三类,分别是:client类,offset类,scroll类。还有一个getComputedStyle()方法,下面我们来分别介绍。

      一、client 可视

        指元素本身的可视内容,内容的宽度+内填充。特点:它获取的结果是没有单位的;内容的溢出与否对它是没有影响的;获取的结果会四舍五入,是整数;如果给元素设置了display:none那么client属性都是为0;因为每次访问可视区时,client都是要重新计算,重复访问需要消耗性能如果需要重复访问,则把它们的值保存在变量中,以提高性能。

        clientWidth: 元素的可见宽度,不包含边框,会随窗口的显示大小而变化

        clientHeight: 元素的可见高度,不包含边框,会随窗口的显示大小而变化

        clientTop: 元素顶部边框的宽度

        clientLeft:元素的左边框的宽度

        获取当前页面可视化区域的宽高:

          document.documentElement.clientWidth || document.body.clientWidth

          document.documentElement.clientHeight || document.body.clientHeight

        可以利用上面的特性让盒子水平垂直居中,代码如下:

        <style>
            * {padding: 0;margin: 0;}
            .box {box-sizing: border-box;padding:20px; 300px;height: 300px;border: 10px solid lightblue;background: lightgreen;font-size: 16px;}
        </style>
    </head>
    <body>
        <div id="box" class="box">
            如何让你遇见我 在我最美丽的时刻 为这 我已在佛前求了五百年
            求它让我们结一段尘缘 佛于是把我化作一棵树 长在你必经的路旁
            阳光下慎重地开满了花朵 朵都是我前世的盼望 当你走近请你细听
            颤抖的叶是我等待的热情 而你终于无视地走过 在你身后落了一地的
            朋友啊那不是花瓣 是我凋零的心
        </div>
        <script>
            //js实现水平垂直居中:(一屏幕的宽度-盒子的宽度)/2 
            let oneScreenHeight = document.documentElement.clientHeight,
            oneScreenWidth = document.documentElement.clientWidth;
            box.style.position = 'absolute';
            box.style.left = (oneScreenWidth - box.offsetWidth) / 2 + 'px';
            box.style.top = (oneScreenHeight - box.offsetHeight) / 2 + 'px';
        </script>

      二、offset 偏移

        它是在client的基础上加上了盒子的边框,特点:在没有内容溢出的情况下和client是一样的,但有内容溢出时,获取的结果约等于真实内容的宽高;不同浏览器获取的结果是不一样的;设置overflow属性值对最后的结果不尽相同。它有一个重要的偏移参照物——offsetParent。

        offset定位父级它是一个只读属性,返回一个指向最近的包含该元素的定位元素。它有以下几个特点:

        元素position为fixed,offset的结果为null;元素自身无fixed定位且父级元素都未有定位,那offsetParent的结果为<body>;元素自身无fixec定位且父级元素存在经过定位的元素,offset的结果为离自身元素最近的有定位的父级元素;<body>的offsetParent为null。

        offsetWidth: f元素在水平方向上占用的空间大小,如果有滚动条也包含滚动条

        offsetHeight: 元素在垂直方向上占用的空间大小,如果有滚动条也包含滚动条

        offsetTop: 元素的上外边框至offsetParent元素的上内边框之间的像素距离

        offsetLeft: 表示元素的左外边框至offsetParent元素的左内边框之间的像素距离

    示例:获取当前元素距离body的偏移

            function offset(currentEle) {
                let parent = currentEle.offsetParent,
                    deviationLeft = currentEle.offsetLeft,
                    deviationTop = currentEle.offsetTop;
                //存在父参照物,且还没有找到body
                while (parent && parent.targName !== 'BODY') {
                    if (!/MSIE 8.0/.test(navigator.userAgent)) {
                        //ie8中偏移值包含边框
                        //navigator.userAgent获取当前浏览器的版本信息
                        deviationLeft += parent.clientLeft;
                        deviationTop += parent.clientTop;
                    }
                    deviationLeft += parent.offsetLeft;
                    deviationTop += parent.offsetTop;
                    //继续获取上级的参照物
                    parent = parent.offsetParent;
                }
                return {
                    top: deviationTop,
                    left: deviationLeft
                };
            };

      三、scroll 滚动

        scrollHeight: 元素的总高度,包括由于溢出而无法展示在网页的不可见部分

        scrollWidth: 元素的总宽度,包括由于溢出而无法展示在网页的不可见部分

        scrollLeft: 获取位于对象左边界和窗口中目前可见内容的最左端之间的距离(表示被隐藏在内容区域左侧的像素数。元素未滚动时,scrollLeft的值为0,如果元素被水平滚动了,scrollLeft的值大于0,且表示元素左侧不可见内容的像素宽度)

        scrollTop: 对象最顶端和窗口中可见内容的最顶端之间的距离(表示被隐藏在内容区域上方的像素数。元素未滚动时,scrollTop的值为0,如果元素被垂直滚动了,scrollTop的值大于0,且表示元素上方不可见内容的像素宽度)

        特点:

          在没有滚动时,scrollHeight与client属性的结果相等,scrollWidth与clientWidth相等;

          与scrollHeight和scrollWidth属性不同的是,scrollLeft和scrollTop是可写的(只有这两个可写,其余只能是只读);

          获取整个页面的真实高度:document.documentElement.scrollHeight 或 document.body.scrollHeight;

          竖向滚动条卷去的高度:最小值为0,最大值为:整个高度scrollHeight - 可视区的高度clientHeight。

        <style>
            * {padding: 0;margin: 0;}
            html, body {height: 1000%;background:lightgreen;}
            .box {
                display: none;
                position: fixed;top: 500px;right: 2px;
                box-sizing: border-box;
                 50px;height: 50px; background-color: lightcoral;
                color: white;font-size: 16px;
                line-height: 50px;text-align: center;
            }
        </style>
    </head>
    <body>
        <div id="box" class="box"></div>
        <script>
            let html = document.documentElement,
                box = document.getElementById('box');
            //当浏览器滚动时,进行验证
            //卷去的高度超过一屏时,让box显示,不足时则隐藏
            function roll() {
                let oneScreenHeight = html.clientHeight,
                    rollTop = html.scrollTop;
                box.style.display = rollTop > oneScreenHeight ? 'block' : 'none';
            }
            window.onscroll = roll;
    
            //点击让box回到顶部,点击后box消失,滚动条用动画的形式回到顶部
            box.onclick = function () {
                //1.让box隐藏
                box.style.display = 'none';
                //先禁止滚动事件触发(回到顶部的过程中,如果事件一直在,会计算box显示隐藏的样式,无法让其隐藏)
                window.onscroll = null;
                //2.实现动画
                let step = 1000;
                let timer = setInterval(() => {
                    let currentTop = html.scrollTop;
                    if (currentTop === 0) {
                        //边界判断,看是否是到了顶部,是则清除定时器
                        clearInterval(timer);
                        window.onscroll = roll;
                        return;
                    }
                    //不是执行
                    currentTop -= step;
                    html.scrollTop = currentTop;
                }, 17);
            };
        </script>

      四、getComputedStyle

        获取当前元素所有经过浏览器计算后的样式

        语法:let style = window.getComputedStyle(element,null); element为当前元素,第二个参数是元素的伪类:after/:before。必须对普通元素省略(或null)。

        返回值:返回的style是一个实时的 CSSStyleDeclaration 对象,当元素的样式更改时,它会自动进行更新。

        特点:在ie6-8下不兼容要用到currentStyle来获取。

       五、示例:图片懒加载

        <style>
            * { margin: 0;padding: 0;}
            img {border: none;}
            img[src=""] {display: none; }
            .imgBox {box-sizing: border-box;margin: 1000px auto;  240px; height: 160px; background-color: #cccc;;}
            .imgBox img { 100%;height: 100%;}
        </style>
    <body>
        <div class="imgBox"><img src="" data_src="img/dog.jpg" /></div>
        <script>
            function offset(currentEle) {
                let parent = currentEle.offsetParent,
                    deviationLeft = currentEle.offsetLeft,
                    deviationTop = currentEle.offsetTop;
                //存在父参照物,且还没有找到body
                while (parent && parent.targName !== 'BODY') {
                    if (!/MSIE 8.0/.test(navigator.userAgent)) {
                        //ie8中偏移值包含边框
                        //navigator.userAgent获取当前浏览器的版本信息
                        deviationLeft += parent.clientLeft;
                        deviationTop += parent.clientTop;
                    }
                    deviationLeft += parent.offsetLeft;
                    deviationTop += parent.offsetTop;
                    //继续获取上级的参照物
                    parent = parent.offsetParent;
                }
                return {
                    top: deviationTop,
                    left: deviationLeft
                };
            };
            let imgBox = document.querySelector('.imgBox'),
                _img = imgBox.querySelector('img');
            //显示图片:获取图片中的data_src属性,当图片能正常加载出来后,记图片显示 
            //currentImg是要显示的图片
            function lazyImg(currentImg) {
                //给src赋值真实图片的地址
                let data_src = currentImg.getAttribute('data_src');
                currentImg.src = data_src;
                //检查图片是否能正常的加载出来 用img.onload事件来监听
                currentImg.onload = function () {
                    currentImg.style.display = 'block';
                }
                //设置自定义属性:isLoad存储当前图片已经加载过了
                currentImg.inLoad = true;
            }
            //监听页面滚动事件(只要页面滚动则触发这个事件)
            window.onscroll = function () {
                // 如果图片已经存在就返回结束后面操作
                if (_img.isLoad) return;
                /* 
                *图片完全加载出来的条件:
                *  盒子的底边距离body的顶端的距离
                *   浏览器底边距离body的距离
                *   当盒子的距离小于浏览器的距离时,盒子就完全出现在了用户的面看
                */
                let html = document.documentElement,
                    boxBottomBodyDistance = imgBox.offsetHeight + offset(imgBox).top;
                browserBottomBodyDistance = html.clientHeight + html.scrollTop;
                if (boxBottomBodyDistance <= browserBottomBodyDistance) {
                    lazyImg(_img);
                };
            };
        </script>
  • 相关阅读:
    js中url跳转问题
    代码走查整理总结
    关于前后端分离跨域请求问题
    mysql大小写敏感问题
    初识react
    mysql测试
    关于使用Ajax请求json数据,@RequestMapping返回中文乱码的几种解决办法
    ssm实现分页查询
    js表单验证处理和childNodes 和children 的区别
    javaScript数组操作整理
  • 原文地址:https://www.cnblogs.com/davina123/p/12966460.html
Copyright © 2020-2023  润新知