【问题标题】:Sliding expandable inline menu滑动可扩展内联菜单
【发布时间】:2012-09-05 11:21:22
【问题描述】:

我有一个简单(外观)菜单的概念,它使用仅 CSS 展开和缩回子菜单。

这是概念化的:

<ul>
    <li><a href="#">home</a></li>
    <li><a href="#">main one</a>
        <ul>
            <li><a href="#">sub one</a></li>
            <li><a href="#">sub two</a></li>
            <li><a href="#">sub three</a></li>
        </ul>
    </li>
    <li><a href="#">main two</a>
        <ul>
            <li><a href="#">sub one</a></li>
            <li><a href="#">sub two</a></li>
        </ul>
    </li>
    <li><a href="#">main three</a></li>
</ul>

我已经使用嵌套无序列表对上面的基本框架进行了编码(忽略缺少类、ID、管道符号等),但我无法将所有内容保持内联。所有列表都是list-style-type: none,所有列表项都向左浮动。

另外,我不知道如何防止自动换行,以便将整个列表项作为一个整体移到新行,而不是分成两部分。

此外,我可以将什么属性与过渡属性结合使用以使嵌套列表在鼠标单击时滑出?

【问题讨论】:

  • 那个字体是 Century Gothic 吗? :P 我喜欢你的颜色选择。 +1。
  • 确实如此。可能是我最喜欢的字体。

标签: css menu inline sliding expandable


【解决方案1】:

我可以想到两种方法:

1. 使用a:focus + ul(IE 为a:active + ul)使菜单在点击时展开。

DEMO

优势

  • 它具有出色的浏览器支持:即使在 IE8 中也能正常工作;有点在 IE7 中,尽管您需要将鼠标悬停在链接上才能看到 菜单扩展;
  • 保留您当前的 HTML 结构,您只需将tabindex='1' 添加到您想要在单击时触发操作的链接(如展开的子菜单)

缺点

  • 您不能同时拥有多个处于“展开”状态的子菜单;
  • 它不是持久的;这意味着一旦您单击页面中的其他位置,展开子菜单的链接就会失去焦点 => 子菜单折叠;

它是如何工作的

  • a:focus 选择有焦点的链接(链接被点击后获得焦点,并保持焦点直到点击其他内容)
  • a:focus + ul 选择无序列表 (ul),它是链接的兄弟,在 HTML 中具有焦点(在这种情况下被单击后)并紧随其后(= 它们之间没有其他元素) - 请参阅这个:adjacent sibling combinator
  • a:focus + ul li 选择作为上述无序列表后代的列表项
  • a:focus + ul a 选择作为上述无序列表后代的链接

2. 使用复选框技巧。

DEMO

优势

  • 您可以同时展开多个子菜单;
  • 它是持久的;当您单击页面上的其他位置时,展开的菜单不会折叠;

缺点

  • 您需要更改 HTML 结构;
  • 在 IE8 或更早版本中不起作用;

它是如何工作的

  • input[type=checkbox]:checked 选中复选框;复选框在此处隐藏(在其上设置display: none),但单击label 会检查其id 与单击的labelfor 属性值相同的复选框;
  • input[type=checkbox]:checked ~ ul 选择作为选中复选框的兄弟(不一定相邻)的无序列表 - 请参阅:general sibling combinator

【讨论】:

  • 是的,这太棒了。它非常接近我的想法,但是是否有可能使每个子菜单都是一个切换,而不是一次只能有一个?另外,你能不能让它滑出时高度保持不变(去掉高度会留下一点点显示)?您能否解释一下a:focus + ul a 选择器的工作原理?
  • 是的,对于第一个问题,但是使用复选框 hack,而不是这个菜单结构。至于height,这个dabblet.com/gist/3635623/… 是我现在能想到的最好的。我将通过更多关于:focus/:active 方法和复选框破解的详细信息来扩展我的答案。
  • 我知道:focus:active 做什么,但我想我只是对+ 符号感到困惑。我以前从未见过它使用过。
  • 我已经用一些解释和另一个演示编辑了我的答案。
【解决方案2】:

将主要的一个孩子设置为

display:none;

在主要的悬停时

将它们设置为

display:block;

【讨论】:

  • 显示属性不被任何转换处理。这是显而易见的答案,但滑动动画至关重要。
  • 你有任何其他网站上的例子,所以我可以更好地帮助你
  • 你在哪里看到滑动动画,却不知道你想要什么,我该如何帮助你
  • 我确实知道我想要什么,但我所能做的就是帮助您帮助我将其可视化并解释其功能。如果我有一个可行的例子给你看,我会从中得到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2020-04-04
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多