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

------------------------------------盒子模型常用的八个属性---------------------------------
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也不立即执行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容