Делаем меню с использованием вкладок с помощью javascript

Рисовал не так давно сайт для Черниговского автосалона и невольно озадачился парочкой интересных решений на основе javascript. Об одном из них пойдёт речь в этой заметке. Другое имеет полное право быть выделено как отдельный пост, так как решает свои специфические задачи. Позволим же ему воспользоваться этим правом в полной мере.

Итак, пойдёт разговор сегодня о такой красивости, как вкладки или табы. А точнее о меню на их основе. Цель – написать наипростейший код, выполняющий полностью поставленные перед ним задачи. Конечно, скрипт обязан быть максимально кратким и надёжным. Там, где можно написать 1 строку не стоит городить десяток, что довольно часто можно наблюдать даже на сайтах, сделанных «крутыми» сайтостроительными конторами. И естественно, понимать его обязаны все более менее вменяемые браузеры.

Поехали. Вначале мной было подсмотрено решение для вкладок у ForSimple (мне оно показалось наиболее простым), а также изучено пару решений от Мастера Gordi. Были также изрядно истоптаны тропинки поисковиков по нужным запросам, однако ничего интерессного найти не удалось.

Смысл нашего скриптика в том, чтобы при запуске функции нужные вкладки выделялись (остальные при этом должны быть невыделены), а также пользователю показывается нужный слой с подменюшкой (остальные в это время обязаны быть скрыты). Выделить/снять выделение и скрыть/показать элемент просто. Это делается путём назначения стилей CSS и функции javascript getElementById.

С помощью простейшей конструкции мы можем выполнить нашу задачу.

function index() {
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, и так далее.

function index() {
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 раза уменьшить количество строк. Смотрим следующий рабочий пример. Однако это ещё не идеал.

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

Получаем на выходе простейшее решение:

function index(n) {
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 блог начинающего вам поможет.

Интересно, что будет дальше? Подпишись на RSS


20 мая 2009, 13:17
№ 1Вкладочки поплыли в ie6,7
Вкладочки плавают в ie6, ie7
Исправляй :)
с upload не разобрался?
20 мая 2009, 13:30
№ 2
Это ж не по CSS статья. Javascript нормально работает, а это главное. Но согласен. Спасибо. Нужно, чтобы было красиво :)

Разберусь :)

Рабочий пример, без плавающих вкладочек, можно лицезреть здесь: http://skoda-metek.com.ua
Lex Nevermind
20 мая 2009, 22:51
№ 3JS
Если делать переключение вкладок по mouseover, то можно вообще обойтись одним CSS и не потребуется шаманства с javascript. Но на практике нужно переключение как раз по клику....
fit-media.com
21 мая 2009, 10:04
№ 4
Одним CSS вы врядли обойдётесь. Наверно не внимательно прочли пост. Да и скрипт работает, как по клику, так и по наведению. Отсюда универсальность.

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

2Kudesnik, извиняюсь, что не ответил в прошлый раз. С аплоадом пока нет.
Lex Nevermind
22 мая 2009, 03:13
№ 5JS tabs
Я думал, что после истории с редактором ты мне уже начал доверять... ;)
Решение без жаба-скрипта здесь: http://fit-media.com/__tabs.htm
Имей в виду, что это не законченное решение, а просто набросок - писано на коленке за 5 минут, специально для тебя, поэтому может косячить во всяких эксплорерах. Проверил только в лисе и опере (в опере выглядит более правильно и красиво).
ЗЫ
Пост не читал, просто примеры глянул ;)
fit-media.com
22 мая 2009, 10:56
№ 6
Твой пример очевиден (любой школьник мог его нарисовать), однако в корне неверен. Ты совершенно не понял постановку задачи. Важно, чтобы после того, как пользователь уводит мышь от таба и от менюшки в принципе, в поле зрения оставался активный слой с подменюхой, а активный таб был выделен. Тут нужно навечно изменять свойства CSS, а это подвластно только Javascript.

З.Ы. Программинг программингом, а вёрстка не твой конёк
Lex Nevermind
22 мая 2009, 19:02
№ 7Без темы
Первое - я же сказал, что пример писан за 5 минут и не стоит ожидать от него сногсшибательного функционала.
Второе - в моем первом комменте к твоему опусу написано, что "Если делать переключение вкладок по mouseover, то можно вообще обойтись одним CSS". Ни о каких уводах мыши и прочем там не говорилось. Ты хотел пример табов с mouseover на одном CSS, а тебе его дал.
Третье - JS и верстка - это совершенно разные вещи, коли ты их путаешь, то как раз твои знания в данном предмете поверхностны. Го в библиотеку.
Четвертое - не стоит делать выводы о том, что есть "не мой конек", после того как я _дважды_ тебе доказал, что ты не прав.
Пятое - этот пост в комменты не пропускай, т.к. в дальнейших дискуссиях на тему "у кого длинее" я участвовать не собираюсь.
fit-media.com
23 мая 2009, 09:41
№ 8
1. Твой пример вообще не выполняет поставленной задачи, а значит глуп и неверен. Как я писал ранее, школьник мог легко озаботиться написанием такого "крутого" примера.
2. Смотри первый пункт. Зачем плодить глупости?
3. CSS с вёрсткой не связано? Странно ;) Ты вроде своими познаниями в CSS хотел козырнуться. Сам иди почитай.
4. Единожды и касалось это PHP программинга. А вёрстка всё таки видимо не твой конёк, если ты даже постановки задачи понять не можеш.
5. До свидания. Занимаймся своим делом.
Lex Nevermind
23 мая 2009, 10:36
№ 9дети
Ну, дети малые.
На ровном месте умудрились поругаться.
fit-media.com, к сожалению, не нашел твоего имени.
Ну, что тебе стоит доработать плагин из прошлого поста? Обезопасить загрузку, тем более, что компетентен в этом вопросе.
Выложишь на своем блоге решение, lex — поблагодарит ссылочкой.
В итоге все выигрыше.
Разработчикам респекты, пользователям — полезная фенька.
23 мая 2009, 12:58
№ 10
Совершенно верно. Можно внести свой вклад в разработку полезного, нужного и бесплатного ПО.
Lex Nevermind
08 августа 2009, 04:10
№ 11Как насчёт практической помощи?
Искала, как решить проблему с криво работающими табами на блоге - вышла на Вашу статью. Прониклась. Трепещу.
Вижу, Вы знаете толк в них, табах, толк... решусь просить совета, можно?
Вот мой жалкий блог http://allpa.ru/ , на ём поставлена тема, которая мне нравится по многим причинам. Табы, по-видимому, у всех, кто её использует, работают отлично. На моём блоге - увы, нет.
Всё выстроилось в один столбик, на всех вкладках одно и то же.
Не могли бы Вы оказать любезность и пнуть меня в нужном направлении - куда рыть, где искать камень преткновения?
Если пнёте в совсем другую сторону - не обижусь, пойму.
Спасибо :)
08 августа 2009, 12:00
№ 12
Могу сказать, что нужно просмотреть все javascript файлы, подключённые к странице. Когда будет время, гляну :)
Lex Nevermind
10 августа 2009, 03:29
№ 13Буду очень Вам благодарна...
... за любую помощь :)
Дело в том, что я с этими табами уже зверею просто: в некоторых шаблонах они прекрасно работают, а в некоторых - ни в какую. Закономерности выявить не удалось, но я лох, куда мне там выявлять закономерности...
Подозреваю, что рабочее/нерабочее состояние табов зависит от того, каким образом (с помощью чего) они сделаны (как прикручены к шаблону).
Я, когда читала Вашу замечательную статью, очень хотела взять гениальный код, которым Вы с нами поделились, и самостоятельно закинуть в шаблон.
Но, повторюсь, поскоку дуб я, понять, куда имено и как закидывать - не в силах...
Чисто теоретически - возможно проделать такую операцию? Или меня несёт не в ту степь?
Если у Вас вдруг найдётся минутка (жутко надеюсь, что таки найдётся... когда-нить...) и Вы захотите глянуть, что там к чему, то Вы могли бы стукнуть в асю (боже, я наглею о_О) - я бы поставила попеременно парочку неработающих/работающих шаблонов с табами, а Вы могли бы кинуть на них беглый, острый, профессиональный взгляд...
На всякий случай моя ася: 464058287
Простите... (потупясь)...
10 августа 2009, 14:54
№ 14
Только хотел помочь... смотрю а на Вашем блоге уже всё работает. Рад, что разобрались.
Удачи!
Lex Nevermind
10 августа 2009, 15:46
№ 15Вопрос открыт...
Да, как раз хотела Вам отписать: дело оказалось в глючном плаге "Collapsing Archives" - стоило его отключить, как всё заработало :)
Но вопрос, а возможно ли использовать Ваш волшебный код вместо кода аффтара шаблона, остаётся открытым.
Например, я хочу поменять его расклад на свой: вместо Popular, Featured, Comments и Tags поставить Случайные Статьи, Популярное, Комментарии и Счётчики (или Статистика: текстовый блок по типу виджетов, чтобы в него можно было вставлять коды различных счётчиков).
Сейчас я попытаюсь списаться на ОЧЕНЬ ломаном английском с аффтаром шаблона, но ОЧЕНЬ сомневаюсь, что аффтар захочет возиться, отвечая мне (да и поймёт ли он вообще, чего я от него хочу...).
И вот тут-то я бы - хоп! - прикрутила Ваш код (там же всё очень просто можно менять, как я поняла), а?
А я бы о Вас рассказала у себя в первом же сообщении обновлённого блога (как только окончательно утрясутся все переделки в шаблоне), ммм?
Да! А не берёте ли Вы денег за работу? Наверное, если сумма не запредельно велика, я могла бы заплатить...
10 августа 2009, 16:45
№ 16
Плату принимаем, но всё зависит от работ. В Вашем случае нужно ковыряться в Вордпрессе, а я им почти не маялся. Поэтому разбирательство потребует лишнего времени и соотвественно оплаты.

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

Однако если хочется воспользоваться именно моими услугами, прошу в ICQ 380540200. Писал Вам сегодня в аську, но ответа не получил.
Lex Nevermind
28 января 2010, 05:43
№ 17возвращаясь к сказанному
>> Одним CSS вы врядли обойдётесь. Наверно не внимательно прочли пост.
Хех. Придумано не мной, но не важно. http://daniel.glazman.free.fr/weblog/targetExample .html#general :)
28 января 2010, 10:46
№ 18
Очень интересно. Спасибо.
Обязательно посмотрю.
Lex Nevermind
28 января 2010, 12:40
№ 19
Да, CSS3 рулит, только пока его будут исполнять все браузеры... нужно использовать решение на javascript :)
Кстати, лучше комментировать новый адрес заметки: Link
Lex Nevermind
Адрес заметки: http://lexnevermind.com/post_1242571437.html
Ваш комментарий к статье



cod


Примечание:
Обязательные для заполнения поля помечены карандашом
email при указании не будет опубликован.
Адреса с http:// преобразуются в ссылки автоматически
Для этого отделяйте их от текста ПРОБЕЛАМИ с обеих концов
Теги запрещены

Рейтинг популярности заметок:

май, 2009
пн вт ср чт пт сб вс
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31