2009-04-13 123 views
104

我试图使用jQuery dialog UI库来定位对话框旁边的对话框,当它被悬停时。 jQuery对话框使用从当前视口左上角开始测量的位置参数(换句话说,无论当前滚动到哪里,[0, 0]将始终将其放在浏览器窗口的左上角)。但是,我知道检索位置的唯一方法是相对于整个页面的元素。jQuery用户界面对话框定位

以下是我目前的。 position.top的计算结果大概是1200左右,这会使对话远远低于页面上的其余内容。

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

我该如何找到正确的位置?

谢谢!

+1

从版本1.9开始,有一个本地的工具提示窗口小部件。 – theblang 2013-04-25 14:09:06

回答

13

查看一些用于其他对话框实现的jQuery插件。 Cluetip似乎是一个功能丰富的工具提示/对话框样式插件。第四个演示听起来类似于您正在尝试执行的操作(虽然我看到它没有您正在寻找的精确定位选项)。

+0

jfyi,'cluetip'不再有效。 – harshitgupta 2016-07-06 16:11:49

6

而不是做纯粹的jQuery,我会做:

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

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

+0

出于某种原因,document.scrollleft对我而言未定义。 – Wickethewok 2009-04-13 19:25:07

+2

我的坏,它的scrollLeft scrollTop忘了大写 – Samuel 2009-04-13 21:50:26

+0

var x = el.position()。left + el.outerWidth(); var y = el.position()。top - $(document).scrollTop(); 为我工作。问题是我改变了它的信息后,我无法获得对话框的高度和宽度。 – rball 2009-10-19 18:09:42

4

page显示了如何确定您的滚动偏移量。 jQuery可能有类似的功能,但我找不到它。使用页面上显示的getScrollXY函数,您应该能够从.position()结果中减去x和y坐标。

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]); 
}); 
+0

这个答案对我来说很有效,并且可能会节省我很多时间用google搜索如何设置其他解决方案。谢谢! – Nathan 2012-02-28 13:44:12

+1

+1当我理解.position()给出相对位置和.offset(),绝对位置(我需要)时,它帮了我很大的忙。 – daniloquio 2012-03-09 19:43:18

+1

它在1query中不工作1.11或更高 – thg 2015-07-30 08:25:24

16

以Jaymin的例子更进了一步,我想出了这个用于定位你刚刚点击的元素上面一个jQuery UI的对话框元素(认为​​“对话气泡”):

$('#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]); 

注计算相对宽度和高度偏移之前,我“打开” UI-对话框元件。这是因为如果没有ui-dialog元素实际出现在页面中,jQuery不能评估outerWidth()或outerHeight()。

只要确保在对话框选项中将'modal'设置为false,您应该是OK。

+1

我认为你的两个变量意味着'myDialogX'和'myDialogY' – casey 2010-10-14 16:39:34

+0

你是对的;我已经修复了这些。 – markedup 2011-01-16 08:43:24

1

可以使用$(this).offset(),位置与父

4

有点晚了,但你可以通过使用附加$ J(对象).offset()。左做到这一点,现在并相应.TOP。

105

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

$(".mytext").mouseover(function() { 
    var target = $(this); 
    $("#dialog").dialog("widget").position({ 
     my: 'left', 
     at: 'right', 
     of: target 
    }); 
} 
+28

这是最好的方法。我会注意到,如果你是第一次创建对话框,你需要一个额外的调用''dialog'像这样: $('#dialog')。dialog({width:300/*插入你的选项* /})。dialog('widget')。position({my:'left',at:'right',of:$(this)});' – wsanville 2010-12-16 16:13:35

+26

jQuery UI定位工具不起作用在隐藏的元素上,所以你必须打开对话框,然后用这段代码进行定位。 – Toadmyster 2011-12-15 22:46:00

+1

jQuery UI是最好的方法。 [ScottGonzález](http:// tech。pro/tutorial/1262/simplified-dynamic-positioning-with-jquery-ui)深入解释了jQuery UI的工作原理以及如何使用它 – strangeloops 2013-05-09 06:01:46

4

我不认为讲话泡泡是对的。我调整了一下,这样它就可以工作,并且该项目在链接下方打开。

function PositionDialog(link) { 
    $('#myDialog').dialog('open'); 
    var myDialogX = $(link).position().left; 
    var myDialogY = $(link).position().top + $(link).outerHeight(); 
    $('#myDialog').dialog('option', 'position', [myDialogX, myDialogY]); 
} 
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]}); 
} 

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

1

我尝试了很多方法可以让我的对话框在页面上居中,看到代码:

$("#dialog").dialog("option", "position", 'top')

永远不变的对话框位置这是创建时。

而不是,我更改选择器级别以获取整个对话框。

$("#dialog").parent() < - 这是dialog()函数在DOM上创建的父对象,这是因为选择器$(“#dialog”)不应用属性,top,left。

为中心我对话,我用的是jQuery-Client-Centering-Plugin

$( “#对话”)父()centerInClient()。

77

由于一些答案上面,我尝试,最终发现,所有你需要做的是编辑在模态对话框定义中的“位置”属性:

position:['middle',20], 

的JQuery曾与“中”没有问题水平“X”值的文本,我的对话框弹出中间,从顶部向下20px。

我心里的JQuery。

+0

没有任何附加插件和直观的工作。我见过的最佳解决方案。 – PlanetUnknown 2013-08-31 15:58:15

+0

非常简单的解决方案,无需额外的插件。这应该是被接受的答案。 – kamui 2013-09-26 14:48:02

+8

该死的,这很好但不赞成 - “注意:字符串和数组形式已被弃用。” http://api.jqueryui.com/dialog/#option-position 所以你需要使用位置对象my/at/of thingy。查看关于“jQuery UI位置”的链接。你可以得到像 这样的位置:{my:“center top”,在:“center top + 20”,:window} 可以像你想的那样工作。请参阅链接了解更多示例。 – mikato 2013-11-12 20:50:10

2

我试过所有建议的解决方案,但他们不会工作,因为对话框不是主要文档的一部分,将有其自己的层(但多数民众赞成我的教育猜测)。

  1. 初始化对话与$("#dialog").dialog("option", "position", 'top')
  2. 打开它$(dialog).dialog("open");
  3. 然后得到所显示的对话框的X和Y(不是文档的任何其他节点!)

    var xcoord = $(dialog).position().left + ADD_MODIFIER_FOR_X_HERE;

    var ycoord= $(dialog).position().top + ADD_MODIFIER_FOR_Y_HERE;

    $(dialog).dialog('option', 'position', [xcoord , ycoord]);

这样坐标来自对话框而不是文档,位置根据对话框的层次而改变。

15

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"); 
}); 
3

要解决的中心位置,我用:

以上
open : function() { 
    var t = $(this).parent(), w = window; 
    t.offset({ 
     top: (w.height()/2) - (t.height()/2), 
     left: (w.width()/2) - (t.width()/2) 
    }); 
} 
1

解决方案是非常真实的...但调整窗口大小后,UI对话框不会保留位置。 下面的代码执行此

  $(document).ready(function(){ 

       $(".test").click(function(){ 
          var posX = $(".test").offset().left - $(document).scrollLeft() + $(".test").outerWidth(); 
          var posY = $(".test").offset().top - $(document).scrollTop() + $(".test").outerHeight(); 
          console.log("in click function"); 
          $(".abc").dialog({ 
           position:[posX,posY] 
          }); 

         }) 

      }) 

      $(window).resize(function(){ 
       var posX=$(".test").offset().left - $(document).scrollLeft() + $(".test").outerWidth(); 
       var posY = $(".test").offset().top - $(document).scrollTop() + $(".test").outerHeight(); 

      $(".abc").dialog({ 
           position:[posX,posY] 
          }); 
      }) 
3

这里是代码..,如何定位的jQuery UI的对话框中心......

var $about = $("#about"); 

    $("#about_button").click(function() { 
     $about.dialog({ 
     modal: true, 
     title: "About the calendar", 
     width: 600,   
     close: function() { 
      $about.dialog("destroy"); 
      $about.hide(); 
     }, 
     buttons: { 
      close : function() { 
       $about.dialog("close"); 
      } 
     } 
     }).show(); 

     $about.dialog("option", "position", 'center'); 

    }); 
5

纠正错误之上控制,您可以使用此代码:

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

... 
    }); 
10

检查<!DOCTYPE html>

我注意到,如果您错过了HTML文件顶部的<!DOCTYPE html>,则即使您指定了位置:{my:'center',at: 'center',of:window}

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

+2

这是我的确切问题,并且这固定了它。 – BobRodes 2016-05-26 19:56:32

+1

我的xml转换无法添加文档类型,这个答案随着:http://stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt让事情为我滚动。 – 2017-04-19 19:42:00

2
$("#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});    
     } 
    }); 
0

您的CA集合顶部位置在风格上中心显示,看到的代码:

的.ui-对话框:;

这种风格应该显示对话框顶部{100像素重要!}从顶部100px波纹管。