Динамичное меню. Динамические меню пользователя. CSS переходы для анимации меню

Многочисленные просьбы моих настойчивых читателей и просто любознательных пользователей возымели свое действие. Я наконец то создала урок, в котором мы будем учиться делать динамическое меню Вконтакте с эффектом нажатых кнопок! По аналогии с обычными сайтами интернета, когда посещенная ссылка маркируется особым способом (нажатая кнопка, подчеркивание итд) — мы будем создавать такую же конструкцию Вконтакте, с помощью созданных страниц и графического оформления. Для начала мы сделаем графические заготовки в фотошопе — создадим шапку меню и кнопочки двух видов. Потом создадим несколько страниц Вконтакте, согласно пунктам нашего меню. И напоследок сделаем хитрый прием, который, собственно, и создаст нам иллюзию перехода по ссылке. Урок достаточно сложный и подходит для тех, кто уверенно себя чувствует в функционале Вконтакта. Все манипуляции я буду производить на примере своей группы Вконтакте , где этот эффект реализован вживую. Итак, за дело!

Шаг 1. Создаем в фотошопе шапку меню
Создаем в фотошопе документ шириной 600 пикселей. Высота может быть разная, на ваше усмотрение. Вы можете поместить в шапку любую видовую фотографию, коллаж, информационный баннер и прочие графические картинки. В данном сучае я использовала такой вот рекламный баннер размером 600х172 пикселя.

Шаг 2. Создаем в фотошопе строку навигации
Теперь нам надо создать строку навигации. В данном примере я использовала в качестве кнопок только текст. Но на ваше усмотрение можно создать цветные кнопки и уже на них написать текст. Делаем так — создаем в фотошопе прямоугольник 600х56 пикселей и в данном случае заливаем его белым цветом. Потом в строку пишем пункты меню — где-то порядка 5-6 пунктов, не больше. Большее количество пунктов будет смотреться зажато.

Шаг 3. Создаем в фотошопе строку навигации в нажатом состоянии
Теперь нам надо создать активные ссылки, так, как-будто по ним нажали. Я использовала обычное подчеркивание, но можно использовать другой цвет текста или фона для маркировки посещенной ссылки.

Шаг 4. Нарезаем готовые картинки
На данном этапе нам надо нарезать картинки из Шага 2 и Шага 3. У нас должно получиться два комплекта по пять кнопок — одна кнопка без подчеркивания, другая кнопка с подчеркиванием. Кнопки каждого отдельного пункта (с подчеркиванием и без подчеркивания) должны быть одинакового размера. На картинке ниже представлено все наше графическое оформление — десять кнопок и одна шапка меню.

Шаг 5. Создаем Вконтакте страницу Меню
Теперь переходим ВКонтакт. Наша задача — создать отдельную страницу под названием «Меню». Для этого мы воспользуемся таким кодом
http://vk.com/pages?oid=-XXX&p=Нaзвание_страницы
где вместо ХХХ мы подставим id нашей группы, а вместо текста «Название страницы» мы напишем Меню. Теперь надо выяснить id группы. Как это сделать? Заходим на главную страницу группы и смотрим на наши записи на стене — прямо под блоком «Добавить запись» будет написано «Все записи» — нажимаем на эту ссылку.

Шаг 6. Определяем id группы и редактируем код
Переходим на страницу и видим урл такого вида https://vk.com/wall-78320145?own=1 , где цифры 78320145 в данном примере и есть id группы. Подставляем наши данные в исходный код и получаем запись такого вида:
http://vk.com/pages?oid=-78320145&p=Меню (с вашими цифрами!). Вставляем эту строку в адресную строку браузера и нажимаем Enter. Так мы создали новую страницу Вконтакте и изначально она выглядит так.

Шаг 7. Создаем Вконтакте остальные страницы навигации
Аналогичным образом мы создаем еще четыре страницы навигации: Цены, Как заказать, Техзадание и Вопросы. То есть еще четыре раза копируем в адресную строку браузера соответствующий код (с вашими цифрами id в примере ниже мои цифры):

http://vk.com/pages?oid=-78320145&p=Цены

http://vk.com/pages?oid=-78320145&p=Как_заказать

http://vk.com/pages?oid=-78320145&p=Техзадание

http://vk.com/pages?oid=-78320145&p=Вопросы
Обратите внимание, в названии страницы из двух слов (Как заказать) пробел между словами заменен на нижнее подчеркивание Как_заказать. Теперь у нас есть пять готвых страниц под каждый пункт меню. Страницу Портфолио мы не создавали поскольку она размещается на странице Меню

Шаг 8. Загружаем фотографии на первую страницу меню
На созданной, пока еще пустой странице (см. Шаг 6) Меню нажимаем на ссылку Редактировать или на ссылку Наполнить содержанием. После этого мы видим панель редактирования. Здесь нам надо нажать на значок фотоаппарат с функцией Загрузить фотографию. Важно! Обратите внимание на то, чтобы у вас стоял режим wiki-разметки. Переключение режимов регулируется значком у правого края страницы.

Шаг 9. Результат после загрузки картинок
Загружаем наши картинки, которые мы создавали в Шаге 1 и Шаге 2. После загрузки мы видим такой код, как на картинке ниже, а само меню выглядит так. После каждого изменения кода не забываем нажимать Сохранить страницу, а потом нажать предпросмотр для просмотра результата.

Шаг 10. Редактируем код картинок
Теперь наша задача заменить все свойства noborder на свойство nopadding. А у первой картинки проставить реальные размеры, поскольку Вконтакт при загрузке ужал картинку до 400 пикселей. После всех изменений мы должны получить такой код и такое меню.

Шаг 11. Проставляем ссылки для картинок
Теперь мы должны проставить ссылки для каждой картинки. Ссылку надо вставлять после nopadding| вместо пробела перед закрывающими скобками. Для первой картинки (шапка меню из Шага 1) можно дать ссылку на главную страницу группы, а можно воспользоваться свойством nolink (ставится через; после nopadding без пробелов). Для второй картики вставляем адрес страницы формата page-78320145_49821289 . То есть полный урл картинки https://vk.com/page-78320145_49821289 , до первую часть с доменом можно опустить. А вот для ссылок на внешние сайты урл ссылки надо указывать полностью.

Шаг 12. Копируем код на остальные страницы навигации
На этом, достаточно простом шаге, мы копируем последний код из предыдущего шага и вставляем его на остальные созданные страницы — Цены, Как заказать, Техзадание и Вопросы. Находимся на странице, нажимаем Редактировать или Наполнить содержанием (находимся в режиме wiki-разметки), вставляем код и нажимаем Сохранить. И потом также на следующей странице. То есть сейчас у нас есть пять страниц, на каждой из которых меню выглядит абсолютно одинаково. Но зато уже можно осуществлять навигацию по меню — при нажатии на ссылку например Цены, мы переместимся на страницу Цены итд.

Шаг 13. Делаем эффект нажатой кнопки
Теперь нам предстоит на каждой из пяти страниц поменять одну картинку (кнопку без подчеркивания заменим на кнопку с подчеркиванием). Например, на первой странице Меню мы загружаем новую картинку и потом заменяем в коде адрес старой картинки на новый (подчеркнуто красным). Потом переходим на страницу Цены, загружаем картинку с подчеркнутыми Ценами и меняем в коде на адрес новой картинки. Потом заходим на страницы Как заказать, Техзадание и Вопросы и делаем туже самую операцию аналогичным образом.

Финал.
В итоге у нас получился эффект навигации, когда нажимаешь на ссылку меню и она становится активной. Но поскольку графическое оформление на всех страницах практически одинаковое, за исключением активной ссылки, то создается иллюзия навигации, хотя на самом деле осуществляется переход на другую страницу.

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

Первым делом следует уточнить, что официально такого термина нет. Вообще же под динамическим меню можно понимать такое меню, содержание которого меняется во время работы пользователя в зависимости от каких-либо внешних обстоятельств.

В данном случае речь идет о предмете, хоть и попадающим под эту расплывчатую формулировку, но более простом и прозаичном. Если меню, как таковому, свойственна динамика (вспомним, что инсталляция программы приводит к изменениям в нем) и имеется даже особо изменчивое меню "Документы", придуманное Microsoft, то я предлагаю поговорить о том, как организовать меню, содержащее именно ваши данные и изменяемое вами в процессе работы.

Выпустив Windows 95, компания Microsoft предприняла попытку перенести акцент с системно-программистских вещиц вроде "файлов" на понятные любому деловому человеку "документы". Для этого была усилена взаимосвязь между типами файлов и настойчиво предложено открывать их двойным щелчком мышки непосредственно по значку документа, а не из запущенного предварительно приложения. Что же, это не новинка и, в принципе, вещь более удобная, чем лазание по дискам в окне "Открыть".

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

Я раз десять пробовал модернизировать меню "Документы", но особо путного ничего не получилось. Могу предложить другой вариант. Представьте себе, что в системном меню на первом его уровне имеется один или несколько пунктов, открывающих доступ к системе подменю, соответствующей принятому вами разбиению документов на группы (по теме, времени, типу и т.п.), причем в подменю содержатся все находящиеся в вашем распоряжении файлы документов, их состав обновляется по мере создания или удаления, они переводятся из одного меню в другое, автоматически следуя за перемещениями файлов на диске.

Нормальный вариант быстрого доступа, просмотра и поиска документов? Тогда учтите, что реализуется такое динамическое меню проще простого. Надо лишь поместить в соответствующую главному меню директорию на диске ваши рабочие директории. Именно директории с живыми файлами, а не ярлыки. Сделайте это, и вы сразу получите доступ через меню к каждому из хранящихся там документов.

Но чтобы все выглядело тик-так, придется еще повозиться. Надо использовать длинные имена, тогда ваше пользовательское меню с документами получит человеческий вид. Это потребует от вас отказаться от милых сердцу DOS"овских каракатиц наподобие Docs, Doc1 и т.п. Ничего, надо привыкать называть вещи своими именами и забыть про восьмибуквенные подпольные клички.

Над именами придется подумать. Как я уже говорил, количество вложенных директорий не должно превышать 3, ну максимум 4 уровней. Их названия не следует делать слишком пространными, как и имена содержащихся в них документов. Иначе ваше меню будет гулять по экрану сначала слева направо, потом загибаться обратно и снова вперед. Замучаетесь гонять мышку. Избегайте дублирования слов. Если директория и, соответственно, подменю называются "Договоры", то не надо входящие в него документы называть "Договор №139-45 от...". Совершенно очевидно, что это договор, раз он лежит в папке с договорами. Старайтесь также с помощью нескольких слов, отведенных судьбой (или шириной экрана, если вам так больше нравится) на описание документа, отразить его содержание. Номер и дата - сведения прекрасные, но навряд ли вы с ходу вспомните, о чем был этот документ.

Ценой дополнительных усилий можно добиться согласования внутри цепочки, образуемой названиями подменю и конечного документа, падежей, спряжений и прочей нечисти. Глазу приятнее и менее утомительно для вас читать на экране прилично построенные фразы, а не общаться с компьютером на ломаном русском, как с представителем иностранного юридического лица. Например, если документ описывается выражением "Договор за 1996 год об аренде склада на ж.д. станции", то можно составить следующую цепочку меню: "Договор" - "за 1996 год" - "об аренде" - "склада на ж.д. станции". Быть может, кого-то покоробит название файла "склада на ж.д. станции", но с учетом выстраивающейся перед ним цепочки из названий директорий все получается правильно.

У организованного таким способом динамического пользовательского меню есть и недостатки. Во-первых, система не всегда обновляет меню сразу после попадания туда нового файла (удаления имеющегося). Видимо, где-то в лабиринтах многопоточности и многозадачности застревает команда о необходимости освежить меню. Немного неприятно, но случается не так уж часто, а после загрузки машины меню уж точно будет соответствовать тому, что записано на диске. (Это не значит, что я призываю каждый раз в подобных случаях перегружать машину, обычно можно обойтись перечитыванием директории в "Проводнике" по клавише .) Во-вторых, нехорошо хранить свои рабочие файлы внутри директории Windows. Придется вытащить оттуда папку "Главное меню" и следить за ней, как положено беспокоиться о сохранности пользовательской информации - делать резервные копии, очищать от мусора и т.д. Третья неприятность носит психологический характер - первое время уж очень непривычно видеть свои рабочие директории не внутри корневого оглавления диска, а где-то в "Главном меню". Но это проходит - привыкаешь.

Скрытые элементы меню

Еще один способ упростить содержание меню и, следовательно, повысить эффективность его использования - спрятать его часть на время нормальной работы.

В меню Windows 95 полным-полно вещей, которыми при нормальной работе пользоваться не приходится. К ним относятся ярлыки от программ деинсталляции приложений, различные файлы Readme и прочая текстовая информация от производителей, программы регистрации и формы для отправки по электронной почте. Сюда же можно зачислить и утилиты служебного плана, которыми вы пользуетесь только тогда, когда софт начинает хныкать или вести себя подозрительно. Для выполнения ежедневных процедур компьютерной гигиены удобнее всего (и достаточно) прибегнуть к услугам утилиты автоматического выполнения System Agent из комплекта Plus, вместо того чтобы запускать сканирование диска и дефрагментацию вручную. А раз так, то и постоянно держать эти программы в меню нет резона.

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

В Windows 95, как и в DOS, есть понятие скрытых файлов и директорий. При обычной работе вы не видите их на экране, так как система не показывает те файлы и каталоги, у которых установлен флажок "Скрытый". Флажок этот взводится и сбрасывается в окне свойств файла. Чтобы увидеть такие объекты, надо в "Проводнике" зайти через меню в "Вид"/"Параметры" и включить режим "Отображать все файлы".

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

Если меню стало проще и удобнее, значит вам удалось внести в интерфейс Windows 95 еще одну полезнейшую настройку. Когда же придется заняться ковырянием в системных неполадках (а такое, увы, случается нередко), просто включите в "Проводнике" отображение всех файлов и получите в свое распоряжение полный набор элементов меню.

В принципе, аналогичный подход можно использовать в отношении рабочего стола, содержимое которого связано с папкой C:\Windows\Рабочий стол. Однако для десктопа система хранит не только ярлыки, но и порядок их размещения (он сокрыт в недрах реестра конфигурации), поэтому при переключениях режима отображения у меня на машине система собирала значки в алфавитном порядке. Что меня, естественно, не устроило. Проблему создания нескольких раскладок рабочего стола можно решить, но лучше уже другим путем.

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

Роман Соболенко

Слышали ли вы когда либо такое утверждение, что "нельзя сделать динамическое выпадающее меню исключительно на CSS для IE"? Уверен, что да. И что, вы-таки верите этому? Правильно, лучше не верьте.

Цель, которой мы хотим достичь в этой статье

Цель данной статьи - сделать выпадающее меню для IE, сделанное исключительно на CSS. Начав с этой постановки, я расширил задачу до того, чтобы заставить работать такое меню в других наиболее известных браузерах (прим. пер.: из комментариев выясняется, что этими браузерами являются Opera 7.x и последние версии Firefox).

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

Каким мы представляем уровень читателя.

Вообще-то я думал о том, чтобы пометить эту статью как для "углубленного изучения (advanced)". Но я уверен, что даже не самые опытные разработчики хорошо поймут то, что написано в статье. Короче, читатель просто обязан знать основы CSS и
HTML.

Чем это меню отличается от всех других?

Я долго искал в сети меню, которые были бы сделаны на CSS, но не нашел ни одного решения, которое бы работало без глюков в IE. Однако же я нашел много интересных идей, которые и привели меня к тому результату, который будет здесь описан. Да, мой код тоже не совершенен, но у меня попросту нет времени, чтобы выправить все ошибки. Самое интересное альтернативное решение из всех, что я видел (которые используют CSS), основано на использовании псевдокласса hover для элементов LI. А я-то никогда и не думал, что такое возможно, впрочем, как и не думал о том, что вообще возможно сделать выпадающее меню для IE без скриптов...

Основным отличием между моим и другими меню является то, что мое работает в IE. Все решения, которые я видел, используют элемент LI как основной элемент для псевдокласса:hover, однако Microsoft решила, что этот псевдокласс может быть использован только для
элемента A. Большинство сайтов делают оговорку, что их меню работают только в браузерах Opera 7.x или Mozilla. Но ведь эти браузеры используются только пятью процентами пользователей! Да, такие меню хороши в этих браузерах, но к сожалению не могут быть видны в большинстве самых распространенных браузеров. Сейчас мы исправим это недоразумение.

Что такое меню, сделанное с помощью только CSS?

Это динамическое меню, для создания которого используется только CSS, и не используются скрипты (например, написанные на JavaScript).

Что, не верится?

Давайте рассмотрим код:

< STYLE type = text / css id = "default" title = "default" name = "default" >
*::- moz - any - link br ,*:- moz - any - link br {
/*a workarround for mozilla*/
display : none ;
}

div #menu * {
cursor : pointer ; /*because IE displays the text cursor
if the link is inactive*/
}

Disabled {
color : red ! important ;
background : none ! important ;
}

Div #menu {
background : #F5F5DC;

height : 15px ;
white - space : nowrap ;
width : 100 %;
}

Div #menu .a {
background : #F5F5DC;
border : 1px solid #F5F5DC;
color : #000000;
text - decoration : none ;
}

Div #menu .a table {
display : block ;
font : 10px Verdana , sans - serif ;
white - space : nowrap ;
}

Div #menu table, div#menu table a {
display : none ;
}

Div #menu .a:hover, div#menu div.menuitem:hover {
background : #7DA6EE;
border : 1px solid #000080;
color : #0000FF;
margin - right :- 1px ; /*resolves a problem with Opera
not displaying the right border*/
}

Div #menu .a:hover table, div#menu div.menuitem:hover table{
background : #FFFFFF;
border : 1px solid #708090;
display : block ;
position : absolute ;
white - space : nowrap ;
}

Div #menu .a:hover table a, div#menu div.menuitem:hover table a {
border - left : 10px solid #708090;
border - right : 1px solid white ; /*resolves a jump problem*/
color : #000000;
display : block ;
padding : 1px 12px ;
text - decoration : none ;
white - space : nowrap ;
z - index : 1000 ;
}

Div #menu .a:hover table a:hover, div#menu div.menuitem:hover table a:hover {
background : #7DA6EE;
border : 1px solid #000000;
border - left : 10px solid #000000;
color : #000000;
display : block ;
padding : 0px 12px ;
text - decoration : none ;
z - index : 1000 ;
}

Td {
border - width : 0px ;
padding : 0px 0px 0px 0px ;
}

Menuitem {
float : left ;
margin : 1px 1px 1px 1px ;
padding : 1px 1px 1px 1px ;
}

Menuitem * {
padding : 0px 0px 0px 0px ;
}

#other {

}

#moz{

}

#moz::-moz-cell-content{
height : auto ; visibility : visible ;
}

#other::-moz-cell-content{
height : 1px ; visibility : hidden ;
}

#holder {
width : 100 %;
}

< TABLE id = holder >
< TR >
< TD id = "other" >
< DIV id = "menu" >
< DIV class= "menuitem" >
< a class= "a" href = "#" > File < BR >
< TABLE >
< TR >
< TD >< a href = #2>click me

< TR >
< TD >< a href = #3>Save

< TR >
< TD >< a href = #4>Close



< DIV class= "menuitem" >
< A class= "a" href = "#11" > Help < BR >
< TABLE >
< TR >
< TD >< a class= "disabled" >..

< TR >
< TD >< a href = #13>Index

< TR >
< TD >< a href = "#14" > About






< TR >
< TD id = "moz" > Mozilla specific menu !
< DIV id = "menu" >
< DIV class= "menuitem" >
< a class= "a" href = "#" > Filezilla
< TABLE >
< TR >
< TD >< a href = #2>Open

< TR >
< TD >< a href = #3>Save

< TR >
< TD >< a href = #4>Close




< DIV class= "menuitem" >
< A class= "a" href = "#11" > Helpzilla
< TABLE >
< TR >
< TD >< a class= "disabled" >..

< TR >
< TD >< a href = #13>Index

< TR >
< TD >< a href = "#14" > About







< BR >

Что происходит, почему все работает?

Сразу оговорюсь, что в этой статье я не буду вас учить использованию CSS. Поэтому сразу переходим к рассмотрению принципа работы меню - к псевдоклассу ":hover". Да, это именно класс. Т.е. селектор может наследовать другой селектор, который включает ":hover". В нашем случае "A:hover TABLE" выбирает "

в
элементе , на который наводится указатель мыши. Далее следует трюк с таблицей, свойство "display" которой равняется "none" (т.е. она невидима). Таблица находится между тэгами якорей (,). По словам Microsoft, это может вызвать неадекватную реакцию IE, но я ничего такого не заметил.

Почему мы используем таблицу? А потому, что что она очень хорошо разделяет вложенные якоря, которые мы хотим задействовать из основного якоря. Такое решение не работает в Mozilla 0.7 и даже с помощью JavaScript я еще не нашел способа реализовать это. Прямое вложение якорей не допускается Microsoft, поэтому элемент table - это своеобразный хак для IE. И, насколько я знаю, только таблицы позволяют таким образом "провести" IE.

Итак, что у нас тут имеется? 2 таблицы с якорями внутри якорей.

< A class= "a" href = "#11" > Help < BR >
< TABLE cellpadding = "0" cellspacing = "0" border = "0" >
< TR >
< TD >< a href = "#12" > Howto

< TR >
< TD >< a href = "#13" > Index

< TR >
< TD >< a href = "#14" > About

Которые являются скрытыми.

div #menu .a table {
display : none ;
z - index :- 1 ;
}

Браузер показывает содержимое якоря при наведении указателя мыши и применяет в этом случае соответствующий стиль:

div #menu .a:hover {
background : #7DA6EE;
border : 1px solid black ;
color : black ; z - index : 0 ;
}

Для выпадающей таблицы, которую мы используем для подменю: это ключевая таблица, которая и является выпадающим списком.

div #menu .a:hover table{
background : White ;
display : block ;
position : absolute ;
width : 125px ; z - index : 0 ;
border : 1px solid #708090;
}

Для ссылок внутри подменю:

div #menu .a:hover table a {
display : block ;
color : Black ;
text - decoration : none ;

}

Если мы наводим указатель на одну из ссылок в подменю, браузер применяет следующий стиль:

Для ссылок внутри подменю:

div #menu .a:hover table a:hover {
display : block ;
background : #7DA6EE;
color : black ;
text - decoration : none ;
padding : 0px 11px ;
border : 1px solid black ; z - index : 1000 ;
visibility : visible ;
}

Стиль ссылок в выпадающем меню:

div #menu .a:hover table a {
display : block ;
color : Black ;
text - decoration : none ;
padding : 1px 12px ; z - index : 1000 ;
}

Возможно, вы заметили, что я испольщовал несколько свойств "z-index" для некоторых элементов. Они являются хаками для некоторых проблем, которые я нашел при тестировании меню.

Усовершенствования

Для того, чтобы добавить подуровни в выпадающее меню нужно просто вставить еще один элемент div ".menuitem" (вместе с его содержимым и аналогичной структурой) вместо ссылки в родительскую таблицу.
Теперь, когда у вас есть подуровни в меню, вам нужно будет удалить тэги
, чтобы дать меню "нормально выезжать". В дополнение к этому, вам нужно будет сделать несколько копий классов.menuitem и.a с одинаковыми свойствами, но разными именами для каждого подменю.
Да, похоже поработать придется много, НО вы можете просто добавить их селекторы в соответствующую секцию таблицы стилей.

Полное описание того, как это сделать, я сделаю в следующий раз.
А пока что скажу, что это меню вы можете изменить так, как вам захочется, приспособить под себя. И возможностей для этого существует бесконечное множество - ограничить их может только ваша фантазия...

Переключение стилей (Скины)

Если вы хотите добавить скины для вашего меню с возможностью их смены самим пользователем, вам нужно будет добавить дополнительные таблицы стилей и дать им имена с id="some_name" (для IE) и с именами name="some_name" (для остальных браузеров). Для того, чтобы не применялись оба стиля, вам нужно заблокировать все стили, кроме стилей по умолчанию, путем добавления параметра "disabled" в стиль тэга (причем не имеет значения, связываете ли вы его или используете линейный синтаксис). Mozilla и Opera позволяют переключение поименованных стилей из браузера. Как правило, эти браузеры не применяют все стили, которые определены именем name="..." и игнорируют id="...". Также они умеют использовать имя name="default" как таблицу стилей по умолчанию и name="alternate" в качестве альтернативной таблицы стилей. Вы можете определить имя стиля, которое пользователь будет видеть как свойство title="...". Например, демонстрационная версия меню на этой странице включает следующие определения:

< STYLE type = text / css id = "alternate" title = "Blue" name = "alternate" disabled >
...< STYLE >
< STYLE type = text / css id = "default" title = "Default" name = "default" >
...< STYLE >

Обратите внимание на порядок присвоения имен, я настойчиво рекомендую строго ему следовать.

IE не имеет встроенного переключения стилей CSS, поэтому нам придется его сделать самим (тут уже не без использования JavaScript):

Выберите один из стилей, кликнув на соответствующий, и вернитесь вверх, чтобы увидеть
изменения:

onclick = "document.styleSheets("default").disabled=false;document.styleSheets("alternate").disabled=true;" > Стиль
по умолчанию

Onclick = "document.styleSheets("alternate").disabled=false;document.styleSheets("default").disabled=true;" > Голубой

Onclick = "document.styleSheets("alternate").disabled=true;document.styleSheets("default").disabled=true;" > Без
стилей

Это делается так:

< ul >
< li onclick = "document.styleSheets("default").disabled=false;
document.styleSheets("alternate").disabled=true;"
>
< a >Default

< li onclick = "document.styleSheets("alternate").disabled=false;
>
< a > Blue

< li onclick = "document.styleSheets("alternate").disabled=true;
document.styleSheets("default").disabled=true;"
>
< a > No Stylesheet

Предупреждение! Это просто маленький пример!
Перезагрузка страницы сбросит значения по умолчанию для таблиц стилей. Поэтому для реальных целей необходимо использовать cookies или серверные скрипты для того, чтобы запоминать выбор пользователя, что опять-таки не является предметом рассмотрения данной статьи.
Добавлю только, что приведенный выше код будет работать только в
IE.

Заключение

Я советую всем использовать меню на основе CSS на ваших сайтах (и в веб-приложениях), потому что таким образом можно избежать многих проблем, которые появляются при использовании меню на основе JavaScript. Такие проблемы, как правило, возникают при неправильной обработке событий в IE. Более того, в некоторых браузерах имеется возможность отключения скриптов, и уж тем более многие браузеры не поддерживают JS от Microsoft.

Если же браузер не поддерживает CSS, то он по крайней мере будет отображать все ссылки.

Известные ошибки

По умолчанию ссылки в подменю не работают в Mozilla. Но я нашел более-менее приемлемое решение этой ошибки. Оно основано на вставке специального меню, опять-таки без использования скриптов. Просмотрите внимательно те места кода, где упоминается Mozilla (или "moz"). Вы увидите, что HTML разделы не имеют вложенных якорей (последний тэг помещен туда, где он и должен находиться). В первой части CSS я использую недокументированные селекторы - это специальные селекторы для Mozilla, и добавляю селектор:hover для тех элементов div, которые поддерживаются Mozilla. И все равно после этого поведение остается не совсем корректным.

В комментариях есть замечание (от Nick Young), что меню не работает в Netscape. я уверен, что проблема там в том же, что и в Mozilla. Надо искать дополнительную информацию об этом. Решение возможно потребует некоторых изменений, потому что альтернативный код должен нормально работать и в Netscape.

Замечания:

Страница была протестирована в IE версий 5, 5.5, 6, в Opera 7.23 и Mozilla 0.71. Скорее всего, меню будет работать и в более ранних версиях указанных браузеров.

Liked:
26



Did not like: 12

В этой статье я покажу как написать простой плагин на jQuery, который будет строить из обычной HTML-разметки симпатичное динамическое меню. Первое, с чего мы начнём, - определимся, что именно будет делать плагин и какова наша цель. Итак:

  1. Плагин назовём dynamenu (от английского Dynamic Menu ). Короткое, неплохое название в духе jQuery. Динамика меню будет представлена изменением "прозрачности" пунктов меню и изменения позиции элемента меню при наведении мышью - пункт меню будет немного "уезжать" вправо.
  2. Структуру меню мы зададим статично в виде HTML-разметки. Это будет последовательный набор DIV-элементов. Внутри каждого div-а - гиперссылка с названием пункта меню. Для каждого div-a зададим атрибут class="dynamenu" для того, чтобы затем можно было обратится к набору div-ов и превратить их в меню.
  3. Для анимации меню будем использовать стандартный метод jQuery - animate(). Его вполне хватит для реализации задачи "динамичности". С помощью этого метода мы изменим свойства opacity и left в момент наведения мышью на элемент и убирания мыши с элемента меню.

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

2. jquery.dynamenu.js - код плагина, помещенный в отдельный файл.

3. dynamenu.css - стиль нашего меню. Сюда помещаем весь CSS

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

Начинаем писать плагин. Поехали!

1. Готовим HTML разметку страницы

Зададим самую простую разметку для нашего меню. Пусть это будут несколько пунктов меню для нашего будущего сайта:

Новости сайта
Уроки Photoshop
Кисти для Photoshop
Красивые шрифты

Тут всё просто - 4 div-элемента, у каждого задан класс dynamenu для того, чтобы потом передать его в качестве селектора нашему будущему плагину. Внутри каждого div-а гиперссылка с названием пункта меню.

2. Задаём CSS-стили

Чтобы стилизовать наше меню, используем всего два CSS-стиля. С их помощью мы сделаем фон каждого пункта меню серым, ширину меню в 300 пикселей с внешними и внутренними отступами по 5 пикселей, а все ссылки меню - чёрного цвета:

a.mlink { color:#000; text-decoration:none; } .dynamenu { background-color: #aaaaaa; width:300px; margin:5px; padding:5px; font-family: "Tahoma"; font-size: 9pt; }

3. Пишем "каркас" плагина

Первым делом, зададим каркас нашего плагина. Этот каркас частично взят с официального сайта jQuery и содержит так называемые "Best Practices" (лучшие практики и приемы - от разработчиков языка jQuery). В общем случае подобный каркас применим практически ко всем плагинам jQuery. Если Вы запомните и поймете, как функционирует этот каркас, то потом будете писать плагины на "раз-два". Выглядит он следующим образом:

(function($) { // список методов нашего плагина var methods = { init: function(options) { // сюда можно помещать инициализацию плагина. в нашем случае // для простоты здесь ничего не будет }, sliding: function () { // метод sliding нашего плагина будет непосредственно строить меню } }; // "регистрируем" наш плагин в пространстве имен jQuery. $.fn.dynamenu = function(method) { // здесь вызываем нужный метод внутри плагина } })(jQuery);

Ничего сложного в каркасе, как видите, нет. Зато он несёт в себе полезную информацию. Первый важный момент, который нужно понять в каркасе - мы собираем все методы, добавляемые к нашему плагину (init, sliding) в один объект - methods. Это позволяет не забивать пространство имен $.fn лишними функциями. Правильное указание пространства имен нашего плагина - очень важная часть процесса разработки плагинов как такового. Использование пространства имен гарантирует, что наш плагин с минимальной долей вероятности будет переписан другими плагинами или кодом, расположенными на одной и той же HTML-странице. Пространство имен также делает жизнь проще, т.к. помогает лучше следить за методами, событиями и данными.

Всегда используйте сокрытие методов внутри плагина, например в объекте methods. Помимо того, что это хороший стиль программирования, данный приём поможет вам избежать конфликтов с другими сторонними библиотеками и плагинами, а также позволит не засорять пространство имен jQuery

Следующий момент, на который стоит обратить внимание - конструктор нашего плагина. Это строка $.fn.dynamenu = function (method) {...}. Как видим, конструктор принимает один параметр - method . В качестве значения для параметра мы будем передавать строку, содержащую имя метода внутри объекта methods, который мы собираемся вызвать. Давайте заполним конструктор следующим кодом:

$.fn.dynamenu = function(method) { if (methods) { methods.init.apply(this, arguments); return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1)); } else { $.error("Метод" + method + " не существует!"); } }

Разберем, что мы сделали. Сначала мы проверяем, есть ли метод с именем, переданным в параметре конструктора, в объекте methods нашего плагина. Если метод есть, то мы вызываем сначала метод init - для инициализации нашего плагина, а затем вызываем тот метод, имя которого передали в параметре конструктора, причем передаем ему все оставшиеся аргументы. Если же метода с таким именем нет, то мы выдадим ошибку и плагин прекратит свою работу.

На данном этапе уже многое сделано! Уже теперь мы можем обращаться к нашему плагину и вызывать его методы, хоть и никакой полезной работы они пока не выполняют,. Я рекомендую поместить код нашего плагина в отдельный файл и назвать его jquery.dynamenu.js . Размещение кода плагина в отдельном файле является логичным - ведь плагин должен быть по своей сути универсальным и давать нам и другим разработчикам подключать его в готовом виде к своему сайту.

Теперь, когда наш каркас наполнен кодом, способным вызывать внутренние методы плагина, пора нарастить "мясо", то есть написать код, который будет непосредственно превращать наши div-блоки в красивое динамическое меню. Приступим...

4. Пишем код, создающий динамическое меню на jQuery

Весь полезный код нашего плагина будет размещён в функции sliding , которая является внутренним методом плагина и находится в объекте methods . Давайте кратко опишем последовательность действий по превращению статичной разметки с нашими div-блоками в динамическое меню на jQuery:

  1. Сначала изменим всем div-блокам прозрачность, установив её в 0.4 пункта. Это позволит сделать каждый пункт меню сероватым. Потом, при наведении мышкой на него мы будем менять opacity до 1, таким образом создавая эффект выделения пункта меню
  2. Далее мы создадим обработчики "входа" мышью в область пункта меню и "выхода" из неё. При наведении на пункт меню будем менять стиль шрифта на полужирный и менять цвет фона на более тёмный. Также, при помощи стандартного метода jQuery animate мы сделаем эффект "выдвигания" меню немного вправо. При уходе мыши из области пункта меню просто будем возвращать все параметры в начальное состояние.

Вот, собственно, и вся логика. А теперь посмотрим, как это реализовать:

return this.each(function() { $(this).css({"opacity":"0.4"}); $(this).hover(function() { $("a.mlink", this).css({"font-weight":"bold"}); $(this).animate({ opacity:1, "margin-left":"+=5" }, 100, "linear"); }, function() { $("a.mlink", this).css({"font-weight":"normal"}); $(this).animate({ opacity:0.4, "margin-left":"-=5" }, 100, "linear"); }); });

На всякий случай, поясню, что происходит. Итак, в самой первой строчке мы видим оператор . Он делает следующее: пробегает по переданному в функцию sliding набору элементов (т.е. все наши div-блоки) и выполняет код, размещенный внутри. После такого пробега по элементам мы возвращаем (оператор return) результат выполнения операций для каждого элемента набора, опять же, в виде набора. Таким образом наша функция sliding возвращает набор div-блоков, переданных на "вход" функции, только обработанный и уже превращенный в динамическое меню. Этим реализуется важная концепция jQuery - возможность использования нашего плагина в цепочке вызовов. Чтобы лучше понять, что такое цепочка вызовов, приведу пример:

$(".myelm").dynamenu("sliding").css({"border" : "1px solid red"});

В приведенном выше куске кода мы видим, что такое цепочка вызовов: сначала мы выбираем все элементы на странице с классом myelm, затем используем наш плагин dynamenu и затем снова по цепочке применяем уже стандартный метод jQuery css() для изменения стиля элементов. Если бы мы не возвращали из метода конструкцию return this.each(function() { ... }) , то использовать метод css() в "цепочке" уже бы не смогли.

Используйте возврат оператора this.each() для того, чтобы поддерживать принцип "цепочки" в ваших плагинах и делать их более универсальными.

Едем дальше, внутри оператора each(), где мы пробегаем по всем нашим div-блокам идет как раз начальная установка свойства "прозрачность" (opacity) элемента в 0.4. пункта. Максимальное значение opacity - это 1 (100%), поэтому мы делаем "прозрачность" в 40%. После этого мы ставим два обработчика на "наведение" (hover) мыши и "уход" мыши из области div-блока. В первом обработчике мы устанавливаем название пункта меню полужирным шрифтом и используем метод animate(), чтобы добиться "полной непрозрачности" пункта меню, а также делаем сдвиг вправо на 5 пикселей. В обработчике "ухода" мыши мы просто возвращаем элемент в начальное состояние - меняем снова шрифт на обычный (normal) и делаем сдвиг влево снова на 5 пикселей.

На этом всё! Наш плагин готов к использованию. Хоть, он и простой, но может хорошо пригодиться для создания динамического меню на сайте. Ниже по тексту - демонстрация работы нашего плагина. Для того, чтобы увидеть результат работы плагина, перейдите на вкладку Result.

Успехов в написании хороших плагинов! Комментарии, вопросы и отзывы всегда приветствуются;)

06.06.06 26.3K

Введение

Слышали ли вы когда либо такое утверждение, что «нельзя сделать динамическое выпадающее меню исключительно на CSS для IE»? Уверен, что да. И что, вы-таки верите этому? Правильно, лучше не верьте.

Цель, которой мы хотим достичь в этой статье

Цель данной статьи — сделать выпадающее меню для IE, сделанное исключительно на CSS. Начав с этой постановки, я расширил задачу до того, чтобы заставить работать такое меню в других наиболее известных браузерах (прим. пер.: из комментариев выясняется, что этими браузерами являются Opera 7.x и последние версии Firefox).

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

Каким мы представляем уровень читателя.

Вообще-то я думал о том, чтобы пометить эту статью как для «углубленного изучения (advanced)». Но я уверен, что даже не самые опытные разработчики хорошо поймут то, что написано в статье. Короче, читатель просто обязан знать основы CSS и
HTML.

Чем это меню отличается от всех других?

я долго искал в сети меню, которые были бы сделаны на CSS, но не нашел ни одного решения, которое бы работало без глюков в IE. Однако же я нашел много интересных идей, которые и привели меня к тому результату, который будет здесь описан. Да, мой код тоже не совершенен, но у меня попросту нет времени, чтобы выправить все ошибки. Самое интересное альтернативное решение из всех, что я видел (которые используют CSS), основано на использовании псевдокласса hover для элементов LI. А я-то никогда и не думал, что такое возможно, впрочем, как и не думал о том, что вообще возможно сделать выпадающее меню для IE без скриптов…

Основным отличием между моим и другими меню является то, что мое работает в IE. Все решения, которые я видел, используют элемент LI как основной элемент для псевдокласса:hover, однако Microsoft решила, что этот псевдокласс может быть использован только для
элемента A. Большинство сайтов делают оговорку, что их меню работают только в браузерах Opera 7.x или Mozilla. Но ведь эти браузеры используются только пятью процентами пользователей! Да, такие меню хороши в этих браузерах, но к сожалению не могут быть видны в большинстве самых распространенных браузеров. Сейчас мы исправим это недоразумение.

Что такое меню, сделанное с помощью только CSS?

Это динамическое меню, для создания которого используется только CSS, и не используются скрипты (например, написанные на JavaScript).

Что, не верится?

Давайте рассмотрим код:

Mozilla specific menu!

Что происходит, почему все работает?

Сразу оговорюсь, что в этой статье я не буду вас учить использованию CSS. Поэтому сразу переходим к рассмотрению принципа работы меню — к псевдоклассу ‘:hover’. Да, это именно класс. Т.е. селектор может наследовать другой селектор, который включает ‘:hover’. В нашем случае ‘A:hover TABLE’ выбирает ‘

в
элементе , на который наводится указатель мыши. Далее следует трюк с таблицей, свойство "display" которой равняется "none" (т.е. она невидима). Таблица находится между тэгами якорей (,). По словам Microsoft, это может вызвать неадекватную реакцию IE, но я ничего такого не заметил.

Почему мы используем таблицу? А потому, что что она очень хорошо разделяет вложенные якоря, которые мы хотим задействовать из основного якоря. Такое решение не работает в Mozilla 0.7 и даже с помощью JavaScript я еще не нашел способа реализовать это. Прямое вложение якорей не допускается Microsoft, поэтому элемент table — это своеобразный хак для IE. И, насколько я знаю, только таблицы позволяют таким образом "провести" IE.

Итак, что у нас тут имеется? 2 таблицы с якорями внутри якорей.

Help

Howto
Index
About

Которые являются скрытыми.

div#menu .a table { display: none; z-index:-1; }

Браузер показывает содержимое якоря при наведении указателя мыши и применяет в этом случае соответствующий стиль:

div#menu .a:hover { background: #7DA6EE; border: 1px solid black; color: black;z-index:0; }

Для выпадающей таблицы, которую мы используем для подменю: это ключевая таблица, которая и является выпадающим списком.

div#menu .a:hover table{ background: White; display: block; position: absolute; width: 125px;z-index: 0; border: 1px solid #708090; }

Для ссылок внутри подменю:

Если мы наводим указатель на одну из ссылок в подменю, браузер применяет следующий стиль:

Для ссылок внутри подменю:

div#menu .a:hover table a:hover { display: block; background: #7DA6EE; color: black; text-decoration: none; padding: 0px 11px; border: 1px solid black;z-index:1000; visibility: visible; }

Стиль ссылок в выпадающем меню:

div#menu .a:hover table a { display: block; color: Black; text-decoration: none; padding: 1px 12px;z-index:1000; }

Возможно, вы заметили, что я испольщовал несколько свойств ‘z-index’ для некоторых элементов. Они являются хаками для некоторых проблем, которые я нашел при тестировании меню.

Усовершенствования

Для того, чтобы добавить подуровни в выпадающее меню нужно просто вставить еще один элемент div ‘.menuitem’ (вместе с его содержимым и аналогичной структурой) вместо ссылки в родительскую таблицу.
Теперь, когда у вас есть подуровни в меню, вам нужно будет удалить тэги
, чтобы дать меню «нормально выезжать». В дополнение к этому, вам нужно будет сделать несколько копий классов.menuitem и.a с одинаковыми свойствами, но разными именами для каждого подменю.
Да, похоже поработать придется много, НО вы можете просто добавить их селекторы в соответствующую секцию таблицы стилей.

Полное описание того, как это сделать, я сделаю в следующий раз.
А пока что скажу, что это меню вы можете изменить так, как вам захочется, приспособить под себя. И возможностей для этого существует бесконечное множество — ограничить их может только ваша фантазия…

Переключение стилей (Скины)

Если вы хотите добавить скины для вашего меню с возможностью их смены самим пользователем, вам нужно будет добавить дополнительные таблицы стилей и дать им имена с id=’some_name’ (для IE) и с именами name=’some_name’ (для остальных браузеров). Для того, чтобы не применялись оба стиля, вам нужно заблокировать все стили, кроме стилей по умолчанию, путем добавления параметра «disabled» в стиль тэга (причем не имеет значения, связываете ли вы его или используете линейный синтаксис). Mozilla и Opera позволяют переключение поименованных стилей из браузера. Как правило, эти браузеры не применяют все стили, которые определены именем name=»…» и игнорируют id=»…». Также они умеют использовать имя name=’default’ как таблицу стилей по умолчанию и name=’alternate’ в качестве альтернативной таблицы стилей. Вы можете определить имя стиля, которое пользователь будет видеть как свойство title=»…». Например, демонстрационная версия меню на этой странице включает следующие определения: