【问题标题】:Building a vertical, nested CSS menu that works in IE7构建可在 IE7 中使用的垂直嵌套 CSS 菜单
【发布时间】:2011-01-05 15:41:34
【问题描述】:

仅使用 CSS(和 JS 来应用 :hover 样式),构建水平下拉嵌套菜单的最佳方式是什么?

我正在尝试采用菜单here,但无法实现我想要的定位。每次我尝试这样做时,我都会遇到太多的 CSS 杂物,以至于无法再管理。

DOM:

<nav>
  <ul>
    <li>
      <a href="#">Heading 1</a>
      <ul>
         <li><a href="#">1</a>
               <ul><li>a</li><li>b</li></ul>
         </li>
         <li>2</li><li>3</li>
      </ul>
    </li>
    <li>
      <a href="#">Heading 2</a>
        <ul><li>1</li><li>2</li><li>3</li></ul>
    </li>
</nav>

期望的输出:

也就是说,顶部标题是完全水平的,每个标题下方的第一个菜单在标题左侧水平排列,所有其他子菜单在右侧水平排列并在顶部垂直排列。我将如何构建这个基本想法?

【问题讨论】:

标签: javascript html css layout


【解决方案1】:

我能够自己创建一个,但我不确定它是否足够好。我宁愿建议您查看jQuery UI Development & Planning Wiki > Menu 页面。该页面列出了几个菜单。

另外,this is a very simple script 用于创建可作为起点的下拉菜单。

编辑

要创建动态 CSS 弹出菜单,您需要 jQuery 支持,主要是因为 (i) 您必须动态定位子菜单 (ii) 利用“悬停”事件,这在纯 CSS 解决方案中是不可能的。

  1. 您的主菜单&lt;ul&gt; 应该是position: static
  2. 所有包含子菜单的&lt;li&gt; 都应该是position: relative
  3. 您的所有子菜单&lt;ul&gt; 应该是position: absolute 和display: none。

然后您可以在所有包含子菜单的&lt;li&gt; 元素上实现hover 事件。悬停时,您首先定位直接嵌套在该&lt;li&gt; 内的&lt;ul&gt;,然后显示它。悬停事件还提供了一个在该元素“未悬停”时触发的事件。在这种情况下,您只需隐藏相应的&lt;ul&gt;。容易吗?

要定位子菜单&lt;ul&gt;,只需抓住包含&lt;li&gt; 的宽度并将left: XXXpx; top: 0 设置在您将要显示的&lt;ul&gt; 上。如果子菜单出现在&lt;li&gt; 下方,那么您可以抓住&lt;li&gt; 的高度并将left: 0; top: YYYpx 设置在&lt;ul&gt; 上。绝对相对组合使这种定位成为可能。

此时您还可以考虑实现“边缘检测”...即检查菜单是否扩展超出了视口的右边缘或下边缘。相当棘手。

请注意,在 IE7 中正确呈现菜单(并触发悬停事件)时会出现问题,尽管根据 HTML 规范,您的菜单是可以的。为了解决这个问题,您可能需要在子菜单上设置 z-index。

【讨论】:

  • 减去 jQuery 和效果,这是我需要的确切(或多或少)布局。
  • 唯一真正的问题是需要指定宽度,并且我生成了动态菜单。我可以修复这个服务器端,但是完全在前端处理这个会更好。
  • (我需要空格:nowrap,这样可以解决问题。)
  • 我可以写一篇关于如何创建 css+jQuery 驱动的下拉菜单的文章,但他可能需要一两个小时。不过,我已经为您修改了一些答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多