Делаем меню с использованием вкладок с помощью javascript
Рисовал не так давно сайт для Черниговского автосалона и невольно озадачился парочкой интересных решений на основе javascript. Об одном из них пойдёт речь в этой заметке. Другое имеет полное право быть выделено как отдельный пост, так как решает свои специфические задачи. Позволим же ему воспользоваться этим правом в полной мере.
Итак, пойдёт разговор сегодня о такой красивости, как вкладки или табы. А точнее о меню на их основе. Цель – написать наипростейший код, выполняющий полностью поставленные перед ним задачи. Конечно, скрипт обязан быть максимально кратким и надёжным. Там, где можно написать 1 строку не стоит городить десяток, что довольно часто можно наблюдать даже на сайтах, сделанных «крутыми» сайтостроительными конторами. И естественно, понимать его обязаны все более менее вменяемые браузеры.
Поехали. Вначале мной было подсмотрено решение для вкладок у ForSimple (мне оно показалось наиболее простым), а также изучено пару решений от Мастера Gordi. Были также изрядно истоптаны тропинки поисковиков по нужным запросам, однако ничего интерессного найти не удалось.
Смысл нашего скриптика в том, чтобы при запуске функции нужные вкладки выделялись (остальные при этом должны быть невыделены), а также пользователю показывается нужный слой с подменюшкой (остальные в это время обязаны быть скрыты). Выделить/снять выделение и скрыть/показать элемент просто. Это делается путём назначения стилей CSS и функции javascript getElementById.
С помощью простейшей конструкции мы можем выполнить нашу задачу.
document.getElementById('tab1').className='sel';
document.getElementById('cont1').style.display='block';
//выделяем нужный таб и показываем нужный слой
document.getElementById('tab2').className='nonsel';
document.getElementById(‘cont2’).style.display='none';
…
…
//снимаем выделение с остальных табов, а слои скрываем
}
В принципе этого скрипта уже достаточно для выполнения нашей задачи. Он будет нормально работать, причём в любом браузере. Смотрим рабочий пример на 4 вкладки. Единственные его минусы - размер и громоздкость. Ведь если вкладок довольно много, величина скрипта становится значительной. При четырёх табах каждая вкладка описывается с помощью восьми строк. Естественно, такое положение вещей не могло устроить меня, так как одним из моих принципов в вёрстке и разработке является минимализм. И я пошёл дальше.
Порывшись ешё немного в Гугле, удалось написать упрощённый вариант скрипта. Его главное отличие от предыдущего – наличие цикла. Обязательное правило: вкладкам и слоям должны быть выданы соотвествующие айдишники. То есть, первый таб – tab1, первый слой – cont1, и так далее.
for(i=1;i<=4;i++) {
document.getElementById('tab'+i).className='nonsel';
document.getElementById('cont'+i).style.display='none';
}
//снимаем выделение со всех табов, все слои скрываем
document.getElementById('tab1').className='sel';
document.getElementById('cont1').style.display='block';
//выделяем нужный таб и показываем нужный слой
}
Итого получилось четыре короткие функции (по количеству вкладок). Уже неплохо. Оптимизация налицо, ведь удалось в 2 раза уменьшить количество строк. Смотрим следующий рабочий пример. Однако это ещё не идеал.
Конечно, сократить функцию уже врядли получится. Зато можно сократить количество функций. В идеале нужно делать все операции с помощью одной небольшой функции, а их пока целых четыре. Далее всё очень просто. Нужно всего лишь задаться вопросом, что является исходными данными для скрипта и можем ли мы их передавать динамически. А вводной служит всего лишь одна цифра – айдишник (таба и слоя), и передавать его мы не только можем, но и обязаны, если не хотим расписывать энное количество лишних строк скрипта.
Получаем на выходе простейшее решение:
for(i=1;i<=4;i++) {
document.getElementById('tab'+i).className='nonsel';
document.getElementById('cont'+i).style.display='none'
}
//снимаем выделение со всех табов, все слои скрываем
document.getElementById('tab'+n).className='sel';
document.getElementById('cont'+n).style.display='block';
//выделяем нужный таб и показываем нужный слой
}
Последний рабочий пример можно лицезреть по линку.
Итого: имеем универсальное простое решение для реализации сложной динамической менюшки с использованием вкладок. Причём работает оно в любом браузере (естественно, при включённом javascript).
Кстати, хотел бы заметить, что активировать скрипт можно как угодно (по клику или наведению). Мне нравится больше вариант с onmouseover. Ведь в результате получаем меню, которое реагирует на наведение курсора, однако в ссылке вкладки всё равно стоит линк. Так, даже при выключенном жаваскрипте пользователь сможет перейти по ссылке меню.
--------------------
Денис Чекалов продолжает пополнять свой список блогов, авторы которых активно меняются постовыми.
А вы знаете как поднять ТИЦ / Pr сайта, увеличить посещаемость сайта?
Хотите научится продвигать сайт? SEO блог начинающего вам поможет.
Решение без жаба-скрипта здесь:
Имей в виду, что это не законченное решение, а просто набросок - писано на коленке за 5 минут, специально для тебя, поэтому может косячить во всяких эксплорерах. Проверил только в лисе и опере (в опере выглядит более правильно и красиво).
ЗЫ
Пост не читал, просто примеры глянул ;)
Второе - в моем первом комменте к твоему опусу написано, что "Если делать переключение вкладок по mouseover, то можно вообще обойтись одним CSS". Ни о каких уводах мыши и прочем там не говорилось. Ты хотел пример табов с mouseover на одном CSS, а тебе его дал.
Третье - JS и верстка - это совершенно разные вещи, коли ты их путаешь, то как раз твои знания в данном предмете поверхностны. Го в библиотеку.
Четвертое - не стоит делать выводы о том, что есть "не мой конек", после того как я _дважды_ тебе доказал, что ты не прав.
Пятое - этот пост в комменты не пропускай, т.к. в дальнейших дискуссиях на тему "у кого длинее" я участвовать не собираюсь.
На ровном месте умудрились поругаться.
fit-media.com, к сожалению, не нашел твоего имени.
Ну, что тебе стоит доработать плагин из прошлого поста? Обезопасить загрузку, тем более, что компетентен в этом вопросе.
Выложишь на своем блоге решение, lex — поблагодарит ссылочкой.
В итоге все выигрыше.
Разработчикам респекты, пользователям — полезная фенька.
Вижу, Вы знаете толк в них, табах, толк... решусь просить совета, можно?
Вот мой жалкий блог , на ём поставлена тема, которая мне нравится по многим причинам. Табы, по-видимому, у всех, кто её использует, работают отлично. На моём блоге - увы, нет.
Всё выстроилось в один столбик, на всех вкладках одно и то же.
Не могли бы Вы оказать любезность и пнуть меня в нужном направлении - куда рыть, где искать камень преткновения?
Если пнёте в совсем другую сторону - не обижусь, пойму.
Спасибо :)
Дело в том, что я с этими табами уже зверею просто: в некоторых шаблонах они прекрасно работают, а в некоторых - ни в какую. Закономерности выявить не удалось, но я лох, куда мне там выявлять закономерности...
Подозреваю, что рабочее/нерабочее состояние табов зависит от того, каким образом (с помощью чего) они сделаны (как прикручены к шаблону).
Я, когда читала Вашу замечательную статью, очень хотела взять гениальный код, которым Вы с нами поделились, и самостоятельно закинуть в шаблон.
Но, повторюсь, поскоку дуб я, понять, куда имено и как закидывать - не в силах...
Чисто теоретически - возможно проделать такую операцию? Или меня несёт не в ту степь?
Если у Вас вдруг найдётся минутка (жутко надеюсь, что таки найдётся... когда-нить...) и Вы захотите глянуть, что там к чему, то Вы могли бы стукнуть в асю (боже, я наглею о_О) - я бы поставила попеременно парочку неработающих/работающих шаблонов с табами, а Вы могли бы кинуть на них беглый, острый, профессиональный взгляд...
На всякий случай моя ася: 464058287
Простите... (потупясь)...
Но вопрос, а возможно ли использовать Ваш волшебный код вместо кода аффтара шаблона, остаётся открытым.
Например, я хочу поменять его расклад на свой: вместо Popular, Featured, Comments и Tags поставить Случайные Статьи, Популярное, Комментарии и Счётчики (или Статистика: текстовый блок по типу виджетов, чтобы в него можно было вставлять коды различных счётчиков).
Сейчас я попытаюсь списаться на ОЧЕНЬ ломаном английском с аффтаром шаблона, но ОЧЕНЬ сомневаюсь, что аффтар захочет возиться, отвечая мне (да и поймёт ли он вообще, чего я от него хочу...).
И вот тут-то я бы - хоп! - прикрутила Ваш код (там же всё очень просто можно менять, как я поняла), а?
А я бы о Вас рассказала у себя в первом же сообщении обновлённого блога (как только окончательно утрясутся все переделки в шаблоне), ммм?
Да! А не берёте ли Вы денег за работу? Наверное, если сумма не запредельно велика, я могла бы заплатить...
Хех. Придумано не мной, но не важно. http://daniel.glazman.free.fr/weblog/targetExample .html#general :)
Рейтинг популярности заметок:





Исправляй :)
с upload не разобрался?