В этой заметке я продолжаю свой рассказ об особенностях использования API Яндекс.Карт версии 2.х начатой в заметках здесь и здесь.
И теперь рассмотрим работу с балуном.
Давайте рассмотрим пример отображения балуна при клике на метке.
Код примера:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Пример добавления метки и балуна, с использованием JavaScript API Яндекс.Карт 2.0</title>
<!-- Подключаем API карт 2.x -->
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
// Как только будет загружен API и готов DOM, выполняем инициализацию
ymaps.ready(init);
function init () {
// Создание экземпляра карты и его привязка к контейнеру с
// заданным id ("map")
var myMap = new ymaps.Map('map', {
// При инициализации карты, обязательно нужно указать
// ее центр и коэффициент масштабирования
center: [56.315695,44.017063], // Нижний Новгород
zoom: 15
});
// Создание метки
var myPlacemark = new ymaps.Placemark(
// Координаты метки
[56.315695,44.017063], {
balloonContent: 'Оперный театр'
}
);
// Добавление метки на карту
myMap.geoObjects.add(myPlacemark);
}
</script>
</head>
<body>
<div id="map" style="width:600px; height:400px"></div>
</body>
</html> |

В этом примере мы добавляем параметр balloonContent: ‘Оперный театр’.
Мы можем задавать содержимое для разных частей макета балуна (заголовок, содержимое, подвал).
Пример кода:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Пример добавления балуна с заданием содержимого - JavaScript API Яндекс.Карт 2.0</title>
<!-- Подключаем API карт 2.x -->
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
// Как только будет загружен API и готов DOM, выполняем инициализацию
ymaps.ready(init);
function init () {
// Создание экземпляра карты и его привязка к контейнеру с
// заданным id ("map")
var myMap = new ymaps.Map('map', {
// При инициализации карты, обязательно нужно указать
// ее центр и коэффициент масштабирования
center: [56.315695,44.017063], // Нижний Новгород
zoom: 15
});
// Создание метки
var myPlacemark = new ymaps.Placemark(
// Координаты метки
[56.315695,44.017063], {
balloonContentHeader: '<strong>Оперный театр</strong>',
balloonContentBody: 'Содержимое <em>балуна</em>',
balloonContentFooter: 'Подвал'
}
);
// Добавление метки на карту
myMap.geoObjects.add(myPlacemark);
}
</script>
</head>
<body>
<div id="map" style="width:600px; height:400px"></div>
</body>
</html> |

В этом примере содержимое для заголовка задает параметр balloonContentHeader, balloonContentBody — задает основную часть и balloonContentFooter — нижнюю часть (подвал) балуна.
В следующем примере, рассмотрим как можно отобразить балун на карте без метки.
Код примера:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Пример добавления балуна без метки, с использованием JavaScript API Яндекс.Карт 2.0</title>
<!-- Подключаем API карт 2.x -->
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
// Как только будет загружен API и готов DOM, выполняем инициализацию
ymaps.ready(init);
function init () {
// Создание экземпляра карты и его привязка к контейнеру с
// заданным id ("map")
var myMap = new ymaps.Map('map', {
// При инициализации карты, обязательно нужно указать
// ее центр и коэффициент масштабирования
center: [56.315695,44.017063], // Нижний Новгород
zoom: 15
});
myMap.balloon.open(
// Позиция балуна
[56.315695,44.017063], {
contentBody: 'Оперный театр'
}, {
// Опции балуна. В данном примере указываем, что балун не должен иметь кнопку закрытия.
closeButton: false
});
}
</script>
</head>
<body>
<div id="map" style="width:600px; height:400px"></div>
</body>
</html> |

Здесь мы определяем параметры для открытого балуна: позинию на карте, содержимое — contentBody: ‘Оперный театр’, а ткже задаем опцию для балуна — отсутствие кнопки закрытия closeButton: false
Еще одной интересной возможностью для работы с балунами является использование шаблонов для задания макета содержимого.
Пример кода:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Пример задаем шаблон для балуна - JavaScript API Яндекс.Карт 2.0</title>
<!-- Подключаем API карт 2.x -->
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
// Как только будет загружен API и готов DOM, выполняем инициализацию
ymaps.ready(init);
function init () {
// Создание экземпляра карты и его привязка к контейнеру с
// заданным id ("map")
var myMap = new ymaps.Map('map', {
// При инициализации карты, обязательно нужно указать
// ее центр и коэффициент масштабирования
center: [56.317222,44.002149],
zoom: 14
});
myPlacemarkOpera = new ymaps.Placemark([56.315695,44.017063], {
name: 'Оперный театр',
address: 'ул. Белинского, 59',
websayt: 'www.operann.ru/'
}),
myPlacemarkDramma = new ymaps.Placemark([56.324117,44.00136], {
name: 'Театр драмы',
address: 'ул. Большая Покровская, д. 13',
websayt: 'www.drama.nnov.ru'
}),
myPlacemarkKomedia = new ymaps.Placemark([56.320203,44.002321], {
name: 'Нижегородский театр «Комедія»',
address: 'ул. Грузинская, д. 23',
websayt: 'comedia.nnov.ru'
}),
// Создаем коллекцию, в которую будем добавлять метки
myCollection = new ymaps.GeoObjectCollection();
//Добавляем метки в коллекцию геообъектов.
myCollection
.add(myPlacemarkOpera)
.add(myPlacemarkDramma)
.add(myPlacemarkKomedia);
// Создаем шаблон для отображения контента балуна
var myBalloonLayout = ymaps.templateLayoutFactory.createClass(
'<h3>$[properties.name]</h3>' +
'<p><strong>Адрес:</strong> $[properties.address]</p>' +
'<p><strong>Веб-сайт:</strong> <a rel="nofollow" href="http://$[properties.websayt]" target="_blank">перейти</a></p>'
);
// Помещаем созданный шаблон в хранилище шаблонов. Теперь наш шаблон доступен по ключу 'my#theaterlayout'.
ymaps.layout.storage.add('my#theaterlayout', myBalloonLayout);
// Задаем наш шаблон для балунов геобъектов коллекции.
myCollection.options.set({
balloonContentBodyLayout:'my#theaterlayout',
// Максимальная ширина балуна в пикселах
balloonMaxWidth: 300
});
// Добавляем коллекцию геообъектов на карту.
myMap.geoObjects.add(myCollection);
}
</script>
</head>
<body>
<div id="map" style="width:600px; height:400px"></div>
</body>
</html> |

В начале мы задаем параметры для меток на карте.
Потом мы создаем коллекцию геообъектов myCollection и добавляем в нее наши метки.
После этого задаем шаблон для отображения контента балуна.
Добавляем созданный шаблон в хранилище и применяем его для нашей коллекции меток.
В самом конце добавляем коллекцию геообъектов на карту.
Еще один пример — создание макета балуна для полного изменения его внешнего вида.
В самом начале мы должны подготовить изображение будущего балуна.
Это можно сделать в любом графическом редакторе.
Теперь мы можем написать код для нашего примера:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Пример балун со своим макетом - JavaScript API Яндекс.Карт 2.0</title>
<!-- Подключаем API карт 2.x -->
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
// Как только будет загружен API и готов DOM, выполняем инициализацию
ymaps.ready(init);
function init () {
// Создание экземпляра карты и его привязка к контейнеру с
// заданным id ("map")
var myMap = new ymaps.Map('map', {
// При инициализации карты, обязательно нужно указать
// ее центр и коэффициент масштабирования
center: [56.315695,44.017063], // Нижний Новгород
zoom: 16
});
// Создаем метку с изображением коалы
myPlacemark = new ymaps.Placemark([56.315695,44.017063], {
// Контент балуна
balloonContent: '<div style = "margin-top: 30px; margin-left: 20px;" ><b>Оперный театр</b><br/>ул. Белинского, 59</div>'
}, {
// Изображение иконки метки
iconImageHref: 'theater.png',
// Размеры изображения иконки
iconImageSize: [32, 37],
// смещение картинки
iconImageOffset: [-16, -37],
// Размеры содержимого балуна
balloonContentSize: [130, 130],
// Задаем макет балуна - пользовательская картинка с контентом
balloonLayout: "default#imageWithContent",
// Картинка балуна
balloonImageHref: 'newbaloon.png',
// Смещение картинки балуна
balloonImageOffset: [-5, -60],
// Размеры картинки балуна
balloonImageSize: [150, 150],
// Балун не имеет тени
balloonShadow: false
});
// Добавляем метку на карту
myMap.geoObjects.add(myPlacemark);
}
</script>
</head>
<body>
<div id="map" style="width:600px; height:400px"></div>
</body>
</html> |
Здесь мы создаем макет балуна default#imageWithContent.
И параметры для содержимого балуна.

Отличные статьи с примерами. А не могли бы вы опубликовать статью с описанием работы редактора геометрии? А то на офсайте все так скудно описано ((
Спасибо
Спасибо за статью очень помогла. Честно сказать решила мою проблему я даже не парился доступно легко. Вообщем побольше таких статей и мне ваще работать не прийдется только копи пастить)))
Спасибище!
Отличные, очень полезные статьи!
Все подробно и понятно. Абсолютно не разбираясь в программировании, собрал карту для сайта.
Огромное спасибо!
делал по вашему шаблону, но карта перестала грузиться, не подскажите в чем ошибка?
// <![CDATA[
ymaps.ready(init);
var myMap,
myPlacemark;
function init(){
myMap = new ymaps.Map ("map", {
center: [39.734976,54.627714],
zoom: 14
});
myPlacemarkOpera = new ymaps.Placemark([39.734976,54.627714], {
name: 'Тест',
address: 'ул. Белинского, 59',
websayt: 'www.ya.ru/'
}),
myCollection = new ymaps.GeoObjectCollection();
myCollection
.add(myPlacemarkOpera)
var myBalloonLayout = ymaps.templateLayoutFactory.createClass(
'$[properties.name]’+
‘Адрес: $[properties.address]’+
‘Веб-сайт: перейти‘
);
ymaps.layout.storage.add(‘flatlayout’, myBalloonLayout);
myCollection.options.set({
balloonContentBodyLayout:’flatlayout’,
balloonMaxWidth: 300
});
myMap.geoObjects.add(myCollection);
}
// ]]>
Все просто в этой точке максимальный уровень масштаба 7, а у Вас 14.
Не понял, причем здесь масштаб. Исправлял на 7, все равно не работает.
Мне кажется, что я напартачил где то в этой части
myPlacemarkOpera = new ymaps.Placemark([39.734976,54.627714], {
name: ‘Тест’,
address: ‘ул. Белинского, 59’,
websayt: ‘www.ya.ru/’
}),
myCollection = new ymaps.GeoObjectCollection();
myCollection
.add(myPlacemarkOpera)
var myBalloonLayout = ymaps.templateLayoutFactory.createClass(
‘$[properties.name]‘+
‘Адрес: $[properties.address]‘+
‘Веб-сайт: перейти‘
);
ymaps.layout.storage.add(‘flatlayout’, myBalloonLayout);
myCollection.options.set({
balloonContentBodyLayout:’flatlayout’,
balloonMaxWidth: 300
});
myMap.geoObjects.add(myCollection);
у меня coordorder=longlat
если не трудно, скинте код из примера в блокноте на linkin62@mail.ru . Заранее спасибо.
Вот рабочий пример
Огромное спасибо! Без Вас не разобрался бы.
Выяснил , в чем была проблема изначально. Вордпресс съедал теги и получалась ошибка в коде.
теги переноса строки
Здравствуйте… А можно в балун добавить Картинку и одновременно текст… Я пробывал вставить… текст появляеться а как только прописываю картинку … карта пропадает…
Добрый день! Подскажите, как в 4м примере задать меткам собственную картинку? Побывал после координат вставлять {
iconImageHref: ‘http://webmap-blog.ru/files/gmap/gicon/mm_20_red.png’, // картинка иконки
iconImageSize: [12, 20], // размеры картинки
iconImageOffset: [-6, -10] // смещение картинки
}, карта — работает, а метка не меняется.
Реально сделать, чтобы для всех меток выводились хинты из поля name в балуне автоматически?
Можно сделать функцию, которая будет добавлять метки на карту. Входными параметрами она будет принимать параметры метки (название, описание координаты, стиль) и в ее коде прописать параметр hintText равный названию.
Благодарю, что отвечаете! С хинтами разобрался по аналогии с балуном.
Сори за офтоп, но просто писал уже здесь.
Скажите, есть возможность, чтобы метка светилась другим цветом или как-то иначе изменяла свой внешний вид при наведении на нее курсора? (по аналогии с hover в сss)
Есть пример Изменение значка метки при наведении
Спасибо!Отлично работает!
А что нужно дописать, чтобы ещё появлялась панелька с + и — , всмысле приблизить и отдалить?
Подскажите, есть у Вас на сайте примеры, где создаются и подключаются собственные стили для балунов или хинтов? нужно изменить внешний вид хинтов через css.
На блоге такого нет, но есть в примерах на сайте API Яндекс.Карт — Задание собственного шаблона всплывающей подсказки
ПОМОГИТЕ ПОЖАЛУЙСТА! Делаю сайт в подарок сестре, куда добавить
balloonContentHeader: ‘Оперный театр‘,
balloonContentBody: ‘Содержимое балуна‘,
balloonContentFooter: ‘Подвал’
в этот код?
ymaps.ready(init);
function init(){
var geocoder = new ymaps.geocode(
// Строка с адресом, который нужно геокодировать
‘Россия, Москва’,
// требуемое количество результатов
{ results: 1 }
);
// После того, как поиск вернул результат, вызывается callback-функция
geocoder.then(
function (res) {
// координаты объекта
var coord = res.geoObjects.get(0).geometry.getCoordinates();
var map = new ymaps.Map(‘map’, {
// Центр карты — координаты первого элемента
center: coord,
// Коэффициент масштабирования
zoom: 2,
});
// Добавление метки на карту
map.geoObjects.add(res.geoObjects.get(0));
// устанавливаем максимально возможный коэффициент масштабирования — 1
map.zoomRange.get(coord).then(function(range){
map.setCenter(coord, range[1] — 1)
});
// Добавление стандартного набора кнопок
map.controls.add(‘mapTools’)
// Добавление кнопки изменения масштаба
.add(‘zoomControl’)
// Добавление списка типов карты
.add(‘typeSelector’);
}
);
}
Как поставить 3 балуна — понятно. А если надо поставить 30000? Если для каждой метки вызывать new ymaps.Placemark, то это сколько ждать придется… Есть-ли способ группового создания множества меток?