Чтобы не гуглить каждый раз при создании своей интерактивной карты — эта статья для вас. Ниже — простой, рабочий способ вставить карту с несколькими метками на любой сайт. Только HTML и JavaScript. Никаких фреймворков, никакой магии.
Сначала добавьте на страницу блок, в котором будет отображаться карта. Главное — задать ему высоту и ширину:
<div id="map-yandex" style="width: 100%; height: 500px;"></div>
💡 Без
heightкарта не покажется — API Яндекса требует явного размера контейнера.
Теперь вставьте этот скрипт прямо перед закрывающим
(или внизу статьи, если ваш блог позволяет):
<!-- Контейнер карты -->
<div class="ymap-container">
<div id="map-yandex" style="width: 100%; height: 400px;"></div>
<div class="loader"></div>
</div>
<script>
// Флаг, чтобы загрузить карту только один раз
let mapLoaded = false;
// Инициализация карты и метки
function initMap() {
// Создаём карту с центром и зумом
const map = new ymaps.Map("map-yandex", {
center: [55.73, 37.59],
zoom: 10,
controls: ['zoomControl', 'fullscreenControl']
});
// Опции для кастомной иконки метки
const markerOptions = {
iconLayout: 'default#imageWithContent',
iconImageHref: '/map/img/marker.svg', // путь к SVG-иконке
iconImageSize: [50, 50],
iconImageOffset: [-25, -50]
};
// Одна метка с балуном (всплывающим окном)
const placemark = new ymaps.Placemark(
[55.73, 37.59], // координаты
{
balloonContent: 'Пример адреса<br><a href="#" style="color:blue">Подробнее на Яндекс.Картах</a>'
},
markerOptions
);
// Добавляем метку на карту
map.geoObjects.add(placemark);
// Скрываем спиннер после полной загрузки тайлов
waitForTilesLoad(map.layers.get(0).get(0)).then(() => {
document.querySelector('.loader').classList.remove('is-active');
});
}
// Вспомогательная функция: ждём загрузки всех тайлов карты
function waitForTilesLoad(layer) {
return new ymaps.vow.Promise((resolve) => {
const tc = getTileContainer(layer);
if (!tc) return resolve();
const allReady = tc.tiles.all((tile) => tile.isReady());
if (allReady) {
resolve();
} else {
tc.events.once('ready', resolve);
}
});
}
// Находим контейнер с тайлами (внутренняя реализация API)
function getTileContainer(layer) {
for (const key in layer) {
if (
layer[key] instanceof ymaps.layer.tileContainer.CanvasContainer ||
layer[key] instanceof ymaps.layer.tileContainer.DomContainer
) {
return layer[key];
}
}
return null;
}
// Загрузка скрипта API Яндекс.Карт
function loadYmapsScript(callback) {
const script = document.createElement('script');
script.src = 'https://api-maps.yandex.ru/2.1/?lang=ru_RU';
script.onload = callback;
document.head.appendChild(script);
}
// Инициализация карты при первом наведении на контейнер
document.querySelector('.ymap-container').addEventListener('mouseenter', () => {
if (!mapLoaded) {
mapLoaded = true;
document.querySelector('.loader').classList.add('is-active');
loadYmapsScript(() => ymaps.load(initMap));
}
});
</script>
Если вы хотите использовать свою иконку (например, /map/img/marker.svg), убедитесь, что файл существует по этому пути. Если нет — либо загрузите его, либо временно удалите строки:
iconImageHref: '/map/img/marker.svg',
iconImageSize: [50, 50],
iconImageOffset: [-25, -50]
Тогда будут использоваться стандартные метки Яндекса.
Теперь у вас на сайте работает живая карта с вашими адресами. И в следующий раз — просто скопируете этот код и не будете снова искать в Google 😌
P.S. Код работает без jQuery, без CSS-фреймворков и даже без отдельных JS-файлов. Просто вставил — и заработало.
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!