Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.02.2020, 22:46
Интересующийся
Отправить личное сообщение для ColT Посмотреть профиль Найти все сообщения от ColT
 
Регистрация: 14.02.2020
Сообщений: 16

Вертикальное меню аккордеон
Всем привет, извините за тупость, не кидайте пожалуйста камнями в меня, я прошу вашего внимания и помощи, но в интернете есть много чего, но того что именно мне надо нету( или есть но не полностью то что мне надо.
В общем есть такая структура меню
<ul class="tree " id="menu">											
<li class="sub">
	<a href="# title="">
		Меню
	</a>
			<ul>										
				<li class="sub">
					<a href="#" title="">
						Меню
					</a>
				</li>															
				<li class="sub">
					<a href="#" title="">
						Меню
					</a>
				</li>
				<li class="sub">
					<a href="#" title="">
						Меню
					</a>
				</li>
			</ul>
</li>
<li class="sub">
	<a href="# title="">
		Меню
	</a>
			<ul>										
				<li class="sub">
					<a href="#" title="">
						Меню
					</a>
				</li>															
				<li class="sub">
					<a href="#" title="">
						Меню
					</a>
				</li>
				<li class="sub">
					<a href="#" title="">
						Меню
					</a>
				</li>
			</ul>
</li>																
<li class="sub">
	<a href="#" title="">
		Меню
	</a>
		<ul>
			<li class="sub">
				<a href="#" title="">
					Меню
				</a>
					<ul>						
						<li class="sub">
							<a href="#" title="">
								Меню
							</a>
						</li>
						<li class="sub">
							<a href="#" title="">
								Меню
							</a>
						</li>
						<li class="sub">
							<a href="#" title="">
								Меню
							</a>
						</li>
					</ul>
			</li>
			<li class="sub">
				<a href="#" title="">
					Меню
				</a>
					<ul>						
						<li class="sub">
							<a href="#" title="">
								Меню
							</a>
						</li>
						<li class="sub">
							<a href="#" title="">
								Меню
							</a>
						</li>
						<li class="sub">
							<a href="#" title="">
								Меню
							</a>
						</li>
					</ul>
			</li>
		</ul>
	</li>
</ul>


Оно 3х уровненное. Могут быть одиночные пункты, могут быть 2х уровненные, могут быть и трех уровненное вложение.

В общем прошу помочь мне, сделать аккордеон меню, первый пункт должен быть открытым при первом заходе, после что бы при клике на иконку, открывались под категории и куками или кешем запоминалось выбранный пункт, и после перезагрузки страницы что бы этот пункт был открыт.
Еще момент, главное что бы открытие было не по нажатию кнопки первого уровня, а что бы рядом была какая то иконка или "+" - вот как пример вам покажу.
Ответить с цитированием
  #2 (permalink)  
Старый 24.02.2020, 11:38
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

вертикальное меню с сохранением выбранных пунктов
ColT,
<!DOCTYPE html>
<html>
  <head>
    <title>Untitled</title>
    <meta charset="utf-8" />

    <style>
      .tree {
        width: 200px;
      }
      .tree,
      .tree ul {
        list-style: none;
        margin: 0;
        padding: 0;
        text-align: left;
      }

      .tree a {
        background-color: #eee;
        color: black;
        display: block;
        padding: 12px;
        text-decoration: none;
        position: relative;
      }

      .tree a:hover {
        background-color: #ccc;
      }

      .sub > a {
        background-color: #4169e1;
      }

      .sub > a + ul {
        max-height: 0;
        transition: 1s;
        overflow: hidden;
      }
      .sub > a.active + ul {
        max-height: var(--hh, 0px);
        transition: 1s;
      }
      .sub > a.active {
        background-color: #0000cd;
      }

      .sub > a::after {
        font: 1em;
        font-weight: bold;
        content: '+';
        position: absolute;
        right: 5px;
        top: 2px;
        color: #ffffff;
        border: 1px solid #ffffff;
        height: 12px;
        width: 12px;
        border-radius: 2px;
        line-height: 12px;
        text-align: center;
      }

      .sub > a.active::after {
        content: '-';
      }
      .sub > a:focus {
        outline: none;
      }
    </style>
  </head>
  <body>
    <ul class="tree" id="menu">
      <li class="sub">
        <a href="#" title="">Меню 1</a>
        <ul>
          <li>
            <a href="#" title="">Меню 1.1</a>
          </li>
          <li>
            <a href="#" title="">Меню 1.2</a>
          </li>
          <li>
            <a href="#" title="">Меню 1.3</a>
          </li>
        </ul>
      </li>
      <li class="sub">
        <a href="#" title="">Меню 2</a>
        <ul>
          <li>
            <a href="#" title="">Меню 2.1</a>
          </li>
          <li>
            <a href="#" title="">Меню 2.2</a>
          </li>
          <li>
            <a href="#" title="">Меню 2.3</a>
          </li>
        </ul>
      </li>
      <li class="sub">
        <a href="#" title="">Меню 3</a>
        <ul>
          <li class="sub">
            <a href="#" title="">Меню 3.1</a>
            <ul>
              <li>
                <a href="#" title="">Меню 3.1.1</a>
              </li>
              <li>
                <a href="#" title="">Меню 3.1.2</a>
              </li>
              <li>
                <a href="#" title="">Меню 3.1.3</a>
              </li>
            </ul>
          </li>
          <li class="sub">
            <a href="#" title="">Меню 3.2</a>
            <ul>
              <li class="sub">
                <a href="#" title="">Меню 3.2.1</a>
                <ul>
                  <li>
                    <a href="#" title="">Меню 3.2.1.1</a>
                  </li>
                  <li>
                    <a href="#" title="">Меню 3.2.1.2</a>
                  </li>
                </ul>
              </li>
              <li>
                <a href="#" title="">Меню 3.2.2</a>
              </li>
              <li>
                <a href="#" title="">Меню 3.3.3</a>
              </li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
    <script>
      document.addEventListener('DOMContentLoaded', function() {
        let linkActive = JSON.parse(
          localStorage.getItem('linkActive') || '{"0" : true}'
        );
        const parent = document.querySelector('.tree');
        const ulToggle = a => {
          let ul = a.nextElementSibling;
          const hh = ul.scrollHeight;
          const up = a.classList.contains('active');
          do {
            if (ul.nodeName == 'UL') {
              let h = parseFloat(ul.style.getPropertyValue('--hh')) || 0;
              h += up ? -hh : hh;
              h = Math.max(0, h);
              ul.style.setProperty('--hh', `${h}px`);
            }
            ul = ul.parentElement;
          } while (ul !== parent);
          a.classList.toggle('active');
          const i = a.dataset.i;
          linkActive[i] = !up;
        };

        parent.querySelectorAll('.sub > ul').forEach((ul, i) => {
          const a = ul.previousElementSibling;
          a.dataset.i = i;
          const li = ul.closest('li');
          const LiParent = li.closest('ul');
          if (linkActive[i]) ulToggle(a);
          a.addEventListener('click', event => {
            event.preventDefault();
            ulToggle(a);
            [...LiParent.children].forEach(el => {
              if (el != li) {
                const a = el.querySelector('a.active ');
                if (a) {
                  ulToggle(a);
                }
              }
            });
            localStorage.setItem('linkActive', JSON.stringify(linkActive));
          });
        });
      });
    </script>
  </body>
</html>

Последний раз редактировалось рони, 24.02.2020 в 21:03.
Ответить с цитированием
  #3 (permalink)  
Старый 24.02.2020, 13:51
Интересующийся
Отправить личное сообщение для ColT Посмотреть профиль Найти все сообщения от ColT
 
Регистрация: 14.02.2020
Сообщений: 16

Спасибо огромное.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с меню аккордеон masaniachko jQuery 9 17.06.2018 14:25
Замена стилей класса Павел Турченко Элементы интерфейса 9 30.10.2015 15:24
Бесконечноуровневое меню на CSS ruslan_mart Ваши сайты и скрипты 5 12.01.2015 20:59
Вертикальное меню - аккордеон. Проблема. notgosu Events/DOM/Window 5 23.01.2013 11:47
Многоуровневое вертикальное меню chuser jQuery 0 13.05.2012 23:56