【问题标题】:How can I remove the extra width to the right of jquery UI datepicker?如何删除 jquery UI datepicker 右侧的额外宽度?
【发布时间】:2015-07-18 12:19:11
【问题描述】:

我正在对 div 使用 jquery UI datepicker,因此我可以在屏幕上看到月份。问题是它似乎添加了一个比实际需要宽得多的宽度属性,这会产生如下所示的额外空白

这是我的代码:

HTML

<div id="myCalendar"></div>

Javascript:

 $("#myCalendar").datepicker({
      numberOfMonths: 6,
      showButtonPanel: false,
       beforeShowDay: function (date) {

           var dateString = $.datepicker.formatDate('yy-mm-dd', date);
           if ($.inArray(dateString, highlightDateArray) > -1)
           {
               return [true, "highlightCell", ''];
           }
               else 
           {
               return [true, '', ''];
           }
        }
    });

从萤火虫中,我看到了

element.style {
     display: block;
     width: 102em;
}

这比必要的要长得多(在 82em 处;会很好)

消除此空白的最佳方法是什么?

【问题讨论】:

  • display:block; 就是这样工作的。 display:block 给元素一个 100% 的宽度,以确保没有其他元素可以放在它旁边,因此下一个元素将放在对象下方。我问了这个问题,这是解决方案:stackoverflow.com/questions/29515601/…
  • 我理解 display:block 点,但我的问题更多是关于 datepicker 将这种样式内联,所以我看不到任何 css 类等要覆盖
  • 当您激活它时,Jquery UI 会发生很大变化。你能做的(我测试过)是去jquery ui并用元素检查检查日期选择器。例如,使用元素检查可以看到每天都有选择器.ui-datepicker td。通过这样做,您可以找到您需要的类和选择器,并且您应该能够覆盖样式。

标签: html css inline jquery-ui-datepicker uidatepicker


【解决方案1】:

问题是它似乎添加了一个更宽的宽度属性 比它实际需要的多,这会产生额外的空白。..

原因:

这就是 jQuery UI 的设计方式。

  1. 它使用一个幻数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'

  1. 其余由核心 CSS 处理。有ui-datepicker-multi-2ui-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

然后,你最终会添加更多的覆盖来解决这个问题,并且可能会遇到更多问题。尽量保持清洁。

【讨论】:

    【解决方案2】:

    对我来说,这看起来像是一个 jQuery UI 设计疏忽——我想不出为什么要使用额外的空白。正如您所说,小部件在em 中具有固定宽度,因此这不仅仅是display: block 的默认行为问题。

    无论如何,我们可以通过以下步骤消除多余的空格:

    1. 在 datepicker 小部件上设置 display: inline-blockwidth: auto,使其宽度缩小以适应其内容。

    2. 对于每个单独的日历元素,移除浮动并改用inline-block 定位(设置float: nonedisplay: inline-block)。

    3. 在日期选择器小部件上设置 white-space: nowrap。这将所有月份保持在一行,防止它们换到第二行。

    我们还需要在其中一些规则上使用!important,以使它们覆盖默认 jQuery UI 样式表中的规则。

    这是最终结果的截图:


    以下是实际代码的现场演示

    $("#myCalendar").datepicker({
      numberOfMonths: 6,
      showButtonPanel: false
    });
    .ui-datepicker {
        display: inline-block !important;
        width: auto !important;
        white-space: nowrap;
    }
    
    .ui-datepicker-multi .ui-datepicker-group {
        float: none !important;
        display: inline-block;
    }
    <link href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
    
    <div id="myCalendar"></div>

    还有一个JSFiddle版本的代码:https://jsfiddle.net/cjpmyp1j/1/


    附带说明一下,如果您计划设置内联样式,因为您无法在文档head 中包含样式表,请考虑在文档正文中与 jQuery UI 一起使用 scoped stylesheet元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多