而不是使用my, at, of
你可以自己计算位置left
和top
像这样:
$("#btnNewIssue").on("click", function() {
var $button = $(this);
var $dialog = $('#newIssueDialog');
//var top = $button.position().top + $button.height() + ($button.outerHeight() / 2);
var top = $button.position().top + $button.height() + (($button.outerHeight(true) - $button.height()));
var left = ($(document).width() - ($dialog.outerWidth / 2)) / 2
$dialog.dialog({
autoOpen: true,
modal: true,
closeOnEscape: true,
draggable: false,
resizable: false,
width: 415,
height: 175,
position: [left, top]
});
});
以基本 HTML 为例:
<div id="newIssueDialog"> My modal dialog</div>
<button id="btnNewIssue">Click Me</button>
</p>
演示- 按钮下方的定位对话框,但位于窗口/文档的中心
我document
在上面的示例中使用,但如果需要,您可以使用 window 代替,应该几乎没有区别。
编辑
修复了一个疏忽,即没有正确包含按钮的边框高度、填充和边距。
height
我保存了小提琴,但没有添加对from的扣除outerHeight(true)
以包含borders
,padding
和margins
按钮,以防按钮有任何指定。
这个:
var top = $button.position().top + $button.height() + ($button.outerHeight() / 2);
应该是这样的:
var top = $button.position().top + $button.height() + (($button.outerHeight(true) - $button.height()));
演示也已更新。
编辑
但是,如果页面上存在滚动条,我现在会遇到问题。
对于垂直滚动位置,只需scrollTop()
在末尾减去当前值,如下所示:
var top = $button.position().top + $button.height() + ($button.outerHeight(true) - $button.height()) - $(window).scrollTop();
要将模式水平放置在中间,您无需更改任何内容。上面的计算代码left
似乎总是有效的。但是,如果在您的特定标记中对您来说是个问题,请查看scrollLeft()我认为它的工作方式与您需要扣除它的方式相同,类似于:
var left = (($(document).width() - ($dialog.outerWidth / 2)) / 2) - $(window).scrollLeft();
或者可能
var left = ($(window).scrollLeft() - $(document).width() - ($dialog.outerWidth / 2)) / 2;
如前所述,下面的 DEMO 不需要它,但如果需要,请移动它并查看它是否适合。
请注意,如果您的按钮靠近屏幕底部,则模式不会位于按钮下方,因为它不能在屏幕外,而是会将对话框底部与屏幕底部对齐。这是预期的行为。您会看到,如果按钮下方有足够的空间,对话框将始终如预期的那样,就在按钮下方。
DEMO - 包括窗口滚动位置
(您需要向下滚动才能到达按钮,您也可以向右滚动以正确测试它)