編集済み(目立つように):私を信じてください、この質問に対する他の100の答えのうち、これはなぜそれが起こっているのかを説明する唯一の正しいものです
わかりました。このスレッドは古く、1000の回答がありますが、どれも正しくなく、正しい回答を投稿する必要があると感じています。
まず、スクロールバーなしでinfoWindowを表示するために、または何かを指定する必要はありませんが、これを行うことで誤って機能させることがあります(ただし、最終的には失敗します)。width's
height's
第二に、Google Maps APIにinfoWindow's
はスクロールのバグがなく、それらがどのように機能するかについて正しい情報を見つけることは非常に困難です。さて、ここにあります:
次のようにinfoWindowで開くようにGoogleMapsAPIに指示すると:
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"></div>
</body>
そして、何らかの理由で、次のようなCSS:
h1 { font-size: 18px; }
#map-canvas h1 { font-size: 32px; }
問題がわかりますか?APIがinfoWindow
(表示する直前に)測定を行おうとするh1
と、コンテンツの一部のサイズは18px
(一時的な「測定div」が本文に追加されるため)になりますが、APIが実際infoWindow
にマップでは、#map-canvas h1
セレクターが優先されるため、APIがのサイズを測定したときのフォントサイズとは大きく異なりinfoWindow
ます。この状況では、常にスクロールバーが表示されます。
にスクロールバーがある特定の理由により、微妙に異なるニュアンスが存在する可能性がありますinfoWindow
が、その背後にある理由は次の理由によるものです。
infoWindow
実際のHTML要素がマークアップのどこに表示されるかに関係なく、同じCSSルールを内部のコンテンツに適用する必要があります。そうでない場合は、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
またはAPI内で#map-canvas
、適用されるCSSルールは常に同じになります。
再編集:フォントファミリー
Googleはフォントの読み込みの問題(以下で説明)に積極的に取り組んでいるようで、機能が最近変更されたためinfoWindow
、使用しているAPIのバージョンに応じて、最初に開いたときにRobotoフォントの読み込みが表示される場合と表示されない場合があります。未解決のバグレポートがあり(変更ログでこのバグレポートはすでに修正済みとしてマークされていますが)、Googleがこの問題でまだ問題を抱えていることを示しています。
もう1つ:あなたのフォントファミリーを見てください!!!
APIの最新の化身では、グーグルは巧妙になり、CSSセレクターでターゲットにできるものでそのinfoWindowコンテンツをラップしようとしました- .gm-style-iw
。上で説明したルールを理解していない人にとっては、これは実際には役に立たず、場合によってはさらに悪化しました。スクロールバーは、ほとんどの場合、最初infoWindow
に開いたときに表示されますが、infoWindow
もう一度開くと、まったく同じコンテンツであっても、スクロールバーは表示されなくなります。真剣に、これがあなたの心を失う前にあなたが混乱していなかったならば。何が起こっていたかは次のとおりです。
APIが読み込まれるときにGoogleがページに読み込むスタイルを見ると、次のことがわかります。
.gm-style {
font-family: Roboto,Arial,sans-serif
...
}
わかりました。Googleは、常にRoboto
font-familyを使用するようにすることで、マップの一貫性を少し高めたいと考えていました。問題は、大多数の人にとって、を開く前infoWindow
に、ブラウザがまだRoboto
フォントをダウンロードしていないことです(ページ上の他の何もフォントを使用していないため、ブラウザはダウンロードする必要がないことを知っているほど賢いです)このフォント)。このフォントのダウンロードは非常に高速ですが、瞬時には行われません。を初めて開いたときにinfoWindow
、APIがコンテンツを本文に追加しdiv
てinfoWindow
測定を行うと、Roboto
フォントのダウンロードが開始されますが、infoWindow's
測定が行われ、Roboto
ダウンロードが完了する前にウィンドウが地図上に配置されます。結果は、かなり頻繁に、infoWindow
コンテンツがArial
またはsans-serif
フォントを使用してレンダリングされたときに測定されましたが、マップに表示されたとき(およびRoboto
ダウンロードが終了したとき)、コンテンツは異なるサイズのフォントで表示されていました-そして出来上がり-スクロールバーが最初に表示されますを開きますinfoWindow
。まったく同じものをもう一度開きます。infoWindow
この時点で、Roboto
はダウンロードされ、APIがinfoWindow
コンテンツの測定を行っているときに使用され、スクロールバーは表示されません。