检测Web,下拉菜单是否将显示在屏幕外

时间:2010-06-21 17:56:57

标签: javascript jquery html css menu

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

如果检测到这种情况,某些预先构建的菜单控件只会打开向左而不是向右的下拉列表。

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

3 个答案:

答案 0 :(得分:2)

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

/*---   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);

答案 1 :(得分:1)

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

(未经测试的例子)

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

答案 2 :(得分:1)

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

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