onfocus="this.blur()" は視覚障害のあるウェブマスターに嫌われている

onfocus="this.blur()" は視覚障害のあるウェブマスターに嫌われている

スクリーン リーダー ソフトウェアの操作ページについて話しているとき、彼はフロントエンドの学生たちに特に強調しました。彼が最も嫌っているのは、ページ リンクの onfocus="this.blur()" コードです。これはどこから来たのでしょうか。

各種瀏覽器虛線框差異圖

(図1)

学生の皆さん、このコードは見覚えがありますか? はい、ご存知のとおり、このコードは、リンクにフォーカスが当たったときにリンクの周囲に表示される点線の枠を削除するためによく使用されます (上の図 1 を参照)。Google で検索すると、最初の数十ページはすべて点線の枠を削除するテクニックに関するものであることがわかります。しかし、私たちはこれまでこれについて考えたことがなかったかもしれません。このコード行は視覚障害のあるユーザーにとって大きな問題を引き起こしました。視覚障害のあるユーザーの Tab キー パスを中断し、Tab カーソルがページの次のコントローラー (リンク、フォーム フィールド、オブジェクト、イメージ マップなど) にフォーカスできなくなるのです。テストは次のとおりです。


コードをコピー
コードは次のとおりです。

<本文>
<a href="#" >最初のリンク</a>
<a href="#" >2 番目のリンク</a>
<a href="#" onfocus="this.blur();">3 番目のリンク</a>
<a href="#" >4番目のリンク</a>
<a href="#" >5番目のリンク</a>
<a href="#" >6 番目のリンク</a>
</本文>

Tab キーを押すと、最初のリンクと 2 番目のリンクは正常にフォーカスを取得できます。3 番目のリンクにタブで移動し続けると、悲劇が起こります。フォーカスは最初のリンクに戻り、4 番目のリンクにフォーカスできなくなります。これは、フォーカスが 3 番目のリンクにあるときに、onfocus="this.blur()" イベント処理によってフォーカスが強制的に失われ、フォーカスがドキュメントの先頭に戻るためです。 Tabキーを連続して押すと、フォーカスは最初の3つのリンク間で回転し、それらの背後にあるコンテンツにはTabキーを使用してアクセスできなくなります[1]。

虛線框影響視覺效果 (図2)

それで、もっと良い方法はあるのでしょうか?基本的に、onfocus="this.blur()" を追加すると、リンクがフォーカスを取得した後にリンクの周りの点線枠が削除されます (もちろん、Chrome、Safari、Opera のフォーカス効果は異なるため、ここではそう呼びます)。アウトラインに関する W3C の記事では、この点線のボックスは、現在のページのどの要素にフォーカスが置かれているかをユーザーに伝えるために使用されると説明されています。点線のボックスの存在は合理的だと思いますが、場合によっては、特定の「視覚的なクリーンさ」のニーズを避けられないことがあります (図 2 に示すように、点線のボックスは「製品」の背景とその下の赤いブロックを分離します)。次に、点線のボックスを削除するための一般的な方法をいくつかまとめます。

点線枠の削除方法長所と短所互換性タブを中断するかどうか
<a href="#" onfocus="this.blur()">このぼかし</a>フォーカスを失うとリンクフォーカスがトリガーされ、js と html が結合されます互換性の問題はありませんはい
a:focus {outline:none} または
{アウトライン:なし}
アウトラインは CSS 2.1 で導入されました。点線のボックスの視覚的な問題を解消するのは CSS の役割です。 ie6/ie7はサポートされていません、ie8+/ff/safari/opera[2]はサポートされていますいいえ
<a href=”#” hidefocus=”true” >hidefocus</a>このプロパティはIEの私有財産です。[3] IE5+ サポートいいえ
a { noFocusLine: 式(this.onFocus = this.blur())}バッチ処理は可能だが、表現のパフォーマンスは無視できない式はIE6/7でサポートされていますが、IE8+または非IEではサポートされていません。はい

上記を踏まえて、リンクの点線枠を削除する推奨方法は、IE では hidefocus 属性を使用し、FF/chorme/opera/safari では outline:none を使用することです。今すぐ:
<a href="#" hidefocus="true" >リンク</a>
フォーカス {
アウトライン:なし;
}

Yang Yongquan 氏は、onfocus="this.blur()" のせいでタブがページ全体のコンテンツにアクセスできない場合、スクリーン リーダー ソフトウェアはページを読む前にこの属性を強制的にフィルタリングすると、どうしようもなく言いました。ただし、ユーザーが js で this.blur() を動的にトリガーした場合、スクリーン リーダー ソフトウェアはそれを抑制するための新しいトリックを考え出さなければなりません。これにより、スクリーン リーダー ソフトウェア開発の作業負荷が間違いなく増加します。視覚障碍のあるユーザーが当社の Web サイトをよりスムーズにアクセスできるようにするには、onfocus="this.blur()" の使用を避けるようにしてください。

注記

[1] Safariでは、デフォルトではTabキーを押してもリンクはフォーカスされませんが、フォームフィールドにフォーカスされます。この機能を有効にするには、環境設定の詳細で「Tabキーを押してWebページ上の各項目をハイライト表示する」をチェックします。 Opera は非常に特殊です。Shift キーを押しながら上、下、左、右の矢印キーを使用すると、ページを上、下、左、右にフォーカスできます。

[2] Operaでは、リンク(フォーカスまたはアクティブ状態)をクリックしても点線枠は表示されないため、Operaのリンクの点線枠の問題は無視できます。 Opera が Shift + 上、下、左、右キーを使用して作成したワイヤーフレームは、outline:none を使用して削除することはできませんが、Opera は outline 属性をサポートしています。

[3]hidefocus属性はIEのプライベート属性です。hidefocus属性にはtrueとfalseの2つの値がありますが、テスト結果によると、IE5-IE9では、値がtrueかfalseかに関係なく、hidefocus属性が追加されている限り、リンクの点線枠が消えます。

<<:  リンク使用時にハイパーリンクがジャンプしないようにする方法

>>:  mysql ダーティ ページとは何ですか?

推薦する

Vue でデータが変更された後にビューを同期的に更新する方法

序文少し前に、興味深い問題を目にしました。Vue のデータが変更された後に、ビューを同期的に更新する...

Docker の NFS-Ganesha イメージを使用して NFS サーバーを構築する詳細なプロセス

目次1. NFS-Ganeshaの紹介2. NFS-Ganeshaの設定3. NFS-Ganesha...

Linux で一般的なソフトウェアを設定する方法

新しいLinuxサーバーを入手する場合、通常は次の5つの構成を実行する必要があります。 HOSTAN...

MySQL学習エンジンの詳細な説明、説明、権限

エンジン導入InnodbエンジンInnodb エンジンは、データベース ACID トランザクションを...

ネストされた HTML ページの使用例 (フレームセットの使用)

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

HTML 基本構造_Powernode Java アカデミー

多くの場合、Web ページ開発を学ぶときに最初に印象に残るのは、html または htm サフィック...

JavaScriptは4桁のランダム検証コードの生成を実装します

この記事の例では、JavaScriptで4桁のランダムな検証コードを生成する具体的なコードを参考まで...

MySQL で最大接続数を正しく変更する 3 つの方法

MySQL データベースをインストールすると、デフォルトの MySQL データベースの最大接続数が ...

Reactエラー境界コンポーネント処理

React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなか...

docker-machineの使い方の詳しい説明

Docker-machineはDockerが公式に提供しているDocker管理ツールです。これは d...

vue+tp5はシンプルなログイン機能を実現

この記事では、参考までに、簡単なログイン機能を実装するためのvue+tp5の具体的なコードを紹介しま...

さまざまなブラウザでのhrタグの説明

通常、人事担当者と会うことはめったにありませんが、一度会うと、それが生死を分けることもあります。 H...

Centos7でmysql6の初期化インストールパスワードをインストールする方法

1. まずデータベースサーバーを停止しますサービスmysqld停止2.vim /etc/my.cnf...

Vueは商品詳細ページの虫眼鏡機能を実装します

この記事では、商品詳細ページの虫眼鏡を実装するためのVueの具体的なコードを参考までに共有します。具...

MySQLカスタム関数とストアドプロシージャの詳細な説明

序文この記事では主にMySQLのカスタム関数とストアドプロシージャに関する関連コンテンツを紹介し、皆...