@user_tm

Как по нажатию на одну вкладку, скрыть другие вкладки?

Как по нажатию на <summary>Покажи-скрой меня</summary> скрыть текст от других <summary>Покажи-скрой меня</summary>?
Хорошо бы если на чистом css, но и js тоже можно.

Вот код:

<div class="wrapp">
  <details open>
    <summary>Покажи-скрой меня</summary>
    <p>Скандинавская мифология — мифология древних скандинавов, часть древнегерманской мифологии.</p>
  </details>
  <details>
    <summary>Покажи-скрой меня 2</summary>
    <p><b>Скандинавская мифология</b> — мифология древних скандинавов, часть древнегерманской мифологии.<br>
        Основным источником сведений о ней являются тексты поэтической <b>«Старшей Эдды»</b> и прозаической <b>«Младшей Эдды» С. Стурлусона XII века н. э.</b><br>
        Примерно в то же время датский хронист Саксон Грамматик в <b>«Деяниях датчан»</b> передаёт многие мифологические сюжеты. Ценные сведения о <br>древнегерманской мифологии имеются в <b>«Германии» Тацита</b>.</p>
  </details>
  <details>
    <summary>Покажи-скрой меня 3</summary>
    <p>Скандинавская мифология — мифология древних скандинавов, часть древнегерманской мифологии.</p>
  </details>
</div>

.wrapp {
  display: flex;
}
summary {
  position: relative;
  padding-right: 20px;
}
p {
  position: absolute;
  top: 20px;
  left: 0;  
}
  • Вопрос задан
  • 137 просмотров
Решения вопроса 2
не вижу вариантов, кроме js
const details = document.querySelectorAll("details");

details.forEach((targetDetail) => {
  targetDetail.addEventListener("click", () => {
    details.forEach((detail) => {
      if (detail !== targetDetail) {
        detail.removeAttribute("open");
      }
    });
  });
});
Ответ написан
0xD34F
@0xD34F Куратор тега CSS
Хорошо бы если на чистом css

Придётся сильно поменять разметку. Управлять видимостью вкладок можно с помощью скрытых радиокнопок.

но и js тоже можно

document.addEventListener('click', ({ target: { tagName, parentNode: p } }) => {
  if (tagName === 'SUMMARY') {
    document.querySelectorAll('details').forEach(n => n.open = n.open && n === p);
  }
});

// или

const summaries = document.querySelectorAll('summary');
const details = Array.from(summaries, n => n.parentNode);
const onClick = e => details.forEach(n => n.open = n.open && n === e.target.parentNode);
summaries.forEach(n => n.addEventListener('click', onClick));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы