我有一个基本的jQuery下拉菜单,我正在移动设备上测试它,特别是手机。
我遇到的一个问题是,右侧的子菜单有时会脱离屏幕边缘,因为一个或多个项目中的文本太长。当然,用户可以稍微向右滚动,但这不是一个很好的解决方案。有一个类似的问题here,但我无法得到拟议的答案(加上我已经摸索,因为我还是JS / jQuery的新手)。
一般的想法似乎是获取当前子菜单的左侧位置+宽度(确保首先显示它们,然后再次隐藏它们或显示它们并在用户点击菜单时移动它们)并查看该值大于屏幕宽度。如果是,则它应该由差异向左移动。但是,我的尝试似乎对元素没有任何作用,菜单仍然部分显示在屏幕外。目前,我有这个(在身体加载后运行):
var menus = $('#navbar').find('.subMenu');
menus.show();
menus.each(function(index) {
var offsetMenu = $(this).offset();
var diff = screen.width - ($(this).outerWidth + offsetMenu.left);
if(diff < 0) {
$(this).offset({top:offsetMenu.top, left:offsetMenu + diff});
}
});
menus.hide();
jQuery版本是1.7.2,HTML结构如下(简化版):
<div id="navbar">
<ul>
<li class="dropdown"><a href="#">Link A</a></li>
<li class="dropdown"><a href="#">Link B</a>
<ul class="subMenu">
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
</ul>
</li>
</ul>
</div>
我怎样才能让它发挥作用?
编辑:这也是相关的CSS。
#navbar ul.subMenu {
position:absolute;
display:none;
background-color:#FFAF1E;
}
#navbar ul.subMenu li {
clear:both;
}
#navbar a {
text-decoration:none;
color:#0C1F6E;
display:block;
padding-right:10px;
padding-left:10px;
}
答案 0 :(得分:2)
我终于得到了以下工作:
function adjustSubMenus()
{
var menus = $('#navbar').find('.subMenu');
menus.each(function(){
$(this).css("left","");
adjustSingleMenu($(this))
} );
}
function adjustSingleMenu(element)
{
element.show();
var thisMenuWidth = element.outerWidth();
var thisMenuPos = element.offset();
var diff = (thisMenuWidth + thisMenuPos.left) - window.outerWidth;
if(diff > 0) {
element.css("left", function() { return thisMenuPos.left - diff; });
}
element.hide();
}
$('body').ready(function() {
$(window).resize(adjustSubMenus());
if(window.outerWidth <= 720) {
$('html').mousedown(function() {
$('#navbar').find('.subMenu').each(function(index) {
if($(this).is(":visible") ) {
$(this).css("left","");
$(this).hide();
}
} );
});
$('#navbar').mousedown(function(event) {
event.stopPropagation();
});
$('.dropdown').mousedown(function() {
var ele = $(this).find('.subMenu');
$('#navbar').find('.subMenu').each(function(index) {
if(!$(this).is(ele) && $(this).is(":visible") ) {
$(this).css("left","");
$(this).hide();
}
} );
if(ele.is(":visible")) {
ele.css("left","");
ele.hide();
}
else {
adjustSingleMenu(ele);
ele.show();
}
});
}
else
{
$('.dropdown').hover(
function() { $(this).find('.subMenu').stop(true,true).slideDown("fast"); },
function() { $(this).find('.subMenu').stop(true,true).hide(); }
);
}
});
唯一的小问题是,如果您在更改手机方向时打开菜单,菜单可能会显示在屏幕外。关闭并重新打开菜单将解决此问题。其他一切都很完美。
答案 1 :(得分:1)
您可以尝试创建适用于移动设备 的CSS(绑定到CSS类名称),然后在检测到窄屏幕或移动设备时,将CSS类添加到您的元件。
使用Javascript:
if (is_mobile)
{
$(".subMenu").addClass('mobile');
}
CSS:
/* CSS */
.mobile { width:100%; left:0 !important; position:absolute; }
答案 2 :(得分:1)
该函数不应检查子菜单的宽度加上其偏移量,然后如果这大于屏幕宽度,则将左值设置为0,将宽度设置为屏幕宽度?
e.g。
var menus = $('#navbar').find('.subMenu'),
screenWidth = $(window).width();
//screenWidth = screen.width; //I assume this calculates the screens width properly
menus.show();
menus.each(function(index) {
var thisMenu = $(this),
thisMenuWidth = thisMenu.outerWidth(),
thisMenuLeft = thisMenu.offset().left;
if(screenWidth < (thisMenuWidth + thisMenuLeft)) {
thisMenu
.width(screenWidth)
.css({ //could replace this with .addClass("yourClass") and add this styling to that "yourClass" instead
"left": "0",
"position": "absolute"
});
}
});
menus.hide();
更新
我认为screen.width是你为移动设备设计的一些特殊计算。我现在改变了这一行。以上应该有效。我看到你已经有了解决方案,虽然这不会修复菜单的宽度。如果菜单比屏幕宽,则上面将固定其宽度。