Quantcast
Channel: サイト構築 –ソロ学
Viewing all articles
Browse latest Browse all 10

“[id]属性が有効でフォーカス可能な要素のIDが一意ではありません”がPSIで出た時の対処法。

$
0
0

PageSpeed Insightsで“[id] 属性が有効でフォーカス可能な要素の ID が一意ではありません”という改善案が出た時の対処法です。

これはフォーカス可能な要素(入力フォームなど)の中に重複したIDを指定しているページを検証した時に出る改善案です。

WordPressを使っている当サイトでは「サイト内検索」のボタン部分にこの指摘が出ていましたので対処しました。その時の内容です。

対処方法は簡単で、既存のid名を重複しないように変更すればOKです。

PSI:“[id]属性が有効でフォーカス可能な要素のIDが一意ではありません”の対処法

数カ月前にGoogleが提供するサイト診断ツール「PageSpeed Insights」の仕様が変更され、ユーザー補助という項目に出る改善案が多くなりました。

ユーザー補助と題されているだけあり、検索やコメントなどでも使用されるフォーム要素(入力フォーム)のユーザビリティ関連でよく怒られます…。

今回はその指摘の1つである、

[id]属性が有効でフォーカス可能な要素のIDが一意ではありません

というのに対処した時の内容を記事にします。

[id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_001

PageSpeed Insightsで当サイトの記事ページを診断した結果

新しくなったPSIの診断では、当サイトの「サイト内検索」のフォーム部分がボコボコに怒られており、これまで対処を重ねてきました。

今回の内容は「ARIA IDが一意ではありません」という指摘とほとんど同じ内容です。
1つの記事にしても良かったのですが、備忘録でもあるのでこちらに分けました。

では早速見ていきましょう・w・

原因はフォーカス可能な要素内のid名の重複

まず“[id]属性が有効でフォーカス可能な要素のIDが一意ではありません”が出る原因ですが、これは1ページ内に重複するidが存在していることにあります。

本来は一意であるはずのid(id名)が1ページ内に複数あり、スクリーンリーダーを使った時や、要素のフォーカス時にややこしいではないか!という内容です。

参考

「フォーカス可能な要素」とは、簡単に言えばパソコンのTabキーで飛べる部分です。クリックできるリンク部分や、入力フォームもこれに当たります。

さらに詳しい内容は以下のサイトで解説されているので、参考になるかと思います。

ここで改めて「PageSpeed Insights」を確認してみると、

[id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_002

id=”searchsubmit”が2つあり、id名が重複している

2つの<input>要素内に「id=”searchsubmit”」と書いてあり、同じid名が指定されていることが分かりますが、今回はこれを被らないようにする必要があります。

[id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_003 [id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_004

当サイトの場合は、フォーム要素であるサイト内検索のボタン部分で怒られました。

静的サイトなら該当するid名を異なるものに変更するだけでOKなのですが、当サイトはWordPressということで少し面倒なことになりました。

WordPressでは「検索」を2つ使うとダメ?

WordPressには簡単にサイト内検索を実装できるウィジェットで「検索」というのがありますが、これを2つ使うとidが被ります。

[id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_005

WordPressのサイト内検索ウィジェット

使用中のWordPressのテーマにもよりますが、この「検索」ウィジェットを当サイトのようにパソコン用・モバイル用と2つ使用しているとidが被ります。

WordPressのサイト内検索には基本的に「searchform.php」というファイルが使われますが、これが2回読み込まれるので同じidが2つ出力されるわけですね~。

ということで、WordPressで“[id]属性が有効でフォーカス可能な要素のIDが一意ではありません”が出た時の対処方法は以下2つになります。

  1. サイト内検索を1回しか使わないようにする。
  2. 2つのうち1つのサイト内検索を自前で用意する。

今回は2つめの方法で、異なるidのサイト内検索を実装することで対処します。

対処法:要素内のidを重複しないようにする

当サイトの場合は「searchform.php」内に以下のような記述があり、これが先ほどの検索ウィジェットを使った時に読み込まれます。

<form method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
    <label class="hidden" for="s">
        <?php __( '', 'default' ); ?>
    </label>
    <input type="text" placeholder="<?php echo esc_attr( st_get_search_form_placeholder() ); ?>" value="<?php the_search_query(); ?>" name="s" id="s" />
    <input type="submit" value="&#xf002;" class="fa" id="searchsubmit" />
</form>

なのでこのコードを参考に、id名だけ「searchsubmit」から別のものに変更したものを、サイドバーのサイト内検索(パソコン用)で出力するように自前で用意します。

モバイル用のサイト内検索は検索ウィジェットでid="searchsubmit"を出力。
パソコン用にコードを直書きした別のidのサイト内検索を出力する感じですね。

[id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_006

「sidebar.php」にサイト内検索のコードを直書きする

WordPressの場合はサイドバーの出力には基本的に「sidebar.php」というファイルが使われるので、今回はこれにサイト内検索のコードを直書きします。

ポイント

親テーマ内にある「sidebar.php」を編集するとテーマアップデート時に内容が消えてしまうので、これを子テーマにコピーして編集します。

「sidebar.php」を開いて該当する箇所にサイト内検索のコードを書きます。

<form method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
    <label class="hidden" for="s">
        <?php __( '', 'default' ); ?>
    </label>
    <input type="text" placeholder="<?php echo esc_attr( st_get_search_form_placeholder() ); ?>" value="<?php the_search_query(); ?>" name="s" id="s" />
    <input type="submit" value="&#xf002;" class="fa" id="pc-searchsubmit" />
</form>

ほとんど同じコードですが、id=”xxx”の部分を「pc-searchsubmit」に変更して検索ウィジェットが出力する「searchsubmit」というid名と重複しないようにしました。

補足

id名を変更しているので、場合によってはCSSを当て直す必要があります。

id名が変更され、重複していないか確認する

作業を終えたら早速idを確認しましょう!
まずはChromeのデベロッパーツールを使ってidを確認します。

[id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_008 [id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_007

同じようなサイト内検索ですが、id名は別々のものが付与されています。
続いて肝心の「PageSpeed Insights」の方でもチェックしてみます。

[id]属性が有効でフォーカス可能な要素のIDが一意ではありません-PageSpeed Insights_009

[id] 属性が有効でフォーカス可能な要素の ID はすべて一意です

OKですね!

まとめ

以上、PageSpeed Insightsで“[id]属性が有効でフォーカス可能な要素のIDが一意ではありません”が出た時の対処法でした。

内容自体は簡単でid名を重複しないように変更すればOKなのですが、WordPressだとその部分が自動出力なので結構面倒です。

ある程度の専門知識が必要になるので、分からない方は「検索」ウィジェットを1つに絞って対応する感じになるかと思います…。
PageSpeed Insightsの改善必須項目ではないので無視するのもアリかもです。

Copyright © 2024 ソロ学 All Rights Reserved.


Viewing all articles
Browse latest Browse all 10

Trending Articles