jQuery UI对话框定位

Wic*_*wok 114 jquery jquery-ui

我正在尝试使用jQuery对话框UI库,以便在它悬停在某些文本旁边时放置一个对话框.jQuery对话框采用一个位置参数,该参数是从当前视口的左上角开始测量的(换句话说[0, 0],无论您当前滚动到何处,都会将其放在浏览器窗口的左上角).但是,我知道检索位置的唯一方法是相对于ENTIRE页面的元素.

以下是我目前的情况. position.top被计算为大约1200左右,这使得对话框远低于页面上其他内容.

$(".mytext").mouseover(function() {
    position = $(this).position();
    $("#dialog").dialog('option', 'position', [position.top, position.left]);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到正确的位置?

谢谢!

Bri*_*unt 109

作为替代方案,您可以使用jQuery UI Position实用程序,例如

$(".mytext").mouseover(function() {
    var target = $(this);
    $("#dialog").dialog("widget").position({
       my: 'left',
       at: 'right',
       of: target
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的方法.我会注意到,如果你是第一次创建对话框,你需要额外调用`dialog`,如:`$('#dialog').dialog({width:300/*insert你的选择*/}).对话框('widget').position({my:'left',at:'right',of:$(this)});` (29认同)
  • jQuery UI位置实用程序不适用于隐藏元素,因此您必须在使用此代码定位对话框之前打开该对话框. (26认同)
  • 对于任何为如何设置多个位置而苦苦挣扎的人(就像我刚才一样),就像这样: `$('dialog').dialog({position: { my: 'left top', at: 'left+50 top+ 50'}, });` (4认同)

小智 81

感谢上面的一些答案,我进行了实验并最终发现您需要做的就是在Modal Dialog的定义中编辑"position"属性:

position:['middle',20],
Run Code Online (Sandbox Code Playgroud)

JQuery对于水平"X"值的"中间"文本没有问题,我的对话框在中间弹出,从顶部向下20px.

我心中有JQuery.

  • Darn,这很不错但不推荐使用 - "注意:字符串和数组表单已弃用." http://api.jqueryui.com/dialog/#option-position所以你需要使用位置对象my/at/of thingy.请参阅那里有关"jQuery UI Position"的链接.您可以获得类似位置的内容:{my:"center top",at:"center top + 20",of window}可以按照您的需要工作.有关更多示例,请参见链接 (12认同)
  • 我不敢相信您只需要一个代码就可以放置对话框弹出窗口。 (3认同)

小智 42

阅读完所有回复后,这终于对我有用了:

$(".mytext").mouseover(function() {
    var x = jQuery(this).position().left + jQuery(this).outerWidth();
    var y = jQuery(this).position().top - jQuery(document).scrollTop();
    jQuery("#dialog").dialog('option', 'position', [x,y]);
});
Run Code Online (Sandbox Code Playgroud)


mar*_*dup 16

将Jaymin的例子更进一步,我提出了这个问题,将jQuery ui-dialog元素定位在你刚刚点击的元素之上(想想"讲话泡泡"):

$('#myDialog').dialog( 'open' );
var myDialogX = $(this).position().left - $(this).outerWidth();
var myDialogY = $(this).position().top - ( $(document).scrollTop() + $('.ui-dialog').outerHeight() );
$('#myDialog').dialog( 'option', 'position', [myDialogX, myDialogY] );
Run Code Online (Sandbox Code Playgroud)

请注意,在计算相对宽度和高度偏移之前,我"打开"ui-dialog元素.这是因为jQuery无法在没有ui-dialog元素出现在页面中的情况下评估outerWidth()或outerHeight().

一定要确保在对话框选项中将'modal'设置为false,你应该没问题.


小智 16

http://docs.jquery.com/UI/API/1.8/Dialog

左上角的固定对话框示例:

$("#dialogId").dialog({
    autoOpen: false,
    modal: false,
    draggable: false,
    height: "auto",
    width: "auto",
    resizable: false,
    position: [0,28],
    create: function (event) { $(event.target).parent().css('position', 'fixed');},
    open: function() {
        //$('#object').load...
    }
});

$("#dialogOpener").click(function() {
    $("#dialogId").dialog("open");
});
Run Code Online (Sandbox Code Playgroud)


Dan*_*nce 14

检查你的 <!DOCTYPE html>

我注意到如果你遗漏了<!DOCTYPE html>HTML文件的顶部,即使你指定位置,对话框也会显示在文档内容的中心,即使你指定了位置:{my:'center',at:'center' ,of:window}

EG:http://jsfiddle.net/npbx4561/ - 从运行窗口复制内容并删除DocType.保存为HTML并运行以查看问题.

  • 这是我遇到的确切问题,并修复了这个问题. (2认同)
  • 我希望对这个伟大的答案有超过 1 个赞成票。它解决了我为之奋斗数小时的问题。 (2认同)

Ben*_*ler 13

查看一些用于对话框其他实现的jQuery插件. Cluetip似乎是一个功能丰富的工具提示/对话框样式插件.第4个演示听起来与您尝试的类似(尽管我发现它没有您正在寻找的精确定位选项.)


liv*_*ove 8

要将其置于控件之上,您可以使用以下代码:

    $("#dialog-edit").dialog({
...    
        position: { 
            my: 'top',
            at: 'top',
            of: $('#myControl')
        },

...
    });
Run Code Online (Sandbox Code Playgroud)


小智 7

$(".mytext").mouseover(function() {
   var width = 250;
   var height = 270;
   var posX = $(this).offset().left - $(document).scrollLeft() - width + $(this).outerWidth();
   var posY = $(this).offset().top - $(document).scrollTop() + $(this).outerHeight();
   $("#dialog").dialog({width:width, height:height ,position:[posX, posY]});
}
Run Code Online (Sandbox Code Playgroud)

在元素下放置一个对话框.我使用offset()函数只是因为它计算了相对于浏览器左上角的位置,但是position()函数计算了相对于父div或iframe元素的父级的位置.


Sam*_*uel 6

而不是做纯jquery,我会这样做:

$(".mytext").mouseover(function() {
    x= $(this).position().left - document.scrollLeft
    y= $(this).position().top - document.scrollTop
    $("#dialog").dialog('option', 'position', [y, x]);
}
Run Code Online (Sandbox Code Playgroud)

如果我正确理解你的问题,你所拥有的代码就是定位对话框,好像页面没有滚动,但是你想让它考虑滚动.我的代码应该这样做.

  • 我的不好,它的scrollLeft scrollTop忘了大写 (2认同)

小智 5

$("#myid").dialog({height:"auto",
        width:"auto",
        show: {effect: 'fade', speed: 1000},
        hide: {effect: 'fade', speed: 1000},
        open: function( event, ui ) {
          $("#myid").closest("div[role='dialog']").css({top:100,left:100});              
         }
    });
Run Code Online (Sandbox Code Playgroud)