美文网首页
第六节盒子模型和盒子模型偏移量

第六节盒子模型和盒子模型偏移量

作者: 奶瓶SAMA | 来源:发表于2017-08-20 12:15 被阅读0次
    ------------------------------------盒子模型常用的八个属性---------------------------------
    Js盒子模型
    Js盒子模型指的是通过js提供的一系列的属性和方法,获取页面中元素的样式信息值
    
     client系列(当前元素的私有属性)
     clientWidth/clientHeight:内容的宽度/高度+左右/上下填充,(和内容溢出没有关系)
     clientLeft:左边框的宽度(borderLeftWidth)   
     clientTop:上边框的高度(borderTopWidth)
     //真实的内容宽度和高度其实不是这样的,真实的高度是要把溢出的高度也要加进来
    
     offset系列
     offsetHeight/offsetWidth:clientWidth/clientHeight+左右边框/上下边框(和内容溢出没有关系)
     offsetParent:当前元素的参照物
     offsetLeft/offsetTop:当前元素的外边框距离父级参照物的偏移量
    
     scroll系列
      1、内容有溢出
      scrollWidth/scrollHeight 内容没有溢出的情况下和clientWidth/clientHeight一模一样
      2、内容没有溢出:
      如果容器中内容有溢出我们获取的内容以下规则:
      scrollWidth:真实内容的宽度(包含溢出)+左填充
      scrollHeight:真实内容的高度(包含溢出)+上填充
      获取到的结果都是‘约’等于的值,不同的浏览器结果也是不同的,设置overflow: hidden;有影响,在不同的浏览器中我们获取到的结果是不相同的
       scrollLeft/scrollTop滚动条卷去的宽度/高度
    
       关于浏览器本身盒子模型信息
        clientWidth/clientHeight当前浏览器可视窗口的高度和宽度(一屏)
        scrollWidth/scrollHeight当前页面真实的宽度和高度(所有屏的宽度和高度,是一个约等于的值)
     
        不管是哪些属性,也不管是什么浏览器,不管是设置还是获取,想要兼容都写两套
        获取
        document.documentElement[attr]||document.body[attr]
        设置
        document.documentElement.scrollTop=0;
        document.body.scrollTop=0;
    
    编写一个有关于操作浏览器盒子模型的方法
    如果只传递了attr没有传递value,默认的意思是获取样式值
    如果两个参数都传递了,意思是设置某一个样式属性值
    
    
    
    设置、获取浏览器的宽度和高度
        function win(attr,value){
            if(typeof  value=='undefined'){
                  return document.documentElement[attr]||document.body[attr];
            }
            document.documentElement[attr]=value;
            document.body[attr]=value;
    }
    获取可视宽:win(“clientHeight”)
    设置值:win(“scrollTop,0”)
    
    ----------------获取元素的具体样式信息值以及Js兼容检测三种方式--------------
    
    以上获取的都是组合样式值,如果想获取某一个具体的属性值两种方式:
    1、元素.style.属性名(需要我们把所有的样式写在行内样式才可以)(真实项目中不常用)(无法实现css和html的分离)
    2、使用window.getComputedStyle这个方法获取所有经过浏览器计算过的样式(只要当前的元素标签可以在页面中呈现出来,那么它所有的样式都是经过浏览器计算过的,哪怕样式没有写也可以获取到)
    window.getComputedStyle  ----->function getComputedStyle()
    window.getComputedStyle(当前要操作的元素对象,当前元素的伪类一般写null)
    获取的结果是是经过浏览器计算过,是CSSStyleDeclaration这个类的实例,这个实例包含了当前元素的所有样式属性值
    
    Js兼容检测三种方式 1、try catch  使用try catch处理兼容,消耗性能,不得已的情况下使用不是最优的方式
        function getcss(obj, attr) {
            var val = null;
            try {
                val = window.getComputedStyle(obj)[attr];
            } catch (e) {
                val = obj.currentStyle[attr];
            }
            return val;
        }
    2、判断浏览器中是否存在这个属性或方法,存在就兼容,不存在就不兼容  (最优)
         function getcss(obj,attr){
             var val=null;
             if("getComputedStyle" in  window){//判断某一个属性是否属于这个对象
                 val=window.getComputedStyle(obj)[attr];
             }else{
                 val=obj.currentStyle[attr];
             }
             return val;
         }
    
    3、根据浏览器的版本来处理兼容
              function getcss(obj,attr){
                 var val=null;
                 //判断某一个属性是否属于这个对象
                 if(!/MSIE(6|7|8)/.test(window.navigator.userAgent)){
                     val=window.getComputedStyle(obj)[attr];
                 }else{
                     val=obj.currentStyle[attr];
                 }
                 return val;
             }
    
    升级getcss(),部分去掉样式的单位
      function getcss(obj,attr){
            var val=null;
            var reg=null;
            if("getComputedStyle" in  window){
                 val=window.getComputedStyle(obj,null)[attr];
            }else{
                val=obj.currentStyle[attr];
            }
            reg=/^(-?\d+(\.\d+)?)(px|rem|em)$/i;
            return reg.test(val)?parseFloat(val):val;
    }
    标准浏览器和IE浏览器获取的结果是不一样的----->对于部分样式属性,不同浏览器获取的结果不一样,主要是由于getComputedStyle和currentStyle在某些方面不一样
    获取复合型值的时候,比如border等需要拆开了来获取,会避免获取不到的问题
    
    ---------------------------浏览器滚动条卷去的高度scrolltop------------------------
    
    1、只读的属性
    client系列offset系列scrollWidth/scrollHeight都是只读的属性
    
    2、可以设置值的属性
    box.scrollTop=0直接回到了容器的顶部
    
    我们的scrollTop的值是存在边界值的(最大值和最小的值的),最小是0,
    最大是box.scrollHeight-box.clientHeight
    
    
    
    
    ------------------------------------------------获取元素的偏移量-----------------------------------------------------
    盒子模型案例分析offsetParent和offsetLeft/offsetTop 的特点
    parentNode:父节点
        var outer=document.getElementById('outer');
        var inner=document.getElementById('inner');
        var center=document.getElementById('center');
    //    console.log(center.parentNode);
    //    console.log(document.body.parentNode);
    //    console.log(document.documentElement.parentNode);
    //    console.log(document.parentNode);
    //    console.log(document.aa);
    
    Null和undefined都代表没有,但是null是值不存在,undefined是连这个属性都不存在
    
    offsetParent:父级参照物,在同一个平面中,最外层的元素是里面所有的父级参照物(和HTML层级结构没有必然的联系)
    一般来说一个页面中所有元素父级参照物都是body
    center/inner/outer.offsetParent ----->body
    document.body.offsetParent   //body是平面中的顶级是没有父级参照物的
    
    想要改变父级参照物需要脱离当前平面,需要通过position定位来进行改变
               position: relative;
               position: absolute;
               position: fixed;
               position: static;
               position:inherit;
    absolute、relative、fixed任意一个值都能把父级参照物修改
    
    offsetTop/offsetLeft:当前元素(外边框)距离其父级参照(内边框)物偏移距离
    思考:不管center的父级参照物是谁,获取其距离body的左偏移?
    1、首先加上自己本身的左偏移
    2、获取自己的父级参照物(xx)把xx的左边框和左偏移加上
    3、基于当前的xx向上找父级参照物,找到后依然是累加边框和其左偏移
    4、一直找到父级参照物为null,一直找到body
    
    Offset():和jq中的offset()方法相同,实现获取页面中任意一个元素,距离body的偏移(包含左偏移和上偏移),不管当前的父级参照物是谁。 
    
    在标准的ie8浏览器中我们使用offsetLeft/offsetTop其实是是把父级参照物的边框已经算在内了,所以我们不需要自己再单独加边框  
       function offset(curEle) {
            var totalleft = null;
            var totaltop = null;
            var par = curEle.offsetParent;
    //      累加本身
            totalleft += curEle.offsetLeft;
            totaltop += curEle.offsetTop;
    //        只要没有找到body就把父级参照物的边框和偏移进行累加
            while (par) {
    //          不是ie8就累加边框
                if(window.navigator.userAgent.indexOf('MSIE 8.0')==-1){
                    //累加父级参照物的边框
                    totalleft+=par.clientLeft;
                    totaltop+=par.clientTop;
                }
                //累加父级参照物的偏移
                totalleft+=par.offsetLeft;
                totaltop+=par.offsetTop;
                par=par.offsetParent;
            }
            return{
                left:totalleft,
                top:totaltop
            }
    }
    
    作业:
    1、点击滑动到文档开始
    2、图片无缝滚动
    3、文字上下/左右无缝滚动
    4、手风琴效果
    5、轮播
    --------------------------------------------js同步与异步编程------------------------------------
    Js是单线程------->可以想象它是一根筋,做着当前的这件事情,没有完成之前绝对不会做下一件事情
    Js中的两种编程思想:同步和异步编程
    同步编程------->只有上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会说做下一件事情(js中大部分是同步编程的)
    
    异步编程:规划做一件事情,但是不是当前立马去执行这件事情,需要等待一定的时间,这样的话,我们不会等着他执行,而是继续执行下面的操作,只有当下面的事情都处理完成了,才会返回头处理之前的事情,如果下面的事情并没有处理完成,不管之前的事情有没有到时间,都会踏踏实实的等它执行完。
    
    在js中异步编程只有四种情况:
    1、定时器都是异步编程
    2、所有的事件绑定都是异步编程的
    3、Ajax读取数据的时候
    4、回调函数也是异步编程
    
    每一个浏览器对于定时器的等待时间都有一个最小值,谷歌是5~6ms,IE10~14ms,如果设置的等待时间小于这个值不起作用,还是需要等待最小的时间才执行的,尤其是写0也不立即执行
    
    

    相关文章

      网友评论

          本文标题:第六节盒子模型和盒子模型偏移量

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