Javascript tabs with jquery

Табы на JQuery и JavaScript

Сегодня разберем как делаются вкладки ( табы) на JQuery и JavaScript .

Можете посмотреть демо чтобы увидеть как будет выглядеть результат. В колонке JS сверху расположен код JQuery, ниже JavaScript.

В самом начале объясню схему, по которой мы будем делать табы:

  1. Добавим вкладкам и блокам с их содержимым классы с приставкой js- для обращения к ним из JavaScript.
  2. Добавим data атрибут data-tab для идентификации наших табов. Некоторые делают табы по индексу элемента в dom-дереве, я так делать не буду, это не гибкая конструкция.
  3. При клике на вкладку, удалим активный класс у всех вкладок, добавим той, по которой кликнули, удалим активный класс у всех блоков с содержимым и добавим тому, у которого значение атрибута data-tab такое же как у атрибута data-tab нашей вкладки.

Про приставку js.
Мы добавляем отдельный класс для манипуляций из js потому что, на один класс могут быть завязаны стили, которые в дальнейшем могут быть заменены. Приставка js даст вам или другому разработчику понять что этот элемент, в частности класс, участвует в интерактивности, на нем завязаны только события javascript. Таким образом этот класс всегда будет у элемента, не смотря на стили.

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

Читайте также:  Просмотр массива $GLOBALS

Первым делом создадим разметку для наших табов.

Первой вкладке и её содержимому мы добавили класс 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 >);
  1. Удалили класс active у активной вкладки
  2. Добавили класс active вкладке по которой кликнули
  3. Удалили класс active у активного контейнера с содержимым
  4. Добавили класс 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 // клик! >); >);
  1. Циклом перебираем элементы в массива. В массиве у нас лежат dom-элементы, то есть наши вкладки.
  2. Каждому элементу добавляем функцию-обработчик при событии клика.

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

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
  1. Получаем идентификатор вкладки.
  2. Ищем контейнер с таким же значением атрибута data-tab.
  3. Ищем активную вкладку.
  4. Ищем активный контейнер.

В заключении поработаем с классами:

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 >); >);
  1. Удалили класс active у активной вкладки
  2. Добавили класс active вкладке по которой кликнули
  3. Удалили класс active у активного блока с содержимым
  4. Добавили класс 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

Fancybox 3 плагин галерей и модельных окон, в отличии от второй версии существенно изменилась скорость работы, дизайн и немного API, далее подробнее о вызове модальных окон.

Сохранить открытую вкладку в Bootstrap Tabs

В данной статье представлены два метода, как сохранить открытую вкладку в Bootstrap Tabs, поле перезагрузки страницы.

Источник

Оцените статью