Простые табы для сайта на jQuery, бывает еще проще?

Цель:

Минимум кода,

максимум совместимости,

без использования хэшей,

без jQ UI



Текущий вариант реализации:

#wrapper div {<br>
    display:none;<br>
}<br>
#wrapper.tab1 div.tab1 {<br>
    display:block;<br>
    width:100%;<br>
}<br>
#wrapper.tab2 div.tab2 {<br>
    display:block;<br>
    width:100%;<br>
}<br>
#wrapper.tab3 div.tab3 {<br>
    display:block;<br>
    width:100%;<br>
}<br>
#wrapper.tab1 a.tab1 {<br>
    color: black;<br>
    cursor: default;<br>
    font-weight: bold;<br>
    text-decoration: none;<br>
}<br>
#wrapper.tab2 a.tab2 {<br>
    color: black;<br>
    cursor: default;<br>
    font-weight: bold;<br>
    text-decoration: none;<br>
}<br>
#wrapper.tab3 a.tab3 {<br>
    color: black;<br>
    cursor: default;<br>
    font-weight: bold;<br>
    text-decoration: none;<br>
}<br>


<div id="wrapper" class="tab1"><br>
    <a href="#" class="tab1">Вкладка 1</a><br>
    <a href="#" class="tab2">Вкладка 2</a><br>
    <a href="#" class="tab3">Вкладка 3</a><br>
<br>
    <div class="tab1">Содержимое 1</div><br>
    <div class="tab2">Содержимое 2</div><br>
    <div class="tab3">Содержимое 3</div><br>
</div>​<br>


$('#wrapper a').click(function() {<br>
        if ($(this).attr('class') != $('#wrapper').attr('class') ) {<br>
            $('#wrapper').attr('class',$(this).attr('class'));<br>
        }<br>
    });​<br>
<br>




Вопрос:

А можно сделать CSS лаконичнее?



Демо, которое можно форкать.
  • Вопрос задан
  • 65521 просмотр
Пригласить эксперта
Ответы на вопрос 12
@egorinsk
За ссылки с href=# надо отрывать руки. Что это за ссылка, которая никуда не ведет? Далее, при отключенном яваскрипте у вас будет пустая страница. далее, зачем тянуть 150-Кб тяжелый фреймворк, от которого айфон подвисает, ради табов?

Далее. Вот у вас написано

#wrapper div { display:none; }

Что, если внутри сождержимого таба есть еще дивы? А если внутри таба есть еще один блок табов? А?

Далее, а что если табов больше 3-х?

Сделано на троечку, на уровне школьника, который впервые прочел сайт htmlbook.ru и захотел что-то сотворить. С кучей ошибок. Плохо, короче говоря.

И что значит «без использования хешей»? Это почему еще?

К слову, табы можно сделать вообще без яваскрипта, но вам видимо еще до этого далеко. Также, верстку табов можно сделать семантичнее — погуглите, у Сергея Чикуенка была статья на эту тему.
Ответ написан
Zak
@Zak Автор вопроса
>За ссылки с href=# надо отрывать руки.
Это не продакшн код, это ПРИМЕР, вам больше нравится href="javascript:;"?

>Что, если внутри сождержимого таба есть еще дивы?
Добавлю сверху класс tab_item и напишу
#wrapper div.tab_item { display:none; }
#wrapper div { display:none; }

>зачем тянуть 150-Кб тяжелый фреймворк, от которого айфон подвисает, ради табов?
Я не собираюсь писать страницы для айфонов, мне от Jq нет смысла отказываться.

>А если внутри таба есть еще один блок табов?
Выкрутимся как-нибудь :) Не собираюсь писать универсальное решение там, где это не нужно.

>Далее, а что если табов больше 3-х?
Да хоть 10, вот пример

>… на уровне школьника, который впервые прочел сайт htmlbook.ru и захотел что-то сотворить.
>С кучей ошибок. Плохо, короче говоря.
Спасибо, ваше мнение очень важно для меня. Приведите свое решение здесь.

>И что значит «без использования хешей»? Это почему еще?
я имел в виду анкоры (якоря), просто у меня анкоры используются для других задач.

> вообще без яваскрипта, но вам видимо еще до этого далеко
Куда уж мне :)

>А можно сделать CSS лаконичнее? Его вообще можно убрать
Отличная идея, верстальщик мне спасибо скажет :)

Ах, как замечательно вы троллите.
Ответ написан
ademaro
@ademaro
full-stack developer
Раньше делал такие табы jsfiddle.net/ademaro/S4kTx/:
<dl class="tabs">
    <dt class="active">Вкладка 1</dt>
    <dd class="active"><div>Содержимое 1</div></dd>
    <dt>Вкладка 2</dt>
    <dd><div>Содержимое 2</div></dd>
</dl> 
    
<script type="text/javascript">    
$(function(){
    $("dl.tabs dt").click(function(){
        $(this)
            .siblings().removeClass("active").end()
            .next("dd").andSelf().addClass("active");
    });
});
</script>


А вообще можно и без js: jsfiddle.net/ademaro/WwrsX/
Ответ написан
vajadhava
@vajadhava
Максимум совместимости, без JQuery UI тынц
Весь код, который нужно писать ВАМ:

<div class="tabbable">
    <ul class="nav nav-tabs">
    <li class="active"><a href="#1" data-toggle="tab">Section 1</a></li>
    <li><a href="#2" data-toggle="tab">Section 2</a></li>
    </ul>
    <div class="tab-content">
    <div class="tab-pane active" id="1">
    <p>I'm in Section 1.</p>
    </div>
    <div class="tab-pane" id="2">
    <p>Howdy, I'm in Section 2.</p>
    </div>
    </div>
</div>
Ответ написан
Zak
@Zak Автор вопроса
Вот очередной вариант

#wrapper div {
    display:none;
}
#wrapper a.active {
    color: black;
    cursor: default;
    font-weight: bold;
    text-decoration: none;
}
#wrapper div.active {
    display:block;
    width:100%;
}

<div id="wrapper">
    <a href="#" id="tab1" class="active">Вкладка 1</a>
    <a href="#" id="tab2">Вкладка 2</a>
    <a href="#" id="tab3">Вкладка 3</a>
    <div id="con_tab1" class="active">Содержимое 1</div>
    <div id="con_tab2">Содержимое 2</div>
    <div id="con_tab3">Содержимое 3</div>
</div>​

    $('#wrapper a').click(function() {
        var click_id=$(this).attr('id');
        if (click_id != $('#wrapper a.active').attr('id') ) {
            $('#wrapper a').removeClass('active');
            $(this).addClass('active');
            $('#wrapper div').removeClass('active');
            $('#con_' + click_id).addClass('active');
        }
    });​
Ответ написан
Комментировать
dudeonthehorse
@dudeonthehorse
Email Developer
jsfiddle.net/UWYxZ/

Мой вариант. jQuery можно и элегантнее написать, но суть, думаю, ясна
Ответ написан
dudeonthehorse
@dudeonthehorse
Email Developer
«А можно сделать CSS лаконичнее?» — убираем дубляж в css, и даем табам одинаковые классы.

На списках табы гораздо семантичнее.
Ответ написан
@digdream
а есть табы, чтобы можно было анкоры вставить и по ссылке открывать не первую вкладку, а ту, на которую ссылается якорь?
Ответ написан
@ChemAli
Ну используйте вместо хешей атрибуты типа data-target=«targettab». Суть-то все равно не изменится: нужно где-то указывать целевую вкладку.
Ответ написан
Комментировать
svistiboshka
@svistiboshka
живые веб интерфейсы
Rive
@Rive
Noscript в Файрфоксе клик по табу принимает за Clickjacking.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы