Как позиционировать x-координату под курсором мыши в react-tooltip?

Вопрос или проблема

Я в настоящее время реализовал подсказки с помощью библиотеки react-tooltip.
Проблема в том, что подсказка должна быть расположена ниже курсора мыши, а не в начальной точке элемента.
Я использовал опцию position, но это не работает для меня, потому что я должен использовать ось y без условий.
Вы знаете, как использовать значение, примененное в react-tooltip для оси y, и указать только значение для оси x?

function App() {
  const arr = Array.from({ length: 10 }, (_, i) => i);
  const [tooltipPosition, setTooltipPosition] = useState({ x: 0, y: 0 });

  const handleMouseEnter = (event) => {
    const { pageX, pageY } = event;
    setTooltipPosition({ x: pageX, y: pageY });
  };

  return (
    <>
      <Tooltip
        id='tooltip'
        positionStrategy='fixed'
        position={tooltipPosition}
        clickable
      />
      <div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
        {arr.map((item) => (
          <div
            data-tooltip-id='tooltip'
            data-tooltip-content="Hello world!"
            data-tooltip-place="bottom-start"
            onMouseEnter={handleMouseEnter}
            style={{ width: '100vw', height: '100px', backgroundColor: 'gray' }}
          />
        ))}
      </div>
    </>
  );
}

При таком применении подсказка должна быть направлена вверх, но проблема в том, что она направлена вниз. Поэтому я хочу установить значение, указанное в react-tooltip для оси y, и указать только значение для оси x. Есть ли способ это сделать?

Моя текущая ситуация:
моя текущая ситуация

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

Что вам нужно, так это логика, которая будет отслеживать положение мыши.

Проверьте этот ответ для аналогичной проблемы: https://stackoverflow.com/a/71640760/27893855

Применяя информацию из этого ответа к вашему коду, вы получите следующее:

function App() {
  const arr = Array.from({ length: 10 }, (_, i) => i);
  const [tooltipPosition, setTooltipPosition] = useState({ x: 0, y: 0 });

  const handleMouseMove(e) {
     const { screenX, screenY } = event;
     setTooltipPosition({ x: screenX, y: screenY });
  }

  return (
    <>
      <Tooltip
        id='tooltip'
        positionStrategy='fixed'
        position={tooltipPosition}
        clickable
      />
      <div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
        {arr.map((item) => (
          <div
            data-tooltip-id='tooltip'
            data-tooltip-content="Hello world!"
            data-tooltip-place="bottom-start"
            onMouseMove={handleMouseMove}
            style={{ width: '100vw', height: '100px', backgroundColor: 'gray' }}
          />
        ))}
      </div>
    </>
  );
}

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

Вам, возможно, потребуется добавить некоторый код для скрытия подсказки, когда пользователь больше не наводит курсор на элемент, но поскольку вопрос не фокусируется на этом, я не добавлял логику для этого. Если вы хотите сделать что-то подобное, посмотрите на MDN – событие mouseleave.

Ответ или решение

Как расположить тултип под курсором мыши в react-tooltip

Иногда в процессе разработки приложений на React с использованием библиотеки react-tooltip возникает задача установить положение тултипа непосредственно под курсором мыши, а не у границы элемента. В этой статье мы обсудим, как достичь этого и корректно настроить позиционирование тултипа с учетом только оси X.

Исходная проблема

При реализации тултипов, как в вашем коде, вы используете событие onMouseEnter для установки положения тултипа, что приводит к тому, что тултип появляется в заданной позиции на момент наведения курсора. Однако, эта позиция не обновляется, когда курсор мыши перемещается по элементу, что отрицательно сказывается на UX.

Шаги для решения проблемы

Для того чтобы тултип следовал за курсором мыши и располагался под ним, нужно будет изменить обработчик событий на onMouseMove. Это обеспечит обновление позиции тултипа в реальном времени. Также, чтобы тултип находился оставаясь у курсора, нужно корректировать значение по оси Y в соответствии с высотой тултипа.

Вот обновленный код, который решает эту задачу:

import React, { useState } from 'react';
import Tooltip from 'react-tooltip';

function App() {
  const arr = Array.from({ length: 10 }, (_, i) => i);
  const [tooltipPosition, setTooltipPosition] = useState({ x: 0, y: 0 });

  const handleMouseMove = (event) => {
    const { pageX, pageY } = event;
    // Определяем позицию Y так, чтобы тултип находился под курсором
    setTooltipPosition({ x: pageX, y: pageY + 10 }); // 10 - пробел между курсором и тултипом
  };

  return (
    <>
      <Tooltip
        id='tooltip'
        positionStrategy='fixed'
        position={tooltipPosition}
        clickable
      />
      <div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
        {arr.map((item) => (
          <div
            data-tooltip-id='tooltip'
            data-tooltip-content="Hello world!"
            data-tooltip-place="bottom-start"
            onMouseMove={handleMouseMove}
            style={{ width: '100vw', height: '100px', backgroundColor: 'gray' }}
            key={item}
          />
        ))}
      </div>
    </>
  );
}

export default App;

Пояснение к коду

  1. Обработчик onMouseMove: Этот обработчик отслеживает движение мыши и обновляет положение тултипа каждый раз, когда курсор перемещается над элементом. Мы используем параметры pageX и pageY, чтобы получить текущие координаты мыши.

  2. Установка Y: Мы добавляем небольшое значение (например, 10 пикселей) к pageY, чтобы тултип располагался ниже курсора, что улучшает читабельность и восприятие информации.

  3. Параметр positionStrategy: Убедитесь, что установленный параметр positionStrategy='fixed' позволяет тултипу оставаться в заданной позиции на экране, даже если происходит прокрутка.

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

Дополнительные рекомендации

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

const handleMouseLeave = () => {
    // Логика для скрытия тултипа
};

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...