Подсказки | MapGL | 2GIS Documentation

Подсказки

Чтобы показать всплывающую подсказку при наведении курсора на объект, нужно создать HTML-элемент и показывать/скрывать его в обработчиках событий mouseover и mouseout.

Например, чтобы добавить подсказку для маркера, нужно добавить обработчики для событий mouseover и mouseout при помощи метода on():

marker.on('mouseover', (e) => {
    console.log('курсор перешёл на маркер');
});
marker.on('mouseout', (e) => {
    console.log('курсор покинул маркер');
});

Основной смысл в том, чтобы показать HTML-элемент в обработчике mouseover и скрыть его в обработчике mouseout. Координаты для показа элемента можно получить через объект события (см. MapPointerEvent).

Перед показом элемент нужно скрыть и указать абсолютное позиционирование (position: absolute; или position: fixed;). Кроме этого, нужно указать для свойства pointer-events значение none или добавить небольшой отступ для элемента. Если этого не сделать, подсказка будет показана прямо под курсором, что приведет к событию mouseout, обработчик которого скроет подсказку.

Пример разметки для простой подсказки:

<style>
    #tooltip {
        padding: 20px 40px;
        background: #fff;
        display: none;
        position: fixed;
        pointer-events: none;
    }
</style>
<div id="tooltip">Hello, world!</div>

Примера кода, который покажет подсказку при наведении курсора на маркер:

const tooltipEl = document.getElementById('tooltip');

marker.on('mouseover', (event) => {
    // Отступ в пикселях
    const offset = 5;

    tooltipEl.style.top = `${event.point[1] + offset}px`;
    tooltipEl.style.left = `${event.point[0] + offset}px`;
    tooltipEl.style.display = 'block';
});

marker.on('mouseout', (e) => {
    tooltipEl.style.display = 'none';
});

Полный пример кода приведён ниже. Наведите курсор на маркер, чтобы увидеть подсказку.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>2GIS Map API</title>
        <meta name="description" content="Example of a tooltip for a marker" />
        <style>
            html,
            body,
            #container {
                margin: 0;
                width: 100%;
                height: 100%;
                overflow: hidden;
            }

            #tooltip {
                padding: 20px 40px;
                background: #fff;
                box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
                border-radius: 4px;
                display: none;
                position: fixed;
                pointer-events: none;
            }
        </style>
    </head>
    <body>
        <div id="container"></div>
        <div id="tooltip">Hello, world!</div>
        <script src="https://mapgl.2gis.com/api/js/v1"></script>
        <script>
            const map = new mapgl.Map('container', {
                center: [55.31878, 25.23584],
                zoom: 13,
                key: 'Your API access key',
            });
            const marker = new mapgl.Marker(map, {
                coordinates: [55.31878, 25.23584],
                icon: 'https://docs.2gis.com/img/mapgl/marker.svg',
            });
            const tooltipEl = document.getElementById('tooltip');

            marker.on('mouseover', (event) => {
                // Offset in pixels
                const offset = 5;

                tooltipEl.style.top = `${event.point[1] + offset}px`;
                tooltipEl.style.left = `${event.point[0] + offset}px`;
                tooltipEl.style.display = 'block';
            });

            marker.on('mouseout', (e) => {
                tooltipEl.style.display = 'none';
            });
        </script>
    </body>
</html>

Подсказки можно добавлять и для других типов объектов. Например, чтобы добавить подсказку для линии, нужно добавить обработчики для тех же двух событий mouseover и mouseout, которые были использованы в примере выше.

Далее приведён полный пример кода. Чтобы увидеть подсказку, наведите курсор на линию.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>2GIS Map API</title>
        <meta name="description" content="Example of a tooltip for a polyline" />
        <style>
            html,
            body,
            #container {
                margin: 0;
                width: 100%;
                height: 100%;
                overflow: hidden;
            }

            #tooltip {
                padding: 20px 40px;
                background: #fff;
                box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
                border-radius: 4px;
                display: none;
                position: fixed;
                pointer-events: none;
            }
        </style>
    </head>
    <body>
        <div id="container"></div>
        <div id="tooltip">Hello, world!</div>
        <script src="https://mapgl.2gis.com/api/js/v1"></script>
        <script>
            const map = new mapgl.Map('container', {
                center: [55.31878, 25.23584],
                zoom: 13,
                key: 'Your API access key',
            });
            const polyline = new mapgl.Polyline(map, {
                coordinates: [
                    [55.28770929, 25.22069944],
                    [55.28976922, 25.25656786],
                    [55.33096795, 25.22007825],
                    [55.33302789, 25.25687836],
                ],
                width: 10,
                color: '#00b7ff',
            });
            const tooltipEl = document.getElementById('tooltip');

            polyline.on('mouseover', (event) => {
                // Offset in pixels
                const offset = 5;

                tooltipEl.style.top = `${event.point[1] + offset}px`;
                tooltipEl.style.left = `${event.point[0] + offset}px`;
                tooltipEl.style.display = 'block';
            });

            polyline.on('mouseout', (e) => {
                tooltipEl.style.display = 'none';
            });
        </script>
    </body>
</html>