Source:

https://html.ildar-meyker.ru/html-kgeu/components.html?tab=tab-maps

Демо:

Плагины:

Подключение:

//

<script
    src="https://api-maps.yandex.ru/2.1/?apikey=4ee83d51-9c82-4832-ae32-283ef606144b
&lang=ru_RU"
    type="text/javascript"
></script>

Разметка:

//
<div
    class="map-contacts"
    data-id="map-contacts-1"
    data-center="[59.779398, 30.459721]"
    data-hint="г. Санкт-Петербург, Московское ш., д. 177, к. 2 лит. Ж"
    data-assets-url=""
>
    <div class="map-contacts__container">
        <div
            id="map-contacts-1"
            style="width: 100%; height: 100%"
        ></div>
    </div>
</div>

Стили:

//
.map-contacts {
    position: relative;
    background: #f3f3f3;
    border-radius: 2rem;
    overflow: hidden;

    &:before {
        content: " ";
        padding-top: 55%;
        display: block;
    }

    &__container {
        @include fill;

        [class*="ymaps-2"][class*="-ground-pane"] {
            filter: #{"grayscale()"};
        }
        [class*="ymaps-2"][class*="copyrights-pane"] {
            display: none !important;
        }
        [class*="ymaps-2"][class*="controls__control"] {
            inset: 3rem 3rem auto auto !important;
        }
    }

    &__btn-zoom-in,
    &__btn-zoom-out {
        cursor: pointer;
        background: #fff;
        border-radius: 50%;
        font-size: 4.8rem;
        width: 1em;
        height: 1em;
        display: flex;
        justify-content: center;
        align-items: center;
        color: #000;

        .icon {
            font-size: 1.2rem;
        }
    }
}

@media (max-width: 999.98px) {
    .map-contacts {
        border-radius: 0.8rem;

        &:before {
            padding-top: 100%;
        }

        &__btn-zoom-in,
        &__btn-zoom-out {
            font-size: 3.5rem;
        }

        &__container {
            [class*="ymaps-2"][class*="controls__control"] {
                inset: 1rem 1rem auto auto !important;
            }
        }
    }
}

Инициализация:

//
if (typeof ymaps !== "undefined") {
    ymaps.ready(init);
}


const CLASS_ZOOM_IN = "map-contacts__btn-zoom-in";
const CLASS_ZOOM_OUT = "map-contacts__btn-zoom-out";

function init() {
    $(".map-contacts").each(function () {
        const $root = $(this);

        const { id, center, hint } = $root.data();
        const assetsUrl = $root.data("assets-url");

        const myMap = new ymaps.Map(id, {
            center,
            controls: [],
            zoom: 15,
        });

        const myPlacemark = new ymaps.Placemark(
            center,
            {
                hintContent: hint,
                balloonContent: hint,
                iconContent: "",
            },
            {
                // Опции.
                // Необходимо указать данный тип макета.
                iconLayout: "default#image",
                // Своё изображение иконки метки.
                iconImageHref: assetsUrl + "img/map-marker.svg",
                // Размеры метки.
                iconImageSize: [80, 92],
                // Смещение левого верхнего угла иконки относительно
                // её "ножки" (точки привязки).
                iconImageOffset: [-40, -92],
            }
        );

        // Создадим пользовательский макет ползунка масштаба.
        const ZoomLayout = ymaps.templateLayoutFactory.createClass(
            `<div>
                <div class='${CLASS_ZOOM_IN}'>
                    <svg class="icon">
                        <use xlink:href="${assetsUrl}img/icons/general/sprite.svg#zoom-in"></use>
                    </svg>
                </div>
                <div class='${CLASS_ZOOM_OUT}'>
                    <svg class="icon">
                        <use xlink:href="${assetsUrl}img/icons/general/sprite.svg#zoom-out"></use>
                    </svg>
                </div>
            "</div>`,
            {
                // Переопределяем методы макета, чтобы выполнять дополнительные действия
                // при построении и очистке макета.
                build: function () {
                    // Вызываем родительский метод build.
                    ZoomLayout.superclass.build.call(this);

                    // Привязываем функции-обработчики к контексту и сохраняем ссылки
                    // на них, чтобы потом отписаться от событий.
                    this.zoomInCallback = ymaps.util.bind(this.zoomIn, this);
                    this.zoomOutCallback = ymaps.util.bind(this.zoomOut, this);

                    // Начинаем слушать клики на кнопках макета.
                    $root
                        .find("." + CLASS_ZOOM_IN)
                        .on("click", this.zoomInCallback);
                    $root
                        .find("." + CLASS_ZOOM_OUT)
                        .on("click", this.zoomOutCallback);
                },

                clear: function () {
                    // Снимаем обработчики кликов.
                    $root
                        .find("." + CLASS_ZOOM_IN)
                        .off("click", this.zoomInCallback);
                    $root
                        .find("." + CLASS_ZOOM_OUT)
                        .off("click", this.zoomOutCallback);

                    // Вызываем родительский метод clear.
                    ZoomLayout.superclass.clear.call(this);
                },

                zoomIn: function () {
                    var map = this.getData().control.getMap();
                    map.setZoom(map.getZoom() + 1, { checkZoomRange: true });
                },

                zoomOut: function () {
                    var map = this.getData().control.getMap();
                    map.setZoom(map.getZoom() - 1, { checkZoomRange: true });
                },
            }
        );

        const zoomControl = new ymaps.control.ZoomControl({
            options: { layout: ZoomLayout },
        });

        myMap.geoObjects.add(myPlacemark);
        myMap.behaviors.disable("scrollZoom");
        myMap.controls.add(zoomControl);
    });
}


0 комментариев

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

Avatar placeholder

Ваш адрес email не будет опубликован. Обязательные поля помечены *