Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.09.2018, 15:14
DVV DVV вне форума
Кандидат Javascript-наук
Отправить личное сообщение для DVV Посмотреть профиль Найти все сообщения от DVV
 
Регистрация: 26.12.2017
Сообщений: 125

Улучшить аккордеон
Написал скрипт для аккордеона на чистом JS. На текущий момент все элементы изначально закрыты. При клике на заголовок элемент аккордеона раскрывается, а предыдущий открытый закрывается. Хотелось бы улучшить его тем, чтобы при клике на заголовок текущего открытого элемента этот элемент сворачивался.

function accordeon() {
	for (let i = 0; i < accordBlocks.length; i++) {
		accordBlocks[i].style.display = 'none';//Первоначальное скрытие всех блоков аккордиона
	}

	for (let j = 0; j < accordTitles.length; j++) {
		accordTitles[j].addEventListener('click', () => {
			for (let i = 0; i < accordBlocks.length; i++) {
				accordBlocks[i].style.display = 'none';//Закрытие элемента аккордеона
				accordTitles[i].style.color = 'black';//Смена цвета заголовка элемента аккордеона
			}
			accordBlocks[j].style.display = 'block';//Раскрытие элемента аккордеона
			accordTitles[j].style.color = '#fa05f6';//Смена цвета заголовка элемента аккордеона
		});
	}
};	
accordeon();
Ответить с цитированием
  #2 (permalink)  
Старый 07.09.2018, 15:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от DVV
Хотелось бы улучшить его тем, чтобы при клике на заголовок текущего открытого элемента этот элемент сворачивался.
уберите пару циклов все циклы кроме одного

Последний раз редактировалось рони, 07.09.2018 в 15:28.
Ответить с цитированием
  #3 (permalink)  
Старый 07.09.2018, 15:41
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

<button id="btn">Кнопка</button>
		<div id="block" style="overflow:hidden; width:300px; transition:1s;">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Maxime corporis animi neque reprehenderit! Reprehenderit aliquam ea qui quae natus illo, amet, quidem, debitis eaque, dolorum ducimus. Velit, doloremque neque magnam.</div>
	<script>

	var height = getComputedStyle(block).height;
	block.style.height = '0px';
	btn.onclick = function(){
		block.style.height = getComputedStyle(block).height == '0px' ? height : '0px';
	};

	</script>

Думаю что это вам поможет
Ответить с цитированием
  #4 (permalink)  
Старый 07.09.2018, 15:56
DVV DVV вне форума
Кандидат Javascript-наук
Отправить личное сообщение для DVV Посмотреть профиль Найти все сообщения от DVV
 
Регистрация: 26.12.2017
Сообщений: 125

А какие именно, а то я что-то туплю?
Ответить с цитированием
  #5 (permalink)  
Старый 07.09.2018, 15:59
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

DVV,
Все можно засунуть в один цикл и не создавать несколько, оставьте первый например.
Ответить с цитированием
  #6 (permalink)  
Старый 07.09.2018, 16:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

отрывашка зависимая js
DVV,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

  <script>
document.addEventListener("DOMContentLoaded", accordeon);

function accordeon() {
    var accordTitles = document.querySelectorAll(".accordTitles");
    var accordBlocks = document.querySelectorAll(".accordBlocks");
    var index;

    function closeBlocks(i) {
        accordTitles[i].style.color = "black";
        accordBlocks[i].style.display = "none"
    }

    function openBlocks(i) {
        accordTitles[i].style.color = "#fa05f6";
        accordBlocks[i].style.display = "block";
    }
    [].forEach.call(accordTitles, function(btn, i) {
        closeBlocks(i);
        btn.addEventListener("click", function() {
           if (index !== i) openBlocks(i);
           if (index !== void 0) closeBlocks(index);
           index = index !== i ? i : void 0
        })
    })
};
  </script>
</head>

<body>
<div class="accordTitles">1</div>
<div class="accordTitles">2</div>
<div class="accordTitles">3</div>
<div class="accordTitles">4</div>
<div class="accordTitles">5</div>
<div class="accordBlocks">1</div>
<div class="accordBlocks">2</div>
<div class="accordBlocks">3</div>
<div class="accordBlocks">4</div>
<div class="accordBlocks">5</div>
</body>
</html>

Последний раз редактировалось рони, 07.09.2018 в 16:23.
Ответить с цитированием
  #7 (permalink)  
Старый 07.09.2018, 16:41
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

рони, поубирал лишнее

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

	<script>

		document.addEventListener("DOMContentLoaded", accordeon);

		function accordeon() {
			var accordBlocks = document.querySelectorAll('.accordBlocks'),
			accordTitles = document.querySelectorAll('.accordTitles'),
			index = null;
			accordTitles.forEach((el,i)=>{
				accordBlocks[i].style.display = 'none';
				el.addEventListener('click', function(e){
					el.style.color = '#fa05f6';
					accordBlocks[i].style.display = 'block';
					if(index != null){
						accordBlocks[index].style.display = 'none';
						accordTitles[index].style.color = 'black';
					}
					index = index==i? null: i;
				});
			});
		}

	</script>
	
	<div class="accordTitles">1</div>
	<div class="accordTitles">2</div>
	<div class="accordTitles">3</div>
	<div class="accordTitles">4</div>
	<div class="accordTitles">5</div>
	<div class="accordBlocks">1</div>
	<div class="accordBlocks">2</div>
	<div class="accordBlocks">3</div>
	<div class="accordBlocks">4</div>
	<div class="accordBlocks">5</div>
</body>
</html>

Последний раз редактировалось j0hnik, 07.09.2018 в 17:04.
Ответить с цитированием
  #8 (permalink)  
Старый 07.09.2018, 16:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от j0hnik
рони, поубирал лишнее
нельзя открыть один и тотже блок
Ответить с цитированием
  #9 (permalink)  
Старый 07.09.2018, 17:05
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

рони,
поправил
Ответить с цитированием
  #10 (permalink)  
Старый 07.09.2018, 20:47
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

рони,
привет. Подскажи, почему в посте #6 при объявлении переменных каждая состоит из var...;

function accordeon() {
    var accordTitles = document.querySelectorAll(".accordTitles");
    var accordBlocks = document.querySelectorAll(".accordBlocks");
    var index;
}


Не проще писать через запятую, если они применяются "рядом" ?

function accordeon() {
  var
    accordTitles = document.querySelectorAll(".accordTitles"),
    accordBlocks = document.querySelectorAll(".accordBlocks"),
    index;
}

п.с. это не претензия) просто вопрос стилистики кода от менее опытного js-user
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста улучшить мини код jay-S Общие вопросы Javascript 7 17.07.2017 23:44
Как улучшить сортировку массива? Armen Общие вопросы Javascript 3 12.10.2014 20:17
Связать ползунковый слайдер и аккордеон... All_ex74 Элементы интерфейса 1 31.05.2013 13:20
аккордеон, раскрытие активного пункта меню Moles jQuery 1 21.11.2011 13:24
меню в стиле аккордеон из таблицы chdn Элементы интерфейса 1 10.11.2011 21:15