2009-12-07 3 views
8

Меня интересует, как другие люди справляются с навигацией по сайту. Не стиль или юзабилити, а часть поколения. На большинстве веб-сайтов есть своеобразное «дерево навигации», которое отображается в виде одного или нескольких уровней меню - в какой форме вы сохраняете и обрабатываете это дерево? Простейшим решением является статический шаблон меню, например:Как вы создаете навигацию по сайту?

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

Но это не очень гибко. Вы не можете просто пометить текущую страницу в меню, и нет простого способа показать или скрыть часть дерева меню в зависимости от текущей страницы. (Или это?)

Я придумал дерева навигации, что-то вроде этого:

 
    - title: Fruits 
     nodes: 
     - title: Apples 
     - title: Oranges 
     - title: Bananas 
    - title: Music and Stuff 
     url: music 
     nodes: 
     - title: Classical 
     - title: Jazz 

Это дерево загружается специальным Navigation класса, которые могут служить части навигации в зависимости от текущего запроса дорожка. Кажется, это работает немного лучше, но все же мне очень любопытно, как решения других людей.

ответ

6

MySQL имеет статью "Managing Hierarchical Data in MySQL", которую я ранее нашел весьма бесценные. В нем обсуждается два распространенных метода хранения динамической навигации и их ограничений.

+1

+1 для ссылки – Yacoby

+0

Отличный ресурс, особенно для вложенного набора вещей. –

+0

Я отмечаю, что это принято, хотя нет «правильного» решения. (Я не хотел, чтобы это CW, чтобы дать людям точки репутации за хорошие ответы.) – zoul

5

Если ASP.NET ваша аромат, Sitemaps работы большого

+0

Perl/Catalyst здесь, но спасибо, это полезно. – zoul

+1

Да. Они полагаются на файл XML, содержащий карту сайта. Если вы не используете ASP.Net, вы все равно сможете использовать решение на базе XML. – DOK

-2

Инструменты Google для веб-мастеров предоставляет некоторые полезные идеи и поддержку для создания и управления сайтмепов:

+0

Файлы Sitemap (в этом контексте) - это продукты для поисковых систем, а не для навигации. – Quentin

+0

Мой плохой, я неправильно понял вопрос ... – Upgradingdave

1

SQL Server 2008 имеет отличный новый тип данных под названием «hierarchyid` в», который забирает лот головных болей работы с иерархическими данными.

4

Вы можете найти один из моих модулей полезных: CatalystX::Menu::Suckerfish

Структура меню генерируется из атрибутов методы. В нем отсутствует способ изменить состояние записи в меню текущей страницы, но это не составит труда добавить.

Атрибуты метода - это произвольные строки MenuPath и MenuTitle, которые указывают путь с разделителем слэша для опции меню в дереве и строку, которая используется как метка опции меню и атрибут заголовка html, где это применимо.

3

Мы используем подход, похожий на ваш, с иерархией меню, хранящейся в базе данных. Было бы неплохо автоматически генерировать структуру меню на основе методов отправки, но есть и другие преимущества для подхода БД. Например, мы можем изменить/ограничить доступ, не перестраивая приложение, и мы можем создавать пункты меню, которые не отображаются в дереве диспетчеризации, например внешние ссылки. Мы также можем предоставить произвольно многословные ярлыки, которые необязательно отображают путь отправки, чтобы сделать вещи проще для людей.

Основным недостатком (помимо дублирования дерева отправки) является то, что фактически управление иерархическими данными в MySQL немного неудобно. См. cballou's answer за хороший ресурс по этой теме.

2

Когда дело доходит до показа и скрытия частей дерева, CSS - ваш друг.

Например, ваши фрукты подменю могут быть

id="fruitmenu"

вы установите все подменю в

display:none;

в верхней части таблицы стилей.

Затем вы используете идентификатор в теге тела каждой страницы, чтобы сделать их видимыми в соответствии с более конкретным правилом.

Так, например, на странице фруктов, который имеет

<body id="fruitpage">

плод подменю виден, потому что это регулируется правилом, как

#fruitpage #fruitmenu {display:block;}

+0

Это то, что я делаю на статических сайтах, но мне (1) не нравится объем правил, которые я должен печатать, и (2) чувствую себя немного виноватым каждый раз, когда я измените свойство 'cursor', чтобы притворяться, что текущий пункт меню не кликается :) – zoul

+0

Я не понимаю, почему вам нужно будет менять курсор - наверняка, заголовок в верхней части скрытого списка можно щелкнуть? И вы можете комбинировать правила в CSS! Одно длинное правило с запятыми. – AmbroseChapel

+0

Извините, пропустил ваш комментарий. Иногда все меню видимо, только текущий элемент подсвечивается, а не доступен для кликов. Это когда мне нужно «обмануть» свойство 'cursor'. И нет способа комбинировать правила 'body.foo # foo', не так ли? Если бы было 10 страниц с подменю, мне пришлось бы написать 10 правил 'body.foo # foo'. (С общим предложением 'display', конечно.) Это быстро стареет, я бы предпочел написать повторно используемый класс, который генерирует меню из файла. – zoul

Смежные вопросы