LINUX.ORG.RU

Выпадающее многоуровневое меню на css

 , ,


0

2

Привет, ЛОР.

Не откажи в помощи. Поясни, почему не работает моя схема с visible’ами, чтобы отобразить второй уровень вложенности меню? Первый уровень работает, а второй по той же схеме - нет.

https://jsfiddle.net/86tduhqv/

На всякий, код и тут:

<nav onclick="void(0);">
  <div><a href="#">Menu 1</a></div>
  <div class="dropdown-sign">Menu 2
    <div class="dropdown-content">
      <div><a href="#">Option 1</a></div>
      <div><a href="#">Option 2</a></div>
      <div><a href="#">Option 3</a></div>
      <div class="dropdown-sign">Option 4
        <div class="dropdown-content-side">
          <div>Suboption 1</div>
          <div>Suboption 2</div>
          <div>Suboption 3</div>
          <div>Suboption 4</div>
        </div>
      </div>
    </div>
  </div>
</nav>
nav {
    display: flex;
    flex-flow: row nowrap;
    justify-content: space-around;
    align-items: stretch;
    height: 2em;
    font-size: 0.9rem;
}

nav div {
    display: flex;
    flex-flow: row nowrap;
    align-items: center;
    justify-content: center;
    flex-grow: 1;
    background-color: green;
    position: relative;
    width: 100%;
    color: moccasin;
}

nav div a {
    text-decoration: none;
    color: moccasin;
    display: flex;
    flex-flow: row nowrap;
    align-items: center;
    justify-content: center;
    flex-grow: 1;
}

nav div a:hover, nav>div:hover {
    color: goldenrod;
}

.dropdown-sign::after {
    color: inherit;
    content: "▼";
    font-size: 0.6rem;
    text-indent: 0.3em;
}

.dropdown-content {
    visibility: hidden;
    z-index: 1;
    position: absolute;
    top: 2em;
}

nav>div:hover .dropdown-content {
  visibility: visible;
    background-color: darkslategray;
    display: flex;
    flex-flow: column nowrap;
    justify-content: center;
    align-items: stretch;
    width: 100%;
}

.dropdown-content>div {
    display: flex;
    flex-flow: row nowrap;
    justify-content: center;
    align-items: center;
    padding: 0.5em;
}

.dropdown-content>div:hover {
  visibility: visible;
    color: goldenrod;
    border-bottom: 0.1em solid goldenrod;
}

.dropdown-content>div>a {
    text-decoration: none;
    color: moccasin;
    display: flex;
    justify-content: center;
    align-items: center;
}

.dropdown-content>div>div:hover {
  visibility: visible;
    color: goldenrod;
    border-bottom: 0.1em solid goldenrod;
}

.dropdown-content-side {
  visibility: hidden;
    z-index: 2;
    position: absolute;
    top: 0;
    right: 100%;
    background-color: green;
    display: flex;
    flex-flow: column nowrap;
    justify-content: center;
    align-items: stretch;
    width: 100%;
}

.dropdown-content-side>div {
    display: flex;
    flex-flow: row nowrap;
    justify-content: center;
    align-items: center;
    padding: 0.5em;
}

.dropdown-content-side>div:hover {
    color: goldenrod;
    border-bottom: 0.1em solid goldenrod;
}

.dropdown-content-side>div>a {
    text-decoration: none;
    color: moccasin;
    display: flex;
    justify-content: center;
    align-items: center;
}

У тебя нигде нет правила для показа dropdown-content-side при hover, вот оно и не показывается. А вообще css по-моему можно было бы сократить в несколько раз без потери работоспособности.

firkax ★★★★★
()
Ответ на: комментарий от firkax

https://jsfiddle.net/86tduhqv/1/ с ховером. Не показывает. Что не так?

А вообще css по-моему можно было бы сократить в несколько раз без потери работоспособности.

Наверняка да, я плохо пока его знаю, изучаю.

curbar
() автор топика
Ответ на: комментарий от curbar

Как ты всё остальное написал если тут такие проблемы? Мне кажется ты оригинал откуда-то скопипакстил и пытаешься, не вникая в то как он устроен, что-то подкостылить. Не надо так делать.

Вот расскажи, что ты имел ввиду этими строками?

.dropdown-content-side:hover {
  visibility: visible;
}

firkax ★★★★★
()
Ответ на: комментарий от firkax

Мне кажется ты оригинал откуда-то скопипакстил и пытаешься, не вникая в то как он устроен, что-то подкостылить. Не надо так делать.

Тебе кажется. Это уже третья версия, переписанная за два дня.

Вот расскажи, что ты имел ввиду этими строками?

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

curbar
() автор топика
Ответ на: комментарий от firkax

Фирфакс, ты хочешь показаться умным? Тогда помоги разобраться. Не надо выеживаться. Это со стороны выглядит не очень, поверь.

Где моя ошибка? Какую концепцию я не понимаю, что приводит к нежеланному для меня результату?

curbar
() автор топика
Ответ на: комментарий от curbar

Во-первых, не коверкай ник.

Во-вторых, я именно и помогаю, а ты грубишь в ответ - это некрасиво.

Во-третьих, если ты сделал вот это

Вернулся к правильному варианту - атрибут на ховер родительского класса.

то всё должно было заработать. Ты это сделал? Работает? Покажи что получилось то. Ни в одной из двух приведённых тобой ссылок этого нет.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Очепятка в нике, ненарочно. Пардон.

Вот еще раз переписал MWE без лишнего - https://jsfiddle.net/86tduhqv/3/ . Сделал без дивов, с ними постоянно путал вложенность, а классы городить не хотелось. Вроде работает. Что-то лишнее есть?

curbar
() автор топика
Ответ на: комментарий от curbar

Например так можно убрать дублирование кода между суб и субсуб, и упростить селекторы (там не обязательно писать полный путь, можно только значимое)

https://jsfiddle.net/3wtck760/2/

А ещё, поскольку меню однозначно не единственное содержимое страницы, на ней могут встретиться и другие <li>, хорошо бы его (там в конце селектор просто li) как-то обозначить чтобы он точно не пересёкся с ещё кем-то.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Действительно, заметно упростилось. Спасибо.

curbar
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.