其实,你可以不带JavaScript的做这件事的所有,只是media queries(这确实have excellent support +这种解决方案我提出是移动第一个)和:nth-last-child
(这又是连supported by Opera Mini)。
(调整大小,看它是如何工作)
你需要有一个这样的结构:
<nav id='menu'>
<ul>
<li><a href='#'>Home</a></li>
<li><a href='#'>Options</a></li>
<li><a href='#'>Settings</a></li>
<li><a href='#'>Tools</a></li>
<li><a href='#'>Preferences</a></li>
<li><a href='#'>Edit</a></li>
<li><a href='#'>+ MORE +</a></li>
</ul>
</nav>
然后,你需要选择工具 ,首选项和编辑并将它们的display
设置为none
:
#menu li:nth-last-child(-n+4):not(:last-child) { display: none; }
li:nth-last-child(-n+4)
从最后只选择前四个列表项。您将:not(:last-child)
条件添加到该条件,因为您希望显示+更多+列表项目。
为了更好地理解结构伪类,你可以玩this tool。
最后,你需要使用媒体查询更改显示设置大屏幕:
@media (min-width: 30em) {
#menu li:nth-last-child(-n+4):not(:last-child) { display: block; }
#menu li:last-child { display: none; }
}
我使用的是基于em
媒体查询,而不是基于一个有两个原因px
:
EDIT:为了使在菜单上点击扩大和使显示菜单元素的数量与屏幕宽度而变化,我已经改变了结构多一点:
<nav id='menu'>
<a tabindex=1 class='ctrl' href='#'>+ MORE +</a>
<ul>
<li><a href='#' class='menu-link'>Home</a></li>
<li><a href='#' class='menu-link'>Options</a></li>
<li><a href='#' class='menu-link'>Settings</a></li>
<li><a href='#' class='menu-link'>Tools</a></li>
<li><a href='#' class='menu-link'>Preferences</a></li>
<li><a href='#' class='menu-link'>Edit</a></li>
</ul>
</nav>
而且也改变了CSS位:
#menu .ctrl { float: right; }
#menu ul, #menu li { margin: 0; padding: 0; list-style: none; }
#menu ul { overflow: auto; }
#menu li { float: left; }
#menu li:nth-last-child(-n+5) { display: none; }
#menu a {
padding: 0.5em;
text-decoration: none;
border-right: 1px solid #fff;
font-size: 110%;
}
#menu li a { display: block; }
#menu li:first-child a { border-left: 1px solid #fff; }
#menu .ctrl:focus, #menu .ctrl:active { display: none; outline: 0; }
#menu .ctrl:focus ~ ul li, #menu .ctrl:active ~ ul li { display: block; }
@media (min-width: 15em) {
#menu li:nth-child(2) { display: block; }
}
@media (min-width: 20em) {
#menu li:nth-child(3) { display: block; }
}
@media (min-width: 25em) {
#menu li:nth-child(4) { display: block; }
}
@media (min-width: 30em) {
#menu .ctrl ~ ul li { display: block; }
#menu .ctrl { display: none; }
}
(我也每5em的加入垂直线的背景只是为了说清楚屏幕有多宽调整浏览器窗口时)
这种方法不使用JavaScript应该工作 - 测试,在桌面浏览器,Opera Mobile,Android浏览器和iOS Safari。我不知道Opera Mini,但我必须测试它。
编辑#2:不,它不会在Opera Mini的工作对我来说(菜单处于折叠状态,但点击+ MORE +链接不展开)。试图使它与JavaScript(无库)一起工作,但这在Opera Mini中也不起作用(尽管它适用于桌面浏览器)。
编辑#3:也试图用jQuery做同样的事情。这次它也可以在Opera Mini中使用。真的很慢(至少对我来说),但它工作。这是我用什么:
$('.ctrl').click(function() {
$(this).css({'display': 'none'}).next().children().css({'display': 'block'});
});
编辑#4:现在尝试了:target
方法 - demo(也CSS-只)。在使用Chrome的笔记本电脑上正常工作(未在另一台桌面浏览器中测试过),在Opera Mini中不起作用(菜单被折叠,单击+更多+链接不会扩展它)。尽管在Opera Mobile中有效。
媒体查询实际上有很好的支持。 你可以在这里查看一些导航模式:http://bradfrostweb.com/blog/web/complex-navigation-patterns-for-responsive-design/&http://bradfrostweb.com/blog/web/responsive- nav-patterns/ – carpenumidium
在新设备上,是的。但世界上大部分地区都使用旧移动设备 - 请参阅http://www.slideshare.net/bryanrieger/rethinking-the-mobile-web-by-yiibu –
我赞扬您对可访问性的关注,但大多数设备诺基亚,索尼爱立信,LG等公司都可以运行Opera Mini 4+等Java应用程序。过去3年来,我一直使用相同的诺基亚Supernova 7210 S40手机;我使用的浏览器Opera Mini 4.4(它实际上是一个旧版本;后来的版本甚至可以运行一些JS ... live!),它能够很好地渲染复杂的网页。我主要以'单列'模式使用它,这是非常自我解释的,在许多情况下是一个很好的特性。 – carpenumidium