【问题标题】:How do you generate website navigation?您如何生成网站导航?
【发布时间】:2010-12-24 00:36:50
【问题描述】:

我对其他人如何处理网站导航感兴趣。不是样式或可用性部分,而是生成部分。大多数网站都有某种“导航树”,以一个或多个菜单级别的形式显示——你以什么形式保存和处理这个树?最简单的解决方案是静态菜单模板,如下所示:

<ul id="menu">
   <li><a href="…">One</a></li>
   <li><a href="…">Two</a></li>
   <li><a href="…">Three</a></li>
</ul>

但这不是很灵活。您不能简单地在菜单中标记当前页面,也没有简单的方法可以根据当前页面显示或隐藏菜单树的一部分。 (或者是吗?)

我想出了一个导航树,如下所示:

- 标题:水果 节点: - 标题:苹果 - 标题:橘子 - 标题:香蕉 - 标题:音乐和东西 网址:音乐 节点: - 标题:古典 - 标题:爵士乐

这棵树由一个特殊的Navigation 类加载,该类可以根据当前请求路径提供部分导航。这似乎更好一些,但我仍然很好奇其他人的解决方案。

【问题讨论】:

    标签: perl navigation


    【解决方案1】:

    MySQL 有一篇题为"Managing Hierarchical Data in MySQL" 的文章,我之前发现它非常宝贵。它讨论了存储动态导航的两种常用技术及其局限性。

    【讨论】:

    • 很棒的资源,尤其是嵌套集合的东西。
    • 我将其标记为已接受,即使没有“正确”的解决方案。 (我不想让它成为一个 CW 来为人们提供良好答案的声誉积分。)
    【解决方案2】:

    您可能会发现这很有用:

    Storing Hierarchical Data in a Database

    【讨论】:

      【解决方案3】:

      当涉及到树的部分显示和隐藏时,CSS 是您的朋友。

      例如,您的水果子菜单可以是

      id="fruitmenu"

      您将所有子菜单设置为

      display:none;

      在样式表的顶部。

      然后你在每个页面的 body 标签中使用一个 ID 以根据更具体的规则使它们可见。

      例如,在您的水果页面上,该页面有

      &lt;body id="fruitpage"&gt;

      水果子菜单是可见的,因为它受类似规则的约束

      #fruitpage #fruitmenu {display:block;}

      【讨论】:

      • 这是我在静态网站上所做的,但我 (1) 不喜欢我必须输入的规则量并且 (2) 每次更改 @987654325 时都会感到有点内疚@属性假装当前菜单项不可点击:)
      • 我不明白你为什么要改变光标——隐藏列表顶部的词条肯定是可点击的?您可以在 CSS 中组合规则!一条带逗号的长规则。
      • 抱歉,错过了您的评论。有时整个菜单都是可见的,只有当前项目被突出显示并且不可点击。这是我必须用cursor 属性“作弊”的时候。而且没有办法结合body.foo #foo规则,是吗?如果有 10 页带有子菜单,我将不得不编写 10 条 body.foo #foo 规则。 (当然,使用共享的display 子句。)这很快就会过时,我宁愿编写一个可重用的类,从文件中生成菜单。
      【解决方案4】:

      您可能会发现我的其中一个模块很有用:CatalystX::Menu::Suckerfish

      菜单结构由方法属性生成。它缺少改变当前页面菜单项状态的方法,但这应该不难添加。

      方法属性是任意字符串 MenuPath 和 MenuTitle,它们指定树中菜单选项的斜线分隔路径,以及用作菜单选项标签的字符串和 html 标题属性(如果适用)。

      【讨论】:

        【解决方案5】:

        我们使用与您类似的方法,将菜单层次结构存储在数据库中。最好根据调度方法自动生成菜单结构,但 DB 方法还有其他优点。例如,我们可以在不重建应用程序的情况下更改/限制访问,我们可以创建不映射到调度树的菜单项,例如外部链接。我们还可以提供不一定映射到调度路径的任意详细标签,以使人类更容易。

        主要缺点(除了必须复制调度树)是在 MySQL 中实际管理分层数据有点尴尬。请参阅 cballou's answer 以获取有关该主题的良好资源。

        【讨论】:

          【解决方案6】:

          SQL Server 2008 有一个漂亮的新数据类型,称为“HierarchyID”,它消除了很多处理分层数据的麻烦。

          【讨论】:

            【解决方案7】:

            Google 网站管理员工具为创建和管理站点地图提供了一些有用的想法和支持:

            【讨论】:

            • 站点地图(在这种情况下)是搜索引擎的食物,而不是导航。
            【解决方案8】:

            如果您喜欢 ASP.NET,Sitemaps 工作得很好

            【讨论】:

            • 是的。它们依赖于包含站点地图的 XML 文件。如果您不使用 ASP.Net,您仍然可以使用基于 XML 的解决方案。
            猜你喜欢
            • 1970-01-01
            • 2011-11-27
            • 2011-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多