WWW Watch

スタイルの継承で Google Maps JavaScript API で表示した地図のコントロール UI がおかしくなった件

Web サイトに地図を表示できる Google Maps JavaScript API を使っていて気がついた、地図掲載サイト側の CSS に記述した特定のスタイルが、表示した地図内の要素に継承されてしまうことで起こる表示崩れについてのメモ。

Google Maps JavaScript APIたいした話ではないんですが、ある案件で Google Maps JavaScript API を使用した地図を Web サイト内に表示して調整しているとき、通常、デフォルトでは左上の方に表示されるコントロール UI (ズームとか操作するやつです) の表示がおかしいことに気がつきました。

で、なんでだろなと思って Web コンソールで調べてみたら、思わぬところに原因がありましたというお話。

とりあえずどういう症状が起こったかですが、下記が正しい表示。

正しい表示例: Google Maps JavaScript API で表示した地図

一方で、下記が今回おかしくなっていた時の表示。コントロール UI の一部がなんか変なことになっています。

コントロール UI の表示が崩れた例: Google Maps JavaScript API で表示した地図

ちなみに上記のサンプルで出しているキャプチャ画像は前述した 「ある案件」 のものではなく、自分の会社のサイトで表示している地図を改めて確認したら同じ症状がでていたのでそちらのキャプチャ画像です。

img 要素に対する max-width プロパティの指定が継承されてた件

早速、ソースを追って調べてみたんですが・・・・・・

地図表示部分のソースコードをインスペクタで調査

まずはインスペクタで Google Maps JavaScript API が生成した コントロール UI 部分の HTML を探し、そこで使われている img 要素に対してどのようなスタイルが適用されているかを確認してみます。

該当 HTML: 地図表示部分のソースコードをインスペクタで調査

すると下記のように、自サイト側で書いた CSS 内の、img 要素に指定した max-width プロパティの値が継承されてしまっているのがわかりました。実際にこれをインスペクタ上で無効にするとコントロール UI 部分の表示も正常になりました。

継承されたスタイル: 地図表示部分のソースコードをインスペクタで調査

何でこういうことになったのか

今回、地図部分に img {max-width: 100%;} が継承されてしまったのは、親となる要素ブロックに対して .hoge img {max-width: 100%;} みたいな指定をしていたからですが、これって例えばスマホ対応とかがあって、メインコンテンツ部分に表示した画像を、画面サイズにあわせてフィットさせたいときとかによくやる指定だと思います。

今回もそれで、地図を表示しているメインコンテンツの要素ブロックに対して上記のような指定をしていたのですが、それが地図内の画像にまで継承されてしまったというオチでした。

通常、この手の外部サービスで何かを読み込んだ場合、外部サービス側で指定したスタイルはインラインで指定されることが多いですし、設置サイト側で意図的に !important しなければスタイルを上書きしてしまうこともないのであまり深く考えていませんでしたが、今回の max-width に関しては盲点でした。

ということで、今回は Google Maps JavaScript API から地図を表示する領域となる要素に対して下記のように max-width の指定を継承させない指定をして対応しました。

#map-canvas {
  /* 元々の指定 */
  height: 500px;
  width: 500px;
  ・・・省略・・・
  /* 追加指定 */
  max-width: initial;
  max-width: unset; /* unset 値に対応しているブラウザ向け */
}

もちろん、最初から余計な継承されないように CSS の書き方を工夫してもいいと思います。

Recent Entry

全ての記事一覧を見る

Hot Entry

逆引きおすすめエントリー