定位 Angular UI 引导程序 Datepicker

Posted

技术标签:

【中文标题】定位 Angular UI 引导程序 Datepicker【英文标题】:Positioning Angular UI bootstrap Datepicker 【发布时间】:2013-09-14 01:03:38 【问题描述】:

我对 angularjs ui datepicker 有一个“小”问题。我需要以某种方式指出,如果输入带有日期选择器附加,应该从输入的左下角显示弹出窗口(默认)

或者如果我想从输入的右下角改为。这是因为在我正在创建的页面中,我的输入非常靠近页面的右侧,当我附加日期选择器时,会发生这种情况(日期选择器被剪切,现在出现水平滚动):

但问题是我在两个位置都需要日期选择器(根据图像中相关的情况)。

有人知道如何解决这个问题吗?我尝试更改 datepicker 弹出模板中内联的 left 属性,但它始终是一个固定值,我认为这不是真正的选择。

谢谢

【问题讨论】:

您是否考虑过使用 CSS 添加边距?你的 CSS 看起来肯定有问题,可能是因为你使用的是固定布局。例如,如果您的页面的绝对宽度为 1,000 像素,而您的日期选择器的宽度为 300 像素,并且其left 属性的绝对宽度为 800 像素,那么您将失去最右边的 100 像素。在 CSS 中使用固定布局通常是个坏主意(如果用户重新调整浏览器大小、更改屏幕恢复、使用屏幕较小的移动设备等会怎样?)。这在我看来像是 CSS 问题,不是 和 Angular 问题。 我已经通过向日期选择器的父标签添加一个类来解决这个问题,方法是在 CSS 中使用负边距。 【参考方案1】:

https://github.com/angular-ui/bootstrap/issues/1012

丑陋的黑客:

<div class="hackyhack">
  <input datepicker-popup="...">
</div>

魔术CSS:

.hackyhack 
  position: relative;

.hackyhack .dropdown-menu 
   left: auto !important;
   right: 0px;
 

【讨论】:

一点也不丑。 在开玩笑吗?这太棒了!哈哈。拯救了我的一天【参考方案2】:

现在最新的 angular-ui 1.2.0 及以上版本在 uib-datepicker-popup 设置中有popup-placement 选项。

来自文档的快速摘要。

popup-placement(默认:自动左下角,配置:'placement')- 在展示位置之前传入由空格分隔的“auto” 启用自动定位,例如:“自动左下角”。弹出窗口将 尝试定位它适合最近的可滚动祖先的位置。 接受:

top - 顶部弹出,水平居中于输入元素。

top-left - 顶部弹出,左边缘与输入元素左边缘对齐。

top-right - 顶部弹出窗口,右边缘与输入元素右对齐 边缘。

bottom - 底部弹出,水平居中输入 元素。

bottom-left - 底部弹出,左边缘与输入对齐 元素左边缘。

bottom-right - 底部弹出,右边缘对齐 与输入元素右边缘。

left - 在左侧垂直弹出 以输入元素为中心。

left-top - 左侧弹出窗口,上边缘对齐 与输入元素的顶部边缘。

left-bottom - 左侧底部边缘的弹出窗口 与输入元素底部边缘对齐。

right - 右侧弹出窗口, 垂直居中于输入元素。

right-top - 右侧弹出窗口,顶部 边缘与输入元素顶部边缘对齐。

右下 - 弹出 右,底边与输入元素底边对齐。

在你的情况下,我认为bottom-right 会起作用。

与this plunker 一起玩以了解更多详情。

【讨论】:

【参考方案3】:

此 CSS 解决方案可能比更改/破解 Angular .js 文件更简单:

将您的日期选择器包装在一个 div 中,然后覆盖日期选择器的 .dropdown-menu 类的边距 CSS:

<div id="adjust-left">
   <your-datepicker-here/>
<div>

然后,在 CSS 中:

#adjust-left .dropdown-menu
    /* Original value: margin: 2px 0 0; */
    margin: 2px -Xpx; /* Where X is the amount of pixles to shift it left */

【讨论】:

完美解决方案!很简单。我将属性 datepicker-postion-right 添加到 datepicker。然后css变成:input[datepicker-position-right] + ul margin: 2px -Xpx;。不需要额外的 div。 与其他解决方案相比很好。【参考方案4】:

是的,我如上所述破解了我的 angular-ui.0.7.0.tpls.js 文件,它运行得非常好:

function updatePosition() 
    scope.position = appendToBody ? $position.offset(element) : $position.position(element);
    scope.position.top = scope.position.top + element.prop('offsetHeight');

    var padding = 20; //min distance away from right side
    var width = popupEl.outerWidth(true);
    var widthOver =  $('body').outerWidth(true) - (scope.position.left + width + padding);

    if(widthOver < 0) 
        scope.position.left = scope.position.left + widthOver;
    

【讨论】:

感谢您的解决方案,效果很好。只有一件事需要纠正的是 popupEl.outerWidth(true) 应该是 $(popupEl).outerWidth(true) 呃!!当您必须破解许多人使用的东西时,就会产生代码气味。首先,每次更新基本代码时,您都必须重新破解它,其次,您是在帮助自己,而不是帮助他人。尝试接近代码的所有者并要求他们更改代码,以便其他人可以从外部影响它。【参考方案5】:

如果你想实现一个通用的解决方案,这是仅仅通过改变datepicker-popup的模板无法实现的。

您必须更改指令内的updatePosition 函数,以便 scope.position.left 相当于这样的:

 scope.position.left += scope.position.width - $position.position(popupEl).width;

但同样,您必须确保在 popuEl 可见后“读取”它的宽度,否则您将得到零。此外,如果您转到另一种模式(选择月份或年份),尽管弹出窗口的宽度可能会改变,但位置不会更新。

我只想说,这个功能不是一两行改动,可能最好在https://github.com/angular-ui/bootstrap/issues?state=open打开一个请求,可能有人愿意进一步调查!

【讨论】:

嗨贝科斯。感谢您的回答。我已经打开了请求,看看是否有人愿意检查一下。到目前为止,我已经解决了我的问题,但有很多变化。我不得不更改模板并从内联样式中删除 left 属性。我做的另一件事是将输入和日期选择器封装在一个 Div 中,并使用 CSS 和相对定位我为左右对齐创建了一个样式,在我使用它的任何地方,我都根据我需要的对齐方式设置 CSS 类。 我希望引导程序的人考虑这个请求,因为解决方法只是处理这个问题的一种奇怪方法。感谢您的帮助! 是的,如上所述,我破解了我的 angular-ui.0.7.0.tpls.js 文件,效果很好: 不建议从您的库中编辑源代码。当您更新到较新版本时,它们可能会中断

以上是关于定位 Angular UI 引导程序 Datepicker的主要内容,如果未能解决你的问题,请参考以下文章

从 Angular-ui 引导日期选择器中删除周列和按钮

如何将 MVC 模型传递给 UI 引导模式

在 angularjs 中有条件地引导应用程序

如何判断在 Angular-UI 中选择了哪个引导选项卡

Angular 和引导 UI 选项卡都变为活动状态以防止默认

带有 HTML 的 Angular-ui 工具提示