JavaScript DOM元素尺寸和位置


Posted in Javascript onApril 13, 2015

一 获取元素的CSS大小

 1.通过style内联获取元素的大小

 

     var box = document.getElementById('box');    // 获得元素;

     box.style.width;                             // 200px;

     box.style.height;                            // 200px;

// PS:style获取只能取到行内style属性的CSS样式中的宽和高,如果有,则获取;如果没有则返回空;

2.通过计算获取元素的大小

     var style = window.getComputedStyle ? window.getComputedStyle(box,null) : null || box.currentStyle;

     style.width;                                // 200px;

 // PS:通过计算获取元素的大小,无关是行内/内联或链接,它返回经过计算后的结果;
 // 如果本身设置大小,它会返回元素的大小;如果本身没有设置,非IE会返回默认的大小,IE会返回auto;

3.通过CSSStyleSheet对象中的cssRules(或rules)属性获取元素的大小;

     var sheet = document.styleSheets[0];            // 获取link或style;

     var rule = (sheet.cssRules || sheet.rules)[0];  // 获取第一条规则;

     rule.style.width;                               // 200px;

PS:cssRules只能获取到内联和链接样式的宽和高,不能获取到行内和计算后的样式;

总结:以上三种CSS获取元素大小的方法,只能获取元素的CSS大小,却无法获取元素本身实际的大小;比如加上内边距/滚动条/边框之类的;

二 获取元素实际大小

1.clientWidth和clientHeight

 这组属性可以获取元素可视区的大小,包含元素内容及内边距所占据的空间大小;
    box.clientWidth;                                // 200;
     PS:返回了元素大小,但没有单位,默认单位是px;
     PS:对于元素的实际大小,clientWidth和clientHeight理解如下:
     1.元素增加边框,无变化,200;
     2.元素增加外边框,无变化,200;
     3.增加滚动条,最终值=原本大小-滚动条大小;184;
     4.增加内边距,最终值=原本大小+内边距大小;220;
 PS:如果没有设置任何CSS的width和height,那么非IE会算上滚动条和内边距的计算后的大小;而IE则返回0;

2.scrollWidth和scrollHeight

 这组属性可以获取没有滚动条的情况下,元素内容的总高度;
    box.scrollWidth;
    // PS:返回了元素大小,默认单位是px;如果没有设置任何CSS的width和height,它会得到计算后的宽度和高度;

3.offsetWidth和offsetHeight

 这组属性可以返回元素实际大小,包含边框/内边距和滚动条;
    box.offsetWidth;                                 200
     PS:返回了元素大小,默认单位是px;如果没有设置任何CSS的width和height,它会得到计算后的宽度和高度;
     PS:对于元素的实际大小,理解如下:
     1.增加边框,最终值=原本大小+边框大小;220;
     2.增加内边距,最终值=原本大小+内边距大小;220;
     3.增加外边据,无变化;
     4.增加滚动条,无变化,不会减小;

 PS:对于元素大小的获取,一般是块级(block)元素并且已设置了CSS大小的元素较为方便;

三 获取元素周边大小

 1.clientLeft和clientTop
 // 这组属性可以获取元素设置了左边框和上边框的大小;
     box.clientLeft;                                     // 获取左边框的宽度;

2.offsetLeft和offsetTop(偏移量)

// 这组属性可以获取当前元素边框相对于父元素边框的位置;
  box.offsetLeft;                  // 50;
  // PS:获取元素当前相对于父元素的位置,最好将它设置为定位position:absolute;
  // PS:加上边框和内边距不会影响它的位置,但加上外边据会累加;

  box.offsetParent;                 // 得到父元素;
  // PS:offsetParent中,如果本身父元素是<body>,非IE返回body对象,IE返回html对象;
  // 如果两个元素嵌套,如果上级父元素没有使用定位position:absolute,那么offsetParent将返回body或html对象;

// 如果说在很多层次里,外层已经定位,获取任意一个元素距离页面上的位置,可以不停的向上回溯获取累加来实现;
  box.offsetTop+box.offsetParent.offsetTop;     // 只有两层的情况下;
  // 如果多层的话,就必须使用循环或递归;
  function offsetLeft(element){
    var left = element.offsetLeft;        // 得到第一层距离;
    var parent = element.offsetParent;      // 得到第一个父元素;
    while(parent !== null){            // 判断如果还有上一层父元素;
      left += parent.offsetLeft;        // 将得到的距离累加;
      parent = parent.offsetParent;       // 将父元素也回溯;
    }                       // 然后循环;
    return left;                 // 得到最终距离;
  }

3.scrollTop和scrollLeft

// 这组属性可以获取被滚动条隐藏的区域大小,也可设置定位到该区域;
  box.scrollTop;                  // 获取滚动内容上方的位置;

// 设置滚动条滚动到最初始的位置;
  function scrollStart(element){
    if(element.scrollTop != 0){
      element.scrollTop = 0;
    }
  }

四 getBoundingClientRect()方法

// 这个方法返回一个矩形对象,包含四个属性:left/top/right和bottom;
// 分别表示元素各边与页面上边和左边的距离;
  var box = document.getElementById('box');
  alert(box.getBoundingClientRect().top);    // 元素上边距离页面上边的距离;
  alert(box.getBoundingClientRect().right);   // 元素右边距离页面左边的距离;
  alert(box.getBoundingClientRect().bottom);   // 元素下边距离页面上边的距离;
  alert(box.getBoundingClientRect().left);    // 元素左边距离页面左边的距离;
  // PS:IE/Firefox/Opera/Chrome/Safari都支持;
  // 但在IE中,默认坐标从(2,2)开始计算,导致最终距离比其他浏览器多出两个像素;
  document.documentElement.clientTop;      // 非IE为0,IE为2;
  document.documentElement.clientLeft;      // 非IE为0,IE为2;
// 兼容getBoundingClientRect()
  function getRect(element){
    var rect = element.getBoundingClientRect();
    var top = document.documentElement.clientTop;
    var left = document.documentElement.clientLeft;
    return {
      top:rect.top-top,           // 元素上边距-页面的上边距(0-0或2-2);
      bottom:rect.bottom-top,
      left:rect.left-left,         // 元素左边距-页面的左边距(0-0或2-2);
      right:rect.right-left
    }
  };

五 小结

1.偏移量(offset dimension):包括元素在屏幕上占用的所有可见的空间;
元素的可见大小由其高度和宽度决定,包括内边距/滚动条和边框;
2.客户区大小(client dimension):指的是元素内容及其内边距所占据的空间大小;
3.滚动大小(scroll dimension):包含滚动内容的元素的大小;

Javascript 相关文章推荐
动态创建的表格单元格中的事件实现代码
Dec 30 Javascript
Array.prototype.slice.apply的使用方法
Mar 17 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
Dec 29 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
Dec 01 Javascript
原生javascript实现解析XML文档与字符串
Mar 01 Javascript
Javascript之BOM(window对象)详解
May 25 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
jQuery点击头像上传并预览图片
Feb 23 Javascript
用js将long型数据转换成date型或datetime型的实例
Jul 03 Javascript
vue微信分享 vue实现当前页面分享其他页面
Dec 02 Javascript
新手简单了解vue
May 29 Javascript
canvas绘制折线路径动画实现
May 12 Javascript
JavaScript DOM操作表格及样式
Apr 13 #Javascript
JavaScript DOM进阶方法
Apr 13 #Javascript
JavaScript DOM基础
Apr 13 #Javascript
JavaScript 浏览器对象模型BOM使用介绍
Apr 13 #Javascript
JavaScript 匿名函数和闭包介绍
Apr 13 #Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
Apr 13 #Javascript
为什么JS中eval处理JSON数据要加括号
Apr 13 #Javascript
You might like
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
thinkphp连贯操作实例分析
2014/11/22 PHP
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
2013/06/25 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
关于json字符串与实体之间的严格验证代码
2016/11/10 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
会计专业毕业生自我鉴定
2013/10/29 职场文书
便利店投资创业计划书
2014/02/08 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
求职信范文怎么写
2015/03/19 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
python3操作redis实现List列表实例
2021/08/04 Python
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python
Go语言并发编程 sync.Once
2021/10/16 Golang
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server