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実行計画の詳細な説明

EXPLAIN ステートメントは、MySQL がステートメントを実行する方法に関する情報を提供します...

CSSをiPhoneのフルスクリーンに適応させる方法

1. メディアクエリ方式 /*iPhone X への適応*/ @media 画面のみ、(デバイス幅:...

div 内の img と span の垂直方向の中央揃えの問題について

以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<htm...

CSS 境界線の長さ制御機能の実装

以前は、境界線の長さをコンテナーよりも小さくする必要があったときに、div ネストを使用していました...

HTML メタの説明

導入メタタグは、HTML言語のHEAD領域にある補助タグです。 meta は、ページの説明、キーワー...

ウェブページを自動更新するための 3 つのコード

実際、この効果を実現するのは非常に簡単で、この効果は特殊効果と呼ぶことすらできません。次のコードを ...

Webpack での publicPath の使用法の詳細な説明

目次出力出力パス出力.publicPath webpack-dev-server の publicP...

ウェブサイトのパフォーマンスを向上させるためのウェブサーバーの改善

<br />このシリーズの最初のセクションでは、Web サイトのパフォーマンスを向上させ...

Ubuntu 上の Apache で SSL (https 証明書) を設定する正しい方法の詳細な説明

まず、Alibaba Cloud の公式チュートリアルをご覧ください。ファイルの説明: 1. 証明書...

CSS3 3Dクールキューブ変形アニメーションの実装

私はコーディングが大好きです。コーディングすると幸せになります!みなさんこんにちは、Counterで...

Linux で Jenkins プロジェクトを構築するプロセス (CentOS 7 を例に)

https://gitee.com/tengge1/ShadowEditor のデプロイメントを例...

Ubuntu での Subversion (SVN) の詳細なインストールと設定

ソフトウェア開発者であれば、Subversion に精通している必要があります。 Subversio...

MySQLのconcat関連関数の詳細な説明

1. concat() 関数機能: 複数の文字列を 1 つの文字列に連結する構文: concat(s...