埋め込まれたGoogleマップのマウススクロールホイールズームを無効にする


198

私はWordPressサイトで作業しており、著者は通常、ほとんどの投稿でiFrameを使用してGoogleマップを埋め込みます。

Javascriptを使用してそれらすべてのマウススクロールホイールを介してズームを無効にする方法はありますか?


32
マップオプションscrollwheelをに設定しますfalse
AntoJurković14年

またはJSを介して直接無効化:map.disableScrollWheelZoom();
Th3Alchemist 2014

4
できません。セキュリティ上の制限により、マップへのスクリプトアクセスはありません。また、無効にするオプションを提供するURLパラメータはありません。
Dr.Molle

まったく同じ問題があります。iframeマップに埋め込まれたマウススクロールイベントを無効にしたい。まだ見つけていません。
Grzegorz 2014

7
これは埋め込みマップですが、人々がマップのJSライブラリを使用するためのソリューションを投稿する理由が
わかり

回答:


255

私は同じ問題を抱えていました:ページをスクロールすると、ポインターがマップ上に移動し、ページのスクロールを続けるのではなく、マップをズームイン/ズームアウトし始めます。:(

だから私は、これは入れて解決divして.overlay正確に各GMAPの前にiframe挿入、次を参照してください。

<html>
  <div class="overlay" onClick="style.pointerEvents='none'"></div>
  <iframe src="https://mapsengine.google.com/map/embed?mid=some_map_id" width="640" height="480"></iframe>
</html>

私のCSSで私はクラスを作成しました:

.overlay {
   background:transparent; 
   position:relative; 
   width:640px;
   height:480px; /* your iframe height */
   top:480px;  /* your iframe height */
   margin-top:-480px;  /* your iframe height */
}

divはマップをカバーし、ポインターイベントがマップに到達するのを防ぎます。しかし、divをクリックすると、ポインターイベントに対して透過的になり、マップを再度アクティブ化します。

私はあなたを助けてもらいたいです:)


9
これは素晴らしいソリューションです。私の場合は、z-index正しくオーバーレイするためにを指定する必要がありました。
RCNeil 2014

1
IMOはこの問題の最善の解決策です!私たちはこの問題に長い間直面しており、これにより再利用可能な修正がかなりきれいになります!
ディエゴパラディーノ2014

11
これは答えとしてマークする必要がありますが、オーバーレイを親コンテナに絶対的に配置し、幅100%高さ100%に設定する方がおそらく簡単ですが、背景プロパティも必要ありません。
hcharge 2014

3
これを自動化する非常に単純なjQueryプラグインを作成しました。github.com/diazemiliano/mapScrollOffで
EmilianoDíaz15年

8
このソリューションを拡張して、スクロールホイールイベントを無視し、左クリックを無視しないようにする簡単な方法はありますか?このソリューションはいいですが、(DIVを貫通した後、再びハイパーリンク自体をクリックした後。)マップの上部にある「指示」ハイパーリンクを二回クリックするようユーザーに要求する
jptsetme

136

私はこのディスカッションの最初の答えを試しましたが、何をしてもうまくいかなかったので、独自の解決策を考え出しました。

iframeをクラス(この例では.maps)でラップし、理想的には次のようにコードを埋め込みます:http ://embedsensitively.com/ — iframeのCSSをに変更し、pointer-events: nonejQueryのクリック関数を使用して親要素にiframeのCSSを変更できますにpointer-events:auto

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'></iframe>
</div>

CSS

.maps iframe{
    pointer-events: none;
}

jQuery

$('.maps').click(function () {
    $('.maps iframe').css("pointer-events", "auto");
});

$( ".maps" ).mouseleave(function() {
  $('.maps iframe').css("pointer-events", "none"); 
});

誰かがこれに気軽に追加したい場合は、JavaScriptでのみこれを行う方法があると確信しています。

ポインターイベントを再度アクティブにするJavaScriptの方法は非常に簡単です。IDをiFrame(つまり、「iframe」)に指定し、onclickイベントをcointainer divに適用します。

onclick="document.getElementById('iframe').style.pointerEvents= 'auto'"

<div class="maps" onclick="document.getElementById('iframe').style.pointerEvents= 'auto'">
   <iframe id="iframe" src="" width="100%" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>

4
「APIなし」ソリューションをお寄せいただきありがとうございます。+1
厳しい拷問

21
これを追加して、マウスが離れたときに元の状態に戻すこともできます:$( '。maps')。mouseleave(function(){$( '。maps iframe')。css( "pointer-events"、 "なし"); });
Luis

5
注:を使用pointer-events: noneすると、マップとの対話(ドラッグ、ナビゲーション、クリックなど)ができなくなります。
LuBre

@LuBreはい、それは理解されています。それが、自動に変更するjQueryクリック関数がある理由です。
nathanielperales 2015

1
正解です。ページ全体ではなく正しいマップを有効にしていることを確認したい$(this).find('iframe').css("pointer-events", "auto");
Tom Prats

54

@nathanielperalesソリューションを拡張しました。

動作の説明の下:

  • 地図をクリックしてスクロールを有効にします
  • マウスが地図から離れると、スクロールが無効になります

JavaScriptコードの下:

// Disable scroll zooming and bind back the click event
var onMapMouseleaveHandler = function (event) {
  var that = $(this);

  that.on('click', onMapClickHandler);
  that.off('mouseleave', onMapMouseleaveHandler);
  that.find('iframe').css("pointer-events", "none");
}

var onMapClickHandler = function (event) {
  var that = $(this);

  // Disable the click handler until the user leaves the map area
  that.off('click', onMapClickHandler);

  // Enable scrolling zoom
  that.find('iframe').css("pointer-events", "auto");

  // Handle the mouse leave event
  that.on('mouseleave', onMapMouseleaveHandler);
}

// Enable map zooming with mouse scroll when the user clicks the map
$('.maps.embed-container').on('click', onMapClickHandler);

そして、これがjsFiddleの例です。


1
これを省略していただきありがとうございます。:私は最終的には、以下の追加とそれを使用$('.maps.embed-container').find('iframe').css("pointer-events", "none");
lhermann

コードをありがとう。それは実際に私が抱えていた別の問題を解決しました。Googleスプレッドシートのグラフをいくつか埋め込み、マウスホイールでのスクロールが何らかの理由でページ全体で機能しなくなりました。あなたのコードはそれをマウスホイールで再びスクロールさせました。再度、感謝します。
Scott M. Stolz 2017

31

#nathanielperalesによって書かれたコードを再編集していますが、実際に機能しました。シンプルで簡単にキャッチできますが、その作業は一度だけです。そこで、JavaScriptにmouseleave()を追加しました。#Bogdanから採用されたアイデアそして今では完璧です。これを試して。クレジットは#nathanielperalesと#Bogdanに送られます。両方のアイデアを組み合わせました。君たちありがとう。これが他の人にも役立つことを願っています...

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'>  </iframe>
</div>

CSS

.maps iframe{
    pointer-events: none;
}

jQuery

$('.maps').click(function () {
    $('.maps iframe').css("pointer-events", "auto");
});

$( ".maps" ).mouseleave(function() {
  $('.maps iframe').css("pointer-events", "none"); 
});

即興-適応-克服

そして、これがjsFiddleの例です。


1
最もクリーンなソリューション。いいね!しかし、すべてのソリューションには問題があります。ユーザーはマップを2回クリックする必要があります。クリックをすぐに通過させるにはどうすればいいですか?
ローレン

1
たぶんpointer-events: auto、マウスがマップ上で一定時間「ホバリング」された後にのみ切り替えることでクリックを回避できますか?つまり、マウスがiframeに入ったときにタイマーを開始し、マウスが離れたときにタイマーをリセットします。タイマーがXミリ秒に達した場合は、に切り替えpointer-events: autoます。マウスがiframeを離れると、いつでもに戻りpointer-events: noneます。
スタカンベル2015

私はクリックの代わりにdblclickを使用することを好みます。とにかく良い解決策です。
Moxet Khan

25

はい、とても簡単です。私も同様の問題に直面しました。cssプロパティ"pointer-events"をiframe divに追加して、それを'none'に設定するだけです。

例:<iframe style = "pointer-events:none" src = ........>

補足:この修正により、マップ上の他のすべてのマウスイベントが無効になります。地図上でユーザーの操作を必要としなかったので、私にとってはうまくいきました。


20
では、なぜ画像を使用しないのですか?あなたはそれをすべて無効にするためだけに多くの追加のアセットをロードしています。
deweydb 2014年

2
はい、ただしウィジェットをクリックできません
Jeffrey NicholsonCarré14

1
これはIE <11では機能しないことに注意してください-caniuse.com/#search=pointer-events
totallyNotLizards

@deweydb-それは違法ではないですか?
Matt Saunders、

@MattSaundersは、これが当時のケースだったかどうかはわかりませんが、現在はそうです。静的な地図画像をGoogle APIから直接読み込むことができます。おそらくこれがdeweydbが示唆していたことでしょうか。確かに問題を回避できる方法でしょう。
azariah 2016年

19
var mapOptions = {
   scrollwheel: false,
   center: latlng,
   mapTypeId: google.maps.MapTypeId.ROADMAP
};

13

いくつかの調査を行った後、2つのオプションがあります。iframe埋め込みの新しいマップAPIは、マウスホイールの無効化をサポートしていないようです。

最初は古いgoogleマップ(https://support.google.com/maps/answer/3045828?hl=en)。

2つ目は、コメントごとのマップの埋め込みとパラメーターの使用を簡略化するJavaScript関数を作成することです(サンプルコードは場所を特定するだけで、正確な解決策は表示されません)。

function createMap(containerid, parameters) {
  var mymap = document.getElementById(containerid),
  map_options = {
    zoom: 13,
    scrollwheel: false,
    /* rest of options */
  },
  map = new google.maps.Map(mymap, map_options);

  /* 'rest of code' to take parameters into account */
}

8

素晴らしくて簡単な解決策があります。

キャンバスにnoneをマッピングするポインターイベントを設定するカスタムクラスをCSSに追加する必要があります。

.scrolloff{
   pointer-events: none;
}

次に、jQueryを使用して、さまざまなイベントに基づいてそのクラスを追加および削除できます。次に例を示します。

    $( document ).ready(function() {

    // you want to enable the pointer events only on click;

        $('#map_canvas').addClass('scrolloff'); // set the pointer events to none on doc ready
        $('#canvas').on('click', function() {
            $('#map_canvas').removeClass('scrolloff'); // set the pointer events true on click
        });

    // you want to disable pointer events when the mouse leave the canvas area;

     $( "#map_canvas" ).mouseleave(function() {
          $('#map_canvas').addClass('scrolloff'); // set the pointer events to none when mouse leaves the map area
     });    
});

jsfiddleで例を作成しました。


1
これはGoogle Maps Embed APIでも機能します-map_canvasを埋め込みiframeに置き換えるだけです。クリックイベントは外側の要素にありますが、スクロールオフは内側の要素にあることに注意してください(answer / jsfiddleでは、コピー/貼り付けではなく転記する場合に備えて正しいです)
Jxtps

8

私はdeveloper.google.comに 1つのアカウントを登録し、Maps APIを呼び出すためのトークンを取得し、次のように無効にします(スクロールホイール:false):

    var map;
    function initMap() {
        map = new google.maps.Map(document.getElementById('container_google_maps'), {
            center: {lat: -34.397, lng: 150.644},
            zoom: 8,
            scrollwheel: false
        });
    }

jQueryハックよりもはるかに優れています!
ダニエル・キシュナジ

7

これが私のアプローチです。さまざまなウェブサイトに簡単に実装でき、いつでも使用できます

CSSとJavaScript:

<style type="text/css">
.scrolloff iframe   {
    pointer-events: none ;
}
</style>

<script type="text/javascript">
function scrollOn() {
    $('#map').removeClass('scrolloff'); // set the pointer events true on click

}

function scrollOff() {
    $('#map').addClass('scrolloff'); 

}
</script>

HTMLでは、iframeをdivでラップします。 <div id="map" class="scrolloff" onclick="scrollOn()" onmouseleave="scrollOff()" >

function scrollOn() {
    $('#map').removeClass('scrolloff'); // set the pointer events true on click
   
}

function scrollOff() {
    $('#map').addClass('scrolloff'); // set the pointer events true on click
    
}
.scrolloff iframe   {
        pointer-events: none ;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="map" class="scrolloff" onclick="scrollOn()" onmouseleave="scrollOff()" ><iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d23845.03946309692!2d-70.0451736316453!3d41.66373705082399!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89fb159980380d21%3A0x78c040f807017e30!2sChatham+Tides!5e0!3m2!1sen!2sus!4v1452964723177" width="100%" height="450" frameborder="0" style="border:0" allowfullscreen></iframe></div>

これが簡単な解決策を探している人を助けることを願っています。


5

これが簡単な解決策です。pointer-events: noneCSSをに設定して、<iframe>マウスのスクロールを無効にします。

<div id="gmap-holder">
    <iframe width="100%" height="400" frameborder="0" style="border:0; pointer-events:none"
            src="https://www.google.com/maps/embed/v1/place?q=XXX&key=YYY"></iframe>
</div>

ユーザーがマップをクリックしたときにマウスのスクロールがアクティブになるようにするには、次のJSコードを使用します。また、マウスがマップの外に移動すると、マウスのスクロールが再び無効になります。

$(function() {
    $('#gmap-holder').click(function(e) {
        $(this).find('iframe').css('pointer-events', 'all');
    }).mouseleave(function(e) {
        $(this).find('iframe').css('pointer-events', 'none');
    });
})

!!! また、Imho ポインター イベントは、このIframe のすべてのクリックイベントを無効にしました。
ステファンフリードリヒ2015

クリックイベントは、iframeに対してのみ無効になります。ただし、JSコードを使用している場合、マウスがdiv.gmap-holderに入るとすぐに、クリックイベントが再びアクティブになります。
manish_s 2015

これは私にとって見事に機能しました!ほとんどのソリューションはWordPressと互換性がありませんでした。onclickはスクラブされ、場合によってはiframeの幅が確保されないこともありますが、これは魅力のように機能しました。JSコードを片付けたら、id = "gmap-holder"を参照するだけで済みます。完璧です。マニッシュに感謝します。
usonianhorizo​​n

4

埋め込まれたGoogleマップでマウススクロールホイールのズームを無効にするには、iframeのcssプロパティpointer-eventsをnoneに設定するだけです。

<style>
#googlemap iframe {
    pointer-events:none;
}
</style>

それはすべて..かなりきちんとハァッか。

<div id="googlemap">
    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3648.6714814904954!2d90.40069809681577!3d23.865796688563787!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3755c425897f1f09%3A0x2bdfa71343f07395!2sArcadia+Green+Point%2C+Rd+No.+16%2C+Dhaka+1230%2C+Bangladesh!5e0!3m2!1sen!2sin!4v1442184916780" width="400" height="300" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>

2
ダブルクリックズームも無効になります:)
w3debugger

また、無効は、ズームイン、ズームアウト、方向など
zanderwar

4

ええと、私にとって最良の解決策は、単に次のように使用することでした:

HTML:

<div id="google-maps">
<iframe frameborder="0" height="450" src="***embed-map***"  width="100"</iframe>
</div>

CSS:

#google-maps iframe { pointer-events:none; }

JS:

<script>
  $(function() {
    $('#google-maps').click(function(e) {
        $(this).find('iframe').css('pointer-events', 'auto');
    }).mouseleave(function(e) {
        $(this).find('iframe').css('pointer-events', 'none');
    });
  })
</script>

結果

考慮事項:

最高のは、テキストと暗いの透明性とオーバーレイを追加することです:「参照するにはクリックしたときに、」マウスホイールが無効になっている 。しかし、それがされたときに起動し、テキストと透明性が考え(あなたがそれをクリックした後)に消えると、ユーザが閲覧することができ予想通りマップ。それを行う方法の手がかりはありますか?


3

pointer-events:none;これをうまく機能させるスタイルを追加する

<iframe style="pointer-events:none;" src=""></iframe>

3

これを行う最も簡単な方法は、:beforeまたはのような疑似要素を使用することです:after
このメソッドは、追加のhtml要素やjqueryを必要としません。
たとえばこのhtml構造がある場合:

<div class="map_wraper">

    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d405689.7826944034!2d-122.04109805!3d37.40280355!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x808fb68ad0cfc739%3A0x7eb356b66bd4b50e!2sSilicon+Valley%2C+CA!5e0!3m2!1sen!2sro!4v1438864791455" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>

</div>

次に、ラッパーを、スクロールを防止するために作成する疑似要素に対して相対的にする必要があります。

.map_wraper{
    position:relative;
}

この後、マップ上に配置されてスクロールを防止する疑似要素を作成します。

.map_wraper:after{
    background: none;
    content: " ";
    display: inline-block;
    font-size: 0;
    height: 100%;
    left: 0;
    opacity: 0;
    position: absolute;
    top: 0;
    width: 100%;
    z-index: 9;
}

これで完了です。jqueryも追加のhtml要素もありません。これが実際のjsfiddleの例です:http ://jsfiddle.net/e6j4Lbe1/


賢いアイデア。ただし、他のいくつかの回答と同様に、これはマウスホイールイベントだけでなく、すべてをキャプチャします。
likeitlikeit

お役に立てて嬉しいです!
Andrei

3

これが私の簡単な解決策です。

たとえば、「maps」というクラスのdivにiframeを配置します。

これがiframeのCSSになります

.maps iframe { pointer-events: none }

そして、これは、div要素を少なくとも1秒間ホバーしたときにiframeのpointer-eventsプロパティを「auto」に設定する小さなjavascriptであり(私にとって最適です-好きなように設定してください)、タイムアウトをクリアします/マウスが要素から離れたときに、もう一度「なし」に設定します。

var maptimer;

$(".maps").hover(function(){
    maptimer = setTimeout(function(){
        $(".maps").find("iframe").css("pointer-events", "auto");
    },1000);
},function(){
    clearTimeout(maptimer);
    $(".maps").find("iframe").css("pointer-events", "none");
});

乾杯。


3

問題を解決するために非常にシンプルなjQueryプラグインを作成しました。https://diazemiliano.github.io/googlemaps-scrollpreventで確認してください

(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);
Edit in JSFiddle Result JavaScript HTML CSS .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>


2

@nathanielperalesからの回答を使用して、ホバー関数の原因を追加しました。これにより、ユーザーがマップにフォーカスを失い、再びスクロールを停止したときにうまく機能します。

$(function(){
    $('.mapa').hover(function(){
        stopScroll();},
                     function () {
    $('.mapa iframe').css("pointer-events", "none");
    });
});

function stopScroll(){
$('.mapa').click(function () {
    $('.mapa iframe').css("pointer-events", "auto");
});
}

問題は、ナビ機能を失うことです。私にとって、モバイルデバイスでは非常に重要です。必要に応じて変更できる非常にシンプルなjQueryプラグインを作成しました。github.com/diazemiliano/mapScrollOffで
EmilianoDíaz

2

テーマのバリエーション:jQueryを使用したシンプルなソリューションで、CSSの編集は必要ありません。

// make iframe active on click, disable on mouseleave
$('iframe.google_map').each( function(i, iframe) {
    $(iframe).parent().hover( // make inactive on hover
        function() { $(iframe).css('pointer-events', 'none');
    }).click( // activate on click
        function() { $(iframe).css('pointer-events', 'auto');
    }).trigger('mouseover'); // make it inactive by default as well
});

ホバーリスナーは親要素にアタッチされているため、現在の親が大きい場合は、3行目の前にiframeをdivでラップするだけです。

それが誰かのために役立つことを願っています。


1

私はこの問題に出くわし、この質問に対して2つの非常に有用な回答のマッシュアップのいくつかを使用しました。 czeraszの答えとマッサの答えを。

どちらにも多くの真実がありますが、私のテストのどこかで、モバイルでは機能せず、IEのサポートが不十分であることがわかりました(IE11でのみ機能します)。これはnathanielperalesによるソリューションで、その後czeraszによって拡張されます。これは、ポインターイベントcssに依存し、モバイルでは機能しません(モバイルにはポインターがありません)。ません v11以外のどのバージョンのIEでも機能しません。。通常、私はそれほど気にしませんが、そこにはたくさんのユーザーがいて、一貫した機能が欲しいので、ラッパーを使用してコーディングを簡単にするオーバーレイソリューションを使いました。

したがって、私のマークアップは次のようになります。

<div class="map embed-container">
  <div id="map-notice" style="display: block;"> {Tell your users what to do!} </div>
  <div class="map-overlay" style="display: block;"></div>
  <iframe style="width:100%" src="https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d3785.684302567802!2d-66.15578327375803!3d18.40721382009222!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x8c036a35d02b013f%3A0x5962cad95b9ec7f8!2sPlaza+Del+Sol!5e0!3m2!1sen!2spr!4v1415284687548" width="633" height="461" frameborder="0"></iframe>
</div>

次に、スタイルは次のようになります。

.map.embed-container {
  position:relative;
}

.map.embed-container #map-notice{
  position:absolute;
  right:0;
  top:0;
  background-color:rgb(100,100,100);/*for old IE browsers with no support for rgba()*/
  background-color: rgba(0,0,0,.50);
  color: #ccc;
  padding: 8px;
}
.map.embed-container .map-overlay{
  height:100%;
  width:100%;
  position:absolute;
  z-index:9999;
  background-color:rgba(0,0,0,0.10);/*should be transparent but this will help you see where the overlay is going in relation with the markup*/
}

最後にスクリプト:

//using jquery...
var onMapMouseleaveHandler = function (event) {
  $('#map-notice').fadeIn(500);
  var elemento = $$(this);
  elemento.on('click', onMapClickHandler);
  elemento.off('mouseleave', onMapMouseleaveHandler);
  $('.map-overlay').fadeIn(500);
}

var onMapClickHandler = function (event) {
  $('#map-notice').fadeOut(500);
  var elemento = $$(this);
  elemento.off('click', onMapClickHandler);
  $('.map-overlay').fadeOut(500);
  elemento.on('mouseleave', onMapMouseleaveHandler);
}
$('.map.embed-container').on('click', onMapClickHandler);

テスト済みのソリューションをGitHub gistにも追加しました。そこから何かを取得したい場合は...


1

これは、CSSとJavaScriptを使用したソリューションです(つまり、Jqueryですが、純粋なJavascriptでも動作します)。同時に、マップは反応します。スクロール時にマップをズームしないでください。ただし、マップをクリックするとアクティブになります。

HTML / JQuery JavaScript

<div id="map" onclick="$('#googlemap').css('pointerEvents','auto'); return true;"> 
    <iframe id="googlemap" src="http://your-embed-url" height="350"></iframe>
</div>

CSS

#map {
    position: relative; 
    padding-bottom: 36%; /* 16:9 ratio for responsive */ 
    height: 0; 
    overflow: hidden; 
    background:transparent; /* does the trick */
    z-index:98; /* does the trick */
}
#map iframe { 
    pointer-events:none; /* does the trick */
    position: absolute; 
    top: 0; 
    left: 0; 
    width: 100% !important; 
    height: 100% !important; 
    z-index:97; /* does the trick */
} 

楽しんで !


1

Google Maps v3では、スクロールしてズームを無効にできるようになり、ユーザーエクスペリエンスが大幅に向上しています。他のマップ関数は引き続き機能し、追加のdivは必要ありません。また、スクロールが有効になっているときにユーザーが確認できるように、ユーザーにフィードバックを提供する必要があると考えたので、マップの境界線を追加しました。

// map is the google maps object, '#map' is the jquery selector
preventAccidentalZoom(map, '#map'); 

// Disables and enables scroll to zoom as appropriate. Also
// gives the user a UI cue as to when scrolling is enabled.
function preventAccidentalZoom(map, mapSelector){
  var mapElement = $(mapSelector);

  // Disable the scroll wheel by default
  map.setOptions({ scrollwheel: false })

  // Enable scroll to zoom when there is a mouse down on the map.
  // This allows for a click and drag to also enable the map
  mapElement.on('mousedown', function () {
    map.setOptions({ scrollwheel: true });
    mapElement.css('border', '1px solid blue')
  });

  // Disable scroll to zoom when the mouse leaves the map.
  mapElement.mouseleave(function () {
    map.setOptions({ scrollwheel: false })
    mapElement.css('border', 'none')
  });
};

1

これにより、応答性の高いGoogleマップが表示され、iframeでのスクロールが停止しますが、クリックするとズームできます。

これをコピーしてhtmlに貼り付けますが、iframeリンクを独自のものに置き換えます。彼は例のある記事です:埋め込まれたGoogle Map iframeでマウスのスクロールホイールのズームを無効にします

<style>
    .overlay {
    background:transparent;
    position:relative;
    width:100%; /* your iframe width */
    height:480px; /* your iframe height */
    top:480px; /* your iframe height */
    margin-top:-480px; /* your iframe height */
    }
</style>
<div class="overlay" onClick="style.pointerEvents='none'"></div>
<iframe src="https://mapsengine.google.com/map/embed?mid=some_map_id" width="100%" height="480"></iframe>

0

これが私のアプローチです。

これを私のmain.jsまたは同様のファイルにポップします。

// Create an array of styles.
var styles = [
                {
                    stylers: [
                        { saturation: -300 }

                    ]
                },{
                    featureType: 'road',
                    elementType: 'geometry',
                    stylers: [
                        { hue: "#16a085" },
                        { visibility: 'simplified' }
                    ]
                },{
                    featureType: 'road',
                    elementType: 'labels',
                    stylers: [
                        { visibility: 'off' }
                    ]
                }
              ],

                // Lagitute and longitude for your location goes here
               lat = -7.79722,
               lng = 110.36880,

              // Create a new StyledMapType object, passing it the array of styles,
              // as well as the name to be displayed on the map type control.
              customMap = new google.maps.StyledMapType(styles,
                  {name: 'Styled Map'}),

            // Create a map object, and include the MapTypeId to add
            // to the map type control.
              mapOptions = {
                  zoom: 12,
                scrollwheel: false,
                  center: new google.maps.LatLng( lat, lng ),
                  mapTypeControlOptions: {
                      mapTypeIds: [google.maps.MapTypeId.ROADMAP],

                  }
              },
              map = new google.maps.Map(document.getElementById('map'), mapOptions),
              myLatlng = new google.maps.LatLng( lat, lng ),

              marker = new google.maps.Marker({
                position: myLatlng,
                map: map,
                icon: "images/marker.png"
              });

              //Associate the styled map with the MapTypeId and set it to display.
              map.mapTypes.set('map_style', customMap);
              map.setMapTypeId('map_style');

次に、ページの地図を表示する場所に空のdivを挿入します。

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

もちろん、Google Maps APIでも呼び出す必要があります。私は単にmapi.jsというファイルを作成し、それを/ jsフォルダーに入れました。このファイルは、上記のJavaScriptの前に呼び出す必要があります。

`window.google = window.google || {};
google.maps = google.maps || {};
(function() {

  function getScript(src) {
    document.write('<' + 'script src="' + src + '"' +
                   ' type="text/javascript"><' + '/script>');
  }

  var modules = google.maps.modules = {};
  google.maps.__gjsload__ = function(name, text) {
    modules[name] = text;
  };

  google.maps.Load = function(apiLoad) {
    delete google.maps.Load;
    apiLoad([0.009999999776482582,[[["http://mt0.googleapis.com/vt?lyrs=m@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=m@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"m@228000000"],[["http://khm0.googleapis.com/kh?v=135\u0026hl=en-US\u0026","http://khm1.googleapis.com/kh?v=135\u0026hl=en-US\u0026"],null,null,null,1,"135"],[["http://mt0.googleapis.com/vt?lyrs=h@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=h@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"h@228000000"],[["http://mt0.googleapis.com/vt?lyrs=t@131,r@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=t@131,r@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"t@131,r@228000000"],null,null,[["http://cbk0.googleapis.com/cbk?","http://cbk1.googleapis.com/cbk?"]],[["http://khm0.googleapis.com/kh?v=80\u0026hl=en-US\u0026","http://khm1.googleapis.com/kh?v=80\u0026hl=en-US\u0026"],null,null,null,null,"80"],[["http://mt0.googleapis.com/mapslt?hl=en-US\u0026","http://mt1.googleapis.com/mapslt?hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt/ft?hl=en-US\u0026","http://mt1.googleapis.com/mapslt/ft?hl=en-US\u0026"]],[["http://mt0.googleapis.com/vt?hl=en-US\u0026","http://mt1.googleapis.com/vt?hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt/loom?hl=en-US\u0026","http://mt1.googleapis.com/mapslt/loom?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt?hl=en-US\u0026","https://mts1.googleapis.com/mapslt?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt/ft?hl=en-US\u0026","https://mts1.googleapis.com/mapslt/ft?hl=en-US\u0026"]]],["en-US","US",null,0,null,null,"http://maps.gstatic.com/mapfiles/","http://csi.gstatic.com","https://maps.googleapis.com","http://maps.googleapis.com"],["http://maps.gstatic.com/intl/en_us/mapfiles/api-3/14/0","3.14.0"],[2635921922],1,null,null,null,null,0,"",null,null,0,"http://khm.googleapis.com/mz?v=135\u0026",null,"https://earthbuilder.googleapis.com","https://earthbuilder.googleapis.com",null,"http://mt.googleapis.com/vt/icon",[["http://mt0.googleapis.com/vt","http://mt1.googleapis.com/vt"],["https://mts0.googleapis.com/vt","https://mts1.googleapis.com/vt"],[null,[[0,"m",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[47],[37,[["smartmaps"]]]]],0],[null,[[0,"m",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[47],[37,[["smartmaps"]]]]],3],[null,[[0,"h",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[50],[37,[["smartmaps"]]]]],0],[null,[[0,"h",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[50],[37,[["smartmaps"]]]]],3],[null,[[4,"t",131],[0,"r",131000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[5],[37,[["smartmaps"]]]]],0],[null,[[4,"t",131],[0,"r",131000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[5],[37,[["smartmaps"]]]]],3],[null,null,[null,"en-US","US",null,18],0],[null,null,[null,"en-US","US",null,18],3],[null,null,[null,"en-US","US",null,18],6],[null,null,[null,"en-US","US",null,18],0]]], loadScriptTime);
  };
  var loadScriptTime = (new Date).getTime();
  getScript("http://maps.gstatic.com/intl/en_us/mapfiles/api-3/14/0/main.js");
})();`

mapi.jsファイルを呼び出すときは、必ずセンサーのfalse属性を渡してください。

つまり: <script type="text/javascript" src="js/mapi.js?sensor=false"></script>

APIの新しいバージョン3では、何らかの理由でセンサーを含める必要があります。main.jsファイルの前に必ずmapi.jsファイルを含めてください。


0

Googleマップv2-GMap2の場合:

ar map = new GMap2(document.getElementById("google_map"));
map.disableScrollWheelZoom();

0

次のようなGoogleマップ埋め込みAPIを使用するiframeがある場合:

 <iframe width="320" height="400" frameborder="0" src="https://www.google.com/maps/embed/v1/place?q=Cagli ... "></iframe>

このcssスタイルを追加できます:pointer-event:none; ES。

<iframe width="320" height="400" frameborder="0" style="pointer-event:none;" src="https://www.google.com/maps/embed/v1/place?q=Cagli ... "></iframe>

0

@chamsによって拡張された@nathanielperalesの回答に対する私の見解を次に示します。

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'></iframe>
</div> 

jQuery

// we're doing so much with jQuery already, might as well set the initial state
$('.maps iframe').css("pointer-events", "none");

// as a safety, allow pointer events on click
$('.maps').click(function() {
  $(this).find('iframe').css("pointer-events", "auto");
});


$('.maps').mouseleave(function() {
  // set the default again on mouse out - disallow pointer events
  $(this).find('iframe').css("pointer-events", "none");
  // unset the comparison data so it doesn't effect things when you enter again
  $(this).removeData('oldmousepos');
});

$('.maps').bind('mousemove', function(e){
  $this = $(this);
  // check the current mouse X position
  $this.data('mousepos', e.pageX);
  // set the comparison data if it's null or undefined
  if ($this.data('oldmousepos') == null) {
    $this.data('oldmousepos', $this.data('mousepos'));
  }
  setTimeout(function(){
    // some left/right movement - allow pointer events
    if ($this.data('oldmousepos') != $this.data('mousepos')) {
      $this.find('iframe').css("pointer-events", "auto");
    }
    // set the compairison variable
    $this.data('oldmousepos', $this.data('mousepos'));
  }, 300);
  console.log($this.data('oldmousepos')+ ' ' + $this.data('mousepos'));
});

0

最も単純なもの

<div id="myIframe" style="width:640px; height:480px;">
   <div style="background:transparent; position:absolute; z-index:1; width:100%; height:100%; cursor:pointer;" onClick="style.pointerEvents='none'"></div>
   <iframe src="https://www.google.com/maps/d/embed?mid=XXXXXXXXXXXXXX" style="width:640px; height:480px;"></iframe>
</div>

0

これをスクリプトに追加します。

function initMap() {
    var uluru = {lat: -25.363, lng: 131.044};
    var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 12,
        center: uluru,
        scrollwheel: false,
        disableDefaultUI: true,
        disableDoubleClickZoom: true
    });
    var marker = new google.maps.Marker({
        position: uluru,
        map: map
});
}

2
問題は、JavaScript APIではなく、Embed API(iframeを使用)に関するものです。
GreatBlakes 2017

0

これが私の問題の解決策です、私はWPサイトを構築していたので、ここに小さなphpコードがあります。ただし、キーはscrollwheel: false,マップオブジェクトにあります。

function initMap() {
        var uluru = {lat: <?php echo $latitude; ?>, lng: <?php echo $Longitude; ?>};
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 18,
            scrollwheel: false,
            center: uluru
        });
        var marker = new google.maps.Marker({
            position: uluru,
            map: map
        });
    }

これがお役に立てば幸いです。乾杯

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.