如何改变jQuery DatePicker控件的弹出位置

IT技术 javascript jquery jquery-ui jquery-ui-datepicker
2021-01-22 00:56:58

知道如何让 DatePicker 出现在相关文本框的末尾而不是直接在其下方吗?往往发生的情况是文本框靠近页面底部,DatePicker 向上移动以解决它并完全覆盖文本框。如果用户想输入日期而不是选择日期,他们就不能。我宁愿让它出现在文本框之后,所以它如何垂直调整并不重要。

知道如何控制定位吗?我没有看到小部件的任何设置,我也没有运气调整 CSS 设置,但我很容易遗漏一些东西。

6个回答

这是我正在使用的:

$('input.date').datepicker({
    beforeShow: function(input, inst) {
        inst.dpDiv.css({
            marginTop: -input.offsetHeight + 'px', 
            marginLeft: input.offsetWidth + 'px'
        });
    }
});

您可能还想在左边距上多添加一点,这样它就不会正对输入字段。

好招。问题是,在日期选择器显示在屏幕边界之外的情况下,_showDatepicker 将尝试重新定位它,因此,顶部和左侧将不同,并且 marginTop、marginLeft 可能需要调整。
2021-03-26 00:56:58
我使用了类似的方法——我接受了你使用 beforeShow 的想法,但我的 beforeShow 函数使用了 JQueryUI 的位置效果:($(this).position(my:'left top', at:'left bottom', of:'#altField')因为我使用的是日期选择器的altField显示选项)
2021-04-01 00:56:58
这可能适用于设置边距,但不适用于“左”、“顶”、“z-index”和“位置”属性。
2021-04-05 00:56:58
据我了解,这也不起作用,因为 jquery 在调用 beforeShow 后重置位置。
2021-04-05 00:56:58
给定的答案错误的,因为 datepicker 将在 beforeShow() 返回后重置位置。
2021-04-09 00:56:58

我直接在 CSS 中做:

.ui-datepicker { 
  margin-left: 100px;
  z-index: 1000;
}

我的日期输入字段都是 100px 宽。我还添加了 z-index,因此日历也出现在 AJAX 弹出窗口上方。

我不修改 jquery-ui CSS 文件;我在我的主 CSS 文件中重载了该类,因此我可以更改主题或更新小部件,而无需重新输入我的特定module。

使用 Bootstrap 为我工作 :) 但我只设置了 z-index 属性。
2021-03-21 00:56:58
与其他 css-trick 相同的问题:仅当您现在确切地在 CSS 中放置日期选择器时才有效。您不能使用此方法动态放置日期选择器。我不得不使用 hack,绑定 inst.input.focus()
2021-03-28 00:56:58
除了琐碎的实现之外,其他任何东西都没用,因为您不知道输入字段在页面上的位置。
2021-04-13 00:56:58

这是我对 Datepicker 日历对齐的变体。

我认为它非常好,因为您可以通过 jQuery UI Position util 控制定位。

一个限制:需要 jquery.ui.position.js。

代码:

$('input[name=date]').datepicker({
    beforeShow: function(input, inst) {
        // Handle calendar position before showing it.
        // It's not supported by Datepicker itself (for now) so we need to use its internal variables.
        var calendar = inst.dpDiv;

        // Dirty hack, but we can't do anything without it (for now, in jQuery UI 1.8.20)
        setTimeout(function() {
            calendar.position({
                my: 'right top',
                at: 'right bottom',
                collision: 'none',
                of: input
            });
        }, 1);
    }
})
谢谢@kottenator,这真的很有用(尤其是使用 position.js)!
2021-03-25 00:56:58
这在 v1.11.4 中仍然有效,但这确实是一个肮脏的黑客,太糟糕了 jQuery API 不允许我们在afterShow方法中这样做
2021-03-27 00:56:58
这个答案仅显示了 position.js 的优点。
2021-03-29 00:56:58

这是另一个对我很有效的变体,调整 rect.top + 40, rect.left + 0 以满足您的需要:

$(".datepicker").datepicker({
    changeMonth: true,
    changeYear: true,
    dateFormat: 'mm/dd/yy',
    beforeShow: function (input, inst) {
        var rect = input.getBoundingClientRect();
        setTimeout(function () {
	        inst.dpDiv.css({ top: rect.top + 40, left: rect.left + 0 });
        }, 0);
    }
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
<form>
<input class="datepicker" name="date1" type="text">
<input class="datepicker" name="date2" type="text">
</form>

谢谢你这对我有用,我想知道是否会有 afterShow 活动,那太好了!!但是现在这可以帮助我继续进行:D
2021-03-17 00:56:58
通过引入超时来克服编程问题远非完美。
2021-03-18 00:56:58
哇它有效。使用 "inst.dpDiv.css("top", "40px !important");" 不工作!
2021-03-22 00:56:58
我尝试了很多其他解决方案,这是唯一有效的解决方案
2021-03-24 00:56:58

这个问题的公认答案实际上不适用于 jQuery UI Datepicker。要更改 jQuery UI Datepicker 的位置,只需修改 css 文件中的 .ui-datepicker。Datepicker的大小也可以通过这种方式改变,只需调整字体大小即可。

@gfrizzle - 是的,我的答案太错误了。终于可以把它装箱了。不知道我当时在想什么:/
2021-03-21 00:56:58
你能告诉我你做了哪些改变吗?
2021-03-23 00:56:58
我不知道为什么这是公认的答案,因为它几乎完全没用。
2021-03-28 00:56:58
这个答案没有提供任何细节,不应该是公认的答案。
2021-04-01 00:56:58
给出的答案因为日期选择器完全无用将动态弹出的小窗口前修改的.ui-日期选择器的CSS。
2021-04-12 00:56:58