Мобильное меню не открывается, когда на IOS включена передача голоса

Я открываю свой сайт в IOS с помощью браузера Safari. Мобильное меню работает нормально.

Он открывается, когда я нажимаю на значок меню (значок три линии). Но когда я включаю голосовую связь, затем захожу в браузер и нажимаю на этот значок меню, мобильное меню не открывается.

Это проблема CSS или я должен добавить aria атрибуты?

Кто-нибудь может мне помочь?

   

jQuery('.menu-trigge').once('menuMobile').click(function () {
                    jQuery(this).toggleClass('expand');
                    if (jQuery('.menu-trigger').hasClass('expand')) {
                      jQuery('.menu-trigger').first().slideDown();
                    } else {
                      jQuery('.menu-trigger').first().slideUp();
                    }
                  });
.menu-trigger {
 display: inline-block;
 vertical-align: middle;
 cursor: pointer;
 width: 33px;
 margin: 0 0 0 15px;
 transition: 275ms all ease;
}
.menu-trigger span {
 display: block;
 height: 3px;
 background: #233e6b;
 margin-bottom: 4px;
 -webkit-transition: 275ms all ease;
 transition: 275ms all ease;
}
.main-menu {
 position: absolute;
 top: 100%;
 right: -10px;
 width: 100vw;
 z-index: 100;
 background: #fff;
}
ul.menu {
max-height: calc(100vh - 55px);
 overflow: auto;
}
<div class="menu-block">
  <div class="main-menu">
 <div class="menu_wrapper">
   <ul class="menu">
  <li>Menu 1</li>
  <li>Menu 2</li>
   </ul>
 </div>
  </div>
  <div class="menu-trigger">
 <span></span>
 <span></span>
 <span></span>
  </div>
</div>

2 ответа

Это потому, что вы использовали div, чтобы прикрепить событие click к.

Вместо этого ваш div.menu-триггер должен быть кнопкой [type="button"].

Программы чтения с экрана используют семантику разметки, чтобы сказать, что что-то можно сделать. Div не является исконно действующим элементом.

У вас также будут проблемы с кем-то, использующим клавиатуру с синими зубцами или похожее на клавиатуру устройство (такое как клавиатура Брайля или переключающее устройство), так как div не фокусируется и не может быть активирован нажатием клавиши ввода или пробела. Элемент button заботится обо всех этих проблемах.

Если вы действительно не можете использовать кнопку, вам нужно выполнить несколько арий, tabindex и JS.

Так что либо сделайте это:

<button type="button" class="menu-trigger">

или, используя роль aria, tabindex и дополнительный JS, вам нужно сделать это:

<div class="menu-trigger" role="button" tabindex="0">
// then make sure the JS fires on click and on the enter and spacebar keypress events.
// this mimics the keyboard and focus features that are baked in with the button element

важно: не забывайте иметь некоторый текст только для чтения с экрана, чтобы сообщить пользователю программы чтения с экрана, для чего предназначена кнопка меню. Легко сделать с помощью элемента кнопки - просто добавьте aria-label="open the menu". Затем, после открытия меню, измените метку aria, чтобы сказать "закрыть меню".

<button type="button" class="menu-trigger" aria-label="open the menu">

aria-* атрибуты не вызовут такой проблемы в таком случае, насколько я могу судить. У вас что-то не так с таргетингом JS/CSS. Я не могу сказать, как вы нацеливаетесь на него и как вы на самом деле меняете его на видимый, но вы можете попробовать это:

Добавить еще один класс CSS .main-menu-on и использовать правильные свойства для этого, что-то вроде этого:

.main-menu-on {
    top: 50px;
    right: 10px;
}

Затем используйте JS для переключения класса, например, так:

document.querySelector('.menu-trigger').addEventListener('click', function () {
var menu = document.querySelector('.main-menu');
menu.classList.toggle('main-menu-on');
}, false);

Примечание: если вы хотите сделать это доступным, вы должны понимать и использовать aria-* атрибутов. Это не связано с тем, можете ли вы открыть меню с помощью VoiceOver или нет, но пользователь, который использует VoiceOver, может запутаться во взаимодействии.

Вот пример без aria-* атрибуты:

document.querySelector('.menu-trigger').addEventListener('click', function () {
var menu = document.querySelector('.main-menu');
menu.classList.toggle('main-menu-on');
}, false);
.menu-trigger {
 display: inline-block;
 vertical-align: middle;
 cursor: pointer;
 width: 33px;
 margin: 0 0 0 15px;
 transition: 275ms all ease;
}
.menu-trigger span {
 display: block;
 height: 3px;
 background: #233e6b;
 margin-bottom: 4px;
 -webkit-transition: 275ms all ease;
 transition: 275ms all ease;
}
.main-menu {
 position: absolute;
 top: 100%;
 right: -10px;
 width: 100vw;
 z-index: 100;
 background: #fff;
}
.main-menu-on {
 top: 50px;
 right: 10px;
}
ul.menu {
max-height: calc(100vh - 55px);
 overflow: auto;
}
<div class="menu-block">
  <div class="main-menu">
 <div class="menu_wrapper">
   <ul class="menu">
  <li>Menu 1</li>
  <li>Menu 2</li>
   </ul>
 </div>
  </div>
  <div class="menu-trigger">
 <span></span>
 <span></span>
 <span></span>
  </div>
</div>

Другие вопросы по тегам