Проект: как добавить иконку с подсказкой к тексту на странице

Делаем красиво и полезно

Проект: как добавить иконку с подсказкой к тексту на странице

На многих сайтах можно встретить такое: идёт текст, а рядом с ним значок вопроса в кружочке. Мол, нажми на меня, и я тебе кое-что поясню про этот текст. Нажимаешь — и появляется подсказка сверху, которая потом так же легко закрывается. Вот это сегодня и будем делать, выглядит вот так:

Проект: как добавить иконку с подсказкой к тексту на странице

Готовим страницу

Так как проект очень простой, не будем мудрить с файлами и сделаем всё внутри одного. 

Создаём HTML-файл и заполняем его стандартным шаблоном для страницы. Сразу обернём в блок со своим классом всё содержимое (чтобы управлять внешним видом и поведением) и в отдельный блок запишем текст, который требует пояснения:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Текст с подсказкой</title>

</head>
<body>
    <div class="text-with-hint-container">
        <div class="text-with-hint">
            Здесь какой-то текст, который требует пояснения
        </div>
    </div>

</body>
</html>

Открываем в браузере и видим простую страницу с обычным дефолтным шрифтом и размером сверху в углу. Это всё потому, что мы не задали стили:

Проект: как добавить иконку с подсказкой к тексту на странице

Добавляем стили

Начинаем потихоньку наводить красоту — и будем это делать прямо в блоке <style> нашего HTML-файла. Когда проект учебный и цель — посмотреть сразу технологию в действии, так можно делать. 

Сначала зададим общие параметры для страницы: выровняем всё по центру и поменяем шрифт. Потом — выровняем текст внутри своего контейнера (потому что общие настройки выравнивают блоки, а не их содержимое) и настроим внешний вид текста с отступами:

<style>
    /* Основные стили для body — делаем его flex-контейнером */
    body {
        display: flex;           /* Включаем flex-разметку */
        justify-content: center; /* Горизонтальное выравнивание по центру */
        align-items: center;    /* Вертикальное выравнивание по центру */
        min-height: 100vh;      /* Минимальная высота — весь видимый экран */
        margin: 0;              /* Убираем стандартные отступы */
        font-family: Arial, sans-serif; /* Задаём шрифт */
    }
    
    /* Контейнер для центрированного текста с подсказкой */
    .text-with-hint-container {
        text-align: center;     /* Выравниваем текст по центру внутри контейнера */
    }
    
    /* Стили для блока с текстом и подсказкой */
    .text-with-hint {
        font-size: 18px;        /* Размер шрифта основного текста */
        position: relative;     /* Позиционируем относительно для абсолютного позиционирования подсказки */
        display: inline-block;  /* Делаем блок строчно-блочным */
        padding: 20px;          /* Внутренние отступы вокруг текста */
    }
    </style>

Уже лучше — теперь видно, что дизайнер тоже приложил руку:

Проект: как добавить иконку с подсказкой к тексту на странице

Добавляем значок подсказки

Для значка используем стандартный знак вопроса и оборачиваем его в отдельный блок со своим классом. Это нам пригодится, чтобы визуально оформить его, как нам нужно:

<div class="text-with-hint-container">
    <div class="text-with-hint">
        Здесь какой-то текст, который требует пояснения
        <span class="hint-trigger">?</span>
     </div>
</div>

Сразу же настроим стили значка: поместим его на свой фон, настроим скругление, поменяем цвет и сделаем так, чтобы курсор менял свой вид при наведении, чтобы пользователю было понятнее.

Отдельным блоком настроим изменение внешнего вида кружка при наведении — так будет ясно, что это интерактивный элемент. Как обычно, прокомментировали каждую строку кода:

/* Стили для кружочка с вопросительным знаком */
.hint-trigger {
    display: inline-flex;   /* Используем flex для выравнивания знака вопроса */
    align-items: center;    /* Вертикальное выравнивание по центру */
    justify-content: center;/* Горизонтальное выравнивание по центру */
    width: 20px;           /* Ширина кружочка */
    height: 20px;          /* Высота кружочка */
    background-color: #4285f4; /* Синий цвет фона */
    color: white;          /* Белый цвет текста (знака вопроса) */
    border-radius: 50%;    /* Делаем круглую форму */
    font-size: 14px;       /* Размер знака вопроса */
    font-weight: bold;     /* Жирный знак вопроса */
    cursor: pointer;       /* Курсор-указатель при наведении */
    margin-left: 5px;      /* Отступ слева от основного текста */
    vertical-align: super; /* Выравниваем немного выше базовой линии */
    line-height: 1;        /* Межстрочный интервал */
    transition: all 0.2s ease; /* Плавные анимации при изменениях */
}

/* Стили при наведении на кружочек */
.hint-trigger:hover {
    background-color: #3367d6; /* Тёмно-синий цвет при наведении */
    transform: scale(1.1);  /* Увеличиваем немного размер */
}

Первая часть проекта готова:

Проект: как добавить иконку с подсказкой к тексту на странице

Добавляем текст подсказки

Чтобы добавить подсказку на страницу, достаточно в основной блок после раздела со знаком вопроса добавить новый блок с нужным текстом:

<div class="hint-content">
    Это красиво оформленная подсказка, которая появляется при нажатии на знак вопроса. Она исчезнет, если вы кликнете в любом месте страницы.
</div>

Но проблема в том, что он появится сразу и не так красиво, потому что на него действуют общие стили родительского блока:

Проект: как добавить иконку с подсказкой к тексту на странице

Чтобы это исправить, добавим подсказке свои стили:

  • скроем её, чтобы потом показать по нажатию из скрипта;
  • оформим её в красивую всплывашку, которая будет указывать на текст, который она поясняет;
  • добавим анимацию появления (и исчезания).

Запишем всё это в виде CSS-команд в разделе со стилями. Посмотрите комментарии, чтобы стало понятнее, что на что влияет:

/* Стили для содержимого подсказки */
.hint-content {
    position: absolute;    /* Абсолютное позиционирование относительно родителя */
    bottom: 100%;          /* Располагаем над родительским элементом */
    left: 50%;             /* Центрируем по горизонтали */
    transform: translateX(-50%); /* Точное центрирование с учётом ширины */
    background-color: white; /* Белый фон подсказки */
    color: #333;           /* Тёмно-серый цвет текста */
    padding: 15px;        /* Внутренние отступы */
    border-radius: 8px;    /* Закруглённые углы */
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); /* Тень для эффекта «всплывающего окна» */
    width: 250px;          /* Фиксированная ширина подсказки */
    z-index: 100;          /* Поднимаем над другими элементами */
    display: none;         /* По умолчанию скрыта */
    font-size: 14px;      /* Размер шрифта в подсказке */
    line-height: 1.5;      /* Межстрочный интервал */
    margin-bottom: 10px;   /* Отступ снизу */
}

/* Треугольный указатель подсказки (стрелочка вниз) */
.hint-content:after {
    content: '';           /* Псевдоэлемент для создания стрелочки */
    position: absolute;    /* Абсолютное позиционирование */
    top: 100%;            /* Располагаем внизу подсказки */
    left: 50%;            /* Центрируем по горизонтали */
    transform: translateX(-50%); /* Точное центрирование */
    border-width: 8px;    /* Размер стрелочки */
    border-style: solid;   /* Сплошная граница */
    border-color: white transparent transparent transparent; /* Белый треугольник, остальные стороны прозрачные */
}

/* Класс для отображения подсказки */
.show-hint {
    display: block;       /* Делаем подсказку видимой */
    animation: fadeIn 0.2s ease; /* Анимация появления */
}

/* Анимация плавного появления подсказки */
@keyframes fadeIn {
    from { 
        opacity: 0;                     /* Начальная прозрачность */
        transform: translateX(-50%) translateY(10px); /* Начальное смещение вниз */
    }
    to { 
        opacity: 1;                     /* Конечная прозрачность */
        transform: translateX(-50%) translateY(0); /* Конечное положение */
    }
}

Если обновить страницу, увидим, что подсказка исчезла (это нормально, дальше включим её в скрипте):

Проект: как добавить иконку с подсказкой к тексту на странице

Пишем скрипт

У нас всё готово, чтобы запускать всё в работу, осталось только научить страницу реагировать на нажатие на подсказку.

Чтобы это сделать, мы:

  1. Получим доступ к классам блоков через их имена.
  2. Напишем функцию, которая добавит классам нужные свойства.
  3. Повесим обработчики событий на наши интерактивные элементы.

Подсказка не появляется сразу, потому что её начальное состояние в CSS задано как display: none. Она становится видимой только при клике на знак вопроса благодаря команде display: block; в CSS-классе .show-hint {}.

👉 Обратите внимание на команду e.stopPropagation(). Она меняет стандартное поведение DOM-дерева (и его обработки браузером) и гарантирует, что:

  • клик на знаке вопроса не приводит к мгновенному закрытию подсказки;
  • клик внутри подсказки не закрывает её.

Добавим раздел со скриптом в самый конец нашей страницы:

<script>
    document.addEventListener('DOMContentLoaded', function() {
        const hintTrigger = document.querySelector('.hint-trigger');
        const hintContent = document.querySelector('.hint-content');
        
        // Показать подсказку при клике на триггер
        hintTrigger.addEventListener('click', function(e) {
            e.stopPropagation();
            hintContent.classList.toggle('show-hint');
        });
        
        // Скрыть подсказку при клике в любом месте страницы
        document.addEventListener('click', function() {
            hintContent.classList.remove('show-hint');
        });
        
        // Предотвратить сокрытие при клике на саму подсказку
        hintContent.addEventListener('click', function(e) {
            e.stopPropagation();
        });
    });
</script>

Теперь всё красиво:

Проект: как добавить иконку с подсказкой к тексту на странице

Посмотреть работу подсказки на странице проекта

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Текст с подсказкой</title>
    <style>
    /* Основные стили для body — делаем его flex-контейнером */
    body {
        display: flex;           /* Включаем flex-разметку */
        justify-content: center; /* Горизонтальное выравнивание по центру */
        align-items: center;    /* Вертикальное выравнивание по центру */
        min-height: 100vh;      /* Минимальная высота — весь видимый экран */
        margin: 0;              /* Убираем стандартные отступы */
        font-family: Arial, sans-serif; /* Задаём шрифт */
    }
    
    /* Контейнер для центрированного текста с подсказкой */
    .text-with-hint-container {
        text-align: center;     /* Выравниваем текст по центру внутри контейнера */
    }
    
    /* Стили для блока с текстом и подсказкой */
    .text-with-hint {
        font-size: 18px;        /* Размер шрифта основного текста */
        position: relative;     /* Позиционируем относительно для абсолютного позиционирования подсказки */
        display: inline-block;  /* Делаем блок строчно-блочным */
        padding: 20px;          /* Внутренние отступы вокруг текста */
    }
    
    /* Стили для кружочка с вопросительным знаком */
    .hint-trigger {
        display: inline-flex;   /* Используем flex для выравнивания знака вопроса */
        align-items: center;    /* Вертикальное выравнивание по центру */
        justify-content: center;/* Горизонтальное выравнивание по центру */
        width: 20px;           /* Ширина кружочка */
        height: 20px;          /* Высота кружочка */
        background-color: #4285f4; /* Синий цвет фона */
        color: white;          /* Белый цвет текста (знака вопроса) */
        border-radius: 50%;    /* Делаем круглую форму */
        font-size: 14px;       /* Размер знака вопроса */
        font-weight: bold;     /* Жирный знак вопроса */
        cursor: pointer;       /* Курсор-указатель при наведении */
        margin-left: 5px;      /* Отступ слева от основного текста */
        vertical-align: super; /* Выравниваем немного выше базовой линии */
        line-height: 1;        /* Межстрочный интервал */
        transition: all 0.2s ease; /* Плавные анимации при изменениях */
    }
    
    /* Стили при наведении на кружочек */
    .hint-trigger:hover {
        background-color: #3367d6; /* Тёмно-синий цвет при наведении */
        transform: scale(1.1);  /* Увеличиваем немного размер */
    }
    
    /* Стили для содержимого подсказки */
    .hint-content {
        position: absolute;    /* Абсолютное позиционирование относительно родителя */
        bottom: 100%;          /* Располагаем над родительским элементом */
        left: 50%;             /* Центрируем по горизонтали */
        transform: translateX(-50%); /* Точное центрирование с учётом ширины */
        background-color: white; /* Белый фон подсказки */
        color: #333;           /* Тёмно-серый цвет текста */
        padding: 15px;        /* Внутренние отступы */
        border-radius: 8px;    /* Закруглённые углы */
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); /* Тень для эффекта «всплывающего окна» */
        width: 250px;          /* Фиксированная ширина подсказки */
        z-index: 100;          /* Поднимаем над другими элементами */
        display: none;         /* По умолчанию скрыта */
        font-size: 14px;      /* Размер шрифта в подсказке */
        line-height: 1.5;      /* Межстрочный интервал */
        margin-bottom: 10px;   /* Отступ снизу */
    }
    
    /* Треугольный указатель подсказки (стрелочка вниз) */
    .hint-content:after {
        content: '';           /* Псевдоэлемент для создания стрелочки */
        position: absolute;    /* Абсолютное позиционирование */
        top: 100%;            /* Располагаем внизу подсказки */
        left: 50%;            /* Центрируем по горизонтали */
        transform: translateX(-50%); /* Точное центрирование */
        border-width: 8px;    /* Размер стрелочки */
        border-style: solid;   /* Сплошная граница */
        border-color: white transparent transparent transparent; /* Белый треугольник, остальные стороны прозрачные */
    }
    
    /* Класс для отображения подсказки */
    .show-hint {
        display: block;       /* Делаем подсказку видимой */
        animation: fadeIn 0.2s ease; /* Анимация появления */
    }
    
    /* Анимация плавного появления подсказки */
    @keyframes fadeIn {
        from { 
            opacity: 0;                     /* Начальная прозрачность */
            transform: translateX(-50%) translateY(10px); /* Начальное смещение вниз */
        }
        to { 
            opacity: 1;                     /* Конечная прозрачность */
            transform: translateX(-50%) translateY(0); /* Конечное положение */
        }
    }
</style>
</head>
<body>
    <div class="text-with-hint-container">
        <div class="text-with-hint">
            Здесь какой-то текст, который требует пояснения
            <span class="hint-trigger">?</span>
            <div class="hint-content">
                Это красиво оформленная подсказка, которая появляется при нажатии на знак вопроса. Она исчезнет, если вы кликнете в любом месте страницы.
            </div>
        </div>
    </div>

<script>
    document.addEventListener('DOMContentLoaded', function() {
        const hintTrigger = document.querySelector('.hint-trigger');
        const hintContent = document.querySelector('.hint-content');
        
        // Показать подсказку при клике на триггер
        hintTrigger.addEventListener('click', function(e) {
            e.stopPropagation();
            hintContent.classList.toggle('show-hint');
        });
        
        // Скрыть подсказку при клике в любом месте страницы
        document.addEventListener('click', function() {
            hintContent.classList.remove('show-hint');
        });
        
        // Предотвратить скрытие при клике на саму подсказку
        hintContent.addEventListener('click', function(e) {
            e.stopPropagation();
        });
    });
</script>
</body>
</html>

Вам слово

Приходите к нам в соцсети поделиться своим мнением о проекте с подсказкой и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Обложка:

Алексей Сухов

Корректор:

Александр Зубов

Вёрстка:

Егор Степанов

Соцсети:

Юлия Зубарева

Вам может быть интересно
easy