JavaScript中尺寸、坐标

测试环境是IE8,Chrome38,Firefox40,下面是全局通用脚本打印代码

/**
* 打印
*/
function write(str) {
    document.write(str + ‘<br/>‘);
}

一、尺寸

在container外面我还套了个container_out,宽度为1000px,方便演示用,HTML代码如下:

<div class="container_out">
    <div id="container"></div>
</div>
var container = document.getElementById(‘container‘);

/**
* 通用获取CSS属性
*/
function getStyle(el, name) {
    if(window.getComputedStyle) {//标准浏览器
        return window.getComputedStyle(el, null).getPropertyValue(name);
    }else {//IE浏览器
      //需要变成驼峰方式
        name = name.replace(/\-(\w)/g, function(word, first) {
            return first.toUpperCase();
        });
        return el.currentStyle.getAttribute(name);
    }
}

1)CSS获取width、height

分别在container中,width写为200px、10%和不设置。

/**
* 使用CSS,px %,不设置
*/
var cssWidth = getStyle(container, ‘width‘);
write(cssWidth);

在3个浏览器中展现的有所不同,如下面表格中所示,IE展现的就是比较与众不同:

 
firefox

chrome IE8
width:200px
200px

200px 200px
width:10%
100px

100px 10%
宽度不设置
956px

956px  auto
display:none;width:200px
200px

200px 200px
display:none;宽度不设置
auto

auto auto
position:absolute;width:200px
200px

200px 200px
position:absolute;宽度不设置
0px

0px auto

2)offsetWidth、offsetHeight

offsetWidth = width+padding+border

offsetHeight = height+padding+border

/**
* offsetWidth、offsetHeight
*/
var offsetWidth = container.offsetWidth;
write(offsetWidth);

这里获取到的数据是没有单位的,浏览器结果如下:

 
firefox

chrome IE8
width:200px
224

224 224
width:10%
124

124 124
宽度不设置
980

980  980
display:none;width:200px
0

0 0
display:none;宽度不设置
0

0 0
position:absolute;width:200px
224

224 224
position:absolute;宽度不设置
24

24 24

结合公式和第一张表中对应的数据可以计算出结果

当display:none的时候,得到的数据都为0

3)innerWidth、innerHeight、outerWidth和outerHeight

这4个window属性在IE6、IE6和IE8不支持。

在Firefox中,outerWidthouterHeight返回浏览器窗口本身的尺寸。而innerWidthinnerHeight则表示该容器中页面视图区的大小(减去边框宽度)。

在Chrome中,outerWidth.outerHeight与innerWidth,innerHeight返回相同的值,即视口(viewport)大小而非浏览器窗口大小。

 
firefox

chrome IE8
innerWidth
1366

1366 undefined
outerWidth
1382

1366 undefined

4)clientWidth、clientHeight

IE中clientWidthclientHeight属性,用于取得元素的可视区域的尺寸,不包含滚动条、隐藏元素和边框。在body中设置高度为2000px,出现滚动条。

/**
* clientWidth、clientHeight
* 标准模式:document.documentElement.clientWidth
* 怪异模式:document.body.clientWidth
*/
var clientWidth = document.documentElement.clientWidth || document.body.clientWidth;
write(‘clientWidth:‘+clientWidth);
  firefox chrome IE8
clientWidth 1349 1349 1345

5)scrollWidth、scrollHeight

IE、Opera中:scrollWidth = 网页内容实际宽度,可以小于clientWidth

FF:scrollWidth = 网页内容宽度,不过最小值是clientWidth

在MDN上查看scrollHeight

/**
* scrollWidth、scrollHeight
*/
var scrollWidth = document.documentElement.scrollWidth;
write(‘scrollWidth:‘+scrollWidth);
 
firefox

chrome IE8
scrollWidth
1349

1349 1345

二、坐标

#container{
    display: none;
    /*其他属性一样*/
}
.coordinate_out {
    position: relative;
    top:100px;
    left:100px;
    width: 500px;
}
#coordinate{
    left:100px;
    top:250px;
    height:30px;
    width: 30px;
    background: #9ACD32;
    position: absolute;
    border: 2px solid red;
}

接下来的操作会将#container隐藏掉,CSS添加一条属性:display: none;

1)offsetTop、offsetLeft

<div class="coordinate_out">
    <div id="coordinate"></div>
</div>

即使一个元素没有被定位,它的offsetTop和offsetLeft也是有效的,它们是相对于offsetParent的距离,一级级向上累加,就得到相对页面的坐标。

/**
* 累加页面坐标
*/
function offsetSum(node) {
    var top=0, left=0
    while(node) {
        top = top + parseInt(node.offsetTop);
    left = left + parseInt(node.offsetLeft);
    node = node.offsetParent;
    }
    return {top: top, left: left}
}
 
firefox

chrome IE8
top
350

350 350
left
200

200 200

2)node.getBoundingClientRect()

  node.getBoundingClientRect()方法的返回值是一个包含了一组文本矩形的文本矩形对象。

返回值是一个DOMRect对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的CSS 边框集合 。

在IE8或者更低浏览器版本中,getBoudingClientRect()方法返回的对象中没有height和width属性。

1.外面不套relative

<div id="coordinate"></div>

left和top与上面的CSS中定义的一样。

 
firefox

chrome IE8
top
250

250 250
left
100

100 100
width
30

30 undefined
height
30

30 undefined

2.外面套个relative

<div class="coordinate_out">
    <div id="coordinate"></div>
</div>

与上面累加计算的结果一致,可以看到自己会做计算:

left = left + 父级的left;top = top + 父级的top。

 
firefox

chrome IE8
top
350

350 350
left
200

200 200

3)clientLeft、clientTop

clientLeft:一个元素的左边框的宽度,以像素表示。clientLeft 不包括左外边距和左内边距。clientLeft 是只读的。

clientTop:一个元素顶部边框的宽度(以像素表示)。不包括顶部外边距或内边距。clientTop 是只读的。

在coordinate中加了border: 2px solid red,三个浏览器返回的都是2

/**
* clientTop clientLeft
*/
var client_top = coordinate.clientTop;
var client_left = coordinate.clientLeft;
write(‘client-top:‘+client_top);
write(‘client-left:‘+client_left);

4)scrollTop、scrollLeft和pageYOffset、pageXOffset

“外层元素中的内容”高过了“外层元素”本身.当向下拖动滚动条时,有部分内容会隐没在“外层元素的上边界”之外,scrollTop就等于这部分“不可见的内容”的高度。

window.pageYOffset:指的是滚动条顶部到网页顶部的距离,IE6、IE7、IE8不支持此属性。

我给body设置了高度2000px,然后把滚动条下拉到最下面做测试:

 
firefox

chrome IE8
window.pageYOffset
1392

1317 undefined
document.documentElement.scrollTop
1392

0 1416
document.body.scrollTop
0

1317 0

在做IE8的测试的时候,每次返回的都是0,无奈只能写个onscroll事件,实时添加高度,并在html中新增标签p:

<p id="scroll"></p>
/**
* pageYOffset scrollTop pageXOffset scrollLeft
*/
var page_YOffset = window.pageYOffset;
var page_escrollTop = document.documentElement.scrollTop;
var page_bscrollTop = document.body.scrollTop;
write(‘page-YOffset:‘+page_YOffset);
write(‘element-scrollTop:‘+page_escrollTop);
write(‘body-scrollTop:‘+page_bscrollTop);

window.onscroll = function() {
    var onscroll_top = document.documentElement.scrollTop;
    document.getElementById(‘scroll‘).innerHTML = ‘scrollTop:‘ + onscroll_top;;
}

通过上面的数据可以看到,虽然数字不一样,但是都是通过不太一样的属性获取到的,所以需要做兼容性的处理:

var scrollTop = window.pageYOffset|| document.documentElement.scrollTop || document.body.scrollTop;

demo下载:

http://download.csdn.net/detail/loneleaf1/9132279

参考资料:

http://www.jxbh.cn/newshow.asp?id=1363&tag=2  跨浏览器窗口大小兼容js及innerWidth、innerHeight、outerWidth和outerHeight属性

http://www.zhangxinxu.com/wordpress/2012/05/getcomputedstyle-js-getpropertyvalue-currentstyle/  获取元素CSS值之getComputedStyle方法熟悉

http://www.cnblogs.com/fullhouse/archive/2012/01/16/2324131.html   JS中关于clientWidth offsetWidth scrollWidth 等的含义

《JavaScript框架设计》 人民邮电出版社 司徒正美

http://javascript.info/tutorial/coordinates   Coordinates

http://www.zhangxinxu.com/wordpress/2011/09/cssom%E8%A7%86%E5%9B%BE%E6%A8%A1%E5%BC%8Fcssom-view-module%E7%9B%B8%E5%85%B3%E6%95%B4%E7%90%86%E4%B8%8E%E4%BB%8B%E7%BB%8D/    CSSOM视图模式(CSSOM View Module)相关整理

http://www.hujuntao.com/web/javascript/something-about-javascript-scrolltop.html   关于javascript scrollTop那点事

http://www.penglig.com/post-322.html   浏览器模式与窗口 scrollTop 的兼容性问题总结

时间: 2024-10-12 04:28:42

JavaScript中尺寸、坐标的相关文章

javascript中常用坐标属性offset、scroll、client

原文:javascript中常用坐标属性offset.scroll.client 今天在学习js的时候觉得这个问题比较容易搞混,所以自己画了一个简单的图,并且用js控制台里面输出测试了下,便于理解. 1.在文档(document)对象里面用: scrollWidth/Height:获取对象的滚动宽度(滚动条可以滚动的宽度,相当于整个页面的总宽度的样子--网页正文全宽) scrollLeft/Top:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离(页面利用滚动条滚动到右边时,隐藏在

javascript中关于坐标 大小 的描述

window对象 有效桌面的大小,除去桌面下面的任务栏的高度 window.screen.availHeight : window.screen.availWidth : 浏览器窗口的左上角相对于windows桌面的位置(FF不支持改属性) window.screenTop : 距windows桌面顶部的距离 window.screenLeft : 距windows桌面左边的距离 屏幕的分辨率 window.screen.height : window.screen.width : 浏览器窗口的

JavaScript中的坐标

基本概念 视口坐标:相对于浏览器左上角或相对于框架页<iframe>元素的坐标,不包括浏览器的"外壳". 文档坐标:相对于文档左上角的坐标 除IE8及更早的版本,Window对象的pageXOffset和pageYOffset属性在所有的浏览器中提供滚动条的位置. IE和其他浏览器可以通过scrollLeft和scrollTop属性来获得滚动条的位置.标准模式下,通过document.documentElement来获取这些属性,怪异模式下,通过document.body来

web前端入门到实战:JavaScript中尺寸类样式

一:鼠标尺寸类样式 都要事件对象的配合 Tip:注意与浏览器及元素尺寸分开,鼠标类尺寸样式都是X,Y,浏览器及元素的各项尺寸时Height,Width 1:检测相对于浏览器的位置:event.clientX/event.clientY client:整个浏览器的可视区域,当点击鼠标的时候,鼠标事件发生的位置距离浏览器可视区域的左边和上边的距离 clientX:鼠标事件发生的位置距离浏览器可视区域的左边的距离 clientY:鼠标事件发生的位置距离浏览器可视区域的上边的距离 2:检测相对于屏幕的位

【转】深入浅出 JavaScript 中的 this

Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象.一般在编译期确定下来,或称为编译期绑定.而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的,这就导致 JavaScript 中的 this 关键字有能力具备多重含义,带来灵活性的同时,也为初学者带来不少困惑.本文仅就这一问题展开讨论,阅罢本文,读者若能正确回答 JavaScript 中的 What ’s this 问题,作为作者,我就会觉得花费这么多功夫,撰写这样一篇文章是值得的. Java

javascript中的事件

在javascript中的事件有三个方面的知识,一是事件流,二是事件处理程序,三是事件对象.下面就我个人的一点理解,分别讲述一下这三个方面的内容. 第一.事件流 事件流指的是事件按照一定的顺序触发.它有两个顺序,分别是自上而下和自下而上. 自上而下的叫做事件捕获,事件捕获指的是事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件被从目标元素的所有祖先元素依次往下传递.在这个过程中,事件会被从文档根到事件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useC

JavaScript中常见的字符串操作函数及用法汇总

1.字符串转换 字符串转换是最基础的要求和工作,你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: ? 1 2 var num= 19; // 19 var myStr = num.toString(); // "19" 你同样可以这么做: ? 1 2 var num= 19; // 19 var myStr = String(num); // "19" 或者,再简单点儿: ? 1 2 var num= 19; // 19 var myStr =

深入浅出 JavaScript 中的 this

本文来自:http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/ JavaScript 语言中的 this 由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式.JavaScript 中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用.下面我们将按照调用方式的不同,分别讨论

Javascript中String对象的常用方法

charAt(): 返回在指定位置的字符. charCodeAt(): 返回在指定的位置的字符的 Unicode 编码. var s = "Smile forever!"; s.charAt(2); //i s.charCodeAt(2); //105 concat(): 连接字符串,参数可以是多个字符串. var s1 = "Smile forever!"; var s2 = "extend"; s1.concat(s2); //Smile f