【问题标题】:Detect if a web, drop-down menu is going to display off screen检测网页,下拉菜单是否将显示在屏幕外
【发布时间】:2011-03-06 10:52:10
【问题描述】:

我有一个基于 CSS 的简单多级下拉菜单。第二级或第三级可能超出可见窗口,具有某些分辨率和窗口大小的组合。

如果检测到这种情况,一些预建的菜单控件只会打开左侧而不是右侧的下拉菜单。

我该如何测试(使用 JS/jQuery)这种情况?

【问题讨论】:

  • 罗恩,我不会写出一个大的答案,但请确保您解决的任何问题都考虑到有人打开您的页面已经向下滚动(即通过锚点或他们的浏览器)的情况“记住”之前的位置)。话虽如此,jQuery UI 的 Position 实用程序可能正是您想要的。它可以处理您担心的类型的“碰撞”。

标签: javascript jquery html css menu


【解决方案1】:

您可以使用以下功能测试菜单项是否在屏幕外:

/*---   function bIsNodeClippedOrOffscreen returns true if a node
        is offscreen (without scrolling).
        Requires jQuery.
*/
function bIsNodeClippedOrOffscreen (zJnode)
{
    var aDivPos             = zJnode.offset ();
    var iLeftPos            = aDivPos.left;
    var iTopPos             = aDivPos.top;

    var iDivWidth           = zJnode.outerWidth  (true);
    var iDivHeight          = zJnode.outerHeight (true);

    var bOffScreen          = CheckIfPointIsOffScreen (iLeftPos, iTopPos);
    var bClipped            = CheckIfPointIsOffScreen (iLeftPos + iDivWidth, iTopPos + iDivHeight);

    return (bOffScreen || bClipped);
}


function CheckIfPointIsOffScreen (iLeftPos, iTopPos)
{
    var iBrowserWidth       = $(window).width()  - 16;   //-- 16 is fudge for scrollbars, refine later
    var iBrowserHeight      = $(window).height() - 16;   //-- 16 is fudge for scrollbars, refine later
    var bOffScreen          = false;

    if (iLeftPos < 0  ||  iLeftPos >= iBrowserWidth)
        bOffScreen          = true;

    if (iTopPos < 0   ||  iTopPos >= iBrowserHeight)
        bOffScreen          = true;

    return bOffScreen;
}

.
示例用法:

<li id="SomeMenuItem"> Get your shopping cart for free!
...
...

var Node            = $("#SomeMenuItem");

var NeedToMoveIt    = bIsNodeClippedOrOffscreen (Node);

【讨论】:

    【解决方案2】:

    您必须显示元素才能获得大小,因此在屏幕外显示子菜单。获取元素的宽度/高度,计算预期显示位置(右/下),与屏幕宽度/高度进行比较,决定显示哪个位置并将元素移动到最终位置。

    (未经测试的示例)

    function displaysOffPageRight(defaultLeft){
        $('#submenu1').addClass('displayOffScreen');
        var offPage = defaultLeft + $('#submenu1').width() > screen.width;
        $('#submenu1').removeClass('displayOffScreen');
        return offPage;
    }
    

    【讨论】:

    • 您还可以在 jQuery 中更改元素的显示,获取其高度,然后将其设置回隐藏。这应该可以正常工作。
    【解决方案3】:

    当菜单尚未显示时,您无法获取其尺寸。来设置它的位置。如果您设置 CSS visibility: hiddendisplay: none,菜单将不会显示,但定义其尺寸。然后你可以使用jQuery.offset 获取它的位置,使用jQuery.outerWidth/outerHeight 获取它的高度/宽度(注意后面功能的margin 选项)。哦,如果您使用任何负边距,请小心,这需要特殊处理。

    使用jQuery(window).height().width() 获取窗口的尺寸,您应该能够从那里算出数学。

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 2020-03-19
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多