Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.08.2011, 11:07
Аспирант
Отправить личное сообщение для revvo Посмотреть профиль Найти все сообщения от revvo
 
Регистрация: 17.01.2011
Сообщений: 38

Не получается поменять высоту div
Изучаю сейчас jQuery, пробую сделать аккордион, базовый функционал работает, но хочу сделать чтобы айтемы тянулись по высоте как мне надо, а не только от высоты контента зависели. Никак не получается высоту объекту поменять, соседним можно, а вот по тому к-рому был клик, ну никак, все уже перепробовал. Посмотрите еще вы пожалуйста, может подскажете чего...

$(document).ready(function() {	
		
			//console.log();
			
			$(".i-head").click(function () {
			
				var obj = $(this).next();
				obj.slideToggle();
				obj.toggleClass('expanded', obj.height() == 1);
				
				var h = $("#accord").height();
				var h1 = $("#accord .i-body:first").height();
				h = h - h1 - 4*20;
				
				var i = 0;
				
				$("#accord .i-body").each(function() {
					if ($(this).hasClass('expanded')) i++;
				});
				
				// получаю высоту на к-рую тянуть все айтемы, поровну на всех пространство делится
				h = Math.floor(h / i);
				
				/*
				до этого момента все правильно, все проверил через логи, все объекты получаются,
				и все переменные содержат нужные значения
				*/
				
				$(".expanded").css("height", h); 
				// не работает, вообще никакой реакции
				//(вернее меняет высоту всем, кроме текущего, как я убедился ниже)
				
				//$(".i-body:eq(1)").css("height", h); // и даже так не работает,
				//НО работает на других пунктах, т.е. если мы сейчас кликнули 1-й, а менять будем 2-му то все получится
				
				//obj.css("height", h); // так тоже не работает
				
				// еще одна попытка, думал может дело в slideToggle, попробовал проанимировать, тоже безрезультатно
				//obj.css('display', 'block');
				//obj.animate({height: h}, 1500);
				
			});
			
			$(".i-body").click(function () {
				$(this).css("height", 200);
				// что интересно, тут работает, но мне нужно чтобы работало в функции выше, 
				// т.е. по клику хедера, а не тела
			});
		});


<div style="height:400px;">

	<!-- Accordion -->

	<div class="acc-container" id="accord">
	
		<div class="acc-item">
			<div class="i-head">
				<span class="i-title">Item 1</span><div class="i-arrow"></div>
			</div>
			<div class="i-body">
				<div style="padding:20px;color:blue;background:#EABF9A;">
					CONTENT of Item 1
				</div>
			</div>
		</div>
		
		<div class="acc-item">
			<div class="i-head">
				<span class="i-title">Item 2</span><div class="i-arrow"></div>
			</div>
			<div class="i-body" style="display:none;">
				<div style="padding:20px;color:blue;background:#EACF5A;">
					CONTENT of Item 2 Line 0<br/>
					CONTENT of Item 2 Line 1<br/>
					CONTENT of Item 2 Line 2<br/>
				</div>
			</div>
		</div>
		
		<div class="acc-item">
			<div class="i-head">
				<span class="i-title">Item 3</span><div class="i-arrow"></div>
			</div>
			<div class="i-body" style="display:none;">
				<div style="padding:20px;color:blue;background:#EABF9A;">
					CONTENT of Item 3 Line 0<br/>
					CONTENT of Item 3 Line 1<br/>
					CONTENT of Item 3 Line 2<br/>
					CONTENT of Item 3 Line 3<br/>
					CONTENT of Item 3 Line 4<br/>
					CONTENT of Item 3 Line 5<br/>
					CONTENT of Item 3 Line 6<br/>
					CONTENT of Item 3 Line 7<br/>
				</div>
			</div>
		</div>
		
		<div class="acc-item">
			<div class="i-head">
				<span class="i-title">Item 4</span><div class="i-arrow"></div>
			</div>
			<div class="i-body" style="display:none;">
				<div style="padding:20px;color:blue;background:#EACF5A;">
					CONTENT of Item 3 Line 0<br/>
					CONTENT of Item 3 Line 1<br/>
					CONTENT of Item 3 Line 2<br/>
					CONTENT of Item 3 Line 3<br/>
					CONTENT of Item 3 Line 4<br/>
					CONTENT of Item 3 Line 5<br/>
					CONTENT of Item 3 Line 6<br/>
					CONTENT of Item 3 Line 7<br/>
				</div>
			</div>
		</div>
		
	</div>

</div> <!-- END container -->
Ответить с цитированием
  #2 (permalink)  
Старый 06.08.2011, 11:20
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Кпараметру height или width не забывай указывать единицу измерения например:
$(".expanded").css("height", h + "px");
Ответить с цитированием
  #3 (permalink)  
Старый 06.08.2011, 11:39
Аспирант
Отправить личное сообщение для revvo Посмотреть профиль Найти все сообщения от revvo
 
Регистрация: 17.01.2011
Сообщений: 38

Сообщение от devote Посмотреть сообщение
Кпараметру height или width не забывай указывать единицу измерения например:
$(".expanded").css("height", h + "px");
Не не, не в этом дело, это не обязательно, jQuery при отсутствии единицы измерения, понимает величину как пиксели.

Спасибо за ответ. Какие еще будут мнения?
Ответить с цитированием
  #4 (permalink)  
Старый 06.08.2011, 11:53
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

хм... запустил твой код, все пашет как часы... Не понимаю в чем проблема у тебя. Кликаю например по слову "Item 1" и разворачивается элемент ниже.
Ответить с цитированием
  #5 (permalink)  
Старый 06.08.2011, 13:12
Аспирант
Отправить личное сообщение для revvo Посмотреть профиль Найти все сообщения от revvo
 
Регистрация: 17.01.2011
Сообщений: 38

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

Спасибо за попытку помочь

Вот вариант работающий как мне надо (может пригодится кому, тут я еще добавил смену иконки (arrow-exp/arrow-clp))

$(".i-head").click(function () {
			
				var obj = $(this).next();
				
				obj.toggleClass('expanded');
				
				$(this).children('.i-arrow').toggleClass('arrow-exp');
				$(this).children('.i-arrow').toggleClass('arrow-clp');
				
				var h = $("#accord").height();
				var h1 = $("#accord .i-body:first").height();
				h = h - h1 - 4*22;
				
				var i = 0;
				
				$("#accord .i-body").each(function() {
					if ($(this).hasClass('expanded')) i++;
				});
				
				h = Math.floor(h / i);
				
				$("#accord .i-body").each(function() {
					if ( (!$(this).hasClass('expanded')) && (!$(this).hasClass('i-first')) ) {
						$(this).animate({height: 0}, 500);
					}
				});
				
				$(".expanded").animate({height: h}, 500);	
				
			});


В HTML коде тоже есть небольшие изменения

<div style="height:400px;">

	<!-- Accordion -->

	<div class="acc-container" id="accord">
	
		<div class="acc-item">
			<div class="i-head">
				<span class="i-title">Item 1</span><div class="i-arrow arrow-exp"></div>
			</div>
			<div class="i-body i-first">
				<div style="padding:20px;">
					Item 1 content
				</div>
			</div>
		</div>
		
		<div class="acc-item">
			<div class="i-head">
				<span class="i-title">Item 2</span><div class="i-arrow arrow-clp"></div>
			</div>
			<div class="i-body" style="height:0px;">
				<div style="padding:20px;">
					Item 2 content<br/>
					Item 2 content<br/>
					Item 2 content<br/>
					Item 2 content<br/>
					Item 2 content<br/>
					Item 2 content<br/>
					Item 2 content<br/>
					Item 2 content<br/>
				</div>
			</div>
		</div>
		
		<div class="acc-item">
			<div class="i-head">
				<span class="i-title">Item 3</span><div class="i-arrow arrow-clp"></div>
			</div>
			<div class="i-body" style="height:0px;">
				<div style="padding:20px;">
					Item 3 content<br/>
					Item 3 content<br/>
					Item 3 content<br/>
					Item 3 content<br/>
					Item 3 content<br/>
					Item 3 content<br/>
					Item 3 content<br/>
					Item 3 content<br/>
				</div>
			</div>
		</div>
		
		<div class="acc-item">
			<div class="i-head">
				<span class="i-title">Item 4</span><div class="i-arrow arrow-clp"></div>
			</div>
			<div class="i-body" style="height:0px;">
				<div style="padding:20px;">
					Item 4 content<br/>
					Item 4 content<br/>
					Item 4 content<br/>
					Item 4 content<br/>
					Item 4 content<br/>
					Item 4 content<br/>
					Item 4 content<br/>
					Item 4 content<br/>
				</div>
			</div>
		</div>
		
	</div>

</div>


Ну и для полноты картины, CSS

.acc-container {
	width: 300px;
	height: 100%;
	border: 1px solid black;
	overflow: hidden;
}

.i-head {
	border-top: 1px solid black;
	border-bottom: 1px solid black;
	position: relative;
	background: url(../images/acc.png) repeat-x;
}

.i-title {
	font-weight: bold;
	padding: 0 8px;
}

.i-arrow {
	position: absolute;
	top: 4px;
	right: 4px;
	width: 12px;
	height: 12px;
	cursor: pointer;
}

.arrow-exp { background: url(../images/minus.png) no-repeat; }

.arrow-clp { background: url(../images/plus.png) no-repeat; }

.i-body {
	overflow: auto;
	color: blue;
}


PS Если будете использовать этот код, первый элемент не работает как остальные, не пугайтесь, это мне так нужно просто было, он у меня должен быть фиксированный, поэтому я его не учитывал и не тестировал вообще.

Последний раз редактировалось revvo, 06.08.2011 в 13:15.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Родительский div relative принимал высоту вложенного div absolute Oriy Общие вопросы Javascript 7 26.04.2011 08:28
Не получается по щелчку на ссылке вывести div по центру экрана! Триви jQuery 6 11.03.2011 10:35
как поменять цвет элементов div с помощью ajax? uspehovna AJAX и COMET 12 20.08.2010 17:21
Не получается загрузить баннер в раздел DIV методами Javascript через iframe ((( autobuh Общие вопросы Javascript 3 24.07.2009 19:24
Как получить высоту DIV, установленную автоматически YOricH Internet Explorer 4 22.07.2009 17:15