Как правильно реализовать закрытие CSS тултипа по клику вне него, используя JavaScript и чекбокс?

Здравствуйте! У меня есть вопрос по поводу реализации тултипов на CSS. Я хочу, чтобы они появлялись и скрывались по клику, а не при наведении (хове). Также важно, чтобы тултипы закрывались при клике вне элементов. В принципе, у меня все работает с чекбоксами, но возникает одна проблема: после клика вне элемента тултип закрывается, но следующий клик по чекбоксу не срабатывает — он срабатывает только со второго раза, чтобы снова открыть тултип. Можете подсказать, в чем может быть ошибка?
  • 9 декабря 2024 г. 11:13
Ответы на вопрос 2
Для реализации функциональности, где тултип открывается и закрывается при клике на чекбокс, а также закрывается при клике вне него, можно использовать подход с обработчиками событий. Вы можете столкнуться с проблемой, когда закрытие тултипа вызывает потерю фокуса с чекбокса, что приводит к неправильной работе кликов при последовательном взаимодействии.

Вот пример того, как можно реализовать такую функциональность:

```html
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Tooltip</title>
    <style>
        .tooltip {
            display: none;
            position: absolute;
            background-color: #333;
            color: #fff;
            padding: 5px;
            border-radius: 5px;
        }
        .checkbox-container {
            position: relative;
            display: inline-block;
        }
    </style>
</head>
<body>

<div class="checkbox-container">
    <input type="checkbox" id="tooltip-toggler">
    <label for="tooltip-toggler">Нажмите, чтобы показать тултип</label>
    <div class="tooltip">Это тултип</div>
</div>

<script>
    const checkbox = document.getElementById("tooltip-toggler");
    const tooltip = document.querySelector(".tooltip");

    checkbox.addEventListener("click", function(event) {
        // Показываем или скрываем тултип в зависимости от состояния чекбокса
        tooltip.style.display = checkbox.checked ? "block" : "none";
        event.stopPropagation(); // Предотвращаем событие всплытия
    });

    // Закрываем тултип при клике вне него
    document.addEventListener("click", function(event) {
        const isClickInside = checkbox.parentElement.contains(event.target);
        if (!isClickInside) {
            checkbox.checked = false; // Сбрасываем чекбокс
            tooltip.style.display = "none"; // Скрываем тултип
        }
    });
</script>

</body>
</html>
```

### Описание работы кода:

1. **HTML**: Мы создали чекбокс и соответствующий тултип с меткой.
2. **CSS**: Стили для тултипа, который скрывается по умолчанию.
3. **JavaScript**:
   - Установили обработчик клика на чекбокс. При клике мы показываем или скрываем тултип в зависимости от состояния чекбокса.
   - Используем `event.stopPropagation()` для предотвращения передачи события клика вверх, чтобы не вызвать закрытие тултипа сразу после открытия.
   - Добавили обработчик события клика на документ. Если клик произошел вне контейнера с чекбоксом (включающим и сам тултип), мы сбрасываем состояние чекбокса и скрываем тултип.

Таким образом, пользователь сможет открывать и закрывать тултип, а также возвращаться к нему при новом клике по чекбоксу без необходимости дополнительных действий.
<blockquote>Где ошибка?</blockquote> <br/> в лишнем кода и неверном использовании jQuery <br/> <pre><code class="diff">$('body').click(function(event) { 
 if(!$(event.target).is('.li-tooltip span') &amp;&amp; !$(event.target).is('.li-tooltip input')) {
-    $('.li-tooltip input').checked = 'false';
+    $('.li-tooltip input').prop('checked', false);
-    $('.li-tooltip span').hide();
}  
});
-  $('.li-tooltip input').on('click', function () {
-      $(this).parents().children('span').toggle();
- })</code></pre>
Похожие вопросы