【问题标题】:jQuery Date picker not moving with page scrolljQuery 日期选择器不随页面滚动移动
【发布时间】:2012-09-10 12:36:50
【问题描述】:

我正在使用标准的 jQuery UI 日期选择器,但是当我滚动页面时,日期选择器保持固定。任何想法如何解决这个问题?

http://jsfiddle.net/jbK6a/3/

问候, 尼尔

【问题讨论】:

标签: jquery datepicker


【解决方案1】:

问题在于日期选择器在divoverflow: scroll; 之外。如果日期选择器是在容器内生成的,这不会有问题。

解决方案:http://jsfiddle.net/jbK6a/15/

我将日期选择器放在带有beforeShow 事件的输入后面。

我在可滚动容器上使用了position: relative;,以便绝对元素监听容器。

【讨论】:

  • @lealam 你的 datepicker.js 有问题,继续使用 jQueryUI。
  • 不幸的是,如果用户首先滚动然后单击输入,则此解决方案不起作用。在这种情况下,日历似乎与您滚动的距离成比例地向上移动,从而使对话框位于输入字段的顶部或上方。
  • 如果父元素是绝对定位的,则使用答案中的解决方案以及: beforeShow: _.bind(function (input, ui) { var $absoluteParent = $(input).closest(". absoluteParent"); $absoluteParent.after($(input).datepicker('widget')); setTimeout(function () { ui.dpDiv.css({left:$absoluteParent.css('left') , top: $ absoluteParent.css('top')}); }, 0); }, this), 成功了。非常感谢。
  • 我必须使用 #ui-datepicker-div { top: 0 !important; left: 0 !important; }beforeShow 来正确定位日期选择器
【解决方案2】:

稍微摆弄了一下,我设法得到了以下内容:

http://jsfiddle.net/jbK6a/12/

使用这个,日期选择器隐藏在页面滚动上。我相信有 jQuery 方法可以确定滚动位置,因此稍微麻烦一点,您可以手动操作日期选择器并根据此值更新其位置...

更新: 只是摆弄了一下,得到:http://jsfiddle.net/jbK6a/18/ 滚动日期选择器,但它真的很乱,任何数量的东西都会破坏它,尤其是其他可折叠的元素。幸运的是,Sem 有一个更好、更清洁的解决方案 :)

(我想我还是会添加我的代码)

【讨论】:

  • 隐藏在滚动条上,恕我直言,也是一个优雅的解决方案。 +1
【解决方案3】:

为了在 jQuery UI 1.11.4 中解决这个问题,我在 datepicker 实例化的末尾添加了一个 .bind() 事件:

$("*selector*").datepicker({
  *settings*
}).bind('click',function () {
  $("#ui-datepicker-div").appendTo("*other-selector*");
});

在我的例子中,“其他选择器”是 $(this).closest('the-date-input-parent')。这会拾取单个 #ui-datepicker-div 框(jQuery UI 放置在 DOM 的末尾)并将其移动到文档中的其他位置。这可以为同一页面上的多个日期选择器完成。

other-selector 应该有 position: relative;设置以使绝对定位的#ui-datepicker-div 相对于新父级定位。一旦这样,它滚动就好了。

此解决方案是解决此问题的最简单方法(尽管需要大量时间和搜索才能得出此结论),并且允许日期选择器在移动设备和平板电脑上正常工作,否则将无法使用。

【讨论】:

  • 请注意,您可能希望在#ui-datepicker-div 上设置“top: 0 !important”(或类似的),以确保它保持固定在新 div 的顶部。跨度>
【解决方案4】:

只需从 html 选择器中删除 height: 100% 规则。这样就解决了问题。

【讨论】:

  • 您能给我们一个可行的解决方案或示例吗?
【解决方案5】:

使用 daterangepicker 插件,我们必须添加新选项 parentEl

 <div class="container">
        <h2>Modal Example</h2>
        <!-- Button to Open the Modal -->
        <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">
            Open modal
        </button>

        <!-- The Modal -->
        <div class="modal" id="myModal">
            <div class="modal-dialog">
                <div class="modal-content">

                    <!-- Modal Header -->
                    <div class="modal-header">
                        <h4 class="modal-title">Modal Heading</h4>
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                    </div>

                    <!-- Modal body -->
                    <div class="modal-body">
                        <input type="text" name="dates" value="01/01/2018 - 01/15/2018" />
                       

                    </div>

                    <!-- Modal footer -->
                    <div class="modal-footer">
                        <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
                    </div>

                </div>
            </div>
        </div>

    </div>

    <script>
        $(function() {
            $('input[name="dates"]').daterangepicker({
                parentEl: $('#myModal'),
                showDropdowns: true,
            });

        });
    </script>

【讨论】:

    【解决方案6】:

    使用 Bootstrap 和 datepicker 无法找到任何答案,在模式上滚动时 datepicker 与元素保持连接存在问题。这是我的解决方案:

     var dateModals = (function() {
        'use strict';
    
        var currentInput = '';
    
        var setPos = function() {
            if (currentInput === '') return false;
            var $datepicker = $('.datepicker');
            var topPos = currentInput.offset().top + currentInput.outerHeight();
            if ($datepicker.hasClass('datepicker-orient-bottom')) {
                topPos -= $datepicker.outerHeight() + currentInput.parent('.date').outerHeight();
            }
            $datepicker.css('top', topPos);
        };
    
        var attachEvents = () => {
            $('.modal').on('scroll', function() {
                setPos();
            });
    
            $('.modal').on('click', '.date input.form-control', function() {
                currentInput = $(this);
            });
        };
    
        var initialize = (function() {
            attachEvents();
        })();
    
    })();
    

    如果遵循 Bootstrap 和 Datepicker 语法,这应该很好玩。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      相关资源
      最近更新 更多