【问题标题】:jquery position with collision. add class when collision detectedjquery位置与碰撞。检测到碰撞时添加类
【发布时间】:2012-10-29 06:42:50
【问题描述】:

我正在使用带有碰撞的 jquery-ui 的自动完成框来在输入上方或下方显示自动完成。我想要的是在检测到碰撞时向自动完成元素添加一个类,这样我可以稍微自定义 CSS 是否高于或低于。这似乎应该很简单,但我似乎无法找到任何方法来实现它。

【问题讨论】:

    标签: jquery jquery-ui position collision


    【解决方案1】:

    更好的解决方案是在回调中使用第二个参数。 来自 jQueryUi 文档:

    第二个提供有关两个元素的位置和尺寸的反馈,以及对它们相对位置的计算。 target 和 element 都具有以下属性:element、left、top、width、height。此外,还有水平、垂直和重要,给你十二个潜在的方向,如{水平:“中心”,垂直:“左”,重要:“水平”}。

    正如它所说,第二个参数中有一个 horizo​​ntal 和一个 vertical 属性,您可以使用它们来确定元素是否被翻转。所以你可以这样写:

    $("#someId").dialog({
          position: {
          my: 'left top',
          at: 'right top',
          collision: 'flip flip',
          of: $('#' + someElementID),
          using: function (obj,info) {
              if (info.vertical != "top") {
                  $(this).addClass("flipped");
              } else {
                  $(this).removeClass("flipped");
              }
              if (info.horizontal != "left") {
                  $(this).addClass("flipped");
              } else {
                  $(this).removeClass("flipped");
              }
              $(this).css({
                left: obj.left + 'px',
                top: obj.top + 'px'
              });
          }
    },
    

    【讨论】:

    • 我在文档中读到了这个,但是当我尝试它时,我在 using 回调中根本没有得到第二个参数。你知道这是否是在更新版本的 jQuery UI 中添加的东西吗?不幸的是,我们现在停留在相对古老的 1.8.2 上。
    • 我不确定,但我想我已经用 1.8.12 或 1.10.3 对其进行了测试但是,它似乎不像是在版本的微小变化中引入的东西!
    【解决方案2】:

    比起使用这里提到的两种解决方案,我更喜欢创建一个自定义翻转处理程序,它使用默认处理程序并检测是否有变化。

    这是我的做法:

    $.ui.position.custom = {
        left: function(position, data) {
            var initPos = position.left;
            $.ui.position.flip.left(position, data);
            if (initPos != position.left) {
                data.elem.addClass('tooltipFlipLeft');
            } else {
                data.elem.removeClass('tooltipFlipLeft');
            }
        },
        top: function(position, data) {
            var initPos = position.top;
            $.ui.position.flip.top(position, data);
            if (initPos != position.top) {
                data.elem.addClass('tooltipFlipTop');
            } else {
                data.elem.removeClass('tooltipFlipTop');
            }
        }
    };
    

    那我在使用位置函数的时候就用到了:

    me.position({
        of: opener,
        my: 'right bottom',
        at: 'center top',
        collision: 'custom'
    });
    

    这里唯一相关的线是有碰撞的线。

    【讨论】:

    • 这是唯一可行的解​​决方案。此外,像这里提到的那样扩展现有逻辑似乎是一种很好的方法。使用这个!
    • 这个答案对我来说非常有效。这是我能得到的唯一解决方案,你可以知道翻转发生的方向。谢谢!
    【解决方案3】:

    您应该使用positionusing 回调

    这是一个可能的解决方案,假设您打开一个对话框...

    $("#someId").dialog({
    position: {
        my: 'left top',
        at: 'right top',
        collision: 'flip flip',
        of: $('#' + someElementID),
        using: function (obj) {
            if (obj.left < $('#' + someElementID).offset().left) {
                $(this).addClass("flipped");
            } else {
                $(this).removeClass("flipped");
            }
            //decide if dialog is being opened flipped from buttom to top
            if ((obj.top + 50) < $('#' + someElementID).offset().top) {
                $(this).addClass("flipped_top");
            } else {
                $(this).removeClass("flipped_top");
            }
            $(this).css({
                left: obj.left + 'px',
                top: obj.top + 'px'
            });
        }
    },
        ...
    

    您可以向对话框本身添加/删除类,而不是向$(this) 添加/删除类...

    【讨论】:

    • 什么是 someElement ?
    • 任何其他你不想反映对话框被翻转的元素(想不出场景atm)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2019-04-30
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多