Javascript中的盒子模型

作者: icessun | 来源:发表于2017-05-17 22:54 被阅读63次

说起盒子模型,我们首先会想到css盒子模型,主要是针对标准浏览器和非标准浏览器而言,其由四个部分组成:手动设置的宽高+padding(内边距)+border+margin(外边距)
当然,我们的js也有所谓的盒子模型,主要是通过元素身上的属性和方法,来获取元素身上的样式值

client系列:可视区,视口,浏览器客户端

  • clientWidth:手动设置的宽度(内容区)+左右padding宽(内边距),一般也就是内容可视区的宽度
  • clientHeight:手动设置的高度+上下padding,内容可视区的高度
  • clientLeft:左边框的宽度,几乎不用
  • clientTop:上边框的宽度

offset系列:偏移量,只能获取不是设置,得到的是数值

  • offsetWidth:手动设置的宽度(内容区域)+左右padding宽(内边距)+左右的border
    • 也可以说是:clientWidth+左右的border
  • offsetHeight:手动设置的高度+上下padding宽+上下的border宽,获取的是数值,不带单位,只能获取不能设置,可以获取行内样式和内嵌样式
    • 也可以说是:clientHeight+上下的border
  • offsetLeft:当前元素的外边框距离最近的定位父级元素的内边框的距离,border到定位父级元素的内边框的距离,不包括border宽度
  • offsetTop:当前元素的外边框距离他定位父级元素的内边框的距离
通过offserLeft和offsetTop可以计算一个元素的位置
// 思路:计算一个元素的位置  那么要传入这个元素参数,返回位置(以对象的形式返回)
function getElePosition(ele){
    var x=0,y=0;
    while(ele!=null){
         x+=e.offsetLeft;
         y+=e.offsetTop;
         e=e.offsetParent;
     }
     return {
                x:x,
                y:y
            };

}
  • offsetParent:元素定位的父级

scroll系列:滚动区

  • scrollWidth:内容未溢出的情况下,这个值等于clientWidth实际内容的宽度
  • scrollHeight:内容未溢出的情况下,这个值等于clientHeight实际内容的高度
  • scrollLeft:页面被浏览器卷去的宽度,这属性是可写的,设置来让元素中的内容滚动
  • scrollTop:页面被浏览器卷去的高度,这属性是可写的,设置来让元素中的内容滚动
  • 在内容溢出的情况下,不同的浏览器拿到的值是不同的;就算是同一浏览器,内容是否溢出拿到的值也不同;当内容溢出的时候,scrollHeight约等于:内容真实的高度+上padding

JS盒子模型兼容的写法

if(document.compatMode == "BackCompat") {//渲染方式
    wHeight = document.body.clientHeight;
}else {//"CSS1compat"
    wHeight = document.documentElement.clientHeight;
}

其他的补充

  • clientX:鼠标到可视区左边框的距离
  • clientY:鼠标到可视区上边框的距离
  • offsetX:鼠标到容器左边框的距离
  • offsetY:鼠标到容器上边框的距离

封装思想

由于上面的js盒子模型中,我们遇到几个问题:1. 取到的值都是复合值,无法取到单独的宽和高;2. 盒子的偏移量只能取到当前元素外边框到定位父级元素内边框的距离,无法获取当前元素到body的距离;3. 求可视区的宽高和被浏览器卷去的宽度和高度比较麻烦;基于上面的一些问题,我们可以进行封装。

  • 属性的判断:
    • .点:if(obj.xxx),结果转布尔值:如果对象上面有这个属性就会进入if条件判断语句,或者是:typeof obj.xxx=='function'把其放在条件判断语句中。属性是变量的时候只能用[]来获取,
    • in属性 in 对象getComputedStyle in window
  • 要是报错,我们可以用try...catch(e){..}捕获
  • 然后用正则去匹配一些我们需要的结果:reg.test()str.search(reg)===-1reg.test()和reg.exec()会影响到reg.lastIndex()的值
    • 字符串跟正则配合的方法:
      • replace()
      • macth()
      • split()str.split(/[^\d]+/g)
      • search()

区别结构父级和定位父级

结构父级:parentNode,其最大的元素是Html
定位父级:offsetParent,其最大的元素是body

<body class="body">
<div class="divOuer" id="divOuer">divOuter
    <div class="divCenter" id="divCenter">divCenter //这个相对定位
        <div class="divInner" id="divInner">divInner</div> //这个绝对定位
    </div>
</div>


<script>
    var oInner=document.getElementById('divInner');
    //需求:想找到所有的结构父级;思路:必须先找到第一个结构父级,一层层往上找;
    var par=oInner.parentNode;
    while(par){
        alert(par.className);  //结果是:divCenter divOuter body html undefined(说明className不能加到!DOCTYPE html上面)
        par=par.parentNode;
    }
    //需求:找到inner所有的定位父级
   var par=oInner.offsetParent;
  while(par){
       alert(par.className); // 结果是:divOuer body
        par=par.offsetParent;
    }
</script>

相关文章

  • Javascript中的盒子模型

    说起盒子模型,我们首先会想到css盒子模型,主要是针对标准浏览器和非标准浏览器而言,其由四个部分组成:手动设置的宽...

  • React笔记 -- Node节点

    moment -- JavaScript 日期处理类库 CSS 弹性盒子模型

  • 盒子模型

    CSS盒子模型 **盒子模型解释 **元素在页面中显示成一个方块,类似一个盒子,CSS盒子模型就是使用现实中盒子来...

  • 2018-09-03CSS盒子模型+margin-top塌陷+C

    CSS盒子模型 **盒子模型解释 **元素在页面中显示成一个方块,类似一个盒子,CSS盒子模型就是使用现实中盒子来...

  • 前端盒子模型学习

    内容概要 本文主要学习盒子模型,以及两种盒子模型有什么区别,如何使用,如何变化。 盒子模型 CSS中的盒子模型就是...

  • 前端一些面试题

    HTML 和 CSS 面试题 盒子模型 CSS 中盒子模型包括 IE 盒子模型和标准的 W3C 盒子模型。W3C ...

  • 前端学习感悟

    HTML的基本结构和常用标记及属性 CSS中的盒子模型、相对布局、绝对布局 在JavaScript当中为我们提供了...

  • JavaScript进阶教程-3.dom盒子模型实战和dom库封

    盒子模型和盒子偏移量 js中的盒子模型clientHeight 高度+上下填充clientWidth 宽度+左右...

  • 盒模型

    简介 就是用来装页面上的元素的矩形区域。CSS中的盒子模型包括IE盒子模型和标准的W3C盒子模型。 标准盒子模型标...

  • JavaScript盒子模型及其属性

    JavaScript盒子模型,指的是通过JavaScript中提供的一系列的属性和方法,获取页面中元素的样式信息值...

网友评论

    本文标题: Javascript中的盒子模型

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