知道如何让DatePicker出现在相关文本框的末尾而不是直接在它下面吗?容易发生的是文本框朝向页面底部,DatePicker向上移动以占用它并完全覆盖文本框.如果用户想要输入日期而不是选择日期,则他们不能.我宁愿让它出现在文本框之后,所以它如何垂直调整并不重要.
知道如何控制定位吗?我没有看到小部件的任何设置,我没有运气调整CSS设置,但我很容易丢失一些东西.
这是我正在使用的:
$('input.date').datepicker({ beforeShow: function(input, inst) { inst.dpDiv.css({marginTop: -input.offsetHeight + 'px', marginLeft: input.offsetWidth + 'px'}); } });
您可能还想向左边距添加更多内容,因此它不会对输入字段.
我直接在CSS中做到这一点:
.ui-datepicker { margin-left: 100px; z-index: 1000; }
我的日期输入字段都是100px宽.我还添加了z-index,因此日历也出现在AJAX弹出窗口之上.
我不修改jquery-ui CSS文件; 我在主CSS文件中重载了类,所以我可以更改主题或更新小部件而无需重新输入我的特定mod.
这是我的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); } })
这是另一个适合我的变体,调整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);
}
});
这个问题的接受答案实际上不适用于jQuery UI Datepicker.要更改jQuery UI Datepicker的位置,只需在css文件中修改.ui-datepicker即可.Datepicker的大小也可以通过这种方式更改,只需调整字体大小即可.
这对我有用:
beforeShow: function(input, inst) { var cal = inst.dpDiv; var top = $(this).offset().top + $(this).outerHeight(); var left = $(this).offset().left; setTimeout(function() { cal.css({ 'top' : top, 'left': left }); }, 10);
首先我认为afterShowing
在datepicker对象中应该有一个方法,你可以在jquery在_showDatepicker
方法中完成所有voodoo之后改变位置.此外,调用的参数preferedPosition
也是可取的,因此您可以设置它,并且jquery会修改它,以防对话框在视口外部呈现.
最后这件事有一个"诀窍".如果您研究该_showDatepicker
方法,您将看到使用私有变量$.datepikcer._pos
.如果之前没有人设置过,那么该变量将被设置.如果在显示对话框之前修改该变量,Jquery将接受它并将尝试在该位置分配对话框,如果它呈现在屏幕外,它将调整它以确保它是可见的.听起来不错,嗯?
问题是; _pos
是私人的,但如果你不介意的话.您可以:
$('input.date').datepicker({ beforeShow: function(input, inst) { $.datepicker._pos = $.datepicker._findPos(input); //this is the default position $.datepicker._pos[0] = whatever; //left $.datepicker._pos[1] = whatever; //top } });
但要小心Jquery-ui更新,因为内部实现的更改_showDatepicker
可能会破坏您的代码.