Размещение в скрытом контейнере
Карта заполняет своим содержимым контейнер, в котором она размещается. В момент инициализации карта должна иметь возможность определить размеры контейнера.
Если в момент инициализации карты контейнер еще не сформирован, размеры карты будут нулевыми (0x0), т. е. она фактически не будет отображена.
Неотображение карты в неактивной вкладке jQuery.UI происходит из-за того, что для скрытия вкладки используется CSS-свойство display: none. Элемент, для которого выставлено display: none, не знает свои реальные размеры. Самое простое решение - в момент переключения вкладки инициировать пересчет размеров карты вызовом команды fitToViewport(). Также можно обойти проблему в примере (используется jQuery.UI), если использовать альтернативный способ скрытия вкладки, переопределив стандартные классы jQuery.UI:
.ui-tabs .ui-tabs-hide { position: absolute !important; left: -10000px !important; display: block !important; }
<!DOCTYPE html>
<html>
<head>
<title>Размещение в скрытом контейнере</title>
<meta
http-equiv="Content-Type"
content="text/html; charset=utf-8"
/>
<!--
Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
-->
<script
src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=<ваш API-ключ>"
type="text/javascript"
></script>
<!--
Основная библиотека JQuery.
Яндекс предоставляет хостинг JavaScript-библиотек
-->
<script
src="https://yandex.st/jquery/2.2.3/jquery.min.js"
type="text/javascript"
></script>
<!-- Библиотека JQuery.UI. Используем для работы со вкладками -->
<script
src="https://yandex.st/jquery-ui/1.11.2/jquery-ui.min.js"
type="text/javascript"
></script>
<!-- CSS JQuery.UI. Используем для отрисовки вкладок -->
<link
rel="stylesheet"
href="https://yandex.st/jquery-ui/1.8.23/themes/humanity/jquery.ui.all.min.css"
type="text/css"
/>
<script src="hiddendiv.js" type="text/javascript"></script>
</head>
<body>
<div id="tabs" style="width: 95%">
<ul>
<li><a href="#tab-1">Описание</a></li>
<li><a href="#tab-2">Карта</a></li>
</ul>
<div id="tab-1">
<p>Во вкладке Карта находится карта Москвы</p>
</div>
<div
id="tab-2"
style="width: 100%; height: 300px; padding: 0;"
></div>
</div>
</body>
</html>
ymaps.ready(init);
var myMap;
function init() {
// Инициализация вкладок.
// После исполнения команды tabs() tab-2 получит style='display:none'.
// Карта будет инициализирована, но будет иметь нулевой размер.
// В данном случае это хорошо, так как невидимая карта не будет загружать невидимые тайлы.
$("#tabs").tabs();
myMap = new ymaps.Map("tab-2", {
center: [55.76, 37.64], // Москва
zoom: 10,
});
// В момент показа новой вкладки будем пересчитывать размер карты.
// Карта примет максимально возможные значения при активации ее таба
// и нулевые, как только будет выбран первый таб.
// Подписываемся на событие 'tabsshow' (а не 'tabselect',
// так как требуется, чтобы элемент с картой уже был виден).
$("#tabs").bind("tabsshow", function (event, ui) {
myMap.container.fitToViewport();
});
}