ドロップダウン メニューをプッシュ メニューに置き換えようとしています。当初、ドロップダウンはメインのナビゲーション リンクの隣にネストされていました。キーボードで Tab を使用すると、意図したとおりに機能しました。例:
<li>
<a href="#" name="#women">WOMEN</a> <!-- *Main Navigation -->
<ul id="women"> <!-- *Submenu -->
<li><a href="#">Women</a></li>
<li><a href="#">Women's Plus</a></li>
<li><a href="#">Petites</a></li>
</ul>
</li>
プッシュ メニューの場合、HTML の構造は異なります。例:
<ul> <!-- *Main Navigation -->
<li><a href="#" name="#women">Women</a></li>
<li><a href="#" name="#accessories">Accessories</a></li>
</ul>
<div> <!-- *Submenus -->
<ul id="women">
<li><a href="#">Women</a></li>
<li><a href="#">Women's Plus</a></li>
<li><a href="#">Petites</a></li>
</ul>
<ul id="accessories">
<li><a href="#">Women</a></li>
<li><a href="#">Men</a></li>
</ul>
</div>
私が直面している問題は、キーボードのタブがサブメニューを完全に見逃していることです。で使用しようとしfocus()
まし$(ahrefname).find('a').first().focus();
たが、機能しないため、何かが欠けているに違いありません。
$(document).ready(function() {
$('.lp-sub-menu ul').each(function () {
height = $(this).height();
$(this).transition({
y: +-+height + 'px'
});
});
var heights = $('.lp-sub-menu > ul').map(function () {
return $(this).height();
}).get(),
maxHeight = Math.max.apply(null, heights);
$('#top').on('click focus', 'a', function (e) {
"use strict";
e.preventDefault();
var ahrefname = this.name,
eLeft = $(this).offset().left,
percent = 100 / $(window).width() * eLeft,
submenuHeight = $(ahrefname).height();
if ($(ahrefname).siblings().hasClass('active-sub-menu')) {
$(this).parents('ul').find('a').removeClass('active-menu').find('span').css({
'visibility': ''
});
$(ahrefname).siblings().transition({
y: +-+maxHeight + 'px'
}).delay(10).queue(function (next) {
$(ahrefname).siblings().removeClass('active-sub-menu').css({
'margin-left': ''
});
next();
});
$('.lp-sub-menu').transition({
height: +submenuHeight + 'px'
});
$(ahrefname).css({
'margin-left': percent + '%'
}).delay(4).queue(function (next) {
$(ahrefname).addClass('active-sub-menu').transition({
y: +0 + 'px'
});
next();
});
$(this).addClass('active-menu').find('span').css({
'visibility': 'visible'
});
} else if ($(ahrefname).hasClass('active-sub-menu')) {
$('.lp-sub-menu').transition({
height: +-+submenuHeight + 'px'
});
$(ahrefname).removeClass('active-sub-menu').transition({
y: +0 + 'px'
}).css({
'margin-left': ''
});
$(this).removeClass('active-menu').find('span').css({
'visibility': ''
});;
} else {
$('.lp-sub-menu').transition({
height: +submenuHeight + 'px'
});
$(ahrefname).find('a').first().focus();
});
});
JS Fiddleが動作しています。どんな助けでも大歓迎です!
アップデート:
ありがとう@ヒュンケルン!サブメニューに焦点を当てることはできましたが、次のメニュー項目に問題があり、サブメニューが開きませんでした。関数を次のように更新しました...
$('.lp-sub-menu ul').each(function(){
var height = $(this).height(),
oid = $(this).attr('id');
$(this).transition({ y: + - + height + 'px' });
$(this).find('a:last').focusout(function(){
$( "[name|='#"+oid+"']" ).focus();
});
});
サブメニューが閉じます。もう一度タブを押すと、次のサブメニューが開きます。多分それは良いことですか?わからない。これが最新のJS Fiddleです。(jsFiddle でタブ操作がうまく機能しないのはなぜですか?結果を確認するには、ローカルでテストする必要があります。)