22 декабря 2015
8 октября 2008
94
Как делать табы на jQuery
Всем привет! Сегодня мы покажем как делать табы (они же вкладки) с помощью jQuery. Табы довольно популярная штука в современном вебе, так что любой уважающий себя человек просто обязан знать, как их делать. Поехали.
Я постараюсь все расписывать довольно подробно, чтобы не было непонимания. Нетерпеливые могут сразу посмотреть живой пример.
Итак, для начала нам нужен HTML. Скажем, у нас будет всего 3 таба (соотвественно и 3 вида содержимого). Пишем следующий код:
<h1>Цитаты</h1>
<div class="tabs">
<!-- Это сами вкладки -->
<ul class="tabNavigation">
<li><a class="" href="#first">Д.Огилви</a></li>
<li><a class="" href="#second">Миллер</a></li>
<li><a class="" href="#third">Черчилль</a></li>
</ul>
<!-- Это контейнеры содержимого -->
<div id="first">
<h2>Д.Огилви</h2>
<p>Лучший способ превратить работника в генератор идей это возложить на него самую высокую ответственность.</p>
</div>
<div id="second">
<h2>Миллер</h2>
<p>Деньги не имеют значения — пока они у вас есть.</p>
</div>
<div id="third">
<h2>Черчилль</h2>
<p>Пессимист видит трудности при каждой возможности; оптимист в каждой трудности видит возможности.</p>
</div>
</div>
Обратите внимание, что имя якоря ссылки таба соотвестсвует id дива.
Теперь добавим сюда стилей по вкусу:
div.tabs {
background: #333;
padding: 1em;
}
div.container {
margin: auto;
width: 90%;
margin-bottom: 10px;
}
ul.tabNavigation {
list-style: none;
margin: 0;
padding: 0;
}
ul.tabNavigation li {
display: inline;
}
ul.tabNavigation li a {
padding: 3px 9px;
background-color: #666;
color: #000;
text-decoration: none;
}
ul.tabNavigation li a.selected,
ul.tabNavigation li a.selected:hover {
background: #FFF;
color: #000;
}
ul.tabNavigation li a:hover {
background: #ccc;
color: #000;
}
ul.tabNavigation li a:focus {
outline: 0;
}
div.tabs div {
padding: 5px;
margin-top: 3px;
border: 1px solid #FFF;
background: #FFF;
}
div.tabs div h2 {
margin-top: 0;
}
Финальным штрихом будет JavaScript код:
$(function () {
var tabContainers = $('div.tabs > div'); // получаем массив контейнеров
tabContainers.hide().filter(':first').show(); // прячем все, кроме первого
// далее обрабатывается клик по вкладке
$('div.tabs ul.tabNavigation a').click(function () {
tabContainers.hide(); // прячем все табы
tabContainers.filter(this.hash).show(); // показываем содержимое текущего
$('div.tabs ul.tabNavigation a').removeClass('selected'); // у всех убираем класс 'selected'
$(this).addClass('selected'); // текушей вкладке добавляем класс 'selected'
return false;
}).filter(':first').click();
});
Теперь остается посмотреть, что у нас получилось.
Надо сказать, что сегодня мы изобрели велосипед (плагинов для табов огромное количество), но зато посмотрели как работают селекторы jQuery. Еще к плюсам можно отнести то, что при отключенном JS пользователь все равно увидит информацию из табов.
На сегодня все. Вопросы и замечания — в комментариях. Пока.
Обновление, 28 марта 2009: По многочисленным просьбам трудящихся я сделал пример, как делать несколько блоков с табами на странице.
Странно, что скрипт (поставил в комменты), который просто раздвигается/задвигается занимает всего(!) 1-3 строчки ??? :)
Спасибо.
var tabContainers = $('div.tabs > div');
var saved_tab = parseInt($.cookie('saved_tab')) || 0;
tabContainers.hide().filter(':eq('+saved_tab+')').show();
$('div.tabs ul.tabNavigation a').click( function () {
var index = $('div.tabs ul.tabNavigation a').index(this);
$.cookie('saved_tab', index);
tabContainers.hide();
tabContainers.filter(':eq('+index+')').show();
$('div.tabs ul.tabNavigation a').removeClass('selected');
$(this).addClass('selected');
return false;
}).filter(':eq('+saved_tab+')').click();
Мне нужно сделать что-то типа табов, но только все гораздо проще. К примеру есть вот такой текст: 1. Текст1 2. Текст2 3. Текст3 Нужно, чтобы когда нажимаешь на Текст1 под ним (между Текст1 и Текст2) открывалась некая инфа1. Нажимаешь на Текст2 инфа1 исчезала и появлялась инфа2 между Текст2 и Текст3. надеюсь понятно объяснил. спасибо
Вот на одной странице стоит несколько блоков, и при нажатии на одну вкладку открывается она во всех блоках! Как сделать чтоб каждый блок работал по отдельности!
Чтобы этого не происходило, можно оборачивать каждую из групп блоков в див с каким-то айди, например:
А потом уже для каждого блока в отдельности вызывать функцию вот так:
Все дело в том, что изначальный код был только для одного набора табы-содержимое на странице.
Спасибо!
как заставить открыватся не первую вкладку по умолчанию а например вторую? заранее спасибо!
заменяем на вот такок
я вижу все содержимое на одной вкладке. А поидее должно быть так: выбрал вкладку Черчель и там должен открыься блок с описанием Черчеля. Я правильно понимаю? Если да, то почему же у меня вашпример не правильно отборажается :(
Мне нужно написать подобную менюшку на табах только 2х-уровневую, то есть на выделенной вкладке должна появляться еще одна менюшка со вкладками.
Помогите пожалуйста...
Осталось теперь на свою верстку его переложить и мне будет сщастье...
А кто-нить Граватаркой пользуется? я зарегилась и теперь нужно имя выбрать, я ввожу имя и после этого нажимаю ок. Но ничего не происходит, просто перезагружается страничка и все. И никаких ошибок, ничего не появляется...
мне письмо пришло:
To activate your account, simply click on the link below or paste into the url field on your favorite browser: и ссылка. вот тут нужно придумать ник и пароль. я все ввожу но ничего не сохраняется.
что нужно исправить в js?
в общем все три дива должны лежать в каком то одном, куда будет програмно выводится весь контент.
А еще я хочу сделать 2-х уровневую менюшку, нажимаешь на вкладку и внизу появляется еще один уровень с такими вкладками. Мне сказали что это табами сделать можно. Кто-нибудь делал такое? Подскажите где можна стырить код такой менюшки :), а то сроки поджимают, надо как-то уже что-то сделать...
<script src='/files/js/jquery.js' type='text/javascript'></script>
нужно исправить на
<script src='./files/js/jquery.js' type='text/javascript'></script>
т.е. просто добавить точку в ссылке, иначе jquery не подгружается.
эту сторочку можно закомметить, все работает.
Спасибо большое за статью. Очень помог!
$(function () {
var tabContainers = $('div.tabs > div');
tabContainers.hide().filter(':first').show();
$('div.tabs ul.tabNavigation li').click(function () {
tabContainers.hide();
tabContainers.filter(this.hash).show();
$('div.tabs ul.tabNavigation li').removeClass('hover');
$(this).addClass('hover');
return false;
}).filter(':first').click();
});
Я заменил a на li и все получилось, но.. перестала отображаться информация из табов, т.е. я щелкаю по элементам меню. Они весело выделяются hover'ом, но информация не отображается. Как реализовать это корректно?
Имеется, приведенный в данном примере, код:
Для работы табов использован также приведенный здесь код:
Я так полагаю, что данный код добавляет/удаляет класс hover непосредственно к тэгу ссылки a. Мне же нужно, чтобы добалялся класс не к ссылке, а к элементу списка. Я пробовал заменить на , но в таком случае табы перестают работать. В любом случае нужно обрабатывать click на а, но добавлять класс к li. Видимо надо что-то с сделать, но если заменить на , то hover добавится ко всем элементам списка (что, впрочем, очевидно). Помогите пожалуйста решить проблему, очень нужно. Спасибо.
Не согласен :) Данный пример НАМНОГО легче тех, что приведены на большинстве сайтов, где я был. Правда вот с семантикой, говорят, проблемы ;)
Спасибо за ответ, если кто ответит )
давно тут не писали ничего, но я надеюсь что кто-то подскажет.
понравилась простота пояснения, очень признателен,
а не могли бы вы подказать какие измениния в коде скрипта нужно сделать чтобы подгружать табы с отдельных штмл файлов, как я понимаю это ajaх но пока не понимаю многих положений в jQuery и js в частности.(только вникаю)
в любом случае очень благодарен.
http://tutorialzine.com/2010/01/sweet-tabs-jquery-ajax-css/
и вот я не могу найти простой кусочек кода который мне помог бы реализовать табсы.:)
еще раз спасибо, буду пробовать выбрать нужный функционал из кипы кода.
А код с добавлением cookie не работает. Не запоминает последний таб.
Почему? Написано код верный для cookie. Файл с cookie подгружаю
Очень хороший таб, спасибо! Хотя и 2008г.
Вопрос был задан, но у меня по ответу не получилось.
Поэтому, ещё раз:
Как сделать переходы между табами (естесственно с перезагрузкой страницы).
Например, в первом табе список, а во втором - редактирование строки списка. При выборе строки мне нужно после перезагрузки страницы с параметром нужного элемента списка попасть сразу на редактирование его - то есть на второй таб.
Не путайте с блоками, у меня по-простому - один блок табов.
В две строчки:
Пример: на jsFiddle
Подскажите как прикрутить таб бар к "вид новостей" на укозе.
А именно, как сделать так, чтобы при нажатии на "вкладка2" открывалась "вкладка2" у одной новости, а не у всех (новость1 новость2 новость3 и тд)
Обычно для не используемых табов используют сокрытие через метод jQuery hide(), который в свою очередь для элемента устанавливает свойство css display:none; либо из-за задания этого свойства в стилях к применяемому классу, из-за этого для всех скрытых элементов width=height=0, поэтому не работает javascript который использует эти значения, например различные скролы. Решение - скрытие табов не через hide(), а другими методами (z-index, opacity, offset и пр). Смотрите пример для табов из jQueryUI http://jqueryui.com/demos/tabs/ в самом низу в разделе "Why does..."
http://jsfiddle.net/1pu6q86f/