Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   скрыть, развернуть таб по клику (https://javascript.ru/forum/jquery/27358-skryt-razvernut-tab-po-kliku.html)

archcoffe 10.04.2012 17:19

скрыть, развернуть таб по клику
 
Хочу понять и научиться:
1. Как тут можно сделать так что бы #main прятался когда идет повторный клик на ту же ссылку, но при этом #main прятался а потом снова разворачивался когда второй клик на другую ссылку.
<ul class="tabse" >
<li class="d1" ><a href="#" >первый</a></li>
<li class="d2" ><a href="#" >второй</a></li>
</ul>
<div id="main">
    <div class="d1">
         <p>текст1</p>
    </div>
    <div class="d2">
        <p>текст2</p>
    </div>
</div>

$(document).ready(function() {
	$('div.d2').hide();
	$('div.d1').hide();
	$('div#main').hide();
	$('ul.tabse li').click(function(){
		var thisClass = this.className.slice(0,2);
		$('div.' + thisClass).fadeOut();
		$('div#main').slideUp();	
		$('div.d1').hide();
		$('div.d2').hide();
		$('ul.tabse li').removeClass('tab-curre');
		$(this).addClass('tab-curre');
		$('div.' + thisClass).delay(250).fadeIn();
		$('div#main').delay(250).slideDown();	
	});
});

kiff86 11.04.2012 16:24

что значит "повторный"? в jquery есть dblclick то есть двойное нажатие. Насчет повтора не уверен что есть..

archcoffe 11.04.2012 16:49

"повторный" всмысле что - заходишь видишь что все блоки скрыты, кликаешь по ссылке таба - разворачиваеться #main с блоком самого таба, кликаешь по той же ссылке таба - сворачивается #main соответственно с табом. Я так себе сейчас понял что это ближе к toogle() но он будет неправильно работать когда идет клик по соседнему табу.
Потом можно было бы поставить jquery ui там этот вопрос быстро решается через collapsible=true, но этого сейчас не хочу ибо цель не сделать и забыть, а понять что происходит т.е научиться

kiff86 11.04.2012 17:32

ну тогда функция click.
пример:
$("#tabse a").click(function(){
  $("#main div[id='" +$(this).closest("li").attr("class") + "']").toggle(...);
});


Вообще есть где-нить живой пример )) посмотреть чтоб?

kiff86 11.04.2012 17:33

если нужно чтобы #main только отрывался - toogle к майну а к нужному div например opacity = 1 через .css();

archcoffe 11.04.2012 18:39

вот пример этих табов http://dimox.name/examples/accessible-tabs-with-jquery/ - я добавил только блок #main и его развертывание, свертывание

а вот по примеру что ты бросил - что в этом коде происходит? - мне понятно что по клику на ссылке в блоке #tabse должны быть найдены все дивы в блоке #main где есть <li> содержащие "class" ?

kiff86 11.04.2012 19:48

Да именно так, когда ты выделил блок который нужно отобразить ставишь ему свойство display:block например и затем открывешь #main

archcoffe 12.04.2012 11:59

этот пример у меня не отработал, я не пойму как его совместить с моим кодом :(

archcoffe 16.04.2012 17:37

Пробую так как ниже, но вопросы остались
$(document).ready(function() {
				$('ul.tabse li').css('cursor', 'pointer');
				$('div.d2').hide();
				$('div.d1').hide();
				$('div#main').hide();
			
				$('ul.tabse li').click(function(){
					var thisClass = this.className.slice(0,2);
					if( $('ul.tabse li').hasClass('tab-curre') ) {
                                                // если клик по блоку без активного класса ?
						$('ul.tabse li').removeClass('tab-curre');
						$('div#main').slideUp();	
					}
					else {
                        $('div.' + thisClass).hide();
						$(this).addClass('tab-curre');
						$('div.' + thisClass).fadeIn();
						$('div#main').slideDown();	
					}
				});
			});

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

p.latonenkonikita 17.04.2012 02:48

<ul class="tabse" >
<li class="d1" ><a href="#" >первый</a></li>
<li class="d2" ><a href="#" >второй</a></li>
</ul>
<div id="main">
    <div class="sld">
         <p>текст1</p>
    </div>
    <div class="sld">
        <p>текст2</p>
    </div>
</div>


$('.sld').click(function(){
   $(this).slideToggle();
})


Вот и все! :)

а если нужно, что бы открытый закрывался, то вначале закрой все, а нужный разверни:
$('.sld').click(function(){
   $('.sld').hide();
   $(this).slideToggle();
})

archcoffe 17.04.2012 04:53

slideToggle(); - почти то же самое но все же :)
Вот и все! :) - нет не все, потому что смущает два номера:
1. Класс в <li> должен совпадать с названием блока таба, ибо не сработает :)
2. Осталось сделать переход к новому табу без сворачивания #main
я попробовал скрыть в диве #main все блоки которые не попадают в условие -
$('ul.tabse li').click(function(){
					var thisClass = this.className.slice(0,2);
					
					if( $('ul.tabse li').hasClass('tab-curre') ) {
						$('ul.tabse li').removeClass('tab-curre');
						$('div.' + thisClass).fadeOut();
						$('div#ololo').slideToggle();	
					}
					else {
						$('div#main div:not(.' + thisClass + ')' ).hide();
						$(this).addClass('tab-curre');
						$('div.' + thisClass).fadeIn();
						$('div#ololo').slideToggle();
					}
				});

похоже на правду наверно. Последнее что нужно допереть как сделать - при клике на не нажатую ранее ссылку(таб) оставить #main развернутым и отобразить блок не нажатого таба. Или свернуть #main затем снова развернуть и показать новый блок таба.

archcoffe 18.04.2012 22:34

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

archcoffe 19.04.2012 23:52

У меня получилось этого добиться добавляя "active" к классу самих блоков таба.
$(document).ready(function() {
				$('ul.tabse li').css('cursor', 'pointer');
				$('div.d2').hide();
				$('div.d1').hide();
				$('div#ololo').hide();
				$('ul.tabse li').click(function() {
					var thisClass = this.className.slice(0,2);
					if($('ul.tabse li').hasClass('tab-curre')) {
						if($('div#ololo div.' + thisClass).hasClass('active')) {
							$('div#ololo div.' + thisClass ).fadeOut();
							$('ul.tabse li').removeClass('tab-curre');
							$('div#ololo div.' + thisClass).removeClass('active');
							$('div#ololo').slideUp();
						}
						else {
							$('div#ololo div:not(.' + thisClass + ')' ).removeClass('active');
							$('div#ololo div.' + thisClass).addClass('active');
							$('ul.tabse li').removeClass('tab-curre');
							$(this).addClass('tab-curre');
							$('div.' + thisClass).fadeIn();
							$('div#ololo div:not(.' + thisClass + ')' ).hide();
							$('div#ololo').fadeIn(function () {
								$(this).toggle();
								$(this).show(350);
							});
						}
					}
					else {
						$('div#ololo div.' + thisClass).addClass('active');
						$(this).addClass('tab-curre');
						$('div.' + thisClass).fadeIn();
						$('div#ololo').slideDown();
					}
				});
				
			});

Однако потом поговорил с товарищем который что то понимает в этом - он мне по первой показал код в половину меньше этого, ругнулся мол "учи матчасть" и бросил замечание о том что у меня html не валидный.


Часовой пояс GMT +3, время: 09:21.