
みなさんこんにちは、ガノー(Twitter:Ganohr)です。
Googleアドセンスではアンカー広告が表示されることがありますが、アンカー広告がもともと表示していた「画面の上部へスクロールするためのボタン」や「SNSシェア用のボタン」などの、ユーザビリティを向上するための要素の上に重なって表示されてしまうことがあります。
この記事では、
アンカー広告の表示状態に連動して既存のUIの位置を調整するためのコードを共有します。
更新履歴
目次
- 1.Google AdSenseのアンカー広告はどのように実装されているのか?
- 1.1.Google AdSenseのアンカー広告が読み込まれているかどうか判別する
- 1.2.Googleアドセンスのアンカー広告の開閉状態を判別する
- 2.JavaScriptで特定要素の変化を監視する:MutationObserver
- 3.Googleアドセンスのアンカー広告の状態に応じてUIの位置を調整するコード
- 3.1.Googleアドセンスのアンカー広告要素を取得する
- 3.2.Googleアドセンスのアンカー広告のstyle属性やdata-anchor-status属性の変化を監視する
- 3.3.Googleアドセンスのアンカー広告の表示状態に応じて実際にUIの位置を調整する
- 3.4.アンカー広告が上部に表示されたか下部に表示されたかに応じて調整を呼び出すか否かを切り替える
- 3.5.Google AdSenseのアンカー広告の状態に応じてレイアウトを調整する最終コード
- 4.最後に
Google AdSenseのアンカー広告はどのように実装されているのか?

コードの理解を進めるために、アンカー広告がどのように実装されているのか確認しておきます。
まずアンカー広告は以下のようなコードで表示されます。
AdSenseのアンカー広告はどのように実装されているのか?
<ins class="adsbygoogle adsbygoogle-noablate" data-adsbygoogle-status="done" data-anchor-status="displayed" style="display: block; width: 100% !important; height: 129px !important; bottom: 0px; clear: none !important; float: none !important; left: 0px; margin: 0px !important; max-height: none !important; max-width: none !important; opacity: 1; overflow: visible !important; padding: 0px !important; position: fixed; right: auto !important; top: auto !important; vertical-align: baseline !important; visibility: visible !important; z-index: 2147483647; background: rgb(250, 250, 250) !important;" data-ad-status="filled" data-anchor-shown="true">
<div class="grippy-host">
</div>
<div id="aswift_9_host" tabindex="0" title="Advertisement" aria-label="Advertisement" style="border: none !important; height: 124px !important; width: 100% !important; margin: 0px !important; padding: 0px !important; position: relative !important; visibility: visible !important; background-color: transparent !important; display: inline-block !important; inset: auto !important; clear: none !important; float: none !important; max-height: none !important; max-width: none !important; opacity: 1 !important; overflow: visible !important; vertical-align: baseline !important; z-index: auto !important;">
<iframe id="aswift_9" name="aswift_9" style="width: 1005px !important; height: 124px !important; display: block; margin: 0px auto;" sandbox="allow-forms allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-top-navigation-by-user-activation" width="1005" height="124" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" src="..." data-ssxxxxxxxx="1" data-google-container-id="a!a" data-google-query-id="XXXXXXXXXXXXXXXXXXXXXXXXXXXX" data-load-complete="true">
</iframe>
</div>
</ins>
このコードで注目すべきはCSSがstyle
タグにベタ書きされている点です。
特に!important
指定されているため、単純なCSSの追加では表示の調整ができません。
例えばCSSで要素の重なりを制御するz-index
が2147483647
という最大値を指定されており、且つ、遅延してロードされるためほぼ確実にブラウザ内の最前面に表示されてしまいます。
こうなるとCSS定義を用いた場合では、残念ながらアンカー広告より上に表示することができません。
そもそも、アンカー広告より上にUIを表示することができたとしても、誤クリック・誤タップでアンカー広告がクリックされることは好ましくないため、アンカー広告の重なりを制御することは避けたほうが良いでしょう。
そうなると必然的に、「アンカー広告が読み込まれているかどうか」、「アンカー広告が表示されているかどうか」といった状態を識別し、JavaScript等でUIの位置を制御する方が確実です。
Google AdSenseのアンカー広告が読み込まれているかどうか判別する

さて、ではGoogleアドセンスのアンカー広告が読み込まれているかどうか判別する方法を模索しましょう。
<ins class="adsbygoogle adsbygoogle-noablate" data-adsbygoogle-status="done" data-anchor-status="displayed" style="display: block; width: 100% !important; height: 129px !important; bottom: 0px; clear: none !important; float: none !important; left: 0px; margin: 0px !important; max-height: none !important; max-width: none !important; opacity: 1; overflow: visible !important; padding: 0px !important; position: fixed; right: auto !important; top: auto !important; vertical-align: baseline !important; visibility: visible !important; z-index: 2147483647; background: rgb(250, 250, 250) !important;" data-ad-status="filled" data-anchor-shown="true">
この中で実際に識別に使えそうなものはclass
属性のadsbygoogle
やdata-anchor-status
、data-ad-status
にdata-anchor-shown
などが使えそうです。
特にdata-anchor-status
とdata-anchor-shown
は、他のAdSenseの広告タグには含まれていないため、これを識別に使うことができそうです。
念のため広告タグの属性変化を検証すると、やはりdata-anchor-status
があればアンカー広告であると確定します。
Googleアドセンスのアンカー広告の開閉状態を判別する
またこの属性(data-anchor-status
)はアンカー広告を開いているか開いていないかの状態に追随して変化していることが判明しました。
さらには、開閉状態を切り替えると、style
属性の値が随時変化していることもわかりました。
したがって、これらの情報より、
クライアントサイドにてdata-anchor-status
というデータ属性を含む要素のdata-anchor-status
属性の変化、またはstyle
属性の変化に追随してレイアウトを調整すれば良いということがわかりました。
JavaScriptで特定要素の変化を監視する:MutationObserver
JavaScriptで要素の監視といえばMutationObserver
です。これは属性の変化や含まれるテキストデータの変化、サブツリー(子要素)の変化などを監視し、変更があった場合に予め登録しておいた関数を実行させられます。

ちなみに今回の用途ならResizeObserver
を用いて広告タグのリサイズに連動させることも可能です。

この他にもIntersectionObserver
などの種類がありますが、今回の用途では利用できなさそうです。

MutationObserver
とResizeObserver
ですが、今回はMutationObserver
を用います。
両者の違いは監視できる種類の他に、MutationObserver
の方がより古いブラウザに対応できる(Chrome26/Edge12)ため、こちらを採用します。
※ ちなみにResizeObserver
もChrome64/Edge79と比較的古いバージョンに対応しますので、好みで使い分けてください
それでは次ページにて、アンカー広告の状態に応じて位置を調整するコードを実装し、そのコードを共有します。
WordPressの不具合対応/カスタマイズ¥15,000~
PC歴25年超、SE歴10年超、WordPress運営歴7年超、WordPressエンジニア歴5年超のスキルとノウハウを提供します
当サイト管理人の「ガノー」(Ganohr)は、日本最大手且つ東証一部上場企業が運営するクラウドソーシングサイト『Lancers』にて、認定ランサーとして活動しています。
※ 認定ランサーとはLancersにより様々な能力 ( 高い仕事遂行率・高い顧客満足度・多くの実績、など ) を評価したプロフェッショナルを認定する制度です。
JavaScriptカテゴリの最新記事
- 2023.04.26
- JavaScript, ユーザビリティ, 必須, 開発者向け,
サイト内で公開しているオリジナルソフトを、Edge経由でダウンロードできなくする方法
- 2023.04.03
- JavaScript, 開発者向け,
JavaScriptで日付や日時関連のサンプルコード一覧完全版
- 2023.02.27
- AdSense, JavaScript, jQuery, ユーザビリティ, 広告収益等,
Googleアドセンスのワイドスクリーン用アンカー広告の表示状態に応じてトップへスクロールするボタンの位置を調整する
- 2023.02.17
- JavaScript, PHP, 必須, 開発者向け,
条件文・条件式の論理和と論理積と論理否定を分かりやすく解説!コーディングスタイルも解説
- 2023.02.17
- JavaScript, ユーザビリティ, 必須, 開発者向け,
highlight.jsで半角スペースが で記述されている場合に自動的に半角スペースへ置換させる
- 2022.11.23
Chrome/EDGE等のChromiumブラウザのバグによる文字崩れ/文字のにじみ/文字壊れの原因と改善するコードを共有します
コメントを書く