カテゴリー
Google Adsenseで勝手にCSSスタイルに注入されてしまう「height: auto !important」をMutationObserverで抑える
※ 当ページには【広告/PR】を含む場合があります。
2023/01/14

AngularのようなJSフレームワークを使ったフロントエンド開発でとあるウェブサイトを作成しているときに、Google Adsenseのスクリプトが読み込まれるたびに、ページのデザインレイアウトが若干崩れることに気が付きました。
これまで変化がわずかであったため、とりあえず見過ごしてきたわけですが、Adsenseのスクリプトは広告ユニットが貼り付けてあるDOM要素なら、

ほとんどの場合にはcssスタイルで
height: auto
ただしSPAでHTML要素を厳密に高さ調整したいときに、いきなり
height: auto
そんな外部から呼び出してつかうJavascriptスクリプトによってcssスタイルに影響が出てしまう場合に、ブラウザ標準で使えるようになったDOM APIの一つである
MutationObserverを使ったDOMの監視
例えばAdsenseのように外部から提供されたスクリプトは
index.html
<body>...</body>
...
<body>
...
<script src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" async></script>
...
</body>
これが読み込まれた時点で、せっかくのページレイアウトが崩れてしまう可能性があります。
ということで、スクリプトにはスクリプトをぶつけることで勝手に挿入されてしまう
height: auto
具体的には以下のようなスクリプトを
index.html
...
<script>
document.querySelectorAll('.mut-height-guard').forEach((target) => {
const heightChangeObserver = new MutationObserver(() => {
target.style.height = "";
});
heightChangeObserver.observe(target, {
attriblutes: true,
attributeFilter: ['style']
});
});
</script>
...
後は、勝手に
height: auto !important;
class="mut-height-guard"
例えば、Adsenseを呼び出すことで、サイドバーの要素のレイアウトが乱される場合があったとしましょう。
すると、以下のように要素の
class
...
<article>
<div class="mainWrap">
...ページのメインの内容(height: autoで問題ない要素)
</div>
<div class="sideMenu mut-height-guard">
...☝サイドバー(height: autoになってほしくない要素)に指定する
</div>
</article>
...
特に
height: auto !important;
class="mut-height-guard"
とりあえずこれで、ウェブページのレイアウトが崩れなくなれば処置の完了です。
まとめ
今回は、DOMの変化を監視して処理できる
MutationObserverを使えば、今回のように外部スクリプトを呼び出してCSSスタイルが変化してしまうのを防ぐことも出来ますし、iframeでの外部リソース呼び出しでも柔軟に表示サイズを変えられるなど、結構使いどころは多いです。
困ったときには、MutationObserverが使えないか一度検討してみてはどうでしょうか。
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー