当前位置:嗨网首页>书籍在线阅读

13-解决方案

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.3.2 解决方案

jQuery提供三个确定元素位置的实用方法:

offset

返回一个对象,其中包含元素左上角与文档左上角的相对位置。

position

返回一个对象,其中包含元素左上角与该元素第一个定位的双亲元素( offsetParen )左上角的相对位置。

offsetParent

返回一个jQuery对象,其中包含元素的 offsetParent

offset 方法可用于确定元素在页面上的位置——例如,在你打算滚动窗口到某个元素所在位置的时候。 position 方法用于改变元素位置,或者寻找元素在滚动容器中的位置。上述两个任务在后续几节中将讨论;本节的目标是概述定位方法。

假定有如下HTML,其中的 <body> 元素外边距为0,内边距为10个像素:

<body id="the_offset_parent">
   <h1>Finding the Offset of an Element</h1>
   <div id="foo">
     <div id="bar">Some text inside #bar, which is inside #foo</div>
   </div>
   <div id="results"></div>
</body>

可以使用如下代码确定两个 DIV 的位置、偏移量和offsetParent元素:

jQuery(document).ready(function() {
   var $foo = jQuery('#foo');
   var $bar = jQuery('#bar');
   var $results = jQuery('#results');
   var fooPosition = $foo.position();
   var barPosition = $bar.position();
   var fooOffset = $foo.offset();
   var barOffset = $bar.offset();
   var $fooOffsetParent = $foo.offsetParent();
   var $barOffsetParent = $bar.offsetParent();
   $results
     .append('<p>#foo position.top: ' + fooPosition.top + '</p>') // 10
     .append('<p>#foo position.left: ' + fooPosition.left + '</p>') // 10
     .append('<p>#bar position.top: ' + barPosition.top + '</p>') // 10
     .append('<p>#bar position.left: ' + barPosition.left + '</p>') // 10
     .append('<p>#foo offset.top: ' + fooOffset.top + '</p>') // 10
     .append('<p>#foo offset.left: ' + fooOffset.left + '</p>') // 10
     .append('<p>#bar offset.top: ' + barOffset.top + '</p>') // 10
     .append('<p>#bar offset.left: ' + barOffset.left + '</p>') // 10
     .append('<p>ID of #foo offsetParent: '
        + $fooOffsetParent.attr('id')) // the_offset_parent
     .append('<p>ID of #bar offsetParent: '
        + $barOffsetParent.attr('id')); // the_offset_parent
});

在这个例子中,两个元素的位置相同,也有相同的 offsetParent (文档的 <body> 元素)。

但是如果用CSS定位 #foo

<body id="the_offset_parent">
   <div id="foo" style="position:absolute; top:10px; left:10px;">
     <div id="bar">Some text inside #bar, which is inside the
absolutely-positioned #foo</div>
   </div>
   <div id="results" style="position:absolute; top:60px; left:10px;"></div>
</body>

结果就改变了。 #foo DIV 实际上没有移动,它的 offsetParent 也没有变,所以它的位置和偏移量保持不变; #bar DIV 也没有移动,但是因为它的 offsetParent 变化,所以位置也随之变化——记住,元素的位置是相对于其 offsetParent 的。

jQuery(document).ready(function() {
   var $foo = jQuery('#foo');
   var $bar = jQuery('#bar');
   var $results = jQuery('#results');
   var fooPosition = $foo.position();
   var barPosition = $bar.position();
   var fooOffset = $foo.offset();
   var barOffset = $bar.offset();
   var $fooOffsetParent = $foo.offsetParent();
   var $barOffsetParent = $bar.offsetParent();
   $results
     .append('<p>#foo position.top: ' + fooPosition.top + '</p>') // 10
     .append('<p>#foo position.left: ' + fooPosition.left + '</p>') // 10
     .append('<p>#bar position.top: ' + barPosition.top + '</p>') // 0
     .append('<p>#bar position.left: ' + barPosition.left + '</p>') // 0
   .append('<p>#foo offset.top: ' + fooOffset.top + '</p>') // 10
   .append('<p>#foo offset.left: ' + fooOffset.left + '</p>') // 10
   .append('<p>#bar offset.top: ' + barOffset.top + '</p>') // 10
   .append('<p>#bar offset.left: ' + barOffset.left + '</p>') // 10
   .append('<p>ID of #foo offsetParent: '
     + $fooOffsetParent.attr('id')) // the_offset_parent
   .append('<p>ID of #bar offsetParent: '
     + $barOffsetParent.attr('id')); // foo
});