API Карт Google, версия 3: окно InfoWindow неправильно - PullRequest
81 голосов
/ 12 октября 2009

Похоже, что мое InfoWindow, когда вы щелкаете по значку с домашней страницей на моих Картах Google v3, не выполняет автоматическое изменение размера содержимого InfoWindow.

Он дает полосы прокрутки, когда не должен. Окно InfoWindow должно быть правильно автоматически изменено.

Есть идеи, почему?

По запросу соответствующий JavaScript, который внедряет HTML-код для InfoWindow:

listing = '<div>Content goes here</div>';

UPDATE

Эта ошибка была устранена Google в выпуске

https://issuetracker.google.com/issues/35823659

Исправление было реализовано в феврале 2015 года в версии 3.19 API Карт JavaScript.

Ответы [ 34 ]

32 голосов
/ 01 июня 2010

Добавьте div в ваше информационное окно

<div id=\"mydiv\">YourContent</div>

Затем установите размер с помощью css. работает для меня. При этом все информационные окна имеют одинаковый размер!

#mydiv{
width:500px;
height:100px;
}
30 голосов
/ 25 декабря 2010

Краткий ответ: установить свойство параметров maxWidth в конструкторе . Да, даже если установка максимальной ширины была не тем, что вы хотели сделать.

Более длинная история: Перенос карты v2 на v3, я увидел именно описанную проблему. Окна различались по ширине и высоте, некоторые имели вертикальные полосы прокрутки, а некоторые - нет. Некоторые встраивали
в данные, но по крайней мере один с таким размером ОК.

Я не думал, что свойство InfoWindowsOptions.maxWidth было релевантным, поскольку мне было все равно ограничивать ширину ... но, установив его с помощью конструктора InfoWindow, я получил то, что хотел, и теперь окна автоматически изменяют размер (по вертикали) и показывают весь контент без вертикальной полосы прокрутки. Не имеет большого смысла для меня, но это работает!

См .: http://fortboise.org/maps/sailing-spots.html

24 голосов
/ 03 августа 2011

Вы должны передать содержимое в InfoWindow из объекта jQuery.

var $infoWindowContent = $("<div class='infowin-content'>Content goes here</div>");
var infoWindow = new google.maps.InfoWindow();
infowindow.setContent($infoWindowContent[0]);
21 голосов
/ 11 ноября 2014

РЕДАКТИРОВАНИЕ (чтобы выделиться): Поверьте мне, из ста других ответов на этот вопрос, это единственный правильный ответ, который также объясняет, ПОЧЕМУ это происходит

Хорошо, я знаю, что эта ветка старая и имеет тысячу ответов, но ни один из них не является правильным , и я чувствую необходимость опубликовать правильный ответ.

Во-первых, вам не нужно когда-либо указывать width's или height's для чего-либо, чтобы ваше информационное окно отображалось без полос прокрутки, хотя иногда вы можете случайно заставить его работать этим ( но это в конечном итоге потерпит неудачу).

Во-вторых, Google Maps API infoWindow's не имеет ошибку прокрутки, просто очень трудно найти правильную информацию о том, как они работают. Ну, вот оно:

Когда вы говорите API Карт Google открываться в infoWindow следующим образом:

var infoWindow = new google.maps.InfoWindow({...});
....
infoWindow.setContent('<h1>Hello!</h1><p>And welcome to my infoWindow!</p>');
infoWindow.open(map);

Для всех намерений и целей карты Google временно помещают div в конце вашей страницы ( на самом деле создает detached DOM tree - но концептуально легче понять, если я скажу, что вы представляете div места в конце вашей страницы ) с указанным вами содержимым HTML. Затем он измеряет этот div (что означает, что в этом примере все правила CSS в моем документе, применяемые к тегам h1 и p, будут применены к нему), чтобы получить его width и height. Затем Google берет это div, присваивает ему измерения, полученные при добавлении на вашу страницу, и помещает его на карту в указанном вами месте.

Вот где проблема возникает для многих людей - у них может быть HTML, который выглядит следующим образом:

<body>
 <div id="map-canvas"><!-- google map goes here --></div>
</body>

и, по какой-либо причине, CSS, который выглядит следующим образом:

h1 { font-size: 18px; }
#map-canvas h1 { font-size: 32px; }

Вы видите проблему? Когда API пытается выполнить измерения для вашего infoWindow (непосредственно перед его отображением), часть контента h1 будет иметь размер 18px (потому что временный «измерительный элемент» добавляется к телу) , но когда API фактически размещает infoWindow на карте, селектор #map-canvas h1 будет иметь приоритет, в результате чего размер шрифта будет сильно отличаться от того, который был, когда API измерял размер infoWindow и в этом случае вы будете всегда получать полосы прокрутки.

Могут быть несколько более разные нюансы по конкретной причине, по которой у вас есть полосы прокрутки в infoWindow, но причина этого заключается в следующем:

Те же правила CSS должны применяться к содержимому вашего infoWindow независимо от того, где фактический элемент HTML появляется в разметке. Если они не будут, тогда вам будет гарантировано , чтобы получить полосы прокрутки в вашем InfoWindow

Итак, что я всегда делаю, примерно так:

infoWindow.setContent('<div class="info-window-content">...your content here...</div>');

и в моем CSS:

.info-window-content { ... }
.info-window-content h1 { .... }
.info-window-content p { ... }
etc...

Поэтому, независимо от того, где API добавляет свои измерения div - до закрытия body или внутри #map-canvas применяемые к нему правила CSS всегда будут одинаковыми.

РЕДАКТИРОВАТЬ RE: Семейства шрифтов

Google, похоже, активно работает над проблемой загрузки шрифтов (описанной ниже), и функциональность изменилась совсем недавно, поэтому вы можете видеть или не видеть загрузку шрифта Roboto, когда ваш infoWindow открывается в первый раз, в зависимости от версии API, который вы используете. Существует открытый отчет об ошибках (хотя в changelog этот отчет об ошибках уже помечен как исправленный), который показывает, что у Google все еще есть проблема с этой проблемой.

ЕЩЕ ОДНА: СМОТРЕТЬ СЕМЬИ ШРИФТОВ !!!

В последнем воплощении API, Google попытался быть умным и обернуть свой контент infoWindow во что-то, на что можно было бы ориентироваться с помощью селектора CSS - .gm-style-iw. Для людей, которые не понимали правила, которые я объяснил выше, это не очень помогло, а в некоторых случаях сделало его еще хуже. Полосы прокрутки почти всегда появляются при первом открытии infoWindow, но если вы снова откроете любой infoWindow, даже с точно таким же содержимым , полосы прокрутки исчезнут. Серьезно, если бы вы не были смущены до того, как это заставило бы вас сойти с ума. Вот что происходит:

Если вы посмотрите на стили, которые Google загружает на страницу при загрузке API, вы увидите следующее:

.gm-style {
     font-family: Roboto,Arial,sans-serif
 ...
}

Хорошо, поэтому Google хотел сделать свои карты более согласованными, всегда заставляя их использовать семейство шрифтов Roboto. Проблема в том, что для большинства людей до того, как вы открыли infoWindow, браузер еще не загрузил шрифт Roboto (потому что ничто другое на вашей странице не использовало его, поэтому браузер достаточно умен, чтобы знать, что он не нужно загружать этот шрифт). Загрузка этого шрифта не происходит мгновенно, хотя и очень быстро. Когда вы в первый раз открываете infoWindow, и API добавляет тело div с вашим содержимым infoWindow к измерениям, он начинает загружать шрифт Roboto, но ваши измерения infoWindow's выполняются и окно помещается на карту до завершения загрузки Roboto. Результатом, довольно часто, был infoWindow, измерения которого были сделаны, когда его контент отображался с использованием шрифта Arial или sans-serif, но когда он отображался на карте (и Roboto закончил загрузку), его контент отображался шрифтом другого размера - и вуаля - полосы прокрутки появляются при первом открытии infoWindow. Откройте точно такой же infoWindow во второй раз - в этот момент Roboto будет загружен и будет использоваться, когда API измеряет содержание infoWindow, и вы не увидите полос прокрутки.

21 голосов
/ 07 ноября 2013
.gm-style-iw{
    height: 100% !important;
    overflow: hidden !important;
}

у меня работает

12 голосов
/ 07 сентября 2013

Я попробовал каждый из перечисленных ответов. Никто не работал для меня. Это наконец исправило это ПОСТОЯННО. Унаследованный код содержал оболочку DIV вокруг всех записей <h#> и <p>. Я просто включил некоторый «стиль» в том же DIV, принимая во внимание желаемую максимальную ширину, на всякий случай добавил изменение высоты строки (чье-то исправление) и мой собственный white-space: nowrap, который затем заставил автоматическое переполнение сделать правильный корректировки. Нет полосы прокрутки, нет усечения и нет проблем!

html = '<div class="map-overlay" style="max-width: 400px;
                                        line-height: normal;
                                        white-space: nowrap;
                                        overflow: auto;
                                       ">';
9 голосов
/ 17 апреля 2011

Я знаю, что это старая тема, но я только что столкнулся с той же проблемой. У меня были элементы <h2> и <p> в InfoWindow, и у них обоих были нижние поля. Я удалил поля, и окно InfoWindow было правильно настроено. Ни одно из предложенных исправлений не сработало. Я подозреваю, что расчет размера InfoWindow не учитывает поля.

9 голосов
/ 28 марта 2013

Собираюсь добавить мой ответ в список, поскольку ни один из них не решил мою проблему. В итоге я завернул содержимое в div, присвоил этому div класс и указав min-width в div, И указав maxWidth в infoWindow, и они оба должны быть одинакового размера, в противном случае либо ширина или высота будет переполнена в ящиках с неправильным объемом содержимого.

Javascript:

// Set up the content for the info box
var content = "<div class='infowindow-content'>" + content + "</div>";

// create a map info box
var infoWindow = new google.maps.InfoWindow({
    maxWidth: 350,
    content: content
});

CSS:

div.infowindow-content {
    min-width: 350px;
}
7 голосов
/ 12 июля 2013

Похоже, что проблема связана с веб-шрифтом Roboto.

Информационное окно отображается со встроенными свойствами ширины и высоты на основе предоставленного содержимого. Однако он не рассчитывается с уже отрисованным / загруженным веб-шрифтом. Как только шрифт отображается ПОСЛЕ того, как вся карта выводится на экран, он вызывает появление полос прокрутки из-за свойств «overflow: auto», встроенных в DIV окна.

Решение, которое я нашел для работы, заключается в том, чтобы обернуть содержимое в DIV, а затем применить CSS для переопределения веб-шрифта:

.gmap_infowin {
    font-family: sans-serif !important;
    font-weight: normal !important;
}

<div class="gmap_infowin">Your info window content here.</div>
7 голосов
/ 20 июня 2012

Я перепробовал все эти решения, но ни одно из них не сработало. После некоторых проб и ошибок я понял это.

<style type="text/css">
#map_canvas {
    line-height:normal;
}
</style>

Установить высоту строки: нормальная для div холста карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...