Dobrovoi Master
сделано с душой
В состоянии постоянного подключения...

Отзывчивые вкладки (табы) с переходом в аккордеон jQuery & CSS3

В своих статьях, я не раз обращался к теме создания вкладок(табов), работающих с использованием библиотеки javascript jQuery, а так же рассказывал и показывал примеры реализации вкладок исключительно средствами CSS.
(), довольно популярный компонент в среде разработчиков веб-сайтов, этот элемент включён в состав практически всех известных фреймворков, чаще всего они однотипные и по дизайну, и по функциональным возможностям.

Требования адаптивного дизайна диктуют свои правила, по-этому разработчики стараются все элементы интерфейса и модульные компоненты веб-сайтов, различными способами подогнать под эти требования, и конечно же вкладки(табы) не исключение
.
В одной из своих статей рассказывал об одном интересном решении создания адаптивных вкладок на CSS, без подключения javscript. Концепция заключалась в том, что при уменьшении размеров окна просмотра, текстовые заголовки вкладок исчезали, подменяясь информативными иконками, явно указывающими на содержание вкладок. Благодаря чему блок вкладок становился более компактным.

Существуют и другие способы создания адаптивных табов, например, когда при уменьшении экрана просмотра до определённых размеров, вкладки (табы) плавно перестраиваются в режим «аккордеона».
Вот именно такой способ адаптирования вкладок, мы с вами и рассмотрим в этой статье. Сформируем каркас, стили вкладок и аккордеона, подключим в работу последнюю версию библиотеки , и с помощью небольшого js добавим движухи нашим вкладкам, и аккордеону соответственно.
 
Отзывчивые Вкладки (табы)
 
Для начала, так сказать для общего понимания того что мы хотим получить в итоге, пожалуй стоит взглянуть на приготовленное демо, а уж затем разгребём весь фарш исходников.

И так, пример надеюсь посмотрели, с теми кому оно надо, рассмотрим, как всё это дело воспроизвести на практике и начнём с основы, а именно с построения html-каркаса вкладок.
 

HTML

Прежде всего, создадим базовый div-контейнер с определённым классом, например <div class="tabs-box"> и выставим значение ширины width: 100%;, в этом случае блок вкладок замечательно впишется в любой другой родительский контейнер(основной блок контента, боковые колонки и т.д.).
В этом базовом контейнере размещаем разметку наших вкладок, переключатели которых это ничто иное, как стандартный неупорядоченный список <ul>, а далее прописываем внутренние блоки <div> с определённым содержанием и элементами аккордеона(панели заголовков), которые будут скрыты в режиме вкладок.
Посмотрите пример html-кода вкладок(как есть), думаю концепция данного решения, вам станет сразу понятна:

<!-- Базовый контейнер вкладок(табов) -->
<div class="tabs-box">
   <!-- Список вкладок -->
    <ul class="tabs">
        <li class="active" rel="tab1">Вкладка 1</li>
        <li rel="tab2">Вкладка 2</li>
        <li rel="tab3">Вкладка 3</li>
        <li rel="tab4" class="tab_last">Вкладка 4</li>
    </ul>
    <!-- Контейнер для блоков с содержанием -->
    <div class="tab_container">
       <!-- Панель заголовка в режиме аккордеона -->
        <h3 class="d_active tab_accordion" rel="tab1">Вкладка 1</h3>
        <!-- Блок вкладки с содержанием -->
        <div id="tab1" class="tab_content" style="display: block;">
            <h2>Содержимое Вкладки 1</h2>
            <p>Далеко-далеко за словесными горами в стране гласных и согласных живут рыбные тексты. Вдали от всех живут они в буквенных домах на берегу Семантика большого языкового океана.
            <p>Маленький ручеек Даль журчит по всей стране и обеспечивает ее всеми необходимыми правилами.</p>
        </div>
        <!-- конец #tab1 -->
        <h3 class="tab_accordion" rel="tab2">Вкладка 2</h3>
        <div id="tab2" class="tab_content" style="display: none;">
            <h2>Содержимое Вкладки 2</h2>
            <p><img src="http://lorempixel.com/250/200" class="img-left">
            <p>Я совсем один и блаженствую в здешнем краю, словно созданном для таких, как я. Я так счастлив, мой друг, так упоен ощущением покоя, что искусство мое страдает от этого.
            <p>Душа моя озарена неземной радостью, как эти чудесные весенние утра, которыми я наслаждаюсь от всего сердца.</p>
        </div>
        <!-- конец #tab2 -->
        <h3 class="tab_accordion" rel="tab3">Вкладка 3</h3>
        <div id="tab3" class="tab_content" style="display: none;">
            <h2>Содержимое Вкладки 3</h2>
            <p><img src="http://lorempixel.com/250/200" class="img-right">
            <p>Проснувшись однажды утром после беспокойного сна, Грегор Замза обнаружил, что он у себя в постели превратился в страшное насекомое.
             <p>Лежа на панцирнотвердой спине, он видел, стоило ему приподнять голову, свой коричневый, выпуклый, разделенный дугообразными чешуйками живот, на верхушке которого еле держалось готовое вот-вот окончательно сползти одеяло</p>
        </div>
        <!-- конец #tab3 -->
        <h3 class="tab_accordion" rel="tab4">Вкладка 4</h3>
        <div id="tab4" class="tab_content" style="display: none;">
            <h2>Содержимое Вкладки 4</h2>
            <div class="video-responsive">
                <iframe width="1280" height="720" src="https://www.youtube.com/embed/mRrE8CFkkAg" frameborder="0" allowfullscreen></iframe>
            </div>
        </div>
        <!-- конец #tab4 -->
    </div>
    <!-- конец .tab_container -->
</div>
<!-- конец .tabs-box -->

Как видите в примере я сразу продемонстрировал некоторые функциональные возможности вкладок при использовании в них, помимо текстового содержания и других элементов, в частности это миниатюры и полноразмерные изображения, а так же отзывчивый блок встраиваемого через iframe, object или embed видео.

При переходе в состояние аккордеона переключатели вкладок чудесным образом превращаются в панели с заголовком, для этого использовал тег <h3> с определённым классом и атрибутом rel, с помощью которого, как и в случае с вкладками, мы привяжем панели заголовков аккордеона с конкретными блоками с содержанием.

<h3 class="d_active tab_accordion" rel="tab1">Вкладка 1</h3>

Посмотрите, значение атрибута rel="tab1" точно соответствует идентификатору id="tab1" первого блока вкладок(аккордеона) с содержанием

<div id="tab1" class="tab_content" style="display: block;">

С помощью style="display: block;" мы явно указываем, что при загрузке будет показано содержание первой вкладки.

Это всё что касается html-разметки вкладок, с другими встроенными элементами( изображения, миниатюры, видео…) думаю разберётесь, короткие комментарии в css и html в этом вам помогут.

CSS

C html-разметкой мы более-менее разобрались, теперь необходимо сформировать общие стили и оформить внешний вид вкладок, и аккордеона с помощью «магии» CSS.
Расписывать каждый отдельный элемент я не буду, конкретно остановлюсь лишь на определениях стадии перехода вкладок в режим аккордеона с помощью медиа-запросов. Ну, а весь фарш кода CSS в конечном его виде, будет выглядеть примерно так:

/* Вкладки (табы)
-----------------------------------------------------*/
 
 
/* бфзовый контейнер вкладок(табов) */
 
.tabs-box {
    display: inline-block;
    position: relative;
    padding: 0;
    margin: 0;
    width: 100%;
}
 
 
/* панель вкладок */
 
ul.tabs {
    margin: 0;
    padding: 0;
    float: left;
    list-style: none;
    height: 42px;
    border-bottom: 1px solid #00655c;
    width: 100%;
}
 
ul.tabs li {
    float: left;
    margin: 0;
    cursor: pointer;
    padding: 0 21px;
    height: 42px;
    line-height: 42px;
    border-top: 1px solid #00655c;
    border-left: 1px solid #00655c;
    border-right: 1px solid #00b7a6;
    background-color: #009688;
    color: #ddd;
    overflow: hidden;
    position: relative;
    font-size: 16px
}
 
 
/* указываем стиль правой рамки у последней вкладки */
 
.tab_last {
    border-right: 1px solid #00655c;
}
 
 
/* стили вкладок при наведении */
 
ul.tabs li:hover {
    background-color: #26A69A;
    color: #fefefe;
}
 
 
/* стили активных вкладок */
 
ul.tabs li.active {
    background-color: #fff;
    color: #333;
    border-top: 2px solid green;
    display: block;
}
 
 
/* контейнер вкладок первого уровня 
 * включающий в себя панели заголовков аккордеона
*/
 
.tab_container {
    border: 1px solid #00655c;
    border-top: none;
    clear: both;
    float: left;
    width: 100%;
    background: #fff;
    overflow: auto;
}
 
 
/* блоки с содержанием по-умолчанию скрыты 
 * указать раскрытым при загрузке нужный блок
 * с помощью style="display: block;" в html
*/
 
.tab_content {
    padding: 20px;
    display: none;
}
 
 
/* параграф внутри блоков с содержанием */
 
.tab_content p {
    margin-bottom: 10px
}
 
 
/**
 * Изображения внутри вкладок
 * ...сделаем их отзывчивыми
 */
 
.tab_content img {
    width: 100%;
    height: auto;
    -moz-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
    -webkit-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
    box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
 
 
/* полноразмерная картинка */
 
.tab_content img .large-img {
    width: 100%;
    margin-bottom: 10px;
}
 
 
/* миниатюра слева */
 
.tab_content img.img-left {
    width: 25%;
    float: left;
    margin: 5px 15px 15px 0;
}
 
 
/* миниатюра справа */
 
.tab_content img.img-right {
    width: 25%;
    float: right;
    margin: 5px 0 15px 15px;
}
 
 
/* Встраиваемое видео */
 
.video-responsive {
    margin: 20px;
    position: relative;
    padding-bottom: 56.25%;
    height: 0;
    overflow: hidden;
    -moz-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
    -webkit-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
    box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
 
 
/* Предусмотри использование кода встраиваемого видео
 *через iframe, object или embed */
 
.video-responsive iframe,
.video-responsive object,
.video-responsive embed {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}
 
 
/* аккордеон скрыт в режиме вкладок */
 
.tab_accordion {
    display: none;
}
 
 
/* Переход вкладок в режим аккордеона 
 * при достижении размера окна просмотра 480px 
*/
 
@media screen and (max-width: 480px) {
    /* скрываем вкладки */
    .tabs {
        display: none;
    }
    /* показываем элементы аккордеона */
    .tab_accordion {
        position: relative;
        background-color: #26A69A;
        font-weight: 400;
        font-size: 16px;
        color: #ddd;
        border-top: 1px solid #ccc;
        margin: 0;
        padding: 14px 20px;
        display: block;
        cursor: pointer;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        -khtml-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }
    /* панели аккордеона при наведении */
    .tab_accordion:hover {
        background-color: #009688;
    }
    /* переключатель вкладок, положение вниз */
    .tab_accordion:before {
        content: '';
        height: 8px;
        width: 8px;
        display: block;
        border: 2px solid #fefefe;
        border-right-width: 0;
        border-top-width: 0;
        -ms-transform: rotate(-45deg);
        -webkit-transform: rotate(-45deg);
        transform: rotate(-45deg);
        position: absolute;
        right: 20px;
        top: 18px
    }
    /* состояние активных панелей */
    .d_active {
        background-color: #008477;
        color: #fff;
    }
    /* активный переключатель, положение вверх */
    .d_active.tab_accordion:before {
        border: 2px solid #fefefe;
        border-left-width: 0;
        border-bottom-width: 0;
        top: 18px
    }
}

Определённый шрифт к данным вкладкам я не привязывал, так как на разных сайтах и шрифты используются разные, так что при использовании вкладок в ваших проектах, будет применён базовый шрифт вашего сайта.
На демонстрационной странице использовал шрифт из семейства Roboto, подключив напрямую с Google Fonts.

Для перехода вкладок в состояние аккордеона, при просмотре на экранах меньших размеров, использовал один медиа-запрос с максимально возможным значением ширины при котором скрыт и вкладки показаны в своём обычном состоянии, а при достижении размера окна просмотра менее указанного значения, вкладки переходят в режим аккордеона:

@media screen and (max-width: 480px) {
    /* скрываем вкладки */
    .tabs {
        display: none;
    }
    /* показываем элементы аккордеона */
    .tab_accordion {
        position: relative;
        background-color: #26A69A;
        font-weight: 400;
        font-size: 16px;
        color: #ddd;
        border-top: 1px solid #ccc;
        margin: 0;
        padding: 14px 20px;
        display: block;
        cursor: pointer;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        -khtml-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }
    /* панели аккордеона при наведении */
    .tab_accordion:hover {
        background-color: #009688;
    }
    /* переключатель вкладок, положение вниз */
    .tab_accordion:before {
        content: '';
        height: 8px;
        width: 8px;
        display: block;
        border: 2px solid #fefefe;
        border-right-width: 0;
        border-top-width: 0;
        -ms-transform: rotate(-45deg);
        -webkit-transform: rotate(-45deg);
        transform: rotate(-45deg);
        position: absolute;
        right: 20px;
        top: 18px
    }
    /* состояние активных панелей */
    .d_active {
        background-color: #008477;
        color: #fff;
    }
    /* активный переключатель, положение вверх */
    .d_active.tab_accordion:before {
        border: 2px solid #fefefe;
        border-left-width: 0;
        border-bottom-width: 0;
        top: 18px
    }
}

Соответственно в max-width: 480px ничего не мешает прописать любое другое, нужное вам значение, экспериментируйте, главное чтобы результат выглядел корректно и логично.
Так же можете использовать большее количество медиа-запросов под различные типы пользовательских устройств, что позволит более гибко настроить переходы вкладок в состояние аккордеона и обратно.

jQuery

В настоящее время, учитывая возможности современных браузеров с поддержкой новых свойств , такой вид отзывчивых вкладок с переходом в аккордеон, можно реализовать воспользовавшись исключительно средствами CSS, об этом обязательно расскажу одной из следующих статей.
Что же касается данных вкладок, то для полноценной работы нам понадобится популярная библиотека javascript jQuery, в конкретном случае, используем последнюю версию из ветки 2.x подключив напрямую с CDN Google. Если у вас jQuery ещё не используется, чтобы подключить её достаточно внизу страницы, перед закрывающим тегом </dody> прописать следующее:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

Теперь, для того чтобы наши вкладки заработали, непосредственно на странице html, всё там же, в районе тега </body>, необходимо прописать небольшой исполняемый javascript, при помощи которого запустим переключение и раскрытие блоков с содержанием, как в режиме вкладок, так и в режиме аккордеона.

<script>
    // вкладки с содержанием
    // 
    $(".tab_content").hide();
    $(".tab_content:first").show();
    /* в режиме вкладок */
    $("ul.tabs li").click(function () {
        $(".tab_content").hide();
        var activeTab = $(this).attr("rel");
        $("#" + activeTab).fadeIn();
        $("ul.tabs li").removeClass("active");
        $(this).addClass("active");
        $(".tab_accordion").removeClass("d_active");
        $(".tab_accordion[rel^='" + activeTab + "']").addClass("d_active");
    });
    /* в режиме аккордеона */
    $(".tab_accordion").click(function () {
        $(".tab_content").hide();
        var d_activeTab = $(this).attr("rel");
        $("#" + d_activeTab).fadeIn();
        $(".tab_accordion").removeClass("d_active");
        $(this).addClass("d_active");
        $("ul.tabs li").removeClass("active");
        $("ul.tabs li[rel^='" + d_activeTab + "']").addClass("active");
    });
    /* дополнительный класс tab_last, 
    чтобы добавить границу к правой 
    стороне последней вкладки. */
    $('ul.tabs li').last().addClass("tab_last");
</script>

Если ничего не пропустил, то на этом пожалуй и всё. Отзывчивые «до жути» и вполне себе автономные вкладки с переходом в «аккордеон», полностью готовы к работе.
Остаётся лишь ещё раз внимательно посмотреть живой пример работы вкладок и при необходимости скачать исходники, которые я бережно упаковал в архив и выложил для свободного скачивания в облако своего Яндекс.Диска:

С Уважением, Андрей .

Буду всем признателен, если поддержите проект — добавив блог в исключения AdBlock и поделитесь ссылкой на запись в своих соц-сетях:

Всего комментариев: 8

  • Виктория: 17 мая, 2017 в 08:25

    Ой, как здорово. Спасибо за информацию и подробное и понятное разъяснения.

    Ответить
  • Сергей: 17 мая, 2017 в 16:51

    Андрей, спасибо за очередной труд.
    Всегда, одним из первых смотрю твои, качественно сделанные, работы.

    Ответить
    • driver: 17 мая, 2017 в 20:49

      Спасибо за отзыв )))

      Ответить
  • D4FNA: 15 сентября, 2017 в 12:02

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

    Ответить
  • Иван: 17 октября, 2017 в 12:19

    Добрый день! Очень помогли ваши табы, как раз понадобились с сверткой в аккардеон. Но есть один вопрос а как сделать что бы при клике на эту же вкладку(в режиме аккардеон) которая уже открыта она сворачивалась?

    Ответить
  • Серж: 5 февраля, 2018 в 22:46

    Доброго времени суток. Подскажите пожалуйста, как сделать, чтобы сразу после загрузки страницы по умолчанию была активна вкладка (второй пример)?

    Ответить
  • Олег: 19 октября, 2018 в 13:36

    Андрей! Подскажите пожалуйста — табы работают только в ХРОМЕ. Делаю в Дримвивере, в интерактиве работают, в хроме работают, а в Файрфоксе, ИЕ и в Опере кнопки не нажимаются. В чем может быть поблема?

    Ответить
  • WahaWaher: 9 марта, 2019 в 14:54

    Адаптивные вкладки на jQ с трансформацией в аккордеон, кому интересно: http://github.com/WahaWaher/flextabs-js

    Ответить

Оставить комментарий

Ваш email не будет опубликован.

Вы можете использовать следующие HTML тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>