我有一个基于CSS的简单下拉菜单,包含多个级别。第二级或第三级可能超出可见窗口,具有分辨率和窗口大小的某些组合。
如果检测到这种情况,某些预先构建的菜单控件只会打开向左而不是向右的下拉列表。
如何针对这种情况测试(使用JS / jQuery)?
答案 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: hidden
和display: none
,则不会显示菜单,但将定义其维度。然后你可以使用jQuery.offset
获取它的位置,使用jQuery.outerWidth/outerHeight
获得它的高度/宽度(注意后面函数的margin
选项)。哦,如果你使用任何负边距要小心,这需要特殊处理。
使用jQuery(window).height()
和.width()
获取窗口的尺寸,您应该能够从那里算出数学。