Похоже, что мое InfoWindow, когда вы нажимаете на значок дома в моих Google Maps v3, неправильно автоматически подстраивается под содержимое InfoWindow.
Он дает полосы прокрутки, когда этого не должно быть. InfoWindow должно правильно изменять размер.
Есть идеи почему?
Для каждого запроса соответствующий JavaScript, который вставляет HTML для InfoWindow:
listing = '<div>Content goes here</div>';
ОБНОВИТЬ
Эта ошибка была исправлена Google.
https://issuetracker.google.com/issues/35823659
Исправление было реализовано в феврале 2015 года в версии 3.19 Maps JavaScript API.
javascript
html
css
google-maps
Яков Т.
источник
источник
Ответы:
Добавьте div в информационное окно
<div id=\"mydiv\">YourContent</div>
Затем установите размер с помощью css. работает на меня. При этом предполагается, что все информационные окна одинакового размера!
#mydiv{ width:500px; height:100px; }
источник
<div class=\"mydiv\">YourContent</div>
и.mydiv{ width:500px; height:100px; }
Краткий ответ: установите свойство maxWidth options в конструкторе . Да, даже если установка максимальной ширины была не тем, что вы хотели.
Более длинная история: при переносе карты v2 на v3 я точно увидел описанную проблему. Окна различались по ширине и высоте, некоторые из них имели вертикальные полосы прокрутки, а некоторые нет. Некоторые из них были <br /> встроены в данные, но по крайней мере один с таким размером в порядке.
Я не думал, что свойство InfoWindowsOptions.maxWidth имеет значение, так как я не заботился об ограничении ширины ... но, установив его с помощью конструктора InfoWindow, я получил то, что хотел, и окна теперь автоматически изменяются (по вертикали) и показать все содержимое без вертикальной полосы прокрутки. Для меня это не имеет большого смысла, но работает!
См .: http://fortboise.org/maps/sailing-spots.html
источник
maxWidth
процентное значение, карты Google распознают float как процент от родительского и преобразуют его в пиксельный эквивалент: declare{"maxWidth":0.25}
, родительский элемент имеет ширину 1000 пикселей, InfoWindow будет иметь расширениеwidth: 250px
. Я не думаю, что можно заставить ширину InfoWindow оставаться в процентах (значениеmaxWidth
должно быть числом, поэтому{"maxWidth":"25%"}
не будет работать и{"maxWidth":25%}
будет обрабатываться как неопределенный модуль 25 и вызывает синтаксическую ошибку).Вы должны передать контент в InfoWindow из объекта jQuery.
var $infoWindowContent = $("<div class='infowin-content'>Content goes here</div>"); var infoWindow = new google.maps.InfoWindow(); infowindow.setContent($infoWindowContent[0]);
источник
overflow: auto
InfoWindow DIV, когда вы передаете узлы DOM вместо строки. Это решает проблему, если контент выходит только на 1-2 пикселя. К сожалению, это означает, что более длинный контент фактически выходит за пределы InfoWindow вместо добавления полос прокрутки.infoWindow's
правильного отображения. Полный ответ о том, почему это работает, указан в моем ответе -jQuery
создает отдельное дерево DOM, которое заставляет контент правильно отображаться, и его размер точно определяется до того, как Google попытается разместитьinfoWindow
на карте.gm-style-iw{ height: 100% !important; overflow: hidden !important; }
меня устраивает
источник
РЕДАКТИРОВАТЬ (выделиться): Поверьте мне, из сотни других ответов на этот вопрос это единственный правильный, который также объясняет, ПОЧЕМУ это происходит.
Хорошо, поэтому я знаю, что эта ветка старая и содержит тысячу ответов, но ни один из них не является правильным, и я чувствую необходимость опубликовать правильный ответ.
Во-первых, вам не нужно указывать
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, который выглядит так:
Вы видите проблему? Когда API пытается сделать измерения для вашего
infoWindow
(непосредственно перед отображением его), тоh1
часть содержимого будет иметь размер18px
(так как временное «измерение ДИВ» добавляются к телу), но когда API фактически помещаетinfoWindow
на карту,#map-canvas h1
селектор будет иметь приоритет, в результате чего размер шрифта будет сильно отличаться от того, что было, когда API измерял размер,infoWindow
и в этом случае вы всегда будете получать полосы прокрутки.В зависимости от конкретной причины, по которой у вас есть полосы прокрутки, могут быть более разные нюансы
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, который вы используете. Есть открытый отчет об ошибке (хотя в журнале изменений этот отчет об ошибке уже отмечен как исправленный), который показывает, что Google по-прежнему испытывает трудности с этой проблемой.ЕЩЕ ОДНО: ПОСМОТРЕТЬ СВОИ СЕМЬИ ШРИФТОВ !!!
В последнем воплощении API Google попытался проявить смекалку и обернуть его содержимое infoWindow во что-то, на что можно было бы нацелить селектор CSS -
.gm-style-iw
. Для людей, которые не понимали правил, которые я объяснил выше, это не очень помогло, а в некоторых случаях стало еще хуже. Полосы прокрутки почти всегда появляются при первомinfoWindow
открытии, но если вы открываете ихinfoWindow
снова, даже с тем же содержимым полосы прокрутки исчезнут. Серьезно, если бы вы не были сбиты с толку раньше, вы бы потеряли рассудок. Вот что происходило:Если вы посмотрите на стили, которые Google загружает на страницу при загрузке API, вы увидите следующее:
Итак, Google хотел сделать свои карты более последовательными, всегда заставляя их использовать семейство
Roboto
шрифтов. Проблема в том, что для большинства людей до того, как вы открылиinfoWindow
, браузер еще не загрузилRoboto
шрифт (потому что ничто другое на вашей странице не использовало его, поэтому браузер достаточно умен, чтобы знать, что ему не нужно загружать этот шрифт). Загрузка этого шрифта происходит не мгновенно, хотя и очень быстро. В первый раз, когда вы открываете файл,infoWindow
и API добавляет егоdiv
с вашимinfoWindow
содержимым в тело для измерения, он начинает загрузкуRoboto
шрифта, но вашиinfoWindow's
измерения выполняются, и окно помещается на карту доRoboto
завершения загрузки. Результатом довольно часто былinfoWindow
чьи измерения были выполнены, когда его содержимое отображалось с использованиемArial
илиsans-serif
шрифт, но когда он был отображен на карте (иRoboto
завершил загрузку) его содержимое отображалось шрифтом другого размера - и вуаля - полосы прокрутки появляются при первом открытии файлаinfoWindow
. Откройте то же самоеinfoWindow
во второй раз - в этот моментRoboto
файл был загружен и будет использоваться, когда API измеряетinfoWindow
контент, и вы не увидите полос прокрутки.источник
Я попробовал каждый из перечисленных ответов. У меня ничего не работало. Это, наконец, исправило его НАСТОЯЩИЙ. Код , который я унаследовала имел
DIV
обертку все<h#>
и<p>
записи. Я просто принудительно использовал какой-то «стиль» в том же DIV, принимая во внимание желаемую максимальную ширину, добавил изменение высоты строки на всякий случай (чье-то исправление) и мое собственноеwhite-space: nowrap
, что затем заставило автоматическое переполнение внести правильные настройки. Без полосы прокрутки, без усечения и без проблем!html = '<div class="map-overlay" style="max-width: 400px; line-height: normal; white-space: nowrap; overflow: auto; ">';
источник
white-space: nowrap
магия была в том, что другие стили были не нужны. Ура!font-family: sans-serif !important; font-weight: normal !important;
его в CSS.Я знаю, что это старый поток, но я столкнулся с той же проблемой. Я имел
<h2>
и<p>
элементы в InfoWindow, и они оба имели нижние поля. Я удалил поля, и размер InfoWindow был правильным. Ни одно из других предложенных исправлений не помогло. Подозреваю, что при расчете размера InfoWindow поля не учитываются.источник
<div style='overflow:hidden;'></div>
Looks good.Собираюсь добавить свой ответ в список, поскольку НИ ОДИН из них не устранил мою проблему. Я закончил тем, что обернул свой контент в 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:
источник
min-width
на содержание было единственное , что работал для меня тоже. Однако не нужно было устанавливатьmaxWidth
в infoWindow.Я пробовал все эти решения, и ни одно не помогло. После некоторых проб и ошибок я понял это.
<style type="text/css"> #map_canvas { line-height:normal; } </style>
Установите line-height: normal для div холста карты.
источник
#map_canvas
Я не вижу ничего в Google Maps v3. Это должно быть из старого v2.#map_canvas
- это div, который вы используете для карты. Это может быть любое имя, которое вы хотите.Похоже, что проблема связана с веб-шрифтом 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>
источник
Как ни странно, а следующий код исправит полосу прокрутки WIDTH:
.gm-style-iw { overflow: hidden !important; line-height: 1.35; }
Это потребовалось для исправления полосы прокрутки ВЫСОТА:
.gm-style-iw div { overflow: hidden !important; }
РЕДАКТИРОВАТЬ: добавление пробела: nowrap; использование любого стиля может исправить проблему с интервалом, которая, кажется, сохраняется при удалении полос прокрутки. Отличный момент, Натан.
источник
У меня это работает. Поместите
div
вsetContent
sh_map.infoWindow.setContent([ '<div id=\"mydiv\">', 'Your content goes here', ].join(''));
Затем добавьте этот CSS на свою страницу:
<style type="text/css"> #map-canvas { text-align: center; vertical-align: middle; } #mydiv { font-family: "Comic Sans MS", cursive; font-size: 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; letter-spacing: normal; text-align: center; vertical-align: middle; word-spacing: normal; } </style>
Например, см. Http://www.student-homes-northampton.co.uk ; щелкните ссылки под фотографиями домов, чтобы отобразить карту Google.
источник
Это полностью решило мою проблему:
.gm-style-iw { overflow: visible !important; height: auto !important; width: auto !important; }
источник
У меня была такая же проблема с IE, и я попробовал многие исправления, описанные в этих ответах, но не смог надежно удалить вертикальные полосы прокрутки в IE.
Лучше всего для меня сработало переключение на фиксированный размер шрифта внутри информационного окна - «px» ... Я использовал ems. Исправив размер шрифта, мне больше не нужно было явно объявлять ширину или высоту информационного окна, а полосы прокрутки исчезли навсегда.
источник
Также важна высота контейнера карты. Если до маленького infoWindow всегда будет на высоте 80px. В противном случае
maxWidth
и#innerDiv
исправление работает как шарм.источник
Если ничего другого, попробуйте добавить содержимое после открытия окна. Это должно заставить его изменить размер.
infoWindow = new google.maps.InfoWindow() infoWindow.open(map, marker) infoWindow.setContent(content)
источник
Используйте событие domready и повторно откройте информационное окно и покажите скрытый контент после того, как событие domready сработает дважды, чтобы убедиться, что все элементы dom загружены.
// map is created using google.maps.Map() // marker is created using google.maps.Marker() // set the css for the content div .infowin-content { visibility: hidden; } infowindow = new google.maps.InfoWindow(); infowindow.setContent("<div class='infowin-content'>Content goes here</div>"); infowindow.setPosition(marker.getPosition()); infowindow.set("isdomready", false); infowindow.open(map); // On Dom Ready google.maps.event.addListener(infowindow, 'domready', function () { if (infowindow.get("isdomready")) { // show the infowindow by setting css jQuery('.infowin-content').css('visibility', 'visible'); } else { // trigger a domready event again. google.maps.event.trigger(infowindow, 'content_changed'); infowindow.set("isdomready", true); } }
Я пробовал просто выполнить setTimeout (/ * show infowin callback * /, 100), но иногда это не помогало, если контент (например, изображения) загружался слишком долго.
Надеюсь, что это работает для вас.
источник
У меня была такая же проблема, особенно заметная, когда мой
<h2>
элемент был перенесен на вторую строку.Я применил класс к a
<div>
в infoWindow и изменил шрифты на общий системный шрифт (в моем случае Helvetica) вместо веб-шрифта @ font-face, который он использовал. Проблема решена.источник
//infowindow.setContent(response); var infowindowopts = { maxWidth: 274, content: response }; infowindow.setOptions(infowindowopts);
источник
Добавить
min-height
в свой элемент класса infoWindow.Это решит проблему, если все информационные окна одинакового размера.
Если нет, добавьте эту строку jQuery в функцию щелчка для infoWindow:
//remove overflow scrollbars $('#myDiv').parent().css('overflow','');
источник
Я не мог заставить его работать в любой форме или форме, я включил 3 div в поле. Я обернул их во внешний div, с правильной шириной и высотой, и ничего не сработало.
В конце я исправил это, установив div как абсолютный верхний левый угол, а затем перед div я установил два изображения прозрачного gif: одно в ширину 300 пикселей и 1 пиксель в высоту, одно 120 пикселей в высоту и 1 пиксель в ширину.
Тогда он как следует масштабировался!
Это уродливо, но работает.
Вы также можете сделать одно изображение и установить zindex, который я ожидаю, или даже одно изображение, если ваше окно не взаимодействует, но оно содержит форму, поэтому это не вариант ...
источник
Я думаю, что это поведение связано с некоторыми стилями css во внешнем контейнере, у меня была такая же проблема, но я решил ее, используя внутренний div, добавив к нему некоторые отступы, я знаю, что это странно, но это решило проблему
<div id="fix_height"> <h2>Title</h2> <p>Something</p> </div>
И в моем style.css
div#fix_height{ padding: 5px; }
источник
У меня был встроенный элемент (тег a) прямо внутри
div
с,style="overflow:auto"[...
завернутый вp
тег и исправленный.Похоже, это вызовет любой встроенный элемент, который не вложен в блочный элемент непосредственно внутри информационного окна.
источник
Мой ответ - добавить слушателя (с помощью addListenerOnce), чтобы проверить, добавлено ли infoWindow в DOM, а затем снова открыть infoWindow (не нужно его закрывать).
// map, marker and infoWindow code, we'll call them // myMap, myMarker and myInfoWindow myInfoWindow.open(myMap, myMarker); google.maps.event.addListenerOnce(myInfoWindow, 'domready', function(){ myInfoWindow.open(myMap, myMarker); });
источник
Добавление следующего в мой CSS помогло мне:
источник
Чтобы подытожить все решения, которые работали у меня во всех браузерах:
Установите максимальную ширину информационного окна:
this.infowindow = new google.maps.InfoWindow({ maxWidth: 200 });
Оберните содержимое информационного окна
<div style="overflow:hidden;line-height:1.35;min-width:200px;">*CONTENT*</div>
(измените минимальную ширину на значение, которое вы установили в информационном окне maxWidth)
Я протестировал его, и он работал в каждом браузере, и у меня было более 400 маркеров ...
источник
Я знаю, что многие другие люди нашли решения, которые работали в их конкретном случае, но поскольку ни одно из них не помогло в моем конкретном случае, я подумал, что это может быть полезно для кого-то еще.
Некоторые детали:
Я использую API карт Google v3 в проекте, где встроенный CSS - это то, чего мы действительно очень хотим избежать. Мои информационные окна работали для всего, кроме IE11, где ширина не рассчитывалась правильно. Это привело к переполнению div, что вызвало срабатывание полос прокрутки.
Мне пришлось сделать три вещи:
Удалите все правила стиля display: inline-block из всего, что находится внутри содержимого информационного окна (я заменил на display: block) - у меня возникла идея попробовать это из потока (который я больше не могу найти), где у кого-то было то же самое проблема с IE6.
Передайте содержимое как узел DOM, а не как строку. Я использую jQuery, поэтому я мог бы сделать это, заменив:
infowindow.setContent(infoWindowDiv.html());
наinfowindow.setContent($(infoWindowDiv.html())[0]);
Это оказалось для меня самым простым, но есть много других способов получить тот же результат.Используйте хак "setMaxWidth" - установите опцию MaxWidth в конструкторе - установка опции позже не работает. Если вам не нужна максимальная ширина, просто установите очень большое число.
Я не знаю, почему это сработало, и я не уверен, сработает ли часть из них. Я знаю, что ни один из них не работает для всех моих вариантов использования по отдельности, и что 2 + 3 не работают. У меня не было времени проверить 1 + 2 или 1 + 3.
источник
Это было неприемлемо для меня жесткий код ширина и высота информационного окна, или установить
white-space: nowrap
, тоmaxWidth
решение не помогло мне, а все остальное либо не сработало, либо было иным образом не подходило для моего варианта использования.Мое решение заключалось в том, чтобы установить содержимое, открыть окно, а затем, когда
domready
событие будет запущено, установитьheight
свойство CSS для содержимого на любую высоту, а затем заставить Google Maps изменить размер InfoWindow соответствующим образом.infoWindow
это объект InfoWindow,$infoWindowContents
это объект JQuery с содержимым, которое я хочу поместить туда,map
это мой объект Map.marker
- маркер, по которому щелкнули.infoWindow.setContent($infoWindowContents.get(0)); var listener = google.maps.event.addListener(infoWindow, 'domready', function() { // Stop listening, otherwise the listeners stack up if the window is opened again google.maps.event.removeListener(listener); // Set the height on the container to however tall the browser is currently rendering it $infoWindowContents.height($infoWindowContents.height()); // Force Google Maps to recalculate the InfoWindow height infoWindow.setContent($infoWindowContents.get(0)); }); infoWindow.open(map, marker);
(Я опубликовал то же решение по аналогичному вопросу. Как мне заставить Google-Maps InfoWindow изменить размер, чтобы он соответствовал содержимому, помещенному в него? )
источник
Потеряв время и некоторое время почитав, я просто захотел чего-то простого, этот CSS работал в соответствии с моими требованиями.
.gm-style-iw > div { overflow: hidden !important; }
Также это не мгновенное решение, но упоминание / комментирование проблемы может заставить их исправить ее, поскольку они считают, что она исправлена: http://code.google.com/p/gmaps-api-issues/issues/detail?id= 5713
источник
Что ж, это тот, который помог мне:
.gm-style-iw>div { overflow: visible !important; }
Только
overflow: visible
включение на.gm-style-iw
самом деле усугубило проблему! В инспекторе инструментов разработчика Chrome я заметил, что внутри.gm-style-iw
элемента есть два div , оба из которых имеютoverflow: auto
установлены по умолчанию.Я показываю довольно много текста в формате HTML в моем InfoWindows, возможно, поэтому другие решения у меня вообще не работали.
источник