ВЫВОД СОДЕРЖИМОГО В ВИДЕ ЗАКЛАДОК ИЛИ ТАБОВ ОЧЕНЬ РАСПРОСТРАНЕННЫЙ И ЗНАКОМЫЙ ВСЕМ ЭЛЕМЕНТ В ВЕБ-ДИЗАЙНЕ, А ЧАСТО ОКАЗЫВАЕТСЯ И ОЧЕНЬ ПОЛЕЗНЫМ.

https://i.imgur.com/LLsysUP.jpg
Итак, на этом уроке мы собираемся реализовать несколько простых закладок с контентом (табов) используя радио-кнопки вместе с псевдо-классом :checked и родственными комбинаторами (sibling combinators).

HTML-разметка
Мы будем использовать элементы input для связывания всех вкладок с классом content. Для каждого элемента input у нас будет элемент label (ярлык или этикетка). Все элементы label будут стилизованы как закладки.

Код:
<section class="tabs">
 <input id="tab-1" type="radio" name="radio-set" class="tab-selector-1" checked="checked" />
 <label for="tab-1" class="tab-label-1">About us</label>
 
 <input id="tab-2" type="radio" name="radio-set" class="tab-selector-2" />
 <label for="tab-2" class="tab-label-2">How we work</label>
 
 <input id="tab-3" type="radio" name="radio-set" class="tab-selector-3" />
 <label for="tab-3" class="tab-label-3">References</label>
 
 <input id="tab-4" type="radio" name="radio-set" class="tab-selector-4" />
 <label for="tab-4" class="tab-label-4">Contact us</label>
 
 <div class="clear-shadow"></div>
 
 <div class="content">
 <div class="content-1">
 <p>Some content</p>
 </div>
 <div class="content-2">
 <p>Some content</p>
 </div>
 <div class="content-3">
 <p>Some content</p>
 </div>
 <div class="content-4">
 <p>Some content</p>
 </div>
 </div>
</section>

Мы всегда можем изменить закладку открытую по умолчанию, добавив атрибут checked.

CSS
Первое, что нужно сделать, это определить некоторые размеры и спрятать радио-кнопки, установив для них прозрачность равную 0:

Код:
 .tabs {
 position: relative;
 margin: 40px auto;
 width: 750px;
}
 
.tabs input {
 position: absolute;
 z-index: 1000;
 width: 120px;
 height: 40px;
 left: 0px;
 top: 0px;
 opacity: 0;
 cursor: pointer;
}
.tabs input#tab-2{
 left: 120px;
}
.tabs input#tab-3{
 left: 240px;
}
.tabs input#tab-4{
 left: 360px;
}  

Радио-кнопки будут скрыты ярлыками. Это будет вроде того, как если бы мы нажимали на ярлык, а на самом деле мы кликали по кнопке. Этот трюк также будет работать в мобильных браузерах.

Далее, мы сделаем ярлыки похожими на закладки, определив ряд стилей для них. Обратите внимание, что каждый из ярлыков имеет свой z-index. Свойство box-shadow добавит глубины и реализма закладкам.

Код:
 .tabs label {
 background: linear-gradient(top, #5ba4a4 0%,#4e8c8a 100%);
 font-size: 15px;
 line-height: 40px;
 height: 40px;
 position: relative;
 padding: 0 20px;
 float: left;
 display: block;
 width: 80px;
 color: #385c5b;
 letter-spacing: 1px;
 text-transform: uppercase;
 font-weight: bold;
 text-align: center;
 text-shadow: 1px 1px 1px rgba(255,255,255,0.3);
 border-radius: 3px 3px 0 0;
 box-shadow: 2px 0 2px rgba(0,0,0,0.1), -2px 0 2px rgba(0,0,0,0.1);
}
 
.tabs input:hover + label {
 background: #5ba4a4;
}
 
.tabs label:first-of-type {
 z-index: 4;
 box-shadow: 2px 0 2px rgba(0,0,0,0.1);
}
 
.tab-label-2 {
 z-index: 3;
}
 
.tab-label-3 {
 z-index: 2;
}
 
.tab-label-4 {
 z-index: 1;
}  

Так как мы не хотим, чтобы нижняя часть box-shadow была видна, мы скроем её с помощью псевдо-элемента :after :

Код:
 .tabs label:after {
 content: '';
 background: #fff;
 position: absolute;
 bottom: -2px;
 left: 0;
 width: 100%;
 height: 2px;
 display: block;
}  

Когда мы нажимаем на закладку (ярлык), она будет отличаться по стилю и цвету от других. Нужно убедиться, что "отмеченный" ярлык будет поверх всех остальных слоев во вкладках. Для этого мы зададим ему высокое значение z-index:

Код:
 .tabs input:checked + label {
 background: #fff;
 z-index: 6;
}  

Как уже упоминалось выше, блок с классом content будет содержать все страницы, и мы установим для него z-index равный 5, просто чтобы быть под выбранным ярлыком. Таким образом, box-shadow области с содержимым будет накрывать неактивные вкладки.

Внутри области с содержимым, имеются четыре блока и каждый из них имеет свое собственное содержание. По умолчанию (пока ярлык не выбран/нажат), мы хотим, чтобы они были скрыты. Таким образом, мы устанавливаем прозрачность равную нулю, а z-index равный 1. Мы не можем использовать свойство display: none, потому что оно не поддерживает переходы (transitions).

Код:
 .content {
 background: #fff;
 position: relative;
 width: 100%;
 height: 370px;
 z-index: 5;
 box-shadow: 0 -2px 3px -2px rgba(0,0,0,0.2), 0 2px 2px rgba(0,0,0,0.1);
 border-radius: 0 3px 3px 3px;
}
 
.content div {
 position: absolute;
 top: 0;
 left: 0;
 padding: 10px 40px;
 z-index: 1;
 opacity: 0;
 transition: all linear 0.1s;
}
 
.content div h2,
.content div h3{
 color: #398080;
}
.content div p {
 font-size: 14px;
 line-height: 22px;
 font-style: italic;
 text-align: left;
 margin: 0;
 color: #777;
 padding-left: 15px;
 font-family: Cambria, Georgia, serif;
 border-left: 8px solid rgba(63,148,148, 0.1);
}  

Когда мы хотим чтобы содержание появилось (кликаем мышкой по закладке) мы устанавливаем прозрачность равную 1 и повышаем z-index, потому что мы хотим, чтобы эта часть содержания была выше всех остальных:

Код:
 .tabs input.tab-selector-1:checked ~ .content .content-1,
.tabs input.tab-selector-2:checked ~ .content .content-2,
.tabs input.tab-selector-3:checked ~ .content .content-3,
.tabs input.tab-selector-4:checked ~ .content .content-4 {
 z-index: 100;
 opacity: 1;
 transition: all ease-out 0.2s 0.1s;
}

Скачать исходники:

Всё бы тут хорошо, но размер то фиксированный, а если указать 100% то вылазиет за границу! А всё из за position: absolute; если поставить position: relative; то не корректно отображается текст! А так скрипт супер.

Подпись автора

вопрос по ◆ВТ◆ в личку

вопрос по ◆ВТ◆ в тему