Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,913

Компонент, показывающий всплывающую подсказку

25.04.2023, 13:11. Показов 614. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо реализовать компонент "Tooltip", который будет показывать всплывающую подсказку на элементах с data-атрибутом data-tooltip. Данный компонент должен быть реализован через паттерн "Singleton". Важно в данном компоненте своевременно добавлять и очищать обработчики событий
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!doctype html>
<meta charset="UTF-8">
<title>Tooltip</title>
 
<link rel="stylesheet" type="text/css" href="style.css">
 
<body>
  <div data-tooltip="foo">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi enim esse sapiente.
    Necessitatibus praesentium similique voluptatem.
    <div data-tooltip="bar-bar-bar">
      Aperiam consectetur dignissimos dolores ex mollitia.
    </div>
    Alias aliquid animi corporis debitis, eveniet explicabo facilis hic laborum magni nisi nulla
    numquam odio omnis quaerat quas quia, reiciendis repellat repellendus sint sit soluta suscipit
    temporibus voluptate.
  </div>
 
  <script type="module">
    import tooltip from './index.js';
 
    tooltip.initialize();
  </script>
</body>
HTML5
1
2
3
4
5
6
7
8
<!doctype html>
<meta charset="UTF-8">
<title>Tooltip</title>
<link rel="stylesheet" type="text/css" href="style.css">
 
<body>
  <div class="tooltip">This is tooltip</div>
</body>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.tooltip {
  cursor: pointer;
  position: fixed;
  padding: 8px 12px;
  border-radius: 4px;
  text-align: left;
  background: white;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25);
  font-size: 16px;
  line-height: 20px;
  color: rgba(51, 77, 110, 1);
  transition: opacity 0.1s ease-out;
  z-index: 99;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.04.2023, 13:11
Ответы с готовыми решениями:

Как сделать всплывающую подсказку для картинки, являющейся ссылкой, с выбором параметров: цвет, шрифт, фон и т. д.?
Подскажите, пожалуйста, простой код JavaScript всплывающей подсказки для картинки, являющейся ссылкой. Чтоб можно было выбирать параметры -...

Компонент, показывающий сообщения пользователям при загрузке данных на сервер
Необходимо реализовать компонент &quot;NotificationMessage&quot; цель которого показывать сообщения пользователям. Сообщения могут быть двух типов:...

Изменить всплывающую подсказку
При наведении на значок закрыть у формы, появляется всплывающая подсказка с надписью &quot;закрыть&quot;. Как изменить эту подсказку?

7
74 / 53 / 24
Регистрация: 10.06.2015
Сообщений: 162
25.04.2023, 18:45
index.js

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Tooltip {
  constructor() {
    this.tooltipElement = this.createTooltipElement();
    this.mouseOverHandler = this.mouseOverHandler.bind(this);
  }
 
  createTooltipElement() {
    const tooltipElement = document.createElement("div");
    tooltipElement.className = "tooltip";
    tooltipElement.style.opacity = 0;
    tooltipElement.style.pointerEvents = "none";
    document.body.appendChild(tooltipElement);
    return tooltipElement;
  }
 
  mouseOverHandler(event) {
    const target = event.target.closest("[data-tooltip]");
    if (!target) return;
 
    this.tooltipElement.textContent = target.dataset.tooltip;
    this.tooltipElement.style.opacity = 1;
    this.tooltipElement.style.pointerEvents = "auto";
    this.tooltipElement.style.left = event.pageX + 10 + "px";
    this.tooltipElement.style.top = event.pageY + 10 + "px";
 
    const mouseMoveHandler = (event) => {
      this.tooltipElement.style.left = event.pageX + 10 + "px";
      this.tooltipElement.style.top = event.pageY + 10 + "px";
    };
 
    const mouseOutHandler = () => {
      this.tooltipElement.style.opacity = 0;
      this.tooltipElement.style.pointerEvents = "none";
      target.removeEventListener("mouseout", mouseOutHandler);
      target.removeEventListener("mousemove", mouseMoveHandler);
    };
 
    target.addEventListener("mouseout", mouseOutHandler);
    target.addEventListener("mousemove", mouseMoveHandler);
  }
 
  initialize() {
    document.body.addEventListener("mouseover", this.mouseOverHandler);
  }
 
  destroy() {
    document.body.removeEventListener("mouseover", this.mouseOverHandler);
    this.tooltipElement.remove();
  }
}
 
const tooltip = new Tooltip();
export default tooltip;
0
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,913
28.04.2023, 10:39  [ТС]
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Tooltip {
  static instance = null;
  element = null;
  margin = 10;
  onPointerMove = (event) => {
    const {clientX, clientY} = event;
    this.element.style.left = `${clientX + this.margin}px`;
    this.element.style.top = `${clientY + this.margin}px`;
  }
  onPointerOver = (event) => {
    const targetElement = event.target.closest('[data-tooltip]');
    if (!targetElement) return;
    const text = targetElement.dataset.tooltip;
    const tooltipContent = targetElement.parentElement.closest('[data-tooltip]') ? `<b>${text}</b>` : text;
    this.render(tooltipContent);
    document.addEventListener('pointermove', this.onPointerMove);
  }
  onPointerOut = () => {
    this.remove();
    document.removeEventListener('pointermove', this.onPointerMove);
  }
  constructor() {
    if (Tooltip.instance) {
      return Tooltip.instance;
    }
    Tooltip.instance = this;
  }
  initialize () {
    document.addEventListener('pointerover', this.onPointerOver);
    document.addEventListener('pointerout', this.onPointerOut);
  }
  render(content) {
    const element = document.createElement('div');
    element.innerHTML = `<div class="tooltip">${content}</div>`;
    this.element = element.firstElementChild;
    document.body.append(this.element);
  }
  remove() {
    if (this.element) {
      this.element.remove();
    }
  }
  destroy() {
    document.removeEventListener('pointerover', this.onPointerMove);
    document.removeEventListener('pointerout', this.onPointerOut);
    document.removeEventListener('pointermove', this.onPointerMove);
    this.remove();
    this.element = null;
  }
}
export default Tooltip;
0
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,913
29.04.2023, 13:37  [ТС]
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Tooltip {
  element;
  static instance;
  constructor() {
    if (Tooltip.instance) {
      return Tooltip.instance;
    }
    Tooltip.instance = this;
  }
  initialize() {
    this.initEventListeners();
  }
  onMouseOver = event => {
    const hoverElem = event.target.closest('[data-tooltip]');
    if (hoverElem) {
      this.render(hoverElem.dataset.tooltip);
      document.addEventListener('pointermove', this.onMouseMove);
    }
  }
  onMouseMove = event => {
    this.moveTooltip(event);
  }
  onMouseOut = event => {
    this.removeTooltip();
  }
  removeTooltip() {
    if (this.element) {
      this.element.remove();
      this.element = null;
 
      document.removeEventListener('pointermove', this.onMouseMove);
    }
  }
  moveTooltip({posTop = event.clientY, posLeft = event.clientX}) {
    this.element.style.top = `${posTop + 10}px`;
    if (posLeft > window.innerWidth - this.element.clientWidth) {
      this.element.style.left = `${posLeft - this.element.clientWidth}px`;
    } else {
      this.element.style.left = `${posLeft + 10}px`;
    }
  }
  render(msg) {
    this.element = document.createElement('div');
    this.element.className = 'tooltip';
    this.element.innerHTML = msg;
    document.body.append(this.element);
  }
  initEventListeners() {
    document.addEventListener('pointerover', this.onMouseOver);
    document.addEventListener('pointerout', this.onMouseOut);
  }
  destroy() {
    document.removeEventListener('pointerover', this.onMouseOver);
    document.removeEventListener('pointerout', this.onMouseOut);
    this.removeTooltip();
  }
}
const tooltip = new Tooltip();
export default tooltip;
0
74 / 53 / 24
Регистрация: 10.06.2015
Сообщений: 162
29.04.2023, 14:07
Код рабочий. Или у вас что то не получается?
0
29.04.2023, 15:22

Не по теме:

eniqx, это же Вайтколор

0
74 / 53 / 24
Регистрация: 10.06.2015
Сообщений: 162
29.04.2023, 15:25
Цитата Сообщение от Padonak Посмотреть сообщение
eniqx, это же Вайтколор

Не по теме:

Это мне ни о чем не говорит, к сожалению) Пару раз встречался в каких-то темах, не более

0
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,913
29.04.2023, 19:22  [ТС]
Цитата Сообщение от eniqx Посмотреть сообщение
Код рабочий. Или у вас что то не получается?
Да, всё получилось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.04.2023, 19:22
Помогаю со студенческими работами здесь

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

Как реализовать всплывающую подсказку
Как можно сделать, чтобы при наведении мышки на какой-нибудь объект, появлялась всплывающая подсказка (рассказывающая для чего данный...

Убрать всплывающую подсказку в DropDownButton
Вопрос в заголовке. Условие - у вложенных кнопок всплывающие подсказки должны остатся. Добавлено через 11 минут Извините вопрос...

Фиксировать кликом всплывающую подсказку css
Всем привет! Прошу помощи одной простой задачей. Гуглил, примеров полно, но именно с таким нюансом ничего подобного, видимо это ближе к...

Как сделать всплывающую подсказку в jdk ?
Подскажите есть чтото стандартное в jdk для отображения всплывающей подсказки?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru