jQuery 日期选择器 UI 动画不工作

jQuery Datepicker UI animation not working

我深入搜索了 jQuery Datepicker Widget UI 以了解它的操作和它的构建并最终在我的项目中实现目前正在工作 on.But 我还有一些问题需要详细解释。

我项目中的所有内容都经过详细定制,拒绝观察和应用 standard/default 选项以及它们各自的行为,例如 div 元素中的自定义文本区域字段。因此,我制作了另一个自定义对象,一个自定义 jQuery Datepicker UI 应用于 div (!不在 输入 上)。我对完成与这个自定义日期选择器的完整交互的关注如下:

  1. 日期选择器应该可以小心的放下,不用warping/destroying其他元素定位。也就是说,一旦触发显示,它需要位于所有其他元素之上。
  2. 日期选择器应该可以接受它的属性showAnim,以便在弹出和vice-verse时给人一种良好的视觉感觉。例如。 showAnim: 'drop';

    .

    <head>
        <style>
    
            .calendar {
                background-image: url('http://s15.postimg.org/6rhzg16if/icon_datepicker_128x128.png');
                background-size: contain;
                height: 40px;
                width: 40px;
                float: left;
                margin-top: -6px;
                margin-right: 6px;
                opacity: 0.5;
            }
            .calendar:hover {
                opacity:1;
            }
            .datepicker {
                float: right;
                margin-right: 50px;
                position: relative;
            }
            .ui-corner-all {
                border-top-left-radius: 5px;
                border-top-right-radius: 5px;
            }
            .ui-datepicker {
                width: 216px;
                margin: 5px auto 0;
                font: 9pt Arial, sans-serif;
                -webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, .5);
                -moz-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, .5);
                box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, .5);
            }
            .ui-datepicker a {
                text-decoration: none;
            }
            .ui-datepicker table {
                width: 100%;
                border-collapse: collapse;
                border-spacing: 0;
            }
            .ui-datepicker-header {
                background-color: #333333;
                color: #33CCFF;
                font-size: 18px;
                font-family: calibri;
                font-style: italic;
                -webkit-box-shadow: inset 0px 1px 1px 0px rgba(250, 250, 250, 2);
                -moz-box-shadow: inset 0px 1px 1px 0px rgba(250, 250, 250, .2);
                box-shadow: inset 0px 1px 1px 0px rgba(250, 250, 250, .2);
                text-shadow: #2E8DEF 0px 0px 5px;
                filter: dropshadow(color=#000, offx=1, offy=-1);
                line-height: 30px;
                border-radius: 5px 5px 0 0;
            }
            .ui-datepicker-title {
                text-align: center;
            }
            .ui-datepicker-prev, .ui-datepicker-next {
                /*background-color: #efefef;*/
                display: inline-block;
                margin-top: 8px;
                width: 30px;
                height: 30px;
                text-align: center;
                cursor: pointer;
                line-height: 600%;
                overflow: hidden;
                opacity: 0.5;
                border-top-left-radius: 0;
                border-top-right-radius: 0;
            }
            .ui-datepicker-prev:hover, .ui-datepicker-next:hover {
                opacity: 1;
                -webkit-filter: drop-shadow(0 0 1px #2E8DEF);
                -moz-filter: drop-shadow(0 0 1px #2E8DEF);
                -o: drop-shadow(0 0 1px #2E8DEF);
                filter: drop-shadow(0 0 1px #2E8DEF);
            }
            .ui-datepicker-prev {
                float: left;
                background-position: center -30px;
                width: 0;
                height: 0;
                border-style: solid;
                border-width: 7.5px 13.0px 7.5px 0;
                border-color: transparent #33ccff transparent transparent;
                line-height: 0px;
                _border-color: #000000 #33ccff #000000 #000000;
                _filter: progid: DXImageTransform.Microsoft.Chroma(color='#000000');
                margin-left: 5px;
            }
            .ui-datepicker-next {
                float: right;
                background-position: center 0px;
                width: 0;
                height: 0;
                border-style: solid;
                border-width: 7.5px 0 7.5px 13.0px;
                border-color: transparent transparent transparent #33ccff;
                line-height: 0px;
                _border-color: #000000 #000000 #000000 #33ccff;
                _filter: progid: DXImageTransform.Microsoft.Chroma(color='#000000');
                margin-right: 5px;
            }
            .ui-datepicker thead {
                background-color: #f7f7f7;
                background-image: -moz-linear-gradient(top, #f7f7f7 0%, #f1f1f1 100%);
                background-image: -webkit-gradient(linear, left top, left bottombottom, color-stop(0%, #f7f7f7), color-stop(100%, #f1f1f1));
                background-image: -webkit-linear-gradient(top, #f7f7f7 0%, #f1f1f1 100%);
                background-image: -o-linear-gradient(top, #f7f7f7 0%, #f1f1f1 100%);
                background-image: -ms-linear-gradient(top, #f7f7f7 0%, #f1f1f1 100%);
                background-image: linear-gradient(top, #f7f7f7 0%, #f1f1f1 100%);
                filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#f7f7f7', endColorstr='#f1f1f1', GradientType=0);
                /*border-bottom: 1px solid #bbb;*/
            }
            .ui-datepicker th {
                text-transform: uppercase;
                font-size: 6pt;
                padding: 5px 0;
                color: #666666;
                text-shadow: 1px 0px 0px #fff;
                filter: dropshadow(color=#fff, offx=1, offy=0);
            }
            .ui-datepicker tbody td {
                padding: 0;
                border-right: 1px solid #bbb;
            }
            .ui-datepicker tbody td:last-child {
                border-right: 0px;
            }
            .ui-datepicker tbody tr {
                border-bottom: 1px solid #bbb;
            }
            .ui-datepicker tbody tr:last-child {
                border-bottom: 0px;
            }
            .ui-datepicker td span, .ui-datepicker td a {
                display: inline-block;
                font-weight: bold;
                text-align: center;
                width: 30px;
                height: 30px;
                line-height: 30px;
                color: #666666;
                text-shadow: 1px 1px 0px #fff;
                filter: dropshadow(color=#fff, offx=1, offy=1);
            }
            .ui-datepicker-calendar .ui-state-default {
                background: #ededed;
                background: -moz-linear-gradient(top, #ededed 0%, #dedede 100%);
                background: -webkit-gradient(linear, left top, left bottombottom, color-stop(0%, #ededed), color-stop(100%, #dedede));
                background: -webkit-linear-gradient(top, #ededed 0%, #dedede 100%);
                background: -o-linear-gradient(top, #ededed 0%, #dedede 100%);
                background: -ms-linear-gradient(top, #ededed 0%, #dedede 100%);
                background: linear-gradient(top, #ededed 0%, #dedede 100%);
                filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#dedede', GradientType=0);
                -webkit-box-shadow: inset 1px 1px 0px 0px rgba(250, 250, 250, .5);
                -moz-box-shadow: inset 1px 1px 0px 0px rgba(250, 250, 250, .5);
                box-shadow: inset 1px 1px 0px 0px rgba(250, 250, 250, .5);
            }
            .ui-datepicker-unselectable .ui-state-default {
                background: #f4f4f4;
                color: #b4b3b3;
            }
            .ui-datepicker-calendar .ui-state-hover {
                background: #f7f7f7;
            }
            .ui-datepicker-calendar .ui-state-active {
                background: #6eafbf;
                -webkit-box-shadow: inset 0px 0px 10px 0px rgba(0, 0, 0, .1);
                -moz-box-shadow: inset 0px 0px 10px 0px rgba(0, 0, 0, .1);
                box-shadow: inset 0px 0px 10px 0px rgba(0, 0, 0, .1);
                color: #e0e0e0;
                text-shadow: 0px 1px 0px #4d7a85;
                filter: dropshadow(color=#4d7a85, offx=0, offy=1);
                border: 1px solid #55838f;
                position: relative;
                margin: -1px;
            }
            .ui-datepicker-calendar td:first-child .ui-state-active {
                width: 29px;
                margin-left: 0;
            }
            .ui-datepicker-calendar td:last-child .ui-state-active {
                width: 29px;
                margin-right: 0;
            }
            .ui-datepicker-calendar tr:last-child .ui-state-active {
                height: 29px;
                margin-bottom: 0;
            }
    
        </style>
    
    </head>
    
    
    <body>
    
        <div id='LPdate1' class='calendar'></div>
        <div id='datepicker1' class='datepicker'></div>
        <div id='LPdate2' class='calendar'></div>
        <div id='datepicker2' class='datepicker'></div>
    
        <script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
        <script src="http://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
        <script type='text/javascript'>
    
            $('#datepicker1, #datepicker2').hide();
            $('#datepicker1, #datepicker2').datepicker({
                showAnim: 'drop',
                showOtherMonths: true,
                dateFormat: 'dd MM yy',
                dayNamesMin: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                minDate: 0,
                maxDate: '+1y',
                onSelect: function (dateText) {
                    selectedDate = dateText;
                    console.log(selectedDate);
                }
            });
            $('#LPdate1').click(function () {
                $('#datepicker1').toggle();
            });
            $('#LPdate2').click(function () {
                $('#datepicker2').toggle();
            });
    
        <script>
    </body>
    

JS Fiddle 这里: http://jsfiddle.net/q800owcj/5/

不确定为什么日期选择器 showAnim 设置不起作用,但如果您使用:

...
$('#datepicker1').toggle("drop");
...

有效。

已更新:

jQuery 日期选择器实际上是为与关联的输入字段一起使用而设计的,因此它具有默认行为,即当字段获得焦点时显示日期选择器,并在字段失去焦点时隐藏。

让它与其他对象一起工作,比如 DIV,总是需要使用像 show()hide()toggle() 这样的方法,因此需要内置的外观相关选项,比如showAnim 不会有任何效果,因为它们只在默认情况下有效。

如果您只有一个日期选择器要显示,您可以使用零宽度输入字段,并使用点击处理程序来触发 .triggerHandler('focus') / .trigger('blur') 事件,但老实说,我认为这是一个可怕的 hack,不会反正到头来还是那么好。
所以坚持你的解决方案 - 它有效。虽然您不再需要 showAnim 选项,但您仍然可以将其保留在那里并使用它来驱动您的 toggles:

var showAnim = $( "#datepicker1" ).datepicker("option", "showAnim");
...
$('#datepicker1').toggle(showAnim);

希望对您有所帮助。

结合 Raad 部分给出的答案(感谢他),我找到了一个完美的解决方案。

从 :

更改外部 datepickercss.css 中的几行
.datepicker {
    float: right;
    margin-right: 50px;
    position: relative;
}

至:

.datepicker {
    left:0;
    margin-left: 50px;
    position: absolute;
    z-index:999;
}
#datepicker1 {
    top: 66px;
}
#datepicker2 {
    top: 135px;
}

和如下标签:

.tab { position: relative;}

这里是 jsFiddle 中完整的全功能 DEMO