2014-10-30 5 views
7

Es ist ein known bug, dass die Google Maps API die Scrollbar für die erste (Zeit) zeigt geklickt Infofenster,Google Maps Infowindow Scrolling Bug: Wie für alle Fälle lösen?

Das Problem, das erste Mal: ​​

enter image description here

Erholung der Zeit:

enter image description here

So habe ich found out, dass das Hinzufügen maxWidth das Problem gelöst,

Für mich ist es nicht; Wenn ich setze die maxWidth auf 200px, die Scrollbar verschwindet, aber seine kleine, als ich brauche,

enter image description here

Wenn ich gesetzt 250px (Größe ich brauche), bleibt die Scrollbar

enter image description here

Irgendeine Idee, was könnte ich versuchen?

jsfiddle: http://jsfiddle.net/e0x20tvs/3/

$sescam_ventana = { 
 
    init: function() { 
 
    this.mapa(); 
 
    }, 
 
    mapa: function() { 
 
    var script = document.createElement('script'); 
 
    script.type = 'text/javascript'; 
 
    script.src = '//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=$sescam_ventana.mapSetup'; 
 
    document.body.appendChild(script); 
 
    }, 
 
    mapSetup: function() { 
 
    var styles = [ 
 
     /* 
 
\t \t \t { 
 
\t \t \t \t stylers: [ 
 
\t \t \t \t \t { saturation: -100 } 
 
\t \t \t \t ] 
 
\t \t \t },{ 
 
\t \t \t \t featureType: "road", 
 
\t \t \t \t elementType: "geometry", 
 
\t \t \t \t stylers: [ 
 
\t \t \t \t \t { visibility: "simplified" } 
 
\t \t \t \t ] 
 
\t \t \t },{ 
 
\t \t \t \t featureType: "poi.business", 
 
\t \t \t \t elementType: "labels", 
 
\t \t \t \t stylers: [ 
 
\t \t \t \t \t { visibility: "simplified" } 
 
\t \t \t \t ] 
 
\t \t \t } 
 
\t \t */ 
 
    ]; 
 
    var styledMap = new google.maps.StyledMapType(styles, { 
 
     name: "SESCAM" 
 
    }); // 
 
    var mapOptions = { 
 
     zoom: 16, 
 
     scrollwheel: false, 
 
     center: new google.maps.LatLng(39.6177074, 4.9725879), 
 
     mapTypeControlOptions: { 
 
     mapTypeIds: [google.maps.MapTypeId.ROADMAP, 'map_style'] 
 
     } 
 
    } 
 
    var handleMarkerClick = function(marker, index) { 
 
     var $navigationMenu = jQuery('<div>'); 
 
     jQuery('.menu-item').each(function(i) { 
 
     var $button = jQuery('<button>'); 
 
     $button.text(jQuery(this).text()); 
 
     $button.addClass(jQuery(this).data('class')); 
 
     $navigationMenu.append($button); 
 
     }); 
 
     if (typeof infowindow === 'undefined') { 
 
     infowindow = new google.maps.InfoWindow({ 
 
      height: 380 
 
     }); 
 
     } 
 
     var centro = infoCentros[index] //helpful data 
 
     infowindow.setContent(
 
     '<div class="sescam-info-window">' + 
 
     '<h3>' + centro.nombre + '</h3>' + 
 
     '<p>' + centro.lugar + '</h3>' + 
 
     '<p class="titulo">Coordinador</p>' + 
 
     '<p><strong>' + centro.coordinador.nombre + '</strong></p>' + 
 
     '<p><a href="mailto:' + centro.coordinador.email + '">' + centro.coordinador.email + '</a></p>' + 
 
     '<p class="titulo">Responsable</p>' + 
 
     '<p><strong>' + centro.responsable.nombre + '</strong></p>' + 
 
     '<p><a href="mailto:' + centro.responsable.email + '">' + centro.responsable.email + '</a></p>' + 
 
     '<div class="menu">' + $navigationMenu.html() + '</div>' + '</div>' 
 

 
    ); 
 
     infowindow.open(marker.getMap(), marker); 
 
    } 
 
    var handleMenu = function() { 
 
     jQuery('body').on('click', '.menu button', function() { 
 
     var itemClass = jQuery(this).attr('class'); 
 
     jQuery('.listado.' + itemClass).stop(true, true).slideDown().siblings('.listado').stop(true, true).slideUp(); 
 
     }); 
 
    } 
 
    this.gmap = new google.maps.Map(document.getElementById('mapa'), mapOptions); 
 
    this.gmap.mapTypes.set('map_style', styledMap); 
 
    this.gmap.setMapTypeId('map_style'); 
 
    this.mapMarkers = []; 
 
    this.mapInfoWindow = new google.maps.InfoWindow({ 
 
     height: 380 
 
    }); 
 
    jQuery(window).resize(function() { 
 
     $sescam_ventana.gmap.fitBounds($sescam_ventana.mapBounds); 
 
    }); 
 
    for (var i = 0; i < this.mapMarkers.length; i++) { 
 
     // primero eliminamos todos los markers que pudiera haber de una visualización anterior 
 
     this.mapMarkers[i].setMap(null); 
 
    } 
 
    this.mapMarkers.length = 0; // reseteamos el array 
 
    this.mapBounds = new google.maps.LatLngBounds(); 
 
    var c = 0; // de inicio no sabemos cuantos elementos tienen realmente latitud y longitud, este contador nos lo chivará 
 
    var latlon; // lo guardamos fuera del each para poder verlo después, si resulta que es el único elemeto a mostrar 
 
    for (var i = 0; i < infoCentros.length; i++) { 
 
     var centro = infoCentros[i]; 
 
     var lat = centro.cordenadas.lat; 
 
     var lon = centro.cordenadas.long; 
 
     if (lat && lon) { 
 
     c++; 
 
     latlon = new google.maps.LatLng(lat, lon); 
 
     var moptions = { 
 
      position: latlon, 
 
      map: $sescam_ventana.gmap 
 
     } 
 
     moptions.icon = 'http://icons.iconarchive.com/icons/icons-land/vista-map-markers/256/Map-Marker-Marker-Outside-Pink-icon.png'; 
 
     var marker = new google.maps.Marker(moptions); 
 
     $sescam_ventana.mapMarkers.push(marker); 
 
     //google.maps.event.addListener(marker, 'click', handleMarkerClick); 
 
     google.maps.event.addListener(marker, 'click', handleMarkerClick.bind(undefined, marker, i)); 
 

 
     $sescam_ventana.mapBounds.extend(latlon); 
 
     } 
 
    } 
 
    if (c > 1) { 
 
     $sescam_ventana.gmap.fitBounds(this.mapBounds); 
 
    } else { 
 
     // si solo hay uno el fitbounds no hace un zoom ni un centrado correctos 
 
     $sescam_ventana.gmap.setCenter(latlon); 
 
    } 
 
    handleMenu(); 
 
    } 
 
} 
 
jQuery(function() { 
 
    $sescam_ventana.init(); 
 
});
.gmapa { 
 
    position: relative; 
 
    padding-bottom: 50%; 
 
} 
 
#mapa { 
 
    position: absolute; 
 
    left: 0; 
 
    top: 0; 
 
    width: 100%; 
 
    height: 100%; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="gmapa"> 
 
    <script> 
 
    var infoCentros = [{ 
 
     "nombre": "El nombre 0", 
 
     "texto": "Lorem ipsum sit met hamet amid0", 
 
     "lugar": "Toledo", 
 
     "coordinador": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "responsable": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "cordenadas": { 
 
     "lat": 39.150544196, 
 
     "long": -4.8019412125 
 
     } 
 
    }, { 
 
     "nombre": "El nombre 1", 
 
     "texto": "Lorem ipsum sit met hamet amid1", 
 
     "lugar": "Toledo", 
 
     "coordinador": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "responsable": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "cordenadas": { 
 
     "lat": 39.150544196, 
 
     "long": -4.7019412125 
 
     } 
 
    }, { 
 
     "nombre": "El nombre 2", 
 
     "texto": "Lorem ipsum sit met hamet amid2", 
 
     "lugar": "Toledo", 
 
     "coordinador": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "responsable": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "cordenadas": { 
 
     "lat": 39.150544196, 
 
     "long": -4.6019412125 
 
     } 
 
    }, { 
 
     "nombre": "El nombre 3", 
 
     "texto": "Lorem ipsum sit met hamet amid3", 
 
     "lugar": "Toledo", 
 
     "coordinador": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "responsable": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "cordenadas": { 
 
     "lat": 39.150544196, 
 
     "long": -4.5019412125 
 
     } 
 
    }, { 
 
     "nombre": "El nombre 4", 
 
     "texto": "Lorem ipsum sit met hamet amid4", 
 
     "lugar": "Toledo", 
 
     "coordinador": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "responsable": { 
 
     "nombre": "Ana M\u00aa del Mar Alonso Fern\u00e1ndez", 
 
     "email": "[email protected]" 
 
     }, 
 
     "cordenadas": { 
 
     "lat": 39.150544196, 
 
     "long": -4.4019412125 
 
     } 
 
    }]; 
 
    </script> 
 
    <div id="mapa"></div> 
 
</div>

+0

Gerade durch diese vor ein paar Monaten ging. FWIW, ich glaube, dass das Problem durch eine benutzerdefinierte Schriftgröße verursacht wurde, und das Zurücksetzen auf den Standard löste es. – Sparky

Antwort

4

EDIT

In Ihrem speziellen Fall hat es mit der Roboto Web-Schriftart zu tun. Es ist in der Google Maps-API enthalten, aber es wird zur Zeit auf Ihrer Seite nicht verwendet, bevor ein InfoWindow geöffnet wird, sodass der Browser keinen Grund hat, es herunterzuladen, und dies auch nicht.

Wenn Sie das InfoWindow jedoch öffnen, erkennt der Browser an dem Punkt, dass er die Schriftart benötigt und beginnt, sie herunterzuladen, aber Google Maps hat die infoWindow-Größe gemessen, bevor die Schriftart heruntergeladen wird (siehe die ursprüngliche Antwort auf google Karten api misst auf InfoWindows Größe). Wenn die Schrift fertig heruntergeladen wurde, wird der Inhalt im InfoWindow in der Roboto-Schriftart neu gezeichnet, was das InfoWindow tatsächlich zu einer anderen (größeren) Größe als die Größe macht, die Google vor dem Herunterladen der Schrift gemessen hat, und das ist es zeigen Sie Bildlaufleisten.

Dies erklärt auch, warum Sie scrollbars das erste Mal sehen - wenn google maps das infoWindow vor dem Download der Schrift gemessen hat - aber Sie werden es danach nicht sehen - weil die Schrift bereits heruntergeladen wurde, was immer Google Maps jetzt messen wird seien Sie die richtigen. So

, ist die Lösung

a) Render etwas in der Roboto Schriftart auf Ihrer Seite (wodurch der Browser diese Schrift zum Download), bevor der erste infowindow geöffnet oder

b) Verwenden Sie eine andere Schriftart (eine, die an anderer Stelle auf Ihrer Seite verwendet wird und daher beim Laden der Seite heruntergeladen wird) für Ihren infoWindow-Inhalt.

Ich werde den Rest meiner Antwort aufgeben, weil es ein häufiges Missverständnis darüber ist, wie infoWindows funktioniert, und, wie Sie mit Ihrer Google-Suche darauf hingewiesen haben, haben viele Leute aufgelegt.

TLDR:

nie einen Elternteil Selektor (z wie # map-Leinwand) verwenden, um den HTML-Inhalt Ihrer Infowindow stylen.

Es ist kein Fehler. Hier ist, wie Google Maps info Fensterstile arbeiten:

Wenn Sie Google Maps API, dass Sie ein InfoWindow mit HTML-Inhalt öffnen möchten, Google dynamisch ein Div-Element, hängt es an Ihrem Körper-Tag, greift die Messungen der dynamisch erstellt div, und hängt dann ein div mit diesen Messungen an die Karte, die Ihre infoWindow ist.

Hier kommt der Trick ins Spiel.

Lassen Sie uns sagen, dies ist Ihre HTML:

<div id="map-canvas"> 
</div> 

und das ist Ihr infowindow Inhalt:

<h1>I'm an infoWindow</h1> 
<p>Hi there!</p> 

und hier ist Ihre CSS:

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

Google wird fast immer ziehen dieses infoWindow falsch - weil wenn es dynamisch InfoWindow div erstellt und hängt es an den Körper, um die Messungen, die div wird eine h1 Schriftgröße von 18px haben. So, jetzt hat Google die Maße und legt dieses div auf der Karte, an dem Punkt h1 Schriftgröße erhöht sich auf 24px so jetzt google ist die falsche Messungen und Ihre InfoWindow wird am Ende mit Bildlaufleisten.

Ich habe immer den einfachsten Weg gefunden mit CSS infowindow zu arbeiten, ist ein Wrapper-div zu verwenden und es immer Ziel, so dass Sie infowindow HTML-Inhalte sind wie folgt aussehen würde:

<div class="info-window-content"> 
    <h1>I'm an infoWindow</h1> 
    <p>Hi there!</p> 
</div> 

CSS Und dann könnte wie folgt aussehen:

/* global styles */ 
h1 { font-size: 18px; } 
p { line-height: 1.6; } 

/* info window styles */ 
.info-window-content h1 { font-size: 24px; } 
.info-window-content p { line-height: 1.2; } 

und Sie würden nicht mit Bildlaufleisten in Ihrem InfoWindow enden.

+0

Hallo, ich benutze keine Roboto Schriftfamilie, ich benutze 'Avenir' aber es ist eine Webschrift (nicht von Google), die Sache ist, dass ich einen eigenen Wrapper habe (wenn du den Code auscheckst); Also bin ich mir nicht wirklich sicher, ob du auf meinen Fall anwendest .. irgendwelche Gedanken? –

+0

Ich müsste Ihren Code in freier Wildbahn sehen - im Fall der von Ihnen geposteten Version ist meine Antwort korrekt. Ich bin mir sicher, was das Problem ist - Google basiert auf Messungen, die auf dem ersten Infofenster noch nicht fertig sind, und wenn Google schließlich fertig ist, sind die Messungen von Google bereits abgeschlossen. Verwenden Sie Avenir nur in Ihrem InfoWindow? – Adam

+0

Eigentlich sehe ich jetzt den Roboto du meinst, aber Google hat es in seinen Stylesheets, ich benutze Avenir auf der ganzen Seite ... irgendwelche Gedanken? –

-2

Edit: Okay, was benötigt wurde, war das Elternteil von .info-window-content.

Also, das einzige, was ich tat, war hinzufügen

.gm-style-iw>div { 
    overflow: hidden !important; 
} 

ich eine Gabel Ihrer Post. http://jsfiddle.net/mygt82wp/. Funktioniert das?

Ich denke, das könnte eine generische Lösung sein, für diesen Google Maps Bug sollte es für jedes infoWindow funktionieren, denke ich.


Alte Post:

ich denke, die einfachste und effektivste, was Sie tun können, ist einfach 1 Zeile von CSS:

.info-window-content {overflow: hidden} 

Vielleicht machen {Überlauf: versteckt wichtig} wenn

benötigt
+0

Hi! Es gibt ein offenes Kopfgeld für diese Frage. Denkst du, du kannst ein wenig nachdenken? Vielen Dank! –

+0

Ich habe meinen Beitrag aktualisiert –

+0

Hallo, danke für deine Antwort, aber das funktioniert nicht, es gibt keine Bildlaufleiste, aber es ist noch schlimmer, weil es keine Chance gibt, den ganzen Inhalt zu sehen, es wird gebrochen ... salut –

Verwandte Themen