Как сделать так, чтобы при раскрытии одного из одинаковых div с id="x" предыдущий сворачивался?

У меня возникли два вопроса относительно работы с несколькими div, которые имеют одинаковые id и открываются по клику. 

Вопрос 1: Как можно реализовать функционал, при котором предыдущий открытый div автоматически сворачивается, так чтобы на экране оставался развернутым только один div?

Вопрос 2: Как можно изменить или полностью убрать id у всех свёрнутых div, или же сделать так, чтобы они не взаимодействовали с определенным JavaScript до тех пор, пока не будет нажата кнопка "развернуть" (каждый div имеет свою кнопку)?
  • 4 апреля 2025 г. 17:55
Ответы на вопрос 3
Разберем оба ваших вопроса по порядку:

### Вопрос 1: Закрытие предыдущего `div` при открытии нового

Для того чтобы при открытии одного `div` автоматически закрывался предыдущий, вам нужно использовать JavaScript. Один из подходов — это добавить обработчик события клика на все ваши `div`. При каждом клике вы будете скрывать все `div`, а затем показывать только тот, на который кликнули.

Вот пример кода, как это можно реализовать:

```html
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Toggle Divs</title>
    <style>
        .content {
            display: none; /* Скрываем все div по умолчанию */
        }
    </style>
</head>
<body>
    <div id="x" class="toggle">Div 1</div>
    <div id="content1" class="content">Содержимое 1</div>

    <div id="x" class="toggle">Div 2</div>
    <div id="content2" class="content">Содержимое 2</div>

    <div id="x" class="toggle">Div 3</div>
    <div id="content3" class="content">Содержимое 3</div>

    <script>
        const toggles = document.querySelectorAll('.toggle');
        const contents = document.querySelectorAll('.content');

        toggles.forEach((toggle, index) => {
            toggle.addEventListener('click', () => {
                // Скрываем все содержимое
                contents.forEach(content => {
                    content.style.display = 'none';
                });

                // Показываем текущее содержимое
                const currentContent = contents[index];
                currentContent.style.display = (currentContent.style.display === 'block') ? 'none' : 'block';
            });
        });
    </script>
</body>
</html>
```

### Вопрос 2: Изменение или удаление `id` для свёрнутых `div`

С точки зрения семантики HTML, использование одинаковых `id` не является хорошей практикой, так как `id` должен быть уникальным на странице. Вместо этого рекомендуется использовать `class` атрибут. Таким образом, если вы хотите "отключить" взаимодействие для свёрнутых `div`, вы можете использовать `class` для управления состоянием вашего `div` и модифицировать ваше JavaScript.

Пример:

```html
<style>
    .disabled {
        pointer-events: none; /* Отключение кликов */
        opacity: 0.5; /* Обесцвечивание */
    }
</style>
```

В JavaScript добавьте код для управления классами:

```javascript
toggles.forEach((toggle, index) => {
    toggle.addEventListener('click', () => {
        // Скрываем все содержимое и отключаем их
        contents.forEach(content => {
            content.style.display = 'none';
            content.classList.add('disabled'); // Добавляем класс при скрытии
        });

        // Показываем текущее содержимое и включаем его
        const currentContent = contents[index];
        currentContent.style.display = 'block';
        currentContent.classList.remove('disabled'); // Убираем класс при показе
    });
});
```

### Итог
1. Чтобы реализовать автоматическое сворачивание, используйте события клика и управляйте отображением `div`.
2. Лучше использовать `class` вместо одинаковых `id` и применять управление классами для изменения их состояния.
с одинаковыми id
корень проблемы, начни с понимания что такое id, как поймешь, избавься от этого корня. Подсказка, селекторы могут не только по id быть, можно по class, data-атрибутам, да даже по расположению тегов.

ЗЫ посмотрел твои вопросы, на них в гугле отвечали 100500 раз, давай ходи сначала туда, а не бегай сюда на каждый чих.
https://htmlbook.ru/html/attr/id 
Задает стилевой идентификатор — уникальное имя элемента, которое используется для изменения его стиля и обращения к нему через скрипты. Идентификатор в коде документа должен быть в единственном экземпляре, иными словами, встречаться только один раз.

Т.е. в вашем случае следует исправить неверно присвоенные идентификаторы и обращаться к каждому элементу по его уникальному идентификатору. В случае, если же надо обращаться к группе элементов следует присвоить этой группе элементов одинаковый класс и обращаться к группе по этому классу.
Касательно вопроса обращения к предыдущему элементу - для этого существуют переменные. Т.е., присваиваете переменной текущий элемент, а при следующей итерации обращаетесь к элементу через эту переменную.
Похожие вопросы