jQuery 1.2 新增该函数。
jQueryObject.offset( [ coordinates ] )
注意:
1、如果省略了coordinates参数,则表示获取偏移位置;如果指定了该参数,则表示设置偏移位置。2、offset()函数的"设置"操作针对的是当前jQuery对象所匹配的每一个元素;"读取"操作只针对第一个匹配的元素。
1、获得元素相对于document的位置
获得位置是元素相对于document的位置信息,通常可以说是这个元素的坐标值。
// 元素相对于document的左位移
$("#some-id").offset().left
// 元素相对于document的上位移
$("#some-id").offset().top
2、设置元素相对于document的位置
在设置元素offset的时候,需要该元素为已定位样式,即:relative、absolute、fixed等除了static的position属性值。其实这里,我一直不明白,为什么会有static这个position属性值,而不直接是relative呢?此问暂且按下,继续说jquery的offset()使用方法。
// 设置元素相对于document的位移,该元素的position必须为非static值
$("#some-id").offset({left:123,top:99});
注意:
需要注意的是,offset的设置值,必须成对出现,否则会报错的哦!
offset不仅可以设置单个元素,也可以设置多个元素不同的坐标值,而不需要jQuery.each操作了,如:
$(".some-class").offset(function(index,coords)
{
// index为元素索引
// coords为元素的坐标:top、left
// 函数必须返回坐标值
return {top:ccoordsoord.top+index,left:coords.left+index};
});
实验:
offset()的top是指元素与document的上边的距离,而不是浏览器当前窗体的上边缘,如图1。
图1:document高度超过window,window出现滚动条,拖动滚动条,提交按钮的offset().top不变,因为按钮与document上边缘距离未变。
图2:document中的div有滚动条,提交按钮的offset().top随div滚动条变化而变化,因为按钮与document上边缘距离已变。
offset().left 同理。
通过上面的实验我们可以得出以下结论:offset() 获取元素(html 元素)距离document上边缘、左边缘的像素,我们只要清楚浏览器中document是那部分就可以正确使用offset()。关于document可以阅读 JQuery window、document、 body
应用:
1.那么我们怎么保证元素完整的显示在浏览器视窗里呢?我们可以结合offset 和 scrollTop来实现。
scrollTop获取的是什么值?根据我的实验,只有元素具有滚动条,并且滚动了一定距离,才有scrollTop值,没有滚动条的元素scrollTop=0。
上面提交button无滚动条,它的scrollTop恒等于0。
以前我有种错误的认知:document里面的元素与document具有相同的滚动值,这是错误的,子元素与容器的滚动值无关。
按图1(document有滚动条),需计算控件的offsetTop、height,document的scrollTop;
按图2(document无滚动条),计算控件的offsetTop、height
2.浮动div在滚动条滚动时保持在原位
按图1,
var firstTop = $("浮动DIV").offset().top;
var top = firstTop + $(document).scrollTop();
$(浮动DIV).offset({ top: top });
按图2,
var top = $(浮动DIV).offset().top;
$("浮动DIV").offset({ top: top });