如何将Datepicker与文本框右边缘对齐?

时间:2010-06-17 09:51:45

标签: jquery jquery-ui calendar datepicker alignment

我的布局右上角有jQuery UI Datepicker 默认情况下,它会打开,与文本框的左边缘对齐 因此,它不属于布局:

Date Picker

如何将其打开与文本框的右边框对齐?

9 个答案:

答案 0 :(得分:17)

我花了一段时间来弄清楚这一点。

$('.date').datepicker({
    beforeShow: function(input, inst) {
        var widget = $(inst).datepicker('widget');
        widget.css('margin-left', $(input).outerWidth() - widget.outerWidth());
    }
});

答案 1 :(得分:3)

我知道这是一个老问题......但仍然不是本机解决方案......这是一段更新的代码:

$('.datepicker').datepicker({
    beforeShow:function( input, inst )
    {
        var dp = $(inst.dpDiv);
        var offset = $(input).outerWidth(false) - dp.outerWidth(false);
        dp.css('margin-left', offset);
    }
});

答案 2 :(得分:1)

亚历克斯的解决方案很不错,但如果您尝试调整窗口大小,则效果不佳。问题是jquery ui正在尝试计算小部件的位置,因此它永远不会脱离视图。事情是它与Alex的解决方案不兼容。我更改了源代码(这不是很好,但只有我想出的解决方案)来实现结果。这是我改变的第3960行的功能:

/* Check positioning to remain on screen. */
    _checkOffset: function(inst, offset, isFixed) {
        // CHANGED This way I can add class date-right to the input to make it right aligned
        var isRightAlign = inst.input.hasClass('date-right');

        var dpWidth = inst.dpDiv.outerWidth();
        var dpHeight = inst.dpDiv.outerHeight();
        var inputWidth = inst.input ? inst.input.outerWidth() : 0;
        var inputHeight = inst.input ? inst.input.outerHeight() : 0;
        var viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft());
        var viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());

        // CHANGED Alex's solution is implemented on the next line (just add || isRightAlign)
        offset.left -= (this._get(inst, 'isRTL') || isRightAlign ? (dpWidth - inputWidth) : 0);
        offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
        offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;

        // CHANGED Do not check if datepicker is outside of the viewport if it's right aligned
        if(!isRightAlign){
            // now check if datepicker is showing outside window viewport - move to a better place if so.
            offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
                Math.abs(offset.left + dpWidth - viewWidth) : 0);
        }

        offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
            Math.abs(dpHeight + inputHeight) : 0);

        return offset;
    },

答案 3 :(得分:1)

这已在此处回答:https://stackoverflow.com/a/28113070/6173628

方向选项有效:

//datepicker
$('dob').on('click',function(){
    $('.datepicker').datepicker({
        "format": "dd/mm/yyyy",
         "autoclose": true,
         "orientation": right
    });
});

答案 4 :(得分:0)

您可以从右侧对应输入字段对齐jQuery UI日期选择器。

[这里-176是我的datepicker div的宽度,你可以根据需要改变。]

请检查运行演示

http://jsfiddle.net/VijayDhanvai/m795n3zx/

http://jsfiddle.net/m795n3zx/

$(document).ready(function () {
        $('#txtDateFrom,#txtDateTo').datepicker({
        changeYear: true,
        beforeShow: function (textbox, instance) {   
        instance.dpDiv.css({
            marginLeft: textbox.offsetWidth+ (-176) + 'px'
        });
        }
        });
    });

答案 5 :(得分:0)

这很简单。你可以这样做。关键是使用margin-left而不是更改左值。此代码也适用于响应。这意味着文本框左侧的空间不足以从左侧渲染:0而不是右:文本框的0。

$(".date").datepicker({
         dateFormat: "yy-mm-dd",
         changeYear: true,
         minDate:0,
         yearRange: "+0:+2",
         beforeShow: function (textbox, instance) {
            marginLeftDatepicker=  $(instance.dpDiv).outerWidth() - 
         $(textbox).outerWidth()
            datePickerWidth = $(instance.dpDiv).outerWidth();
              var datepickerOffset = $(textbox).offset();
              if(datepickerOffset.left > datePickerWidth){ // this condition 
            will allign right 0 according to textbox
                  instance.dpDiv.css({
                 marginLeft: -marginLeftDatepicker + 'px'
                });
              } else { // for resize if you resize and dont have enough 
             space to align from righ so keep it allign left
                instance.dpDiv.css({
                 marginLeft: 0
                });
              }
            }
    });

这是许多可用的最合适的方法。

答案 6 :(得分:0)

当窗口小到足以移动小部件时,改善Alex Barker的答案。

$('.date').datepicker({
    beforeShow: function(input, inst) {
        var widget = $(instance).datepicker('widget');
        var marginLeft = $(input).outerWidth() - widget.outerWidth();
        if ($(input).offset().left + $(widget).outerWidth() > $(window).width()) {
                    marginLeft += ($(input).offset().left + $(widget).outerWidth()) - $(window).width();
        }
        marginLeft = marginLeft > 0 ? 0: marginLeft;
        widget.css('margin-left', marginLeft);
   }
});

答案 7 :(得分:-1)

options.widgetPositioning={
                horizontal:'right'
                ,vertical: 'auto'
            };

比照https://eonasdan.github.io/bootstrap-datetimepicker/Options/#widgetpositioning

答案 8 :(得分:-3)

简单地说,您可以在jQuery中设置rtl(Arabin方式)选项。搜索isRTL,然后将值从false更改为true。 (isRTL:true)

如果您只需要对齐整个弹出框,那么只需设置rtl选项并删除即可 自定义css中的direction属性。 例如:.ui-datepicker-rtl {}

但是,这不会设置箭头来浏览几个月。如果您还需要该功能,那么您必须做更多的工作。您必须编辑与rtl相关的核心功能(搜索isrtl并相应地更改值)&改变与rtl相关的CSS。