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 ダーティ ページとは何ですか?

推薦する

MySQL マルチバージョン同時実行制御 MVCC の実装

トランザクション分離レベルの設定 グローバルトランザクション分離レベルを読み取りコミット済みに設定;...

この記事では、MySQLのマスタースレーブ同期の原理を説明します。

目次MySQL マスタースレーブ同期原理の簡単な分析1. マスタースレーブとは何ですか? 2. 主従...

JavaScript インスタンス オブジェクトでプロトタイプ メソッドをオーバーライドする方法の詳細

目次JavaScriptでは、通常、次のコードのようにクラスを簡単に定義できます。 var サンプル...

Nest.js のハッシュと暗号化の例の詳細な説明

0x0 はじめにまず、ハッシュアルゴリズムとは何でしょうか?メッセージやセッション項目など、一部のデ...

Win7 で IIS7 Web および FTP サービスを完全にアンインストールする方法

昨日、パソコンにPHP開発環境をセットアップした後、Apacheサーバーを再起動するとエラーが続きま...

MySQL で union all を使用してユニオンソートを取得する方法

プロジェクトでは、何らかの不可逆的な理由により、テーブルに保存されたデータがページの表示要件を満たす...

HTML テキストフォーマットの簡単な例 (詳細な説明)

1. テキストの書式設定: この例では、HTML ファイル内のテキストを書式設定する方法を示します...

ES6 配列のコピーおよびフィルメソッド copyWithin() および fill() の具体的な使用法

目次バッチコピー copyWithin()配列を埋めるメソッド fill()指数の計算方法については...

HTML チュートリアル、optgroup 要素の理解

カテゴリ選択を選択します。テストの結果、IE と FF はこの要素を適切にサポートできることがわかり...

パズル効果を実現するネイティブ js

この記事では、パズル効果を実現するためのネイティブjsの具体的なコードを参考までに共有します。具体的...

MySQL グループ化クエリと集計関数

概要私たちは、双十一に天猫で化粧品を購入する人の平均支出額を知りたい(商品の価格帯を見つけるのに役立...

MySQL でよく使われる型変換関数の概要 (推奨)

1. Concat関数。よく使用される接続文字列: concat 関数。たとえば、SQLクエリ条件...

LeetCode の SQL 実装 (177. 給与が N 番目に高い)

[LeetCode] 177. 最も高い給与従業員テーブルからn番目に高い給与を取得する SQL ...

MySQL の大文字と小文字の区別に関する注意

目次MySQLの大文字と小文字の区別はパラメータによって制御されますMySQLの大文字と小文字の区別...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル (Windows 版)

1. はじめにプロジェクトではMySQLを使用しています。インターネット上の例を参考にインストール...