Как выровнять Datepicker по правому краю текстового поля?

У меня есть jQuery UI Datepicker в правом верхнем углу моего макета.
По умолчанию он открывается с выравниванием по левому краю своего текстового поля.
Таким образом, он выпадает из макета:

Выбор даты

Как сделать так, чтобы он открывался с выравниванием по правой границе текстового поля?


person Michał Pękała    schedule 17.06.2010    source источник


Ответы (9)


Мне потребовалось некоторое время, чтобы понять это.

$('.date').datepicker({
    beforeShow: function(input, inst) {
        var widget = $(inst).datepicker('widget');
        widget.css('margin-left', $(input).outerWidth() - widget.outerWidth());
    }
});
person Alex Barker    schedule 05.12.2011
comment
Если у вас есть 2 поля средства выбора даты на одной странице, как только вы откроете одно из них с помощью этого скрипта, все остальные поля средства выбора даты будут выровнены по правому краю. - person danludwig; 01.06.2012
comment
Если левая позиция виджета уже скорректирована из-за меньшего размера окна, значение поля слева слишком велико. - person Stacker; 11.12.2018

Я знаю, что это старый вопрос... но все еще не родное решение... вот обновленный фрагмент кода:

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

Решение Алекса было хорошим, но оно не сработало, если вы попытались уменьшить размер окна. Проблема заключалась в том, что jquery ui пытается вычислить положение виджета, чтобы он никогда не выпадал из поля зрения. Дело в том, что это не очень хорошо работает с решением Алекса. Я изменил исходный код (что не очень приятно, но это единственное решение, которое я придумал), чтобы добиться результата. Вот функция в строке 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;
    },
person Žan Kusterle    schedule 24.12.2012

Вы можете выровнять средство выбора даты пользовательского интерфейса jQuery с правой стороны, соответствующее полю ввода.

[Здесь -176 - это ширина моего 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'
        });
        }
        });
    });
person Vijay Dhanvai    schedule 20.04.2015

На это был дан ответ здесь: https://stackoverflow.com/a/28113070/6173628

Вариант ориентации - это то, что работает:

//datepicker
$('dob').on('click',function(){
    $('.datepicker').datepicker({
        "format": "dd/mm/yyyy",
         "autoclose": true,
         "orientation": right
    });
});
person Zachary Vorwaller    schedule 18.10.2017
comment
Я считаю, что этот ответ предназначен для средства выбора даты начальной загрузки, в то время как оператор спрашивает о средстве выбора даты пользовательского интерфейса jQuery. - person DaveLak; 17.11.2017

Это просто. Вы можете сделать это таким образом. Ключ использует 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
                });
              }
            }
    });

Это самый подходящий способ из множества доступных.

person Mustkeem K    schedule 12.04.2018

Улучшение ответа Алекса Баркера, когда окно достаточно маленькое, чтобы сместить виджет.

$('.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);
   }
});
person Stacker    schedule 11.12.2018


Просто вы можете установить параметр rtl (арабский способ) в файле jQuery. Найдите isRTL, затем измените значение с false на true. ( isRTL: правда )

Если вам нужно только выровнять все всплывающее окно, тогда просто установите параметр rtl и удалите атрибут направления в пользовательском css. Например: .ui-datepicker-rtl {}

Но это не установит стрелки для навигации по месяцам. Если вам нужна и эта функциональность, вам придется проделать больше работы. Вы должны отредактировать основные функции, связанные с rtl (искать isrtl и изменить значения соответственно) и изменить css, связанный с rtl.

person zap - CG    schedule 13.01.2011
comment
это ерунда и хак, чтобы вернуться в режим rtl, чтобы что-то правильно выровнять - person mare; 09.02.2011