2010-09-16 65 views
6

的CSS:.offset()绝对位置的bug?

.flyoutdialog 
{ 
    position: absolute; 
    top:0; 
    left:0; 
    border: 1px solid #CCC; 
    background-color: white; 
    width: 250px; 
    padding: 10px 10px 10px 10px; 
} 

jQuery的:( “flyoutdialog ”对话框的$(1项),按钮的$(1项)“ flyouticon。”)

var offset = button.offset(); 
    alert("top: " + offset.top + " left: " + offset.left); 
    // dialog.offset({ top: offset.top - 5, left: offset.left + 25 }); 
    dialog.css("top", offset.top - 5 + "px"); 
    dialog.css("left", offset.left + 25 + "px"); 

    dialog.show("blind", { direction: "horizontal" }, 1000); 

    var off2 = dialog.offset(); 
    alert("top: " + off2.top + " left: " + off2.left); 

的HTML:

<div class="editor-label"> 
     <label for="Gebruikerscode">Gebruikerscode</label> 
    </div> 
    <div class="editor-field"> 
     <input id="gebruikerscode" name="gebruikerscode" type="text" value="" /> 
<a href="#" class="flyouticon"> 
    <img src="/img/help.png" alt="Flyout" width="16" /></a> 

<div class="flyoutdialog grayicon" title="Gebruikerscode"> 
    <div class="title"> 
     <h4> 
      Gebruikerscode</h4> 
     <span class="closedialog ui-icon ui-icon-closethick">&nbsp;</span> 
    </div> 
    <p> 
     Dit is de code of 'gebruikersnaam' waarmee de school inlogt. Deze is uniek.</p> 

</div> 

</div> 

现状:

我有一个图标.flyouticon其中,徘徊或点击要打开.flyoutdialog 对话框应该来紧挨着它的时候。要做到这一点,我想我会使用这个代码。此代码有效,但只有(!!!!)当我不向下滚动或向右滚动时。

当不滚动:

var offset = button.offset(); 
    alert("top: " + offset.top + " left: " + offset.left); //top: 375 left: 288.29998779296875 
    dialog.offset({ top: offset.top - 5, left: offset.left + 25 }); 
    dialog.show("blind", { direction: "horizontal" }, 1000); 
    var off2 = dialog.offset(); 
    alert("top: " + off2.top + " left: " + off2.left); //top: 370 left: 313.29998779296875 

工作完美。但是,当滚动时:

var offset = button.offset(); 
    alert("top: " + offset.top + " left: " + offset.left); //top: 375 left: 288.29998779296875 
    dialog.offset({ top: offset.top - 5, left: offset.left + 25 }); 
    dialog.show("blind", { direction: "horizontal" }, 1000); 
    var off2 = dialog.offset(); 
    alert("top: " + off2.top + " left: " + off2.left); //**top: 142** left: 313.29998779296875 

TOP变小了......为什么当我滚动时会发生这种情况?

解决方法:

var offset = button.offset(); 
    alert("top: " + offset.top + " left: " + offset.left); 
    //dialog.offset({ top: offset.top - 5, left: offset.left + 25 }); 

    dialog.css("top", offset.top - 5 + "px"); 
    dialog.css("left", offset.left + 25 + "px"); 

    dialog.show("blind", { direction: "horizontal" }, 1000); 
    var off2 = dialog.offset(); 
    alert("top: " + off2.top + " left: " + off2.left); 

问题:

为什么offset()无法正常工作吗?我使用Firefox,但我想这没关系。 (编辑:在IE8中是一样的,所以它不是浏览器)为什么我必须使用单独的CSS属性,无论如何绝对定位对话框?为什么当我向下滚动时它会上升?为什么'TOP'变小?当我刚刚设置它应该是它的价值。这是一个在offset()二传手的错误?

编辑:

好,

dialog.offset({ top: offset.top + $(window).scrollTop() - 5, left: offset.left + 25 }); 

似乎工作。但是这不回答我的问题为什么?为什么抵消自动扣除设置者中top值的scrollTop()值?这没有道理!

+0

我一直有这个问题,但奇怪的是,*秒*时你运行相同的功能(具有相同的jQuery对象)它的位置如预期的没有添加scrollTop它。然而,我发现使用.css而不是.offset完美工作。 – Altreus 2011-02-02 16:16:46

回答

4

当您滚动时,偏移将无法正常工作。你需要添加$(window).scrollTop()到它

+0

那么为什么即使在滚动时GETTING偏移量也能正常工作,但SETTING不起作用,它的行为很奇怪...... API的 – Stefanvds 2010-09-16 12:20:34

+0

:.offset()setter方法允许我们重新定位一个元素。元素的位置是相对于文档指定的。如果元素的位置样式属性当前是静态的,它将被设置为相对以允许此重新定位...因此,在设置偏移量时检查元素是否变为'相对'。 – mkoryak 2010-09-16 12:24:55

+0

谢谢,我会看看,但它肯定不是,静态之前... – Stefanvds 2010-09-16 12:26:07