Входной эффект на вкладке клавиатуры → фокус, но НЕ на клике

Когда пользователь "переводит" на вход, я хочу, чтобы эффект фокусировки отображался нормально, но при щелчке я не хочу, чтобы он был видимым.

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

Теперь,

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

Я знаю о .blur(), и сейчас мне нужно использовать setTimeout для ленивого исправления, но я хотел бы знать, есть ли лучший способ для этого, или если возможно Решение только для CSS

Ответ 1

Я думаю, что многие сторонние разработчики пытаются найти баланс между эстетикой и лучшими практиками для доступности. Это похоже на большой компромисс.

Вот как я это делаю. Идея состоит в том, чтобы переключиться, когда пользователь использует ключ табуляции и отключает его при нажатии.

JS

document.addEventListener('keydown', function(e) {
  if (e.keyCode === 9) {
    $('body').addClass('show-focus-outlines');
  }
});

document.addEventListener('click', function(e) {
  $('body').removeClass('show-focus-outlines');
});

Стили

body:not(.show-focus-outlines) button:focus, 
body:not(.show-focus-outlines) [tabindex]:focus {
  outline: none;
}

Ответ 2

В настоящее время я делаю что-то подобное для своей компании. К сожалению, вы должны использовать JavaScript, поскольку CSS не поддерживает этот прецедент.

Вот что я сделал.

var btns = document.querySelectorAll('button');

var onMouseDown = function (evt) {
  evt.target.dataset.pressed = 'true';
};

var onMouseUp = function (evt) {
  evt.target.dataset.pressed = 'false';
};

var onFocus = function (evt) {
  var element = evt.target;
  if (element.dataset.pressed !== 'true') {
    element.classList.add('focus');
  }
};

var onBlur = function (evt) {
  evt.target.classList.remove('focus');
};

for(var i = 0, l = btns.length; i < l; i++) {
  btns[i].addEventListener('mousedown', onMouseDown);
  btns[i].addEventListener('mouseup', onMouseUp); 
  btns[i].addEventListener('focus', onFocus);
  btns[i].addEventListener('blur', onBlur);
}
* { box-sizing: border-box; }

body { background-color: white; }

button {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  min-width: 100px;
  margin: 0 1px;
  padding: 12px 10px;
  font-size: 15px;
  color: white;
  background-color: #646e7c;
  border: none;
  border-radius: 5px;
  box-shadow: 0 2px 2px 0 rgba(0,0,0,.2);
  cursor: pointer;
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
}

button:focus { outline: none; }

button:active {
  -webkit-transform: translateY(1px);
  -moz-transform: translateY(1px);
  transform: translateY(1px);
  box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2);
}

button.focus {
  font-weight: bold;
}

button.primary { background-color: #2093d0; }

button.success { background-color: #71a842; }

button.danger { background-color: #ef4448; }
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <button>Default</button>
  <button class="primary">Primary</button>
  <button class="success">Success</button>
  <button class="danger">Danger</button>
</body>
</html>

Ответ 3

Если вы используете плагин what-input.js, вы можете применять стили специально для пользователей клавиатуры. Вы можете использовать следующий код, чтобы выделить кнопку, на которую была установлена ​​вкладка. Я нашел, что-введите надежный плагин (поставляется в комплекте с Zurb Foundation) и в настоящее время регулярно поддерживается.

// scss
body[data-whatinput="keyboard"] {
  button {
    &:focus {
      // other highlight code here
      box-shadow: 0 0 5px rgba(81, 203, 238, 1);
    }
  }
}

или

/* vanilla css */
body[data-whatinput="keyboard"] button:focus {
  box-shadow:  0 0 5px rgba(81, 203, 238, 1);
}