すべてのサブメニューをホバー時またはフォーカス時に表示する全幅のドロップダウン メニューがあります (キーボードでアクセスできるようにするため)。これはよく目にするメニューですが、ホバー動作をシミュレートする (つまり、メニューを展開する) 方法で実装されたキーボード アクセシビリティの例は見つかりませんでした。
メニューの HTML は次のとおりです。
<div id="menu">
<div class="container">
<ul class="row">
<li class="first"><a href="link">Home</a></li>
<li><a href="link">Projects</a>
<ul class="inner">
<li class="first"><a href="link">Project 1</a></li>
<li class="last"><a href="link">Project 2</a></li>
</ul>
</li>
<li class="last"><a href="link">Contact</a>
<ul class="inner">
<li class="first"><a href="link">Visit us</a></li>
<li class="last"><a href="link">Email</a></li>
</ul>
</li>
</ul>
</div>
</div>
私はこれをJqueryで機能させるためにあらゆる種類の方法を試してきました(まだJqueryを学んでいます)が、部分的に機能します。ホバー機能はある程度機能しますが、まだ奇妙なことが起こっています。問題は、フォーカス/ぼかし機能にあります。ぼかし機能にタイムアウトを追加しました。そうしないと、タブで別のリンクに移動するたびに起動します。しかし、このタイムアウトを設定すると、ぼかし効果は発生しなくなります。(メニューは展開されたままです)。
これが他のソリューションと異なるのは、個々のリンクではなく、#menu div でホバー、フォーカス、ぼかしイベントを発生させたいことです。全幅のメニューなので、このように機能させたいと思います。メニューにカーソルを合わせると、すべてのサブメニューが一度に表示されます。div に「tabindex = 0」を追加すると、フォーカスとぼかしを使用できるようになることがわかりました。したがって、これも Jquery で追加することにしました。
私のJqueryは次のようになります。
$(document).ready(function() {
/* dropdownmenu */
$("#menu")
.attr("tabindex",0)
// HOVER
.hover
( function ()
{
$(this).addClass('dropdown');
$(this).animate({ height: '20em'});
},
//hover out
function()
{
$(this).animate(
{ height: '6em' },
{ complete: function() { $(this).removeClass('dropdown'); } }
)
}
)
// FOCUS
.focus
( function ()
{
$(this).addClass('dropdown');
$(this).animate({height: '20em'});
}
)
// BLUR
.blur
( function()
{
setTimeout(function()
{
$(this).animate(
{height: '6em'},
{ complete: function() { $(this).removeClass('dropdown'); } }
)
},500);
}
);
この Jquery を改善するために、誰かが私を少し助けてくれることを願っています。それは長いですか?また、ホバー機能の動作がおかしく、ぼかし機能がまったく機能しないのはなぜですか? 私はこれについて別の方法で行くべきですか?
これも jsfiddle に追加しました: http://jsfiddle.net/CpdM2/1/ ここでは、動作をより適切に示すために高さが異なります。
助けてくれてありがとう!
編集
私は今、Jquery で別のアプローチを試みています。近づいてきましたが、唯一の問題はぼかし機能に残っています。
私の新しいjquery:
$.fn.accessibleDropDown = function ()
{
var el = $(this);
$(el).mouseenter(function() {
$("#menu").addClass('dropdown');
$("#menu").animate({ height: '7em'});
}).mouseleave(function() {
$("#menu").animate(
{ height: '1em' },
{ complete: function() { $("#menu").removeClass('dropdown'); } }
);
});
/* Make dropdown menus keyboard accessible */
$("#menu").focus(function() {
//alert("focus");
$("#menu").addClass('dropdown');
$("#menu").animate({ height: '7em'});
}).blur(function() {
setTimeout(function() {
if ($('#menu').find(':focus').length > 0) {
return false;
} else {
alert("menu does not have focus");
$("#menu").animate(
{ height: '1em' },
{ complete: function() { $("#menu").removeClass('dropdown'); } }
);
}
}, 50);
});
};
$("#menu").attr("tabindex",0).accessibleDropDown();
ここで実際の動作を確認してください: http://jsfiddle.net/kBNRv/
#menu div がフォーカスを失ったかどうかを確認するコードが何らかの理由で機能していません。誰かが私を正しい方向に向けてくれることを本当に願っています。前もって感謝します。