JavaScript获取元素尺寸和大小操作总结


Posted in Javascript onFebruary 27, 2015

一、获取元素的行内样式

var obj = document.getElementById("test");

alert(obj.height + "\n" + obj.width);

// 200px 200px typeof=string只是将style属性中的值显示出来

二、获取计算后的样式

var obj = document.getElementById("test");

var style = null;

if (window.getComputedStyle) {

    style = window.getComputedStyle(obj, null);    // 非IE

} else { 

    style = obj.currentStyle;  // IE

}

alert("width=" + style.width + "\nheight=" + style.height);

注意:如果不设置元素的宽度和高度,那么在非IE浏览器下返回默认的宽度和高度。在IE下面返回auto字符串

三、获取<link>和<style>标签写入的样式

var obj = document.styleSheets[0]; // [object StyleSheetList] 样式表的个数<link>var rule = null;// [object CSSRule]

if (obj.cssRules){

    rule = obj.cssRules[0];  // 非IE [object CSSRuleList]

} else {

    rule = obj.rules[0];     // IE [object CSSRuleList]

} 

alert(rule.style.width);

cssRules(或rules)只能获取到内联和链接样式的宽和高,不能获取到行内和计算后的样式。

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

四、获取元素的实际大小

1. clientWidth和clientHeight
    这组属性可以获取元素可视区的大小,可以得到元素内容及内边距所占据的空间大小。返回了元素大小,但没有单位,默认单位是px,如果你强行设置了单位,比如100em之类,它还是会返回px的大小。(CSS获取的话,是照着你设置的样式获取)。对于元素的实际大小,clientWidth和clientHeight理解方式如下:
    a. 增加边框,无变化;
    b. 增加外边距,无变化;
    c. 增加滚动条,最终值等于原本大小减去滚动条的大小;
    d. 增加内边距,最终值等于原本大小加上内边距的大小;

<div id="test"></div>

#test{

    background-color: green;

    width: 200px;

    height: 200px;

    border: solid 5px red;  /* 对应a理解,结果:200,200 */

    margin: 10px;  /* 对应b理解,结果:200,200*/

    padding: 20px;  /* 对应c理解,结果:240,240*/

    overflow: scroll;  /* 对应d理解,结果:223,223,223=200(css大小)+40(两边内边距)-17(滚动条宽度)*/

}

window.onload = function(){

    var obj = document.getElementById("test");

    alert(obj.clientWidth + "," + obj.clientHeight);

};

注意:如果说没有设置任何CSS的宽和高度,那么非IE浏览器会算上滚动条和内边距的计算后的大小,而IE浏览器则返回0(IE8已修复)。

2. scrollWidth和scrollHeight
    这组属性可以获取滚动内容(可见内容)的元素大小。返回了元素大小,默认单位是px。如果没有设置任何CSS的宽和高度,它会得到计算后的宽度和高度。对于元素的实际大小,scrollWidth和scrollHeight理解如下:
    1. 增加边框,不同浏览器有不同解释(下面在IE8中运行正常,IE6运行不正常):
a) Firefox和Opera浏览器会增加边框的大小,220x220
b) IE、Chrome和Safari浏览器会忽略边框大小,200x200
c) IE浏览器只显示它本来内容的高度,200x18(IE8已经修改该问题)
    2. 增加内边距,最终值会等于原本大小加上内边距大小,220x220,IE为220x38
    3. 增加滚动条,最终值会等于原本大小减去滚动条大小,184x184,IE为184x18
    4. 增加外边据,无变化。
    5. 增加内容溢出,Firefox、Chrome和IE获取实际内容高度,Opera比前三个浏览器获取的高度偏小,Safari比前三个浏览器获取的高度偏大。

3. offsetWidth和offsetHeight
    这组属性可以返回元素实际大小,包含边框、内边距和滚动条。返回了元素大小,默认单位是px。如果没有设置任何CSS的宽和高度,他会得到计算后的宽度和高度。对于元素的实际大小,offsetWidth和offsetHeight理解如下:
    1.增加边框,最终值会等于原本大小加上边框大小,为220;
    2.增加内边距,最终值会等于原本大小加上内边距大小,为220;
    3.增加外边据,无变化;
    4.增加滚动条,无变化,不会减小;
    对于元素大小的获取,一般是块级(block)元素并且以设置了CSS大小的元素较为方便。如果是内联元素(inline)或者没有设置大小的元素就尤为麻烦,所以,建议使用的时候注意。

<div id="test">test div element</div>

#test{

    background-color: green;

    width: 200px;

    height: 200px;

    border: solid 10px red; /*结果:220,220*/

    margin: 10px; /*结果:220,220(无变化)*/

    padding: 10px; /*结果:240,240*/

    overflow:scroll; /*结果:240,240(无变化)*/

}

window.onload = function(){

    var obj = document.getElementById("test");

    alert(obj.offsetWidth + "," + obj.offsetHeight);

};

五、获取元素周边大小
1. clientLeft和clientTop获取边框大小
    这组属性可以获取元素设置了左边框和上边框的大小。目前只提供了Left和Top这组,并没有提供Right和Bottom。如果四条边宽度不同的话,可以直接通过计算后的样式获取,或者采用以上三组获取元素大小的减法求得。
右边框的宽度:obj.offsetWidth-obj.clientWidth-obj.clientLeft
底边框的宽度:obj.offsetHeight-obj.clientHeight-obj.clientTop

<div id="test">test div element</div>

#test{

    background-color: green;

    width: 200px;

    height: 200px;

    border-top: solid 10px red;s

    border-right: solid 20px #00ff00;

    border-bottom: solid 30px blue;

    border-left: solid 40px #808080; 

}

window.onload = function(){

    var obj = document.getElementById("test");

    alert(obj.clientLeft + "," + obj.clientTop); // 40,10

};

2. offsetLeft和offsetTop   
    这组属性可以获取当前元素相对于父元素的位置。获取元素当前相对于父元素的位置,最好将它设置为定位position:absolute;否则不同的浏览器会有不同的解释。
a、将position设置为absolute,则所有浏览器返回一样的值。如:

<div id="test">test div element</div>

#test{

    background-color: green;

    width: 200px;

    height: 200px;

    position: absolute;

    left: 30px;

    top: 20px;

}

window.onload = function(){

    var obj = document.getElementById("test");

    alert(obj.offsetLeft + "," + obj.offsetTop); // 30, 20

};

b、加上边框和内边距不会影响它的位置,但加上外边据会累加。

3、box.offsetParent得到父元素
    offsetParent中,如果本身父元素是<body>,非IE返回body对象,IE(IE6)返回html对象。如果两个元素嵌套,如果上父元素没有使用定位position:absolute,那么offsetParent将返回body对象或html对象。所以,在获取offsetLeft和offsetTop时候,CSS定位很重要。
    如果说,在很多层次里,外层已经定位,我们怎么获取里层的元素距离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;

}

4.scrollTop和scrollLeft
    这组属性可以获取滚动条被隐藏(滚动条上方区域)的区域大小,也可设置定位到该区域。如果要让滚动条滚动到最初始的位置,那么可以写一个函数:

function scrollStart (element) {

    if ( element.scrollTop != 0 ) {

        element.scrollTop = 0;

    }

}

5、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);         // 元素左边距离页面左边的距离

注意:IE、Firefox3+、Opera9.5、Chrome、Safari支持,在IE中,默认坐标从(2,2)开始计算,导致最终距离比其他浏览器多出两个像素,我们需要做个兼容。

document.documentElement.clientTop; //非IE为0,IE为2

document.documentElement.clientLeft; //非IE为0,IE为2

functiongGetRect (element) {

    var rect = element.getBoundingClientRect();

    var top = document.documentElement.clientTop;

    var left= document.documentElement.clientLeft;

    return{

        top  :   rect.top - top,

        bottom  :   rect.bottom - top,

        left  :   rect.left - left,

        right  :    rect.right - left

    }

}

分别加上外边据、内边距、边框和滚动条,用于测试所有浏览器是否一致。

以上就是本文所述的全部内容了,希望小伙伴们能够喜欢。

Javascript 相关文章推荐
javascript parseInt与Number函数的区别
Jan 21 Javascript
新鲜出炉的js tips提示效果
Apr 03 Javascript
JS获取当前网页大小以及屏幕分辨率等
Sep 05 Javascript
BootStrap3学习笔记(一)之网格系统
May 20 Javascript
AngularJS $injector 依赖注入详解
Sep 14 Javascript
js实现textarea限制输入字数
Feb 13 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
Mar 21 jQuery
javascript过滤数组重复元素的实现方法
May 03 Javascript
微信小程序开发之实现自定义Toast弹框
Jun 08 Javascript
javascript中的replace函数(带注释demo)
Jan 07 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 Javascript
使用vue制作滑动标签
Sep 21 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
Feb 27 #Javascript
Javascript writable特性介绍
Feb 27 #Javascript
jQuery实现DIV层收缩展开的方法
Feb 27 #Javascript
JavaScript函数详解
Feb 27 #Javascript
浅谈JavaScript的事件
Feb 27 #Javascript
JS实现图片放大镜效果的方法
Feb 27 #Javascript
浅谈javascript中的instanceof和typeof
Feb 27 #Javascript
You might like
PHP之变量、常量学习笔记
2008/03/27 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
使用python Django做网页
2013/11/04 Python
gearman的安装启动及python API使用实例
2014/07/08 Python
python 获取网页编码方式实现代码
2017/03/11 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
利用python如何处理nc数据详解
2018/05/23 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
wxPython的安装与使用教程
2018/08/31 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
Python PIL图片添加字体的例子
2019/08/22 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
python Tensor和Array对比分析
2020/01/08 Python
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
《花的勇气》教后反思
2014/02/12 职场文书
服务理念口号
2014/06/11 职场文书
城市规划应届生推荐信
2014/09/08 职场文书
七一建党节演讲稿
2014/09/11 职场文书
关于倡议书的范文
2015/04/29 职场文书
杨善洲电影观后感
2015/06/04 职场文书
投资入股协议书
2016/03/22 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书