问题是它似乎添加了一个更宽的宽度属性
比它实际需要的多,这会产生额外的空白。..
原因:
这就是 jQuery UI 的设计方式。
- 它使用一个幻数
17 来计算容器的宽度。
从jquery UI v1.11.4 js 的代码第 4561 到 4574 行:
var origyearshtml,
numMonths = this._getNumberOfMonths(inst),
cols = numMonths[1],
width = 17,
activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
if ( activeCell.length > 0 ) {
datepicker_handleMouseover.apply( activeCell.get( 0 ) );
}
inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
if (cols > 1) {
inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
}
它检查列数(要显示的月份)是否超过1,并计算宽度为(17 * cols) + 'em'。
- 其余由核心 CSS 处理。有
ui-datepicker-multi-2 到ui-datepicker-multi-4 的样式在% 中有预定义的宽度。这会导致内部 .ui-datepicker-group 适合在 Javascript 代码中计算的宽度并应用于同一行(参见上面的 js 代码)。如果您查看核心 CSS,您会发现它的样式仅持续了长达 4 个月。如果月数超过 4,则宽度不会应用于 .ui-datepicker-group(虽然相关类是通过 js 应用的),因此它们不会扩展到容器的整个宽度。
来自jQuery UI v1.11.4 css,第 333 到 341 行:
.ui-datepicker-multi-2 .ui-datepicker-group {
width: 50%;
}
.ui-datepicker-multi-3 .ui-datepicker-group {
width: 33.3%;
}
.ui-datepicker-multi-4 .ui-datepicker-group {
width: 25%;
}
您可以看到...multi-5 及以后的类没有定义。
消除此空白的最佳方法是什么?
推荐解决方案:
只需在自定义 CSS 中根据需要添加更多类。这是推荐的方式(这里的回复中也建议:https://forum.jquery.com/topic/datepicket-problem-with-width-when-showing-multiple-months)。也是最干净的解决方案。
只需将以下行添加到您的自定义 CSS 中:
.ui-datepicker-multi-5 .ui-datepicker-group { width: 20%; }
.ui-datepicker-multi-6 .ui-datepicker-group { width: 16.666%; }
.ui-datepicker-multi-7 .ui-datepicker-group { width: 14.285%; }
.ui-datepicker-multi-8 .ui-datepicker-group { width: 12.5%; }
.ui-datepicker-multi-9 .ui-datepicker-group { width: 11.111%; }
.ui-datepicker-multi-10 .ui-datepicker-group { width: 10%; }
.ui-datepicker-multi-11 .ui-datepicker-group { width: 9.0909%; }
.ui-datepicker-multi-12 .ui-datepicker-group { width: 8.333%; }
这将处理长达 12 个月的所有可能性。如果需要,根据您的用例添加更多类。
为了完整起见,这里是一个演示:
片段:
$("#myCalendar").datepicker({ numberOfMonths: 5, showButtonPanel: false });
.ui-datepicker-multi-5 .ui-datepicker-group { width: 20%; }
.ui-datepicker-multi-6 .ui-datepicker-group { width: 16.666%; }
.ui-datepicker-multi-7 .ui-datepicker-group { width: 14.285%; }
.ui-datepicker-multi-8 .ui-datepicker-group { width: 12.5%; }
.ui-datepicker-multi-9 .ui-datepicker-group { width: 11.111%; }
.ui-datepicker-multi-10 .ui-datepicker-group { width: 10%; }
.ui-datepicker-multi-11 .ui-datepicker-group { width: 9.0909%; }
.ui-datepicker-multi-12 .ui-datepicker-group { width: 8.333%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://code.jquery.com/ui/1.11.4/themes/ui-lightness/jquery-ui.css" rel="stylesheet"/>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
<div id="myCalendar"></div>
还有一个惯用的 Fiddle:https://jsfiddle.net/abhitalks/u07kfLaa/1/
注意:不要试图改变或强行覆盖核心的 jQuery-UI CSS(除非它是绝对不可避免的)。这不是推荐的最佳做法。您最终可能会遇到意想不到的问题,例如就像下面的截图中可见的这个人工制品(显示在红色圆圈中),当你强制组件inline-block:
然后,你最终会添加更多的覆盖来解决这个问题,并且可能会遇到更多问题。尽量保持清洁。