Bootstrap

dom操作获取盒子宽高位置的三种方法,offset/scroll/client三大家族使用详解(附源码及注释)

结论:页面body的高度==视口的高度+滚动条滚动的距离。

这是一个恒等式,看完本篇博客,你将了解offset/scroll/clent三大事件获取宽高位置的具体含义,运用所学内容可以推导出这样的恒等式。

js代码及注释如下:  

  // offsetWidth / offsetHeight 获取盒子自身宽高(width+border+padding的值)
  // offsetLeft / offsetTop     获取盒子自身左/上外边框到定位父元素的距离(width+border+padding的值)

  // 1.1获取元素
  let box = document.querySelector('.box')
  /* console.log(box.offsetWidth);//560px=500+20*2+10*2,即width+border+padding的值 */
  /* console.log(box.offsetHeight);//360px=300+20*2+10*2,即width+border+padding的值 */
  /* console.log(box.offsetLeft);//360px=300+20*2+10*2,即width+border+padding的值 */
  /* console.log(box.offsetTop);//360px=300+20*2+10*2,即width+border+padding的值 */

  //2.scroll家族
  // scrollWidth / scrollHeight 获取盒子内容宽高(ps:内容宽度=width+padding-滚动条自身宽度的值,也就是可视内容的宽,即视口的宽度)
  // scrollLeft / scrollTop     获取滚动条滚动的距离

  // 为box注册鼠标滚动事件
  box.onscroll = function () {
    console.log(box.scrollWidth);//503px=500+10*2-17(滚动条自身的宽度),即width+左右padding-滚动条自身宽度的值
    console.log(box.scrollHeight);//419px=300+10*2-17+box.scrollTop最大的值,内容的高度=height+上下padding-滚动条自身高度的值+滚动条可以滚动的最大距离=可视内容的高度+滚动条可以滚动的最大距离
    console.log(box.scrollLeft);//0,滚动条左右滚动的距离,下方无滚动条,所以滚动距离为0
    console.log(box.scrollTop);//滚动条垂直滚动的距离
  }

  //重点小技巧:获取页面滚动距离两步走
  //(1)给window注册滚动事件:window.onscroll
  //(2)获取html的滚动距离:document.documentElement.scrollTop

  //3.client家族:获取可视内容的宽高,常应用于响应式布局获取页面的宽高
  console.log(box.clientWidth);//503px=500+20*2-17,即width+左右padding-滚动条自身宽度的值(可视内容的宽度)
  console.log(box.clientHeight);//303px=300+10*2-17,即height+上下padding的值-下方滚动条自身的高度(也叫作可视内容的高度)
  console.log(box.clientLeft);//20px,即width+border+padding的值
  console.log(box.clientTop);//20px,即width+border+padding的值

(1)页面显示效果如图(未触发滚动条), 浏览器页面显示效果,控制台输出了用offset及client获取元素宽高及位置,具体释意请详见文末的js注释;

(2)当触发滚动条滚动时,也就可以获取滚动条滚动的距离(注意看控制台的结果)

设置css样式

  <style>
    body {
      height: 2000px;
    }

    .box {
      width: 500px;
      height: 300px;
      border: 20px solid skyblue;
      padding: 10px;
      margin: 100px auto;
      overflow: scroll;
      color: coral;
    }
  </style>

设置html:   

 <div class="box">
    任公曰:造成今日之老大中国者,则中国老朽之冤业也。制出将来之少年中国者,则中国少年之责任也。彼老朽者何足道,彼与此世界作别之日不远矣,而我少年乃新来而与世界为缘。如僦屋(45)者然,彼明日将迁居他方,而我今日始入此室处。将迁居者,不爱护其窗栊,不洁治其庭庑(46),俗人恒情,亦何足怪!若我少年者,前程浩浩,后顾茫茫。中国而为牛为马为奴为隶,则烹脔(47)鞭棰之惨酷,惟我少年当之。中国如称霸宇内,主盟地球,则指挥顾盼之尊荣,惟我少年享之。于彼气息奄奄与鬼为邻者何与焉?彼而漠然置之,犹可言也。我而漠然置之,不可言也。使举国之少年而果为少年也,则吾中国为未来之国,其进步未可量也。使举国之少年而亦为老大也,则吾中国为过去之国,其澌亡可翘足而待也。故今日之责任,不在他人,而全在我少年。少年智则国智,少年富则国富;少年强则国强,少年独立则国独立;少年自由则国自由;少年进步则国进步;少年胜于欧洲则国胜于欧洲
    [1] ;少年雄于地球则国雄于地球。红日初升,其道大光(48)。河出伏流,一泻汪洋。潜龙腾渊,鳞爪飞扬。乳虎啸谷,百兽震惶。鹰隼试翼,风尘翕张(又作风尘吸张 [2]
    )。奇花初胎,矞矞皇皇(49)。干将发硎,有作其芒(50)。天戴其苍,地履其黄。纵有千古,横有八荒。前途似海,来日方长。美哉我少年中国,与天不老!壮哉我中国少年,与国无疆!
  </div>

 js源码及对offset/scroll/client详细注解,注释中有详细运行结果

//1.offset家族
  // offsetWidth / offsetHeight 获取盒子自身宽高(width+border+padding的值)
  // offsetLeft / offsetTop     获取盒子自身左/上外边框到定位父元素的距离(width+border+padding的值)

  // 1.1获取元素
  let box = document.querySelector('.box')
  /* console.log(box.offsetWidth);//560px=500+20*2+10*2,即width+border+padding的值 */
  /* console.log(box.offsetHeight);//360px=300+20*2+10*2,即width+border+padding的值 */
  /* console.log(box.offsetLeft);//360px=300+20*2+10*2,即width+border+padding的值 */
  /* console.log(box.offsetTop);//360px=300+20*2+10*2,即width+border+padding的值 */

  //2.scroll家族
  // scrollWidth / scrollHeight 获取盒子内容宽高(ps:内容宽度=width+padding-滚动条自身宽度的值,也就是可视内容的宽,即视口的宽度)
  // scrollLeft / scrollTop     获取滚动条滚动的距离

  // 为box注册鼠标滚动事件
  box.onscroll = function () {
    console.log(box.scrollWidth);//503px=500+10*2-17(滚动条自身的宽度),即width+左右padding-滚动条自身宽度的值
    console.log(box.scrollHeight);//419px=300+10*2-17+box.scrollTop最大的值,内容的高度=height+上下padding-滚动条自身高度的值+滚动条可以滚动的最大距离=可视内容的高度+滚动条可以滚动的最大距离
    console.log(box.scrollLeft);//0,滚动条左右滚动的距离,下方无滚动条,所以滚动距离为0
    console.log(box.scrollTop);//滚动条垂直滚动的距离
  }

  //重点小技巧:获取页面滚动距离两步走
  //(1)给window注册滚动事件:window.onscroll
  //(2)获取html的滚动距离:document.documentElement.scrollTop

  //3.client家族:获取可视内容的宽高,常应用于响应式布局获取页面的宽高
  console.log(box.clientWidth);//503px=500+20*2-17,即width+左右padding-滚动条自身宽度的值(可视内容的宽度)
  console.log(box.clientHeight);//303px=300+10*2-17,即height+上下padding的值-下方滚动条自身的高度(也叫作可视内容的高度)
  console.log(box.clientLeft);//20px,即width+border+padding的值
  console.log(box.clientTop);//20px,即width+border+padding的值

</script>
;