- Табы на JQuery и JavaScript
- Разберем Jquery код:
- Разберем JavaScript код:
- Итоговый код
- HTML
- CSS
- jQuery или
- JavaScript
- Tabs
- Examples
- Interactions
- Widgets
- Effects
- Utilities
- Books
- Табы/вкладки на jQuery
- Вкладки сверху контента
- Табы на всю ширину
- Вкладки слева контента
- Вкладки справа контента
- Табы снизу контента
- Вкладки на всю ширину
- Комментарии 1
- Другие публикации
Табы на JQuery и JavaScript
Сегодня разберем как делаются вкладки ( табы) на JQuery и JavaScript .
Можете посмотреть демо чтобы увидеть как будет выглядеть результат. В колонке JS сверху расположен код JQuery, ниже JavaScript.
В самом начале объясню схему, по которой мы будем делать табы:
- Добавим вкладкам и блокам с их содержимым классы с приставкой js- для обращения к ним из JavaScript.
- Добавим data атрибут data-tab для идентификации наших табов. Некоторые делают табы по индексу элемента в dom-дереве, я так делать не буду, это не гибкая конструкция.
- При клике на вкладку, удалим активный класс у всех вкладок, добавим той, по которой кликнули, удалим активный класс у всех блоков с содержимым и добавим тому, у которого значение атрибута data-tab такое же как у атрибута data-tab нашей вкладки.
Про приставку js.
Мы добавляем отдельный класс для манипуляций из js потому что, на один класс могут быть завязаны стили, которые в дальнейшем могут быть заменены. Приставка js даст вам или другому разработчику понять что этот элемент, в частности класс, участвует в интерактивности, на нем завязаны только события javascript. Таким образом этот класс всегда будет у элемента, не смотря на стили.
В нескольких проектах я это правило игнорировал и потом на исправление багов я тратил время.
Первым делом создадим разметку для наших табов.
Первой вкладке и её содержимому мы добавили класс active, чтобы по-умолчанию эти два элемента были активны. Остальные вкладки оставляем неактивными, а блоки с контентом скрываем.
.tabs < width: 100%; max-width: 500px; >/* Стили для списка вкладок */ .tab-header < list-style: none; padding-left: 0; display: flex; align-items: center; justify-content: flex-start; margin: 0; >/* Стили для вкладки */ .tab-header__item < padding: 10px 20px; margin-right: 5px; cursor: pointer; border: 1px solid #ddd; >/* Стили для активной вкладки */ .tab-header__item.active < color: red; border-bottom: none; position: relative; background-color: #fff; >/* Стиль для списка контейнеров с содержимым вкладок */ .tab-content < list-style: none; padding: 0; margin: 0; >/* Стили для контейнера с содержимым вкладки. По умолчанию скрыт. */ .tab-content__item < display: none; padding: 20px; border: 1px solid #ddd; margin-top: -1px; >/* Стили для активного контейнера вкладки */ .tab-content__item.active
Стилизовать — дело вкуса, если вы не против я стилизовал на свой вкус.
Здесь мы определили вид наших вкладок и контенеров с содержимым. Важным для понимания будут стили для вкладок, активной вкладки, контенеров, активного контейнера.
Тут все довольно просто. Активной вкладке добавляем изменение цвета, остальные остаются с серым цветом. Активный блок показываем, остальные скрываем.
Разберем Jquery код:
Итак, первое что нужно сделать, обработак клик по каждому элементу.
$('.js-tab-trigger').click(function() < // клик! >)
Теперь нам нужно получить идентификатор нашей вкладки и найти контент с таким же значением data-tab.
$('.js-tab-trigger').click(function() < var // 1 content = $('.js-tab-content[data-tab="'+ id +'"]'); // 2 >);
Отлично, теперь мы знаем и вкладку по которой мы кликнули и контейнер с содержимым этой вкладки. Теперь дело за малым, поработать с классами. Дополним наш предыдущий код.
$('.js-tab-trigger').click(function() < var content = $('.js-tab-content[data-tab="'+ id +'"]'); $('.js-tab-trigger.active').removeClass('active'); // 1 $(this).addClass('active'); // 2 $('.js-tab-content.active').removeClass('active'); // 3 content.addClass('active'); // 4 >);
- Удалили класс active у активной вкладки
- Добавили класс active вкладке по которой кликнули
- Удалили класс active у активного контейнера с содержимым
- Добавили класс active контейнеру который должен быть активным
Вот и все, код на JQuery занял у нас всего лишь 10 строк кода. Рассмотрим JavaSсript.
Код на JavaScript не сложнее чем jquery код. Когда я начинал знакомиться с JQuery, в одном из проектов она не хотела работать, там была сложная структура битрикс сайта и я потратил много времени чтобы заставить её работать. После безрезультатных попыток я психанул и написал табы на JavaScript, до этого я боялся его, но написав табы без JQuery удивился, это не так сложно как кажется.
Разберем JavaScript код:
Прежде чес обработать клик по вкладке, объявим несколько переменных для наших вкладок и контенеров с содержимым.
var jsTriggers = document.querySelectorAll('.js-tab-trigger'), jsContents = document.querySelectorAll('.js-tab-content');
Теперь можно обработать клик по вкладкам.
jsTriggers.forEach(function(trigger) < // 1 trigger.addEventListener('click', function() < // 2 // клик! >); >);
- Циклом перебираем элементы в массива. В массиве у нас лежат dom-элементы, то есть наши вкладки.
- Каждому элементу добавляем функцию-обработчик при событии клика.
Теперь в функции-обработчике объявим несколько переменных для удобной манипуляции. Все можно сделать и без переменных, но мы будем делать по-хорошему.
var // 1 content = document.querySelector('.js-tab-content[data-tab="'+id+'"]'), // 2 activeTrigger = document.querySelector('.js-tab-trigger.active'), // 3 activeContent = document.querySelector('.js-tab-content.active'); // 4
- Получаем идентификатор вкладки.
- Ищем контейнер с таким же значением атрибута data-tab.
- Ищем активную вкладку.
- Ищем активный контейнер.
В заключении поработаем с классами:
var jsTriggers = document.querySelectorAll('.js-tab-trigger'), jsContents = document.querySelectorAll('.js-tab-content'); jsTriggers.forEach(function(trigger) < trigger.addEventListener('click', function() < var content = document.querySelector('.js-tab-content[data-tab="'+id+'"]'), activeTrigger = document.querySelector('.js-tab-trigger.active'), activeContent = document.querySelector('.js-tab-content.active'); activeTrigger.classList.remove('active'); // 1 trigger.classList.add('active'); // 2 activeContent.classList.remove('active'); // 3 content.classList.add('active'); // 4 >); >);
- Удалили класс active у активной вкладки
- Добавили класс active вкладке по которой кликнули
- Удалили класс active у активного блока с содержимым
- Добавили класс active контейнеру который должен быть активным
Итоговый код
HTML
CSS
.tabs < width: 100%; max-width: 500px; >/* Стили для списка вкладок */ .tab-header < list-style: none; padding-left: 0; display: flex; align-items: center; justify-content: flex-start; margin: 0; >/* Стили для вкладки */ .tab-header__item < padding: 10px 20px; margin-right: 5px; cursor: pointer; border: 1px solid #ddd; >/* Стили для активной вкладки */ .tab-header__item.active < color: red; border-bottom: none; position: relative; background-color: #fff; >/* Стиль для списка контейнеров с содержимым вкладок */ .tab-content < list-style: none; padding: 0; margin: 0; >/* Стили для контейнера с содержимым вкладки. По умолчанию скрыт. */ .tab-content__item < display: none; padding: 20px; border: 1px solid #ddd; margin-top: -1px; >/* Стили для активного контейнера вкладки */ .tab-content__item.active
jQuery или
Не забудьте подключить библиотеку jQuery. Я подключаю через cdnjs — https://cdnjs.com/libraries/jquery
$('.js-tab-trigger').click(function() < var content = $('.js-tab-content[data-tab="'+ id +'"]'); $('.js-tab-trigger.active').removeClass('active'); $(this).addClass('active'); $('.js-tab-content.active').removeClass('active'); content.addClass('active'); >);
JavaScript
var jsTriggers = document.querySelectorAll('.js-tab-trigger'), jsContents = document.querySelectorAll('.js-tab-content'); jsTriggers.forEach(function(trigger) < trigger.addEventListener('click', function() < var content = document.querySelector('.js-tab-content[data-tab="'+id+'"]'), activeTrigger = document.querySelector('.js-tab-trigger.active'), activeContent = document.querySelector('.js-tab-content.active'); activeTrigger.classList.remove('active'); trigger.classList.add('active'); activeContent.classList.remove('active'); content.classList.add('active'); >); >);
Tabs
A single content area with multiple panels, each associated with a header in a list.
Examples
Click tabs to swap between content that is broken into logical sections.
html>
html lang="en">
head>
meta charset="utf-8">
meta name="viewport" content="width=device-width, initial-scale=1">
title>jQuery UI Tabs - Default functionality title>
link rel="stylesheet" href="//code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
link rel="stylesheet" href="/resources/demos/style.css">
script src="https://code.jquery.com/jquery-3.6.0.js"> script>
script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"> script>
script>
$( function( )
$( "#tabs" ).tabs();
> );
script>
head>
body>
div id="tabs">
ul>
li>a href="#tabs-1">Nunc tincidunt a> li>
li>a href="#tabs-2">Proin dolor a> li>
li>a href="#tabs-3">Aenean lacinia a> li>
ul>
div id="tabs-1">
p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus. p>
div>
div id="tabs-2">
p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus. p>
div>
div id="tabs-3">
p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus. p>
p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit. p>
div>
div>
body>
html>
Want to learn more about the tabs widget? Check out the API documentation.
Interactions
Widgets
Effects
Utilities
Books
Copyright 2023 OpenJS Foundation and jQuery contributors. All rights reserved. See jQuery License for more information. The OpenJS Foundation has registered trademarks and uses trademarks. For a list of trademarks of the OpenJS Foundation, please see our Trademark Policy and Trademark List. Trademarks and logos not indicated on the list of OpenJS Foundation trademarks are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them. OpenJS Foundation Terms of Use, Privacy, and Cookie Policies also apply. Web hosting by Digital Ocean | CDN by StackPath
Табы/вкладки на jQuery
Сделать табы на jQuery очень просто, сделаем HTML разметку и добавим к нему JS код:
Дополнительно скрипт поддерживает открытие табов кликом по якорным ссылкам. У ссылки должен быть class="tabs-target" и href="#ID_ТАБА" .
Открыть вкладку 1 Открыть вкладку 2 Открыть вкладку 3
Далее все решают CSS стили – каким будет вид и положение кнопок, вот некоторые примеры:
Вкладки сверху контента
#tabs < margin: 10px 0; >.tabs-nav < overflow: hidden; margin: 0; padding: 0; >.tabs-nav li < display: block; float: left; padding: 0; list-style: none; >.tabs-nav a < display: block; padding: 10px 20px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc; background: #fbfbfb; font-size: 16px; text-decoration: none; text-align: center; color: #999; >.tabs-nav li:first-child a < border-radius: 5px 0 0 0; >.tabs-nav li:last-child a < display: block; border-right: 1px solid #ccc; border-radius: 0 5px 0 0; >.tabs-nav a.active < border-bottom: 1px solid #fff; background: #fff; color: #000; >.tabs-items < border: 1px solid #ccc; border-radius: 0 5px 5px 5px; background: #fff; margin: -1px 0 0 0; >.tabs-item
Табы на всю ширину
#tabs < margin: 10px 0; >.tabs-nav < display: table; margin: 0; padding: 0; width: 100%; >.tabs-nav li < display: table-cell; float: none; margin: 0; padding: 0; >.tabs-nav a < display: block; padding: 10px 20px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc; background: #fbfbfb; font-size: 16px; text-decoration: none; text-align: center; color: #999; >.tabs-nav li:first-child a < border-radius: 5px 0 0 0; >.tabs-nav li:last-child a < display: block; border-right: 1px solid #ccc; border-radius: 0 5px 0 0; >.tabs-nav a.active < border-bottom: 1px solid #fff; background: #fff; color: #000; >.tabs-items < border: 1px solid #ccc; border-top: none; border-radius: 0 0 5px 5px; background: #fff; >.tabs-item
Вкладки слева контента
#tabs < margin: 10px 0; overflow: hidden; >.tabs-nav < width: 150px; float: left; overflow: hidden; margin: 0; padding: 0; position: relative; >.tabs-nav:after < content: ''; display: inline-block; width: 1px; height: 1px; background: #ccc; position: absolute; top: 0px; right: 0px; >.tabs-nav li < display: block; padding: 0; margin: 0; >.tabs-nav a < display: block; padding: 10px 20px; width: 100%; box-sizing: border-box; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-left: 1px solid #ccc; background: #fbfbfb; font-size: 16px; text-decoration: none; color: #999; >.tabs-nav li:first-child a < border-radius: 5px 0 0 0; >.tabs-nav li:last-child a < border-bottom: 1px solid #ccc; border-radius: 0 0 0 5px; >.tabs-nav a.active < border-right: 1px solid #fff; background: #fff; color: #000; >.tabs-items < margin-left: 149px; background: #fff; >.tabs-item
Вкладки справа контента
#tabs < margin: 10px 0; overflow: hidden; >.tabs-nav < width: 150px; float: right; overflow: hidden; margin: 0; padding: 0; position: relative; >.tabs-nav:after < content: ''; display: inline-block; width: 1px; height: 1px; background: #ccc; position: absolute; top: 0px; left: 0px; >.tabs-nav li < display: block; padding: 0; margin: 0; >.tabs-nav a < display: block; padding: 10px 20px; width: 100%; box-sizing: border-box; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-left: 1px solid #ccc; background: #fbfbfb; font-size: 16px; text-decoration: none; color: #999; >.tabs-nav li:first-child a < border-radius: 0 5px 0 0; >.tabs-nav li:last-child a < border-bottom: 1px solid #ccc; border-radius: 0 0 5px 0; >.tabs-nav a.active < border-left: 1px solid #fff; background: #fff; color: #000; >.tabs-items < margin-right: 149px; background: #fff; >.tabs-item
Табы снизу контента
Для того чтобы сделать табы снизу контента нужно изменить разметку:
#tabs < margin: 10px 0; >.tabs-nav < overflow: hidden; margin: 0; padding: 0; >.tabs-nav li < display: block; float: left; padding: 0; list-style: none; >.tabs-nav a < display: block; padding: 10px 20px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc; background: #fbfbfb; font-size: 16px; text-decoration: none; text-align: center; color: #999; >.tabs-nav li:first-child a < border-radius: 0 0 0 5px; >.tabs-nav li:last-child a < display: block; border-right: 1px solid #ccc; border-radius: 0 0 5px 0; >.tabs-nav a.active < border-top: 1px solid #fff; background: #fff; color: #000; >.tabs-items < border: 1px solid #ccc; border-radius: 5px 5px 5px 0; background: #fff; margin: 0 0 -1px 0; >.tabs-item
Вкладки на всю ширину
#tabs < margin: 10px 0; >.tabs-nav < display: table; margin: 0; padding: 0; width: 100%; >.tabs-nav li < display: table-cell; float: none; margin: 0; padding: 0; >.tabs-nav a < display: block; padding: 10px 20px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc; background: #fbfbfb; font-size: 16px; text-decoration: none; text-align: center; color: #999; >.tabs-nav li:first-child a < border-radius: 0 0 0 5px; >.tabs-nav li:last-child a < display: block; border-right: 1px solid #ccc; border-radius: 0 0 5px 0; >.tabs-nav a.active < border-top: 1px solid #fff; background: #fff; color: #000; >.tabs-items < border: 1px solid #ccc; border-bottom: none; border-radius: 5px 5px 0 0; background: #fff; >.tabs-item
Комментарии 1
Добрый день. Огромное спасибо за материал. Но возникла проблема: после выполнения ajax надо перекинуть пользователя на станицу в нужный таб, пробовал
window.location = '/lk/index.php#tab-2';
Авторизуйтесь, чтобы добавить комментарий.
Другие публикации
Fancybox 3 плагин галерей и модельных окон, в отличии от второй версии существенно изменилась скорость работы, дизайн и немного API, далее подробнее о вызове модальных окон.
В данной статье представлены два метода, как сохранить открытую вкладку в Bootstrap Tabs, поле перезагрузки страницы.