JS基础之盒子模型的常用属性

盒子模型

JS盒子模型指的是通过JS中提供的一系列的属性和方法,获取页面中的样式信息值#box有很多私有属性
->HTMLDivElement.prototype->HTMElement.prototype ->Element.prototype->Node.prototype->EventTarget.prototype->Object.prototype 在原型链上有很多共有的属性和方法
内容的高度和宽度:我们设置的width/height这两个样式就是内容的宽和高
如果没有设置高度,容器的高度会根据里面的内容自己进行时应,这样获取的就是真实内容的高;如果设置固定高度,不管内容是多了还是少了,其实我们内容的高度指的都是设定的那个值真实内容的宽度和高度:这个值得是实际内容的宽高(和我们设置的宽高没有必然联系),例如我们设置的高度是200px,如果内容有溢出,那么真实内容的高度是要把溢出内容加进来的

  • 1.client 系列 (不是真实宽高) 私有属性
    clientWidth/clientHeight :内容的宽度/高度+左右/上下填充
    clientLeft:左边框宽度 clientTop:上边框高度
  • 2.offset 系列
    offsetWidth/offsetHeight :clientWidth/clientHeight+左右上下边框
    和内容溢出是没有关系的
    offsetParent:当前元素的父级参照物
    offsetLft/offsetTop:当前元素的外边框距离父级参照物的偏移量
  • 3.scroll系列
    scrollWidth/scrollHeight:和clientWidth/clientHeight一样(前提是
    内容没有溢出的情况下)如果内容溢出,我们获取的结果是如下规则
    scrollWidth:真是内容的宽度(包含溢出)+左填充
    scrollHeight:真是内容的高度(包含溢出)+上填充
    但是获取的值都是约等于值;因为同一个浏览器是否设置overflow:hidden是有影响的
    在不同的浏览器中获取到的结果是不同的
    scrollLeft和scrollTop:滚动条卷去(滚动条挡住的那部分)的宽度和高度
    关于JS盒子模型取值的问题
    我们通过13个属性值获取的结果永远不可能出现小数,都是整数,浏览器在计算结果的时候,在原来真是结果上四舍五入
    关于操作浏览器本身的盒子模型信息
    clientWidth/clientHeight 是当前浏览器可视区域的宽度和高度
    scrollWidth/scrollHeight是当前页面的真是高度和宽度(是一个约等于值)
    我们不管是那些属性,也不管是什么浏览器,不管是获取还是设置,想要都兼容都要写两套(必须document.documentElement在前)
    document.documentElement[attr] || document.body[attr]
    document.documentElement.clientHeight || document.body.clientHeight
    document.documentElement.scrollTop=0
    document.body.scrollTop=0
    编写一个有关于浏览器盒子模型的方法
    如果值传递了attr没有传递value ,默认的意思是获取样式值
    如果传了两个,意思是设置
    不严谨说这就是;类的重载:同一个方法,通过参数不同执行不同操作
    var box=document.getElementById('box');
    function win(attr,value) {
       if(typeof  value==='undefined'){//没有传递value值 属于获取
           return document.documentElement[attr] || document.body[attr]
       }
       //设置
       document.documentElement[attr]=value;
       document.body[attr]=value;
   }

获取元素的某一个具体的样式属性值
1.元素.style.属性名(需要我们把元素的样式写在行内样式中)不常用
2.在window中的getComputedStyle获取所有经过浏览器计算过的样式
浏览器计算过的样式:只要当前元素标签可以在页面中呈现出来,那么他的所有样式都是经过浏览器计算过的(渲染)->哪怕这些样式你没有写,我们也可以获取到,但是不兼容IE6-8,获取的结果是CSSStyleDeclaration这个类的一个实例:包含了当前元素所有样式属性和值
window.getComputedStyle(当前要操作的元素,当前元素的伪类(一般我们不用就写null))
window.getComputedStyle->function
window.getComputedStyle(box,null).width['width']
IE6-8:使用currentStyle来获取浏览器计算过的样式 box.currentStyle.width
兼容写法
getCss:获取当前元素所有经过浏览器计算过样式中的[attr]对应的值
curEle:[object]当前要操作的元素对象
attr:[string] 我们要获取样式属性名称
使用try catch 来处理兼容
前提:必须保证try中代码在不兼容浏览器中执行的时候报错,这样的话我们才可以用catch捕获到异常的信息,进行其他的处理
问题:不管当前的是什么浏览器,都要把try中代码执行一遍,如果当前是IE7,window.getComputedStyle本身是不兼容的,但是我们也要先把代码执行一遍,报错了在把currentStyle执行一遍

 function getCss(curEle,attr) {
               var val=null;
              try {
                 val= window.getComputedStyle(curEle,null)[attr]
              }catch (e){
                  val=curEle.currentStyle[attr]
              }
              return val;
            }

var outer=document.getElementById('outer');
var inner=document.getElementById('inner');
var center=document.getElementById('center');

  • 1.parentNode:父亲节点 HTML结构层级关系中的上一级元素
    center.parentNode ->inner
    inner.parentNode ->outer
    outer .parentNode ->body
    document.body.parentNode ->html
    document.documentElement.parentNode ->document
  • 2.offsetParent:父级参照物,在同一个平面中,最外层的元素是里面所有元素的父级参照物(和HTML层级结构没关系)
    一般来说一个页面中的所有元素参照物都是body
    center.offsetParent ->body
    inner.offsetParent->body
    outer .offsetParent ->body
    document.body.offsetParent ->null
    改变父级参照物需要通过position定位来改变
    outer.style.position='relative' position fixed 任意一个值都可以把腹肌参照物进行修改
    outer.style.position='relative'
    inner.style.position='relative'
    center.offsetParent ->inner
    inner.offsetParent->outer
    outer .offsetParent ->body
  • 3.offsetTop/offsetLeft:当前元素(外边框)距离父级参照物(内边框)的偏移距离
    offset:等同于JQ中的offset方法,实现获取页面中任意一个元素距离Body的偏移量(包含左和上),不管当前元素的父级参照物是谁; 获取到的结果是一个对象{left:左偏移量,top:上偏移量},在标准的IE8中,我们使用offsetLeft/offsetTop其实把父级参照物的边框已经算到里边了,所以 不需要我们自己单独加边框了
 function offset(curEle) {
     var totalLeft=null,totalTop=null,par=curEle.offsetParent;
         totalLeft+=curEle.offsetLeft;
         totalTop=curEle.offsetTop;
         //只要没有找到body 我们就把父级参照物的边框和偏移也进行累加
         while(par){
             if(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}
  }

js盒子模型中:
1.client系列/offset系列/scrollWidth/scrollHeight都是“只读”属性-》
只能通过属性获取值,不能通过属性修改元素的样式
2.scrollTop和scrollLeft:滚动条卷去的高度/宽度(这两个属性是唯一“可读写”属性)
box.scrollTop=0; ==>直接回到了容器顶部
我们的scrollTop的值是存在边界值的(最大值和最小值),我们设置的值比最小值小
或者比最大值大都没用,祈祷效果的依然是边界值 最小值为0 最大值是真实高度减去
当前容易一屏幕的高度
box.scrollTop=-1000; 直接回到了容器的顶部,没有超出
JS中的两种编程思想:同步和异步
JS是单线程-》只能做一件事情,没完成之前,绝对不会做下一件事情--------->同步(js中大部分都是同步编程)
for循环就是同步编程的,只有循环结束后,才会继续向下执行
2.异步编程:首先规划要做一件事情,但是不是当前立马去执行这件事情,需要等一定时间,这样的话,我们不会等着他执行,
而是继续执行下面的操作,只有当下面的事情处理完了,才会返回头处理之前的事情,如果下面的事情并没有处理完成,不管之前的事情有没有时间,都踏踏实实的等着
在JS中异步编程自由四种情况:定时器、所有的事件绑定、AJAX获取数据、回调函数

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

推荐阅读更多精彩内容