Обложка к записи Верстка табов с помощью

Верстка табов с помощью

Когда-то возникла необходимость сделать табы на странице. Это довольно типовая задача, поэтому, чтобы не изобретать велосипед, полез в Гугл посмотреть, как народ делает.

Все реализация, которые я увидел, выглядели довольно стандартно, примерно так:

<div class="tabs">
	<ul class="nav">
		<li>Tab 1</li>
		<li>Tab 2</li>
		<li>Tab 3</li>
		<li>Tab 4</li>
		<li>Tab 5</li>
	</ul>

	<ul class="content">
		<li>Tab content 1</li>
		<li>Tab content 2</li>
		<li>Tab content 3</li>
		<li>Tab content 4</li>
		<li>Tab content 5</li>
	</ul>
</div>

То есть два независимых списка, в одном заголовки, во втором — содержимое.

Лично меня такая структура не устраивает, главным образом из-за того, что отсутствует семантическая связь между заголовком и содержимым. Хоть я и не страдаю наркозависимостью верстать все «валидно и семантично» ради респекта и уважухи гиков, тут отсутствие четкой связи было все-таки недостатком.

Во-первых, данные из бэкэкнда придется выводить в два цикла (сначала заголовки, а потом контент), а не одним. Это хоть немного, но увеличивает объем кода и явно не добавляет производительности.

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

Решил попробовать избавиться от этих проблем, а заодно размять мозги ? При выборе структуры элементов первым делом выбор пал на -список, который как нельзя лучше подходит для этой задачи. Думаю, не я первый решил попробовать сделать табы с помощью этого списка.

Вот что у меня получилось.

See the Pen Верстка табов с помощью by mihdan (@mihdan) on CodePen.0

Чтобы приведенный пример не стал очередным источником бездумного копи-пэйста, давайте рассмотрим, за счет чего это работает.

Предположим, у нас есть набор элементов, которым указан float: left:

float: left

А что будет, если одному из элементов этой последовательности указать float: right?

float: right

Уже неплохо: элементы, следующие за , встали ровно за предыдущими. Но нам нужно, чтобы содержимое таба растягивалось на всю ширину, поэтому прописываем этому элементу width: 100%:

width: 100%

Как и ожидалось, элемент разорвал поток. Размышляем так: если элемент прижат к правому краю контейнера, значит при изменении ширины будет изменяться левый край элемента (то есть растет справа налево). Значит, нам нужно подавить влияние левого края элемента. Сделать это можно с помощью margin-left: -100%:

margin-left: -100%

Осталось сместить элемент вниз, сделать это можно с помощью margin-top:

margin-top

Вот и все. По умолчанию все -элементы скрываем с помощью display: none, выбранному элементу говорим display: block. Скрипт переключения табов на jQuery выглядит совсем уж просто:

jQuery( function( $ ) {
	$( 'dl.tabs dt' ).click( function() {
		$( this )
			.siblings()
			.removeClass( 'selected' )
			.end()
			.next( 'dd' )
			.andSelf()
			.addClass( 'selected' );
	} );
} );

Способ получился не супергибким (есть привязка к точному размеру закладки таба), однако позволяет решать большинство подобных задач.

Ссылки

CSS HTML Tabs

Источник: https://www.kobzarev.com/makeup/dl-tabs/