Как убрать фокус с кнопок при нажатии

226

Все мои кнопки выделяются вокруг них после того, как я нажимаю на них. Это в Хроме.

неотобранный выбранный

<button class="btn btn-primary btn-block">
    <span class="icon-plus"></span> Add Page
</button>

Я использую Bootstrap с темой, но я уверен, что это не так: я заметил это раньше в другом проекте.

Уходит, если я использую <a>тег вместо <button>. Зачем? Если бы я хотел использовать, <button>как бы я сделал это уйти?

Шон Кларк Хесс
источник
12
контур: 0; может вас заинтересовать
Wiggler Jtag
Любой класс добавляется после клика?
Кузгун
1
набросок: 0, кажется, не помогает, как и появление webkit
Шон Кларк Хесс
7
28 ответов, предлагающих различные методы решения этой проблемы, являются свидетельством плачевного состояния веб-разработки на сегодняшний день.
Дельтанин
3
Люди, считающие эту особенность доступности проблемой, являются свидетельством плачевного состояния веб-разработки переднего плана сегодня.
Квентин

Ответы:

294

Я нашел эти вопросы и ответы на другой странице, и переопределение стиля фокуса кнопки сработало для меня. Эта проблема может быть характерна для MacOS с Chrome.

.btn:focus {
  outline: none;
  box-shadow: none;
}

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

jerimiah797
источник
33
Я тоже думал об этом, но разве удаление контура не имеет проблем с доступностью?
Сильвенон
10
Я думаю, у нас нет другого выбора. Вы также можете добавить .btn:active:focusселектор, чтобы удалить его из активного состояния.
Сильвенон
45
Удаление контура с кнопки определенно вредно для доступности. Есть пользователи, которые не могут управлять мышью и должны иметь возможность перемещаться по странице с помощью клавиатуры. Удаление контура делает это очень трудным. Вероятно, лучше не давать кнопке получать фокус при нажатии.
Мерфи Рэндл
Для будущих путешественников этот код полностью заменяет все стили во всех состояниях кнопок для кнопки по умолчанию (не все кнопки):.btn-default, .btn-default:hover, .btn-default:active, .btn-default:active:focus, .btn-default:visited, .btn-default:focus { color: #dcdcdc; background-color: #232323; outline: none; }
Geordie
1
при использовании встроенных переменных начальной загрузки этого можно добиться, установив для этих двух переменных: $ btn-focus-width: 0; $ БТН-фокус-бокс-тень: нет;
Bullettrain
110

Вы хотите что-то вроде:

<button class="btn btn-primary btn-block" onclick="this.blur();">...

Метод .blur () правильно удаляет выделение фокуса и не портит стили Bootstraps.

cshotton
источник
9
Это отображает план на короткий момент, который все еще разрушает его: /
Silvenon
2
Я не вижу мерцания, если я запускаю событие фокуса вместо события щелчка.
Чарльз
2
Это сработало отлично! Будут ли потенциальные проблемы, если я попытаюсь присоединить другой обработчик события click () (т.е. код, который выполняется при нажатии указанной кнопки) к той же кнопке?
Nils_e
4
Если кто-то здесь задается вопросом, работает ли это в bootstrap v4, это так. Ответ действителен в 2018 году, ура!
Jreed
4
Доступность - хорошо, по сравнению с вопросом с наибольшим количеством голосов?
CharlesM
47

я понимаю, что основное внимание будет впервые применено после onMouseDownсобытия, поэтому вызов e.preventDefault()в onMouseDownможет быть чистым решением в зависимости от ваших потребностей. Это, безусловно, удобное решение, но, очевидно, оно регулирует поведение щелчков мыши, которые могут быть несовместимы с вашим веб-проектом.

В настоящее время я использую это решение (в рамках react-bootstrapпроекта), и я не получаю мерцание фокуса или удержание фокуса кнопок после щелчка, но я все еще могу прокрутить фокус и визуально визуализировать фокус тех же кнопок.

PJS
источник
2
Да. ваше решение работает. Спасибо за чаевые. Вот скрипка для решения. Но это требует, чтобы обработчик JavaScript был присоединен к каждой кнопке. Было бы здорово, если бы мы могли достичь этого только с помощью CSS.
Галеель Бхаша
1
Я думаю, что люди ожидают, что внимание будет сосредоточено на элементе, когда вы нажмете на него, и это решение предотвращает это. Я часто нажимаю на элемент и затем удаляюсь перед тем, как отпустить мышь, чтобы сфокусировать его, чтобы потом можно было вкладывать.
Михаил Тончев
7
Для любого, кто просматривает фрагмент, это должно сработать и сохранить onClick:onMouseDown={e => e.preventDefault()}
Адам К Дин
1
Это предотвращает «нажатие» кнопки пробелом и клавишей возврата. Возможно, более полное решение , чтобы добавить обратно с: onKeyUp={(e) => {if (e.keyCode === 13 || e.keyCode === 32) handleClick()}.
jfbloom22
Вы не должны вызывать e.preventDefault () внутри onKeyUpсобытия. Оказывается, если вы это сделаете, то кнопка остается сфокусированной после нажатия клавиши пробела или клавиши возврата и вкладки или щелчка в любом месте.
jfbloom22
30

Не могу поверить, что никто еще не опубликовал это.

Используйте метку вместо кнопки.

<label type="button" class="btn btn-primary btn-block">
<span class="icon-plus"></span> Add Page
</label>

скрипка

Адам МакКенна
источник
11
Это прекрасно работает для большинства пользователей, но этот метод не подходит для программ чтения с экрана или клавиатур и оставит незрячих пользователей и пользователей с ослабленной моторикой неспособными взаимодействовать с кнопкой.
Мерфи Рэндл
8
1. Замените метку тегом <a>. так что это доступно через клавиатуру. 2. добавьте aria-role = "button", чтобы улучшить доступность для читателя экрана. обновленный Fiddle
Galeel Bhasha
Хорошее решение, помогло мне, но как-то не работает для угловой директивы, даже с оберткой, например<a class="btn"><my-directive/></a>
ya_dimon
2
При использовании вкладок ярлыки полностью пропускаются для пользователей, не являющихся мышами, что плохо для доступности
Фелипе Июн
1
В Bootstrap 4 кажется, что вид кнопки меняется.
Джейсон Ким
30

Хотя это легко только контур вынимаются для всех сосредоточены кнопок (как в user1933897 игрового ответа ), но это решение плохо с точки зрения доступности (например, см Остановить Мессинг с браузером по умолчанию Фокуса контур )

С другой стороны, вероятно, невозможно убедить ваш браузер прекратить стилизовать вашу нажатую кнопку как выделенную, если она думает, что она сфокусирована после того, как вы нажали на нее (я смотрю на вас, Chrome на OS X).

Так что мы можем сделать? Несколько вариантов приходят мне на ум.

1) Javascript (jQuery): $('.btn').mouseup(function() { this.blur() })

Вы указываете своему браузеру, что нужно убрать фокус с любой кнопки сразу после ее нажатия. Используя mouseupвместо этого, clickмы сохраняем поведение по умолчанию для взаимодействий на основе клавиатуры ( mouseupне вызывается клавиатурой).

2) CSS: .btn:hover { outline: 0 !important }

Здесь вы отключаете контур только для кнопок навески . Очевидно, что это не идеально, но может быть достаточно в некоторых ситуациях.

Alexis
источник
4
Число 1 - полезный совет. Он отключит фокусировку, когда кнопка не нажата, однако он будет отображаться, пока она нажата. Я отключил фокус на выбранном активном элементе с помощью :active:focus {outline:none;}.
конечно,
Сокращенные функции, которые связывают прослушиватели событий, в jQuery устарели, поэтому лучше использовать .on('mouseup', function() { ... })вместо них.mouseup()
Crazy Redd
16

Это сработало для меня. Я создал собственный класс, который переопределяет необходимый CSS.

.custom-button:focus {
    outline: none !important;
    border: none !important;
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
}

введите описание изображения здесь

-Webkit-box-shadow будет работать для браузеров Chrome и Safari.

men_aka
источник
у меня работает, но мне пришлось убрать border: none !important;кнопку для сохранения тех же размеров
Emeka Mbah
1
Я пытался убрать фокус на клике над ответами, который не работал, но "box-shadow: none! Важный;" его работа для меня, спасибо @Menaka
Warm
11

Это работает для меня, другое решение не упомянуто. Просто добавьте это в событие щелчка ...

$(this).trigger("blur");

Или вызвать его из другого события / метода ...

$(".btn_name").trigger("blur");
обкрадывать
источник
Проблема в том, что когда пользователь клавиатуры «нажимает» кнопку (фокусируя ее, затем нажимая пробел), он теряет фокус. Затем вы должны перейти на весь путь обратно туда, где вы были. 😡
Тамлин
8

Если вы используете правило :focus { outline: none; }для удаления контуров, ссылка или элемент управления будут фокусируемыми, но без указания фокуса для пользователей клавиатуры. Методы для его удаления, такие как JS onfocus="blur()", еще хуже и приведут к тому, что пользователи клавиатуры не смогут взаимодействовать с элементом управления.

Хаки, которые вы можете использовать, что- то вроде ОК , включают добавление :focus { outline: none; }правил, когда пользователи взаимодействуют с мышью, и удаление их снова, если обнаружено взаимодействие с клавиатурой. Линдсей Эванс сделал много для этого: https://github.com/lindsayevans/outline.js

Но я бы предпочел установить класс по тегу html или body. И иметь контроль в файле CSS о том, когда использовать это.

Например (встроенные обработчики событий только для демонстрационных целей):

<html>
<head>
<style>
  a:focus, button:focus {
    outline: 3px solid #000;
  }
  .no-focus a, .no-focus button {
    outline: none;
  } 
</style>
</head>
<body id="thebody" 
onmousedown="document.getElementById('thebody').classList.add('no-focus');"
onkeydown="document.getElementById('thebody').classList.remove('no-focus');">
    <p>This her is <a href="#">a link</a></p>   
    <button>Click me</button>
</body>
</html>

Я положил вместе ручку: http://codepen.io/snobojohan/pen/RWXXmp

Но будьте осторожны, есть проблемы с производительностью. Это заставляет перерисовывать каждый раз, когда пользователь переключается между мышью и клавиатурой. Подробнее об избежании ненужных красок http://www.html5rocks.com/en/tutorials/speed/unneeded-paints/

snobojohan
источник
6

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

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

Этого следует избегать!

.btn:focus {
  outline: none;
}
Оскар Боланьос
источник
Я не думаю, что это неправильно, потому что у вас все еще есть немного различная молния на кнопке, когда сфокусировано, так что даже пользователи клавиатуры все еще могут это распознать. Но этого не достаточно, потому что вы все равно получите рамку рамки, когда будете нажимать и удерживать левую кнопку мыши
apocalypz
6

Я нахожу решение. когда мы фокусируемся, при начальной загрузке используется box-shadow, поэтому мы просто отключаем его (недостаточно репутации, невозможно загрузить изображение :().

я добавить

.btn:focus{
    box-shadow:none !important;
}

оно работает.

ириска
источник
6

ВАРИАНТ 1: Используйте :focus-visibleпсевдокласс

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

/** 
 * The default focus style is likely provided by Bootstrap or the browser
 * but here we override everything else with a visually appealing cross-
 * browser solution that works well on all focusable page elements
 * including buttons, links, inputs, textareas, and selects.
 */
*:focus { 
  outline: 0 !important;
  box-shadow:
    0 0 0 .2rem #fff, /* use site bg color to create whitespace for faux focus ring */
    0 0 0 .35rem #069 !important; /* faux focus ring color */
}

/**
 * Undo the above focused button styles when the element received focus
 * via mouse click or touch, but not keyboard navigation.
 */
*:focus:not(:focus-visible) {
  outline: 0 !important;
  box-shadow: none !important;
}

Предупреждение. Начиная с 2020 года :focus-visibleпсевдокласс не широко поддерживается в разных браузерах . Однако полифилл очень прост в использовании; см. инструкции ниже.


ВАРИАНТ 2: использовать .focus-visibleполифилл

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

Шаг 1. Добавьте зависимости Javascript на свою HTML-страницу.

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

<!-- place this code just before the closing </html> tag -->
<script src="https://cdn.polyfill.io/v2/polyfill.js?features=Element.prototype.classList"></script>
<script src="https://unpkg.com/focus-visible"></script>

Шаг 2. Добавьте следующий CSS в таблицу стилей.

Ниже приведена модифицированная версия решения CSS, более подробно описанная выше.

/**
 * Custom cross-browser styles for keyboard :focus overrides defaults.
 */
*:focus { 
  outline: 0 !important;
  box-shadow:
    0 0 0 .2rem #fff,
    0 0 0 .35rem #069 !important;
}

/**
 * Remove focus styles for non-keyboard :focus.
 */
*:focus:not(.focus-visible) {
  outline: 0 !important;
  box-shadow: none !important;
}

Шаг 3 (необязательно): при необходимости используйте класс focus-visible

Если у вас есть какие-либо элементы, для которых вы действительно хотите показать кольцо фокусировки, когда кто-то щелкает или использует касание, просто добавьте focus-visibleкласс в элемент DOM.

<!-- This example uses Bootstrap classes to theme a button to appear like
     a regular link, and then add a focus ring when the link is clicked --->
<button type="button" class="btn btn-text focus-visible">
  Clicking me shows a focus box
</button>

Ресурс:

Демо-версия:

Джеймс Энтони Уилсон
источник
Но если даже Chrome еще не поддерживает его, это, вероятно, не лучшее решение (пока)
Элайджа Мок
Что вы предлагаете вместо этого?
Джеймс Уилсон
Скройте схему, как говорят другие ответы, пока это решение не станет более стандартизированным
Илия Мок
Из моего прочтения вещей, если проблема заключается в доступности, сокрытие контура карт-бланша <whatever>:focus { outline: none }- худшая идея, чем это решение. На самом деле, есть люди в сообществе специальных возможностей, которые предпочитают, чтобы вы НИКОГДА не удаляли контур и вместо этого заставляли все иметь стиль: focus (или контур или тень), и не хотели бы поддерживать: focus-visible, пока браузеры не реализуют способ, позволяющий пользователи определяют предпочтения пользователя относительно того, должны ли все элементы быть фокусируемыми или нет. Мне нравится думать, что focus-visible - это удачное промежуточное звено между проблемами дизайна и a11y.
Джеймс Уилсон
5

Если вышеупомянутое не работает для вас, попробуйте это:

.btn: focus {контур: нет; box-shadow: нет; граница: 2px прозрачная;}

Как указал user1933897, это может быть характерно для MacOS с Chrome.

alns
источник
Тем не менее, это действительно при использовании bootstrap 4.0- в Windows
3gwebtrain
5

Поздно, но кто знает, может кому-то помочь. CSS будет выглядеть так:

.rhighlight{
   outline: none !important;
   box-shadow:none
}

HTML будет выглядеть так:

<button type="button" class="btn btn-primary rHighlight">Text</button> 

Таким образом, вы можете сохранить btn и связанные с ним поведения.

Стефани Уайч
источник
1
element:focus { box-shadow: none; }удален синий контур / тень.
user435421
3

Я упоминал об этом в комментарии выше, но для ясности стоит перечислить его как отдельный ответ. До тех пор, пока вам вообще не нужно фокусироваться на кнопке, вы можете использовать событие focus, чтобы удалить ее, прежде чем она сможет применить какие-либо CSS-эффекты:

$('buttonSelector').focus(function(event) {
    event.target.blur();
});

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

Чарльз
источник
Это помогло мне. Я использую React и React-Bootstrap. После нажатия кнопка оставалась подсвеченной вокруг этого. Добавление e.target.blur (); убирает свечение, но кнопка остается другого цвета.
pixelwiz
3

Стиль

.not-focusable:focus {
    outline: none;
    box-shadow: none;
}

С помощью

<button class="btn btn-primary not-focusable">My Button</button>
Богдан Кантерук
источник
Чем это решение отличается от других ответов?
apaul
2
Есть только одно небольшое отличие - вы можете убрать фокус для нужных элементов, указав класс «не-фокусируемый», не переопределяя поведение всех кнопок, ссылок и т. Д.
Богдан Кантерук
3

Попробуйте это решение для удаления границы вокруг кнопки. Добавьте этот код в CSS.

Пытаться

button:focus{
outline:0px;
}

Если не работает, используйте ниже.

button:focus{
 outline:none !important;
 }
Рана Ааламджер
источник
Второй работает даже с кнопкой пользовательского интерфейса React Material
Geek Guy
3

Для людей, которым нужен чистый способ CSS:

:focus:not(:focus-visible) { outline: none }

Это также может работать для ссылки и так далее, и бонус, он сохраняет доступность клавиатуры. Наконец, это игнорируется браузерами, которые не поддерживают: focus-visible

Мартин Педрос
источник
4
Это будет работать только на Chrome с поддержкой экспериментальные функции, согласно developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
Джастин Кан
focus-visibleтеперь есть официальный полифилл. В моем ответе stackoverflow.com/a/60219624/413538 на этот вопрос рассказывается о том, как на самом деле все это понять.
Джеймс Уилсон
2

Мы столкнулись с подобной проблемой и заметили, что Bootstrap 3 не имеет проблемы на вкладках (в Chrome). Похоже, что они используют стиль контура, который позволяет браузеру решать, что лучше делать, а Chrome, кажется, делает то, что вам нужно: показывать контур в фокусе, если вы просто не нажали на элемент.

Поддержку outline-styleтрудно определить, поскольку браузер сам решает, что это значит. Лучше всего проверить в нескольких браузерах и иметь запасное правило.

TeknoFiend
источник
2

Другое возможное решение - добавить класс с использованием слушателя Javascript, когда пользователь нажимает кнопку, а затем удалить этот класс в фокусе с другим слушателем. Это поддерживает доступность (видимые вкладки), а также предотвращает причудливое поведение Chrome, когда кнопка считается нажатой.

JS:

$('button').click(function(){
    $(this).addClass('clicked');
});
$('button').focus(function(){
    $(this).removeClass('clicked');
});

CSS:

button:focus {
    outline: 1px dotted #000;
}
button.clicked {
    outline: none;
}

Полный пример здесь: https://jsfiddle.net/4bbb37fh/

Себ Вулфорд
источник
Используйте mouseDown вместо клика. При щелчке контур появляется, пока мышь нажимается (не отпуская ее) в исходное состояние.
Винсент Хох-Драй
2

Это работа, я надеюсь помочь вам

.btn:focus, .btn:focus:active {
    outline: none;
}
Дмитрий Будницкий
источник
.btn: у фокуса должен быть план доступности (при табуляции)
yennefer
2
.btn:focus:active {
  outline: none;
}

это удаляет контур при щелчке, но сохраняет фокус при вкладке (для a11y)

Йеннифэр из Венгерберга
источник
Это только удаляет контур мыши вниз. После наведения мыши вверх появляется контур.
Wellspring
2

Это работает лучше всего

.btn-primary.focus, .btn-primary:focus {
-webkit-box-shadow: none!important;
box-shadow: none!important;
}

источник
1
  .btn:focus,.btn:active, a{
        outline: none !important;
        box-shadow: none;
     }

эта схема: ни одна не будет работать для кнопки и тега

Милан Паниграхи
источник
Как это отвечает на вопрос? Пожалуйста, добавьте пояснения.
Андре Кул
1

Добавьте это в CSS:

*, ::after, ::before {
    box-sizing: border-box;
    outline: none !important;
    border: none !important;
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
}
Габриэль Рейс
источник
1

Я нашел решение просто добавить строку ниже в вашем коде CSS.

button:focus { outline: none }
Маниш Кумар Шривастава
источник
0

У меня была такая же проблема на MacOS и Chrome, когда я использовал кнопку для запуска события перехода. Если кто-то, читающий это, уже использует прослушиватель событий, вы можете решить его, позвонив .blur()после ваших действий.

Пример:

 nextQuestionButtonEl.click(function(){
    if (isQuestionAnswered()) {
        currentQuestion++;
        changeQuestion();
    } else {
        toggleNotification("invalidForm");
    }
    this.blur();
});

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

jospablos
источник
0

Вы можете установить tabIndex="-1". Это заставит браузер пропускать эту кнопку, когда вы нажимаете клавишу TAB через фокусируемые элементы управления.

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

С другой стороны, создание кнопки без табуляции имеет последствия для доступности.

Я использую его для удаления контура фокуса от кнопки X, у bootstrap modalкоторой в любом случае есть дублирующая кнопка «Закрыть» внизу, поэтому мое решение не влияет на доступность.

zmechanic
источник
0

Если вы используете браузер веб-набора (и, возможно, браузер, совместимый с префиксом поставщика веб-набора), этот контур принадлежит -webkit-focus-ringпсевдоклассу кнопки . Просто установите его outlineна none:

*:-webkit-focus-ring {
  outline: none;
}

Chrome - это такой веб-браузер, и этот эффект также встречается и в Linux (не только в MacOS, хотя некоторые стили в Chrome являются только MacOS)

Нейт Симер
источник
0

У меня возникла та же проблема с использованием <a>кнопки «действовать как кнопка», и я обнаружил, что пропускаю обходной путь, добавив attr, type="button"который, по крайней мере, ведет себя нормально.

<a type="button" class="btn btn-primary">Release Me!</a>

spcsLrg
источник
typeАтрибут не должен иметь никакого влияния на это, и buttonявляется недопустимым значением для него. Атрибут принимает тип MIME и сообщает клиенту , какие данные следует ожидать , чтобы получить , если он следует по ссылке (например <a type="application/pdf" ...>.
Квентин
@Quentin Спасибо. Да, я знаю об этом. Я начал с, role="button"но он просто не работал (после использования <button>вместо <a>). Моя реализация специально требовала <a>и не <button>. Так что после долгих экспериментов я обнаружил этот обходной путь (скорее всего, ошибка BS)!
spcsLrg
0

непосредственно в теге html (в сценарии, где вы можете оставить тему начальной загрузки в другом месте вашего дизайна) ..

примеры, чтобы попробовать ..

<button style="border: transparent;">
<button style="border: 1px solid black;">

..ect ,. в зависимости от желаемого эффекта.

Ни один. Никто
источник