Определить, будет ли отображаться веб-меню в раскрывающемся меню - PullRequest
4 голосов
/ 21 июня 2010

У меня есть простое выпадающее меню на основе CSS с несколькими уровнями. Второй или третий уровень может выходить за пределы видимого окна с определенными комбинациями разрешения и размера окна.

Некоторые предварительно созданные элементы управления меню просто открывают раскрывающийся список слева, а не справа, если они обнаруживают эту ситуацию.

Как я могу проверить (с JS / jQuery) для этой ситуации?

Ответы [ 3 ]

2 голосов
/ 22 июня 2010

Вы можете проверить, находится ли пункт меню вне экрана, с помощью следующей функции:

/*---   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 голос
/ 31 августа 2010

Когда меню еще не отображается, вы не можете получить его размеры. установить свою позицию. Если вы установите CSS visibility: hidden и display: none, меню не будет отображаться, но для будут определены размеры . Затем вы можете получить его положение, используя jQuery.offset, а его высоту / ширину - jQuery.outerWidth/outerHeight (обратите внимание на опции margin для последних функций). Да, и будьте осторожны, если вы используете какие-либо отрицательные поля, это потребует специальной обработки.

Получите размеры окна с помощью jQuery(window).height() и .width(), и вы сможете вычислить математику оттуда.

1 голос
/ 21 июня 2010

Вы должны отобразить элемент, чтобы получить размер, поэтому выведите подменю за пределы экрана. Получите ширину / высоту элемента, рассчитайте ожидаемые позиции отображения (справа / снизу), сравните с шириной / высотой экрана, решите, какое место отображать, и переместите элемент в конечную позицию.

(непроверенный пример)

function displaysOffPageRight(defaultLeft){
    $('#submenu1').addClass('displayOffScreen');
    var offPage = defaultLeft + $('#submenu1').width() > screen.width;
    $('#submenu1').removeClass('displayOffScreen');
    return offPage;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...