/ Scripts & jquery / Табы

Табы

HIT

30.06.2015

2652

Табы (вкладки) один из часто применяемых элементов оформления на сайтах. Представляет собой механизм отделения блоков информации по смыслу и переключения между ними. Рассмотрим стандартное решение CSS + jQuery.

Верстка стандартных табов

Код в страницу

<div class="section2">
  <ul class="list_tabs2">
    <li class="act2">One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
  </ul>
  <div class="tab2 act" id="tab1">1</div>
  <div class="tab2" id="tab2">22</div>
  <div class="tab2" id="tab3">333</div>
  <div class="tab2" id="tab4">4444</div>
</div>

Скрипт стандартных табов

<script>
(function($) {  
$(function() {  
  
  $('ul.list_tabs2').on('click', 'li:not(.act2)', function() {  
    $(this).addClass('act2').siblings().removeClass('act2')  
    .parents('div.section2').find('div.tab2').eq($(this).index()).fadeIn(500).siblings('div.tab2').hide();  
  })  
  
})  
})(jQuery)  
</script>

CSS стандартных табов

/* CSS ТАБЫ (горизонтальные) */

.section2 {float: left; width: 100%; box-shadow: 2px 2px 6px rgba(17, 17, 17, 0.2);}

ul.list_tabs2 {float: left; width: 100% !important; margin: 0 !important;}

ul.list_tabs2 li {
    color: #fff;
    width: 20% !important;
    height: 30px;
    line-height: 30px;
    text-align: center;
    background-color: #04427E;
    float: left;
    list-style: none;
    cursor: pointer;
    box-sizing: border-box;
}

ul.list_tabs2 li:first-child {width: 20%;}  
 
ul.list_tabs2 li:last-child {width: 20%;}  
 
ul.list_tabs2 li:hover {background-color: rgb(55, 99, 213);}

ul.list_tabs2 li.act2 {
    background-color: #fff;
    color: #000;
    height: 40px;
    line-height: 40px;
    margin-top: -10px;
    box-shadow: none;
    font-family: "PlayBold";
    border: 1px solid #ccc;
    border-width: 1px 1px 0px 1px;
}

.tab2 {display:none;}

.tab2.act2 {display:block;}

.tab2 {
    background-color: #fff;
    padding: 5%;
    float: left;
    width: 100%;
    min-height: 300px;
    border: 1px solid #ccc;
    border-width: 0px 1px 1px 1px;
    box-sizing: border-box;
}

Пример реализации табов ниже под данной статьей (Комментарии, Вложения).

Последний вариант табов

Верстка

<div class="section">
	<ul class="list_tabs">
		<li class="act">One</li>
		<li>Two</li>
		<li>Three</li>
	</ul>
	
	<div class="tab act" id="tab1">1</div>
	<div class="tab" id="tab2">22</div>
	<div class="tab" id="tab3">333</div>
</div>

Стили

.tab-section {width: 100%;}

ul.list_tabs {display: flex;}

ul.list_tabs li {
    color: #fff;
    width: 100%;
    padding: 7px 15px;
    text-align: center;
    background: #50aaff;
    list-style: none;
    cursor: pointer;
    margin: 0 !important;
}

ul.list_tabs li:hover, ul.list_tabs li.act {background: #1681e6;}

.tab {padding: 15px 0; width: 100%; min-height: 600px; display: none;}

.tab.act {display: block;}

@media screen and (max-device-width: 480px) { ul.list_tabs li {width: 100%;} }

Скрипт

jQuery(document).ready(function() {
	jQuery(function() {
		jQuery('ul.list_tabs').on('click', 'li:not(.act)', function() {  
			jQuery(this).addClass('act').siblings().removeClass('act')  
			.parents('div.section').find('div.tab').eq(jQuery(this).index()).fadeIn(500).siblings('div.tab').hide();  
		})
	})   
});

Табы с содержимым slick

При помещении галереи slick внутрь табов есть один недочет. т.к. неактивный таб становится display:none, а slick перезагружается при очередной инициации, то при появлении таба с галереей верстка в нем нарушается на несколько секунд (до перерасчета). Сделаем перезагрузку принудительной, при переключении табов. Для этого в последний вариант скрипта добавляем строку:

jQuery(document).ready(function() { 
	jQuery(function() {
		jQuery('ul.list_tabs').on('click', 'li:not(.act)', function() {  
			setTimeout(function () {  jQuery('.multiple-items').slick('setPosition');  }, 50);
			jQuery(this).addClass('act').siblings().removeClass('act')  
			.parents('div.section').find('div.tab').eq(jQuery(this).index()).fadeIn(500).siblings('div.tab').hide();  
		})
	})   
});

.multiple-items — идентификатор галереи slick.

Также привожу стили галереи slick внутри табов для товаров WC

.carousel {margin-left: -15px; margin-right: -15px;}

.carousel .multiple-items {display: flex !important; flex-wrap: wrap; margin-bottom: 25px;}

.carousel .multiple-items img {-moz-backface-visibility: visible; -webkit-backface-visibility: visible; backface-visibility: visible;}

.carousel .slick-list {min-width: 100% !important; padding-top: 15px;}

.carousel .slick-track {display: flex !important; padding-bottom: .1rem;}

.carousel .product {
    width: 25%;
    margin-bottom: 30px;
    padding-left: 15px;
    padding-right: 15px;
    float: left;
    list-style: none;
    text-align: center;
 display: flex !important;
 height: auto; 
}

.carousel .multiple-items > .product {width: 25%;}

.carousel .product > span {
 width: 100%;
    background: #fff;
    /*padding: 20px;*/
 padding-bottom: 20px;
    text-align: center;
    position: relative;
    box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.1);
 transition: all 0.3s ease;
    -o-transition: all 0.3s;
    -webkit-transition: all 0.3s ease 0s; 
}

.carousel .product > span:hover {box-shadow: 1px 1px 16px rgba(0, 0, 0, 0.3); margin-top: -7px; margin-bottom: 7px;}

.carousel .product #short-description {display: none;}

.carousel .product > span img {width: 100%; margin-bottom: 10px;}

Slide эффект при переключении меню табов

Создадим эффект плавного перемещения подчеркивания у меню табов

Верстка:

<div class="radio_wrap">
  <div>tab1</div>
  <div>tab2</div>
  <div>tab3</div>
  <div>tab4</div>
</div>

Стили:

.radio_wrap {position: relative; --i: 0; display: flex;}

.radio_wrap:before {
    content: "";
    position: absolute;
    width: 100%;
    bottom: 0;
    left: 0;
    height: 2px;
    background: #eee;
    transition: .3s ease-in-out;
}

.radio_wrap:after {
    content: "";
    position: absolute;
    width: 25%;
    bottom: 0;
    left: calc( var(--i) * 25%);
    height: 2px;
    background: #8BC34A;
    transition: .3s ease-in-out;
}

.radio_wrap > div {width: 25%; text-align: center; padding: 20px; cursor: pointer;}

При необходимости можно сделать не в виде подчеркивания, а виде полной заливки. Класс .radio_wrap:before не обязателен.

Скрипт:

jQuery(document).ready(function() {
	$('.radio_wrap > div').click(function() {
		$('.radio_wrap').attr('style','--i:'+$(this).index());
	})
});

Метод работает при условии 4 табов. Сделаем его динамическим. Скроем стили у ul.list_tabs:after:

width: 25%;
left: calc( var(--i) * 25%);

Добавим скрипт. Влиять через функцию .css мы не можем, т.к. DOM не видит элементы :after. поэтому будем добавлять стили в подвал:

if($("ul").is(".list_tabs")) {
	$('ul.list_tabs > li').click(function() {
		$('ul.list_tabs').attr('style','--i:'+$(this).index());
	})
		
	var Numlist = $("ul.list_tabs").children('li').length;
	var Numlistpro = (100 / Numlist).toFixed(2);
	var Numlistprocss = '<style>ul.list_tabs:after {width:' + Numlistpro + '%; left: calc( var(--i) * ' + Numlistpro + '%);}</style>';
	$("footer").append(Numlistprocss);
}

Табы с отдельным блоком управления

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

<ul class="tab-menu">
	<li id="tab-description" class="active">Описание</li>
	<li id="tab-plan" >План</li>
	<li id="tab-price" >Прайс</li>
	<li id="tab-place" >Место</li>
	<li id="tab-gallery" >Галерея</li>		
</ul>

<div class="tab-content">
	<div class="tab-description active">Описание</div>
	<div class="tab-plan">План</div>
	<div class="tab-price">Прайс</div>
	<div class="tab-place">Место</div>
	<div class="tab-gallery">Галерея</div>	
</div>

Скрипт по переключению:

jQuery(document).ready(function($) {   
	$('.tab-menu li').on('click', function(){
		var identy = $(this).attr('id');
		$('.tab-content > *, .tab-menu li').removeClass('active');
		$('.tab-content > *.' + identy).addClass('active');
		$(this).addClass('active');
	});
});

Стили:

.tab-content > * {display: none;}
.tab-content > *.active {display: block;}
[site-socialshare]
  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

Табы Табы Табы
ACF PRO
Рекомендации для васACF PROOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.