Cómo deshabilitar el escalado de la rueda de desplazamiento del mouse con la API de Google Maps
Frecuentes
Visto 543,392 veces
565
Estoy usando la API de Google Maps (v3) para dibujar algunos mapas en una página. Una cosa que me gustaría hacer es deshabilitar el zoom cuando desplaza la rueda del mouse sobre el mapa, pero no estoy seguro de cómo.
He desactivado scaleControl (es decir, eliminé el elemento de la interfaz de usuario de escala), pero esto no evita la escala de la rueda de desplazamiento.
Aquí está parte de mi función (es un simple complemento de jQuery):
$.fn.showMap = function(options, addr){
options = $.extend({
navigationControl: false,
mapTypeControl: false,
scaleControl: false,
draggable: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
}, options);
var map = new google.maps.Map(document.getElementById($(this).attr('id')), options);
// Code cut from this example as not relevant
};
14 Respuestas
986
En la versión 3 de la API de Maps, simplemente puede configurar scrollwheel
opción a falso dentro de la MapOptions propiedades:
options = $.extend({
scrollwheel: false,
navigationControl: false,
mapTypeControl: false,
scaleControl: false,
draggable: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
}, options);
Si estuviera utilizando la versión 2 de la API de Google Maps, habría tenido que utilizar la disableScrollWheelZoom () Llamada a la API de la siguiente manera:
map.disableScrollWheelZoom();
EL scrollwheel
el zoom está habilitado de forma predeterminada en la versión 3 de la API de Maps, pero en la versión 2 está deshabilitado a menos que se habilite explícitamente con el enableScrollWheelZoom()
Llamada API.
Respondido 09 Oct 14, 18:10
+1 para tu información: disableDefaultUI: true
puede sustituir navigationControl: false, mapTypeControl: false, scaleControl: false
- Jordan Arseno
Un problema para mí fue que si no tienes el mapTypeId, los otros parámetros se ignoran. - michael cazador
Esto funciona para mí, pero tiene el extraño efecto secundario de deshabilitar la rueda de desplazamiento dentro de un modal en la página. No hay mapa en el contenido modal y el cursor no está sobre el mapa. - micro regular
Lamentablemente, esto no funciona como se esperaba con StreetViewPanorama Map, ya que al poner scrollwheel: false, deshabilita el zoom de desplazamiento, pero también deshabilita el desplazamiento de la página ya que todavía está capturando el desplazamiento de alguna manera. - Salomón Closson
Daniel, ¿podrías ayudarme a responder esta pregunta? stackoverflow.com/questions/60544486/… - Xavier Isaac
104
El código de Daniel hace el trabajo (¡muchas gracias!). Pero quería desactivar el zoom por completo. Descubrí que tenía que usar las cuatro opciones para hacerlo:
{
zoom: 14, // Set the zoom level manually
zoomControl: false,
scaleControl: false,
scrollwheel: false,
disableDoubleClickZoom: true,
...
}
contestado el 23 de mayo de 17 a las 11:05
¿Esto todavía funciona para ti? No pude obtener la versión actual de v3 (creo que es 3.9) para ignorar la rueda de desplazamiento, y tuve que recurrir a recorrer todos los elementos secundarios del objeto del mapa y detener la propagación en el mapa. - c. apolzon
¡Sí, funciona para mí, gracias! Además, si desea eliminar todos los widgets de control de mapa predeterminados, simplemente desactiveDefaultUI: true en lugar de desactivar los controles de zoom, rotación y panorámica individualmente. - tomax
Tenga cuidado con las mayúsculas; scrollwheel
debe ser todo en minúsculas (solo me pilló subiendo la W) - veces
rueda de desplazamiento: falso era todo lo que necesitaba - mindore
31
En caso de que desee hacer esto de forma dinámica;
function enableScrollwheel(map) {
if(map) map.setOptions({ scrollwheel: true });
}
function disableScrollwheel(map) {
if(map) map.setOptions({ scrollwheel: false });
}
A veces tienes que mostrar algo "complejo" sobre el mapa (o el mapa es una pequeña parte del diseño), y este zoom de desplazamiento se coloca en el medio, pero una vez que tienes un mapa limpio, esta forma de hacer zoom es agradable.
Respondido el 14 de diciembre de 16 a las 17:12
Puede agregar este código en la inicialización: map.addListener ('click', function () {if (map) map.setOptions ({scrollwheel: true});}); map.addListener ('mouseout', function () {if (map) map.setOptions ({scrollwheel: false});}); - Spaceman
Esto funciona para mí, ya que quería interrogar la función de rueda de desplazamiento del mapa fuera del código de Google Maps. es decir, desde el interior de mi propio código jquery. - harby
26
¡Mantenlo simple! Variable de mapas de Google original, ninguna de las cosas adicionales.
var mapOptions = {
zoom: 16,
center: myLatlng,
scrollwheel: false
}
respondido 02 mar '15, 20:03
10
A partir de ahora (octubre de 2017) Google ha implementado una propiedad específica para manejar el zoom / desplazamiento, llamada gestureHandling
. Su propósito es manejar el funcionamiento de los dispositivos móviles, pero también modifica el comportamiento de los navegadores de escritorio. Aquí es de documentación oficial:
function initMap() { var locationRio = {lat: -22.915, lng: -43.197}; var map = new google.maps.Map(document.getElementById('map'), { zoom: 13, center: locationRio, gestureHandling: 'none' });
Los valores disponibles para gestoHandling son:
'greedy'
: El mapa siempre se desplaza (hacia arriba o hacia abajo, hacia la izquierda o hacia la derecha) cuando el usuario desliza (arrastra) la pantalla. En otras palabras, tanto un deslizamiento de un dedo como un deslizamiento de dos dedos hacen que el mapa se desplace.'cooperative'
: El usuario debe deslizar un dedo para desplazarse por la página y dos dedos para desplazarse por el mapa. Si el usuario desliza el mapa con un dedo, aparece una superposición en el mapa, con un mensaje que le indica que use dos dedos para mover el mapa. En las aplicaciones de escritorio, los usuarios pueden hacer zoom o desplazarse por el mapa desplazándose mientras presionan una tecla modificadora (la tecla ctrl o ⌘).'none'
: Esta opción deshabilita el desplazamiento y el pellizco en el mapa para dispositivos móviles y el arrastre del mapa en dispositivos de escritorio.'auto'
(predeterminado): Dependiendo de si se puede desplazar la página, la API de JavaScript de Google Maps establece la propiedad gestHandling en'cooperative'
or'greedy'
En resumen, puede forzar fácilmente la configuración a "siempre ampliable" ('greedy'
), "nunca ampliable" ('none'
), o "el usuario debe presionar CRTL / ⌘ para habilitar el zoom" ('cooperative'
).
Respondido 10 Oct 17, 16:10
7
Creé un complemento jQuery más desarrollado que te permite bloquear o desbloquear el mapa con un bonito botón.
Este complemento deshabilita el iframe de Google Maps con un div superpuesto transparente y agrega un botón para desbloquearlo. Debe presionar durante 650 milisegundos para desbloquearlo.
Puede cambiar todas las opciones para su conveniencia. Compruébalo en https://github.com/diazemiliano/googlemaps-scrollprevent
He aquí un ejemplo.
(function() {
$(function() {
$("#btn-start").click(function() {
$("iframe[src*='google.com/maps']").scrollprevent({
printLog: true
}).start();
return $("#btn-stop").click(function() {
return $("iframe[src*='google.com/maps']").scrollprevent().stop();
});
});
return $("#btn-start").trigger("click");
});
}).call(this);
.embed-container {
position: relative !important;
padding-bottom: 56.25% !important;
height: 0 !important;
overflow: hidden !important;
max-width: 100% !important;
}
.embed-container iframe {
position: absolute !important;
top: 0 !important;
left: 0 !important;
width: 100% !important;
height: 100% !important;
}
.mapscroll-wrap {
position: static !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/diazemiliano/googlemaps-scrollprevent/v.0.6.5/dist/googlemaps-scrollprevent.min.js"></script>
<div class="embed-container">
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d12087.746318586604!2d-71.64614110000001!3d-40.76341959999999!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x9610bf42e48faa93%3A0x205ebc786470b636!2sVilla+la+Angostura%2C+Neuqu%C3%A9n!5e0!3m2!1ses-419!2sar!4v1425058155802"
width="400" height="300" frameborder="0" style="border:0"></iframe>
</div>
<p><a id="btn-start" href="#">"Start Scroll Prevent"</a> <a id="btn-stop" href="#">"Stop Scroll Prevent"</a>
</p>
Respondido 21 Feb 17, 16:02
Buen complemento, pero ¿cómo usarlo cuando crea el mapa de Google con la API de JS en lugar de usar un iframe? - ikkez
Es "Edit in JSFiddle Result JavaScript HTML CSS
"¿realmente forma parte del código? - Pedro Mortensen
6
En mi caso, lo crucial fue establecer 'scrollwheel':false
en init. Aviso: estoy usando jQuery UI Map
. Abajo esta mi CoffeeScript encabezado de la función init:
$("#map_canvas").gmap({'scrollwheel':false}).bind "init", (evt, map) ->
Respondido el 14 de diciembre de 16 a las 17:12
6
Por si acaso, está utilizando el GMaps.js biblioteca, que hace que sea un poco más simple hacer cosas como codificación geográfica y pines personalizados, así es como resuelve este problema utilizando las técnicas aprendidas de las respuestas anteriores.
var Gmap = new GMaps({
div: '#main-map', // FYI, this setting property used to be 'el'. It didn't need the '#' in older versions
lat: 51.044308,
lng: -114.0630914,
zoom: 15
});
// To access the Native Google Maps object use the .map property
if(Gmap.map) {
// Disabling mouse wheel scroll zooming
Gmap.map.setOptions({ scrollwheel: false });
}
Respondido el 14 de diciembre de 16 a las 17:12
4
Para alguien que se pregunta cómo deshabilitar el API Javascript Google Map
Va a habilitar el desplazamiento de zoom si hace clic en el mapa una vez. Y inhabilitar después de que su mouse salga del div.
Aquí hay un ejemplo
var map;
var element = document.getElementById('map-canvas');
function initMaps() {
map = new google.maps.Map(element , {
zoom: 17,
scrollwheel: false,
center: {
lat: parseFloat(-33.915916),
lng: parseFloat(151.147159)
},
});
}
//START IMPORTANT part
//disable scrolling on a map (smoother UX)
jQuery('.map-container').on("mouseleave", function(){
map.setOptions({ scrollwheel: false });
});
jQuery('.map-container').on("mousedown", function() {
map.setOptions({ scrollwheel: true });
});
//END IMPORTANT part
.big-placeholder {
background-color: #1da261;
height: 300px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<body>
<div class="big-placeholder">
</div>
<!-- START IMPORTANT part -->
<div class="map-container">
<div id="map-canvas" style="min-height: 400px;"></div>
</div>
<!-- END IMPORTANT part-->
<div class="big-placeholder">
</div>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAIjN23OujC_NdFfvX4_AuoGBbkx7aHMf0&callback=initMaps">
</script>
</body>
</html>
contestado el 10 de mayo de 17 a las 06:05
4
Solo necesita agregar opciones de mapa:
scrollwheel: false
Respondido el 29 de junio de 17 a las 19:06
3
Una solución sencilla:
// DISABLE MOUSE SCROLL IN MAPS
// enable the pointer events only on click;
$('.gmap-wrapper').on('click', function () {
$('.gmap-wrapper iframe').removeClass('scrolloff'); // set the pointer events true on click
});
// you want to disable pointer events when the mouse leave the canvas area;
$(".gmap-wrapper").mouseleave(function () {
$('.gmap-wrapper iframe').addClass('scrolloff'); // set the pointer events to none when mouse leaves the map area
});
.scrolloff{ pointer-events: none; }
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="gmap-wrapper">
<iframe class="scrolloff" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d44754.55736493158!2d9.151166379101554!3d45.486726!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x4786bfca7e8fb1cb%3A0xee8d99c9d153be98!2sCorsidia!5e0!3m2!1sit!2sit!4v1496947992608" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>
</html>
Respondido el 08 de junio de 17 a las 19:06
2
En caso de que alguien esté interesado en una solución CSS pura para esto. El siguiente código superpone un div transparente sobre el mapa y mueve el div transparente detrás del mapa cuando se hace clic en él. La superposición evita el zoom, una vez que se hace clic, y detrás del mapa, el zoom está habilitado.
Ver la publicación de mi blog Mapas de Google alternar zoom con css para una explicación de cómo funciona, y bolígrafo codepen.io/daveybrown/pen/yVryMr para una demostración funcional.
Descargo de responsabilidad: esto es principalmente para aprender y probablemente no sea la mejor solución para sitios web de producción.
HTML:
<div class="map-wrap small-11 medium-8 small-centered columns">
<input id="map-input" type="checkbox" />
<label class="map-overlay" for="map-input" class="label" onclick=""></label>
<iframe src="https://www.google.com/maps/embed?pb=!1m14!1m12!1m3!1d19867.208601651986!2d-0.17101002911118332!3d51.50585742500925!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!5e0!3m2!1sen!2suk!4v1482355389969"></iframe>
</div>
CSS:
.map-wrap {
position: relative;
overflow: hidden;
height: 180px;
margin-bottom: 10px;
}
#map-input {
opacity: 0;
}
.map-overlay {
display: block;
content: '';
position: absolute;
top: 0;
left: 0;
width: 100% !important;
height: 100% !important;
overflow: hidden;
z-index: 2;
}
#map-input[type=checkbox]:checked ~ iframe {
z-index: 3;
}
#map-input[type=checkbox]:checked ~ .map-overlay {
position: fixed;
top: 0;
left: 0;
width: 100% !important;
height: 100% !important;
}
iframe {
position: absolute;
top: 0;
left: 0;
width: 100% !important;
height: 100% !important;
z-index: 1;
border: none;
}
Respondido 01 Feb 17, 21:02
0
Use ese fragmento de código, que le dará todo el control de color y zoom del mapa de Google. (scaleControl: falso y rueda de desplazamiento: falso evitará que la rueda del mouse suba o baje)
function initMap() {
// Styles a map in night mode.
var map = new google.maps.Map(document.getElementById('map'), {
center: {lat: 23.684994, lng: 90.356331},
zoom: 8,
scaleControl: false,
scrollwheel: false,
styles: [
{elementType: 'geometry', stylers: [{color: 'F1F2EC'}]},
{elementType: 'labels.text.stroke', stylers: [{color: '877F74'}]},
{elementType: 'labels.text.fill', stylers: [{color: '877F74'}]},
{
featureType: 'administrative.locality',
elementType: 'labels.text.fill',
stylers: [{color: '#d59563'}]
},
{
featureType: 'poi',
elementType: 'labels.text.fill',
stylers: [{color: '#d59563'}]
},
{
featureType: 'poi.park',
elementType: 'geometry',
stylers: [{color: '#263c3f'}]
},
{
featureType: 'poi.park',
elementType: 'labels.text.fill',
stylers: [{color: '#f77c2b'}]
},
{
featureType: 'road',
elementType: 'geometry',
stylers: [{color: 'F5DAA6'}]
},
{
featureType: 'road',
elementType: 'geometry.stroke',
stylers: [{color: '#212a37'}]
},
{
featureType: 'road',
elementType: 'labels.text.fill',
stylers: [{color: '#f77c2b'}]
},
{
featureType: 'road.highway',
elementType: 'geometry',
stylers: [{color: '#746855'}]
},
{
featureType: 'road.highway',
elementType: 'geometry.stroke',
stylers: [{color: 'F5DAA6'}]
},
{
featureType: 'road.highway',
elementType: 'labels.text.fill',
stylers: [{color: 'F5DAA6'}]
},
{
featureType: 'transit',
elementType: 'geometry',
stylers: [{color: '#2f3948'}]
},
{
featureType: 'transit.station',
elementType: 'labels.text.fill',
stylers: [{color: '#f77c2b3'}]
},
{
featureType: 'water',
elementType: 'geometry',
stylers: [{color: '#0676b6'}]
},
{
featureType: 'water',
elementType: 'labels.text.fill',
stylers: [{color: '#515c6d'}]
},
{
featureType: 'water',
elementType: 'labels.text.stroke',
stylers: [{color: '#17263c'}]
}
]
});
var marker = new google.maps.Marker({
position: {lat: 23.684994, lng: 90.356331},
map: map,
title: 'BANGLADESH'
});
}
Respondido el 18 de junio de 17 a las 13:06
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo. Por favor lee esto cómo responder por brindar una respuesta de calidad. - tal como fuimos
0
Lo hago con este simple ejemplo
jQuery
$('.map').click(function(){
$(this).find('iframe').addClass('clicked')
}).mouseleave(function(){
$(this).find('iframe').removeClass('clicked')
});
CO
.map {
width: 100%;
}
.map iframe {
width: 100%;
display: block;
pointer-events: none;
position: relative; /* IE needs a position other than static */
}
.map iframe.clicked {
pointer-events: auto;
}
O usa las opciones de gmap
function init() {
var mapOptions = {
scrollwheel: false,
Respondido el 22 de junio de 17 a las 14:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas jquery google-maps google-maps-api-3 jquery-plugins or haz tu propia pregunta.
Hola, creé un complemento más desarrollado que te permite bloquear o desbloquear el mapa con un bonito botón. También es el complemento jQuery. Puedes comprobarlo en github.com/diazemiliano/googlemaps-scrollprevent Espero que te guste. - Emiliano Díaz
Presentado en Desarrolladores escribiendo el futuro por Joel Spolsky (CEO y cofundador de Stack Overflow), desde 17 min 09 seg - 18 min 25 seg (2016-12-07). - Peter Mortensen