`
燮羽天翔
  • 浏览: 110092 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript获得元素的尺寸和位置一 : offsetTop/Left、offsetWidth/Height、offsetParent

    博客分类:
  • JS
阅读更多

在学习offset的相关属性前,必须明确指出offsetHeight/Width、offsetTop/offsetLeft等返回的都是只读的并且以数字的形式返回像素值(例如,返回12,而不是'12px')。

  定位父元素:指在CSS中某一元素domElement[position:relative/absolute]所相对定位的元素。

  1、offsetParent

  对于offsetParent来讲,最重要的是能够知道 domElement.offsetParent 指向的是哪个元素。然而对于这一点不同的浏览器之间有一些微妙的差异。

  a、domElement设置了position:relative/absolute属性:

     domElement.offsetParent指向的是该元素的定位父元素。

     但也有一个bug,见一下代码:

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
<title>RainMan</title>
<styletype="text/css">
#target{position:relative;}
</style>
<scripttype="text/javascript">
window.onload=function(){
  vartarget=document.getElementById('target');
  alert(target.offsetParent==document.documentElement);    //IE中指向<html>元素
  alert(target.offsetParent==document.body);  //FF、Safari等指向<body>元素
};
</script>
</head>
<body>
<divid="outer"class="test">
  <divid="inner">
    <divid="target"class="test">Target<br/>rainman</div>
  </div>
</div>
</body>
</html>

 b、domElement没有设置position:relative/absolute,即static:

     这一点所有的浏览器基本相同,domElement的offsetParent指向的是离domElement最近的拥有position:relative/absolute属性的父级元素。若不存在,则指向 <body>元素。但这种情况也有例外,如果domElement是<td>则 offsetparent 指向<table>

  c、关于offsetParent的实例:

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
<title>RainMan</title>
<styletype="text/css">
#outer{position:absolute;}
</style>
<scripttype="text/javascript">
window.onload=function(){
  vartarget=document.getElementById('target');
  varouter=document.getElementById('outer');
  alert(target.offsetParent==outer);  //true
};
</script>
</head>
<body>
<divid="outer"class="test">
  <divid="inner">
    <divid="target"class="test">Target<br/>rainman</div>
  </div>
</div>
</body>
</html>
  
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
<title>RainMan</title>
<styletype="text/css">
</style>
<scripttype="text/javascript">
window.onload=function(){
  vartarget=document.getElementById('target');
  alert(target.offsetParent==document.body);  //true
};
</script>
</head>
<body>
<divid="outer"class="test">
  <divid="inner">
    <divid="target"class="test">Target<br/>rainman</div>
  </div>
</div>
</body>
</html>

 

2、offsetLeft/Top

  offsetLeft: 该元素左border的左边缘 到 该元素的offsetParent的左border内边缘的水平距离。

  offsetTop:该元素的上border的上边缘 到 该元素的offsetParent的上border内边缘的垂直距离。

  代码:

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
<title>RainMan</title>
<styletype="text/css">
*{margin:0px;padding:0px;}
.test{
  padding:5px;
  margin:10px;
  color:#fff;
  border:7pxsolid#000;
  background-color:#CC66FF;
}
#target{
  position:absolute;
  left:3px;
  top:9px;
  width:100px;
  height:100px;
}
#outer{
  position:relative;
  width:300px;
  height:300px;  
}
</style>
<scripttype="text/javascript">
window.onload=function(){
  vartarget=document.getElementById('target');
  alert(target.offsetLeft);  //13=margin-10px+left-3px
};
</script>
</head>
<body>
<divid="outer"class="test">
  <divid="inner">
    <divid="target"class="test">Target<br/>rainman</div>
  </div>
</div>
</body>
</html>

 

3、offsetWidth/offsetHeight

  给出元素在页面中占据的宽度和高度的总计。注意:把元素的边框和滚动条计算在内。

offsetWidth = border-left-width + padding-left + width + padding-right + border-right-width;
  
   offsetHeight = border-top-width + padding-top + height + padding-bottom + border-bottom-width; 

 

4、相关应用

  a、获得一个元素的实际宽度和高度,例如:一个自适应高度的段落,往往可以通过获得该元素CSS层叠后的最终高度【见下代码】,但是这种方法在IE中有时返回的是auto,所以使用一个元素的offsetWidth/offsetHeight是比较理想的方法。

function getStyle(elem,type){
  var typeface='';
  if(elem.currentStyle)
    typeface=elem.currentStyle[type];
  elseif(window.getComputedStyle)
    typeface=window.getComputedStyle(elem,null)[type];
  returntypeface;    
}

 

获得一个元素位置的可移植的方法:在窗口中的位置

function getX(elem){
  var x=0;
  while(elem){
    x=x+elem.offsetLeft;
    elem=elem.offsetParent;
  }
  return x;
}
function getY(elem){
  var y=0;
  while(elem){
    y=y+elem.offsetTop;
    elem=elem.offsetParent;
  }
  return y;
}

 

 

转载自:http://tech.ddvip.com/web/javascript/index.html

分享到:
评论

相关推荐

    图片放大镜

    'left' : m.cont.offsetLeft + m.cont.offsetWidth + 10 + 'px', //放大框的位置为原始图像的右方远10px 'top' : m.cont.offsetTop + 'px' }) var borderWid = m.cont.getElementsByTagName('div')[0]....

    JavaScript Table行定位效果

    一开始的需求只是表头部分在滚动时能一直固定在头部,那关键要实现的就是让tr能定位。 首先想到的方法是给tr设置relative,用ie6/7测试以下代码: Code &lt;!DOCTYPE ...

    JavaScript 图片切割效果

    return { Top: offsetTop, Left: offsetLeft, Width: offsetWidth, Height: offsetHeight } } 如果理解了的话就会觉得其实原理挺简单的,不过要想出来还是要一定创意才行,为想出这个方法的人致敬! 【切割预览】...

    asp.net菜单(很简单)

    var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop; var parentEl=what.offsetParent; while (parentEl!=null){ totaloffset=(offsettype=="left")? totaloffset+parentEl....

    javascript 精确获取页面元素的位置

    代码如下: //取得元素x坐标 function pageX(elem) { return elem.offsetParent?(elem.offsetLeft+pageX(elem.offsetParent)):elem.offsetLeft; } //取得元素y坐标 function pageY(elem) { return elem.offsetParent?...

    js获取元素在浏览器中的绝对位置

    JavaScript中提供获取HTML元素位置的...那么如何得到一个HTML元素的绝对位置呢,可以用以下函数: 代码如下: //获取元素的纵坐标 function getTop(e){ var offset=e.offsetTop; if(e.offsetParent!=null) offset+=ge

    Javascript中找到子元素在父元素内相对位置的代码

    代码如下: // 找到子元素在父元素中的相对位置 function getElementTop(element){ var el = (typeof element == “string”) ? document.getElementById(element) : element; if (el[removed] === null || el.style...

    在IE下:float属性会影响offsetTop的取值

    因需要定位某个HTML元素(例如:div)距离页顶的高度,想用offsetTop来取值,结果却发现CSS中如果使用了float:left;之类的写法后,竟然会导致取到的值不一样。 没有使用float:left;取的到值是正常值200; &lt;!DOCTYPE...

    鼠标放上去显示层及信息详情.

    #yuantu { float:left;} #hidd { border:1px #cccccc solid; overflow:hidden; position:absolute;} #ceshi { background:#FFFF99; width:100%; height:200px; border:1px #ccc solid;} --&gt; &lt;/style&gt; &lt;/head&gt; ...

    JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记

    clientHeight,只读 clientHeight可以用公式 CSS height + CSS padding – 水平滚动条的高度 (如果存在) 来计算。...一个元素顶部边框的宽度(以像素表示)。嗯。。就只是border-top-width 类似的属性还有一

    js获取元素相对窗口位置的实现代码

    JS获取元素的offsetTop,offsetLeft等属性 obj.clientWidth //获取元素的宽度 obj.clientHeight //元素的高度 obj.offsetLeft //元素相对于父元素的left obj.offsetTop //元素相对于父元素的top obj.offsetWidth //...

    js获取控件位置以及不同浏览器中的差别介绍

    代码如下: //获取坐标位置 function getpos(e) { var t=e.offsetTop; var l=e.offsetLeft; var height=e.offsetHeight; while(e=e.offsetParent) { t+=e.offsetTop; l+=e.offsetLeft; } } 假设 obj 为某个 HTML 控件...

    Javascript拖拽系列文章2之offsetLeft、offsetTop、offsetWidth、offsetHeight属性第1/2页

    在阅读本文之前,请先看一看第一篇文章Javascript拖拽系列文章1之offsetParent属性,因为循序渐进是一个很好的习惯,值得提倡。好了,看看我们今天的内容吧。 首先让我们先看一看element.offsetLeft属性。 支持的...

    【JavaScript源代码】javascript实现放大镜功能.docx

     本文实例为大家分享了javascript实现放大镜功能的具体代码,供大家参考,具体内容如下 描述:当鼠标在小图片上移动时,通过捕捉鼠标在小图片上的位置, 使放大镜的移动方向与大图的水平和垂直方向相反 如何设计 ...

    JS大全 web编程

    offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置 event.clientX 相对文档的水平座标 event.clientY 相对文档的垂直座标 event.offsetX 相对容器的水平坐标 event.offsetY 相对容器...

    Javascript dom位置、大小、鼠标定位操作

    做了这么久web开发,凡是涉及用js操作dom元素位置、测量dom元素大小时就心虚,因为js整整提供了二十几个属性对dom元素的位置、大小进行操作。比如:clientTop、offsetTop、scrollTop、clientWidth、offsetWidth、...

    CSS Grid Overlay-crx插件

    示例conf:[{“” columns“:4,” margins“:16,//第一和最后一列前后的像素//这些装订线像空白一样工作://如果列之间的距离为32px,则装订线为16”装订线“:16,” from“:0,//像素的断点开始// //可选值//...

    获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[

    offsetTop和offsetLeft 这两个属性,IE 、Opera和Firefox对它俩的解释存在差异: IE5.0+ 、Opera8.0+: offsetTop和offsetLeft 都是相对父级元素 Firefox1.06: offsetTop和offsetLeft 都是相对于body元素 ...

    简单谈谈offsetleft、offsetTop和offsetParent

    ele.offsetParent返回的是ele元素最近的并且是定位过(relative,absolute)的父元素,如果没有父元素或者是父元素中没有一个是定位过的,返回值就是body元素 ele.offsetLeft和ele.offsetTop取值问题,分多种情况: ...

Global site tag (gtag.js) - Google Analytics