Видаліть синю облямівку із кнопки CSS, призначеної для користувача в Chrome


807

Я працюю над веб-сторінкою і хочу <button>теги на замовлення. Так що з допомогою CSS, я сказав: border: none. Зараз він прекрасно працює в сафарі, але в хромі, коли я натискаю одну з кнопок, вона наносить дратує синю облямівку навколо нього. Я думав, button:active { outline: none }чи button:focus { outline:none }працюю, але ні робити. Будь-які ідеї?

Ось як виглядає перед натисканням (і як я хочу, щоб він все ще виглядав після натискання):

І це кордон, про який я говорю:

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

Ось мій CSS:

button.launch {
    background-color: #F9A300;
    border: none;
    height: 40px;
    padding: 5px 15px;
    color: #ffffff;
    font-size: 16px;
    font-weight: 300;
    margin-top: 10px;
    margin-right: 10px;
}

button.launch:hover {
    cursor: pointer;
    background-color: #FABD44;
}

button.change {
    background-color: #F88F00;
    border: none;
    height: 40px;
    padding: 5px 15px;
    color: #ffffff;
    font-size: 16px;
    font-weight: 300;
    margin-top: 10px;
    margin-right: 10px;
}

button.change:hover {
    cursor: pointer;
    background-color: #F89900;
}

button:active {
    outline: none;
    border: none;
}

1
Мені все гаразд? jsbin.com/oSAdovun/1/edit
davidpauljunior

Я не впевнений, чому це працює у вашій демонстрації. Це робиться тут: jsfiddle.net/NgL8H @davidpauljunior
eshellborn

5
Я додав правило фокусування до низу, яке ви сказали, що не працює, але, схоже, це: jsfiddle.net/NgL8H/1
davidpauljunior

21
Ви не повинні видаляти контури повністю - особам з обмеженими можливостями - а тим, як я, які часто користуються клавіатурою, оскільки вона швидка - потрібна вона для навігації. Було б набагато краще змінити контур на щось, що вам подобається.
Кріс Б

3
Будь ласка, не встановлюйте outline: noneтак, якщо ви не готові замінити втрати в доступності. Дивіться цей веб-сайт: outlinenone.com
Flimm

Відповіді:


1532

Робити це не рекомендується, оскільки це регламентує доступність вашого сайту; Для отримання додаткової інформації дивіться цю публікацію .

Однак, якщо ви наполягаєте, цей CSS повинен працювати:

button:focus {outline:0;}

Перевірте це або JSFiddle: http://jsfiddle.net/u4pXu/

Або в цьому фрагменті:

button.launch {
background-color: #F9A300;
border: none;
height: 40px;
padding: 5px 15px;
color: #ffffff;
font-size: 16px;
font-weight: 300;
margin-top: 10px;
margin-right: 10px;
}

button.launch:hover {
cursor: pointer;
background-color: #FABD44;
}

button.launch {
background-color: #F9A300;
border: none;
height: 40px;
padding: 5px 15px;
color: #ffffff;
font-size: 16px;
font-weight: 300;
margin-top: 10px;
margin-right: 10px;
}

button.launch:hover {
cursor: pointer;
background-color: #FABD44;
}

button.change {
background-color: #F88F00;
border: none;
height: 40px;
padding: 5px 15px;
color: #ffffff;
font-size: 16px;
font-weight: 300;
margin-top: 10px;
margin-right: 10px;
}

button.change:hover {
cursor: pointer;
background-color: #F89900;
}

button:active {
outline: none;
border: none;
}

button:focus {outline:0;}
<button class="launch">Launch with these ads</button> 
<button class="change">Change</button>


49
Чи це насправді outline: none;не має бути чи це не має значення?
henrywright

2
@henrywright Добре, що ОП спробував це і не працював на нього.
діосней

58
Будь ласка, ніколи цього не робіть. Ваша незначна скарга не має відношення до масового питання про доступність цього питання
phazei

20
Ви обов'язково повинні переробити це, замість того, щоб повністю приховувати його. У цьому випадку спробуйте щось на кшталт button:focus{ outline-color: #A75000 }… замість того, щоб приховувати індикатор, ви зміните його на темно-помаранчевий, який відповідає стилю.
хмарні роботи

3
@ SeanO'Brien надав ОП ситуацію, що склалася, може бути для сайту, який має 5 користувачів, які мають працездатність. Але, ймовірно, більшість з 1123 людей, які висловилися за це, вважають, що це правильний спосіб зробити справи для даної ситуації, але насправді це не так, як це дискримінаційно.
alexrogers

296

Зачекайте! Є причина для цього некрасивого контуру!

Перш ніж видалити цей некрасивий синій контур, можливо, ви захочете взяти до уваги доступність . За замовчуванням цей синій контур розміщений на елементах, що фокусуються. Це так, що користувачі з проблемами доступності можуть фокусувати цю кнопку, натискаючи на неї. Деякі користувачі не мають моторних навичок користуватися мишею і повинні використовувати лише клавіатуру (або якийсь інший пристрій введення) для взаємодії з комп'ютером. Коли ви видалите синій контур, більше не буде візуального індикатора, на який елемент орієнтований. Якщо ви збираєтесь видалити синій контур, вам слід замінити його на інший тип візуального вказівки на те, що кнопка фокусується.

Можливе рішення: затемнення кнопок при фокусуванні

Для наведених нижче прикладів синій контур Chrome спочатку було видалено за допомогою button:focus { outline:0 !important; }

Ось основні кнопки Bootstrap, оскільки вони нормально відображаються: Кнопки завантаження в нормальному стані

Ось кнопки, коли вони отримують фокус: Кнопки завантаження у фокусованому стані

Ось кнопки при їх натисканні: введіть тут опис зображення

Як бачите, кнопки трохи темніше, коли отримують фокус. Особисто я б рекомендував зробити фокусировані кнопки ще темнішими, щоб була дуже помітна різниця між сфокусованим станом та нормальним станом кнопки.

Це не тільки для інвалідів

Зробити ваш сайт більш доступним - це те, що часто не помічається, але може допомогти створити більш продуктивний досвід на вашому веб-сайті. Є багато звичайних користувачів, які використовують команди клавіатури для навігації по веб-сайтах, щоб тримати руки на клавіатурі.


40
Проблема в Chrome, це відбувається навіть при натисканні, а не просто вкладці (логічна реалізація, знайдена в більшості браузерів). Тож насправді Google зменшує доступність, оскільки більшість розробників просто вимкне це (у Chrome) Більше часу витрачається на дослідження / виправлення проблем, пов’язаних із Google / Chrome (збереження пароля, підтримка css електронної пошти, це)
RunLoop

3
Ти правий! Для того, щоб доступ в рахунок при видаленні контуру, необхідно трохи JavaScript: paciellogroup.com/blog/2012/04 / ...
MEMS

Ви навіть не можете стилізувати / форматувати коментар так, як зможете відповісти, тхо. важко надати зворотній зв'язок на цьому рівні деталей виключно через коментар.
A-Dubb

@RunLoop Як видалити або змінити синю межу після клацання? Чи можна це зробити за допомогою CSS або потрібен Javascript?
Нік

люди з цими питаннями можуть просто використовувати vimium-ff
yukashima huksay

60

Я просто видаляю контур із усіх тегів на сторінці, вибираючи всі та застосовуючи контур: жодне до всього :)

*:focus {outline:none}

Як згадував bagofcole, вам може знадобитися також додати! Важливо, тому стиль буде виглядати так:

*:focus {outline:none !important}

6
Будь ласка, не робіть цього. Користувачі, які орієнтуються на вашій сторінці за допомогою клавіатури, не зможуть побачити елемент, що фокусується на даний момент. Замість того, щоб приховувати контур, розмийте елемент, якщо подія клацання походить від миші.
joepio

В основному напевно є ще одна фокусна укладка ...
Арзіел

46

У моєму випадку цю проблему мені довелося вказати box-shadow: none

button:focus {
  outline:none;
  box-shadow: none;
}

4
Дякуємо за ваш пост! Властивість "коробки-тіні" була моментом у моєму випадку.
Ніч

1
Це було те саме питання для мене. Не те, що це актуально, але я використовував тему Sages Roots у Chrome на Ubuntu 17.10.
Спенсер Хілл

1
Тільки це спрацювало післяbox-shadow
sura2k

1
Мені довелося додати! Важливо, щоб він працював, напевно, завантажувач має десь таке визначення
webMan

1
це працювало для мене, товариш !, дякую за публікацію рішення. ура
theITvideos

44

Не забувайте !importantдекларацію для кращого результату

button:focus {outline:0 !important;}

Правило, яке має важливе властивість!, Завжди буде застосовуватися незалежно від того, де це правило міститься в документі CSS.


14
"для кращого результату"? Чи можете ви пояснити, що важливо робить?
Popnoodles

5
Але чи можете ви пояснити, що це робить? "З тієї причини, що вона існує" не пояснює людям, які не знають, в чому її причина.
Popnoodles

48
! Важливо використовувати рідко, і лише переконатися, що щось не слід переписувати наступними правилами. Під час перезапису попередніх правил слід орієнтуватися на елементи за допомогою правильного селектора.
Popnoodles

24
Використання! Важливо рідко виправдано. Ви завжди повинні охоплювати свої селектори css таким чином, щоб мати більше сенсу, а не використовувати! Важливо лише тому, що це дає "кращий результат".
Ronen Cypis

5
Будь ласка, не робіть цього. Хоча технічно це відповідає на питання ОП, занижуючи всі показники положення фокусу, outline:0 !importantце погана UX та погана практика розробки . Якщо ви робите це, переконайтеся, що ви робите щось інше, щоб вказати положення фокусу (наприклад, зміна кольору фону елемента).
хмарні роботи

26

Видалення outlineстрашно для доступності! В ідеалі кільце фокусування з’являється лише тоді, коли користувач має намір використовувати клавіатуру .

Використання : видно фокус . Наразі це пропозиція W3C для стилізації фокусування лише на клавіатурі за допомогою CSS та підтримується у Firefox ( каніуса ). Поки інші основні веб-переглядачі не підтримують його, ви можете використовувати цю надійну поліфункцію .

/* Remove outline for non-keyboard :focus */
*:focus:not(.focus-visible) {
  outline: none;
}

/* Optional: Customize .focus-visible */
.focus-visible {
  outline-color: lightgreen;
}

Я також написав більш детальний пост на випадок, якщо вам потрібна додаткова інформація.


1
Майте в виду, AFAIK це не потрібно бути outlineяк такої, до тих пір , як: фокус стан зроблений добре видно через деякі інші засоби, як border, background-color, box-shadowі т.д.
MAR Örlygsson

2
Найкраща відповідь! Ваше повідомлення варто прочитати (а я зараз переглядаю решту вашого блогу 😅) Пакет npm-видимих ​​npm-пакетів справді там, де він зараз знаходиться.
FelDev

1
Це, безумовно, найкраще рішення. За допомогою лише декількох рядків коду я позбувся цієї прикрої синьої межі при натисканні, зберігаючи це на використанні клавіатури. Дякую!
pesta

1
Чи правильні ці дані? Цей селектор, здається, підтримується в Chrome, а не в Firefox. developer.mozilla.org/en-US/docs/Web/CSS/…
Кевін

Схоже, у Firefox викликається селектор :-moz-focusring, але всупереч тому, що кажуть документи, він не розмежовує фокус клацання та вкладки. Зараз у Chrome потрібно включити конкретні прапори, щоб він працював
phil294

12

Додайте це у свій файл CSS.

*{
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;
}

3
Дякую тобі. працював, але MDN кажуть: Ця функція нестандартна і не відповідає стандартним стандартам. Не використовуйте його на виробничих сайтах, що стоять перед Інтернетом: це працюватиме не для кожного користувача. Також можуть бути великі несумісності між реалізаціями, і поведінка може змінитися в майбутньому.
Бенам Мохаммаді

8

Використовуйте або це:

:active {
    outline:none;
}

або це, якщо це не працює:

:active {
   outline:none !important;
}

Це працює для мене (принаймні, FF та Chrome). Замість націлювання на :focusстан, просто націліть на :activeстан, і це видалить естетично нав'язливе виділення у вашому браузері, коли користувач натисне на посилання. Але це все одно збереже фокус станів, коли користувач з обмеженими можливостями вкладки або вкладки shift через сторінку. Обидві сторони раді. :)


4
Навіщо редагувати мою відповідь, якщо ви лише збираєтеся замінити мою мінімізовану версію тим самим кодом, але розширеною? Це не пояснило його кращим для користувачів. Ви отримуєте за це відповіді, або щось таке? LOL ...
чук

3
Суть StackExchange на кшталт цього полягає в тому, щоб відповісти, які допоможуть кожному, хто їх читає, зрозуміти. З цією метою відповідь з лаконічним мінімізованим кодом не є такою корисною, як код, який читається. Поліпшення відповідей, зробивши їх більш читабельними - це нормальний спосіб покращити сайт для всіх.
bignose

7

для цієї проблеми:

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

використовуй це:

   *{
         -webkit-tap-highlight-color: rgba(0,0,0,0);
         -webkit-tap-highlight-color: transparent; /* For some Androids */
    }

результат:

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


7

Для тих, хто використовує Bootstrap і має цю проблему, вони використовують: active: фокус, а також просто: active і: focus, тому вам знадобиться:

element:active:focus {
    outline: 0;
}

Сподіваюсь, хтось врятував якийсь час, з'ясувавши це, стукнув мені голову, щоб трохи роздумувати, чому така проста річ не працює.


5

Більшість рішень не працюватимуть, якщо ви використовуєте Bootstrap 4.1 та, можливо, інші версії. Після довгих ударів по голові я виявив, що вам потрібно застосувати клас shadow-none :

<button class="btn shadow-none">Bootstrap (4.1) button without shadow</button>


4

Виправлення для Chrome та інших браузерів

button:focus { outline: none !important; box-shadow: none !important; }

3

спробуйте цей код для всіх елементів, у яких проблема із синьою рамкою

*{
outline: none;
}

або

*{
outline-style: none;
}

3

Ще один спосіб вирішити проблему доступності, про яку ще не було сказано, - це через трохи JavaScript . Кредити йдуть на цей проникливий допис у блозі від hackernoon: https://hackernoon.com/removing-that-ugly-focus-ring-and-keeping-it-too-6c8727fefcd2

Підхід тут дійсно простий, але ефективний: додавання класу, коли люди починають використовувати клавішу табуляції для навігації по сторінці (і необов'язково видаляти її, коли знову переходити на мишу. Тоді ви можете використовувати цей клас для відображення контуру фокусу чи ні .

function handleFirstTab(e) {
    if (e.keyCode === 9) { // the "I am a keyboard user" key
        document.body.classList.add('user-is-tabbing');
        window.removeEventListener('keydown', handleFirstTab);
    }
}

window.addEventListener('keydown', handleFirstTab);

3

Я зіткнувся з тією ж проблемою, тому я використав прості CSS-

.custom-button {
    outline: none
}

2

Якщо ви хочете видалити такий самий ефект у введенні, ви можете додати наступний код, а також кнопку.

input:focus {outline:0;}

2

Поки всі сучасні браузери не почнуть підтримувати css-селектор : видимий фокус ,
найпростіший та, можливо, найкращий спосіб зберегти доступність - це видалити цей хитрий фокус лише для користувачів миші та зберегти його для користувачів клавіатури :

1. Використовуйте цей крихітний поліфайл (близько 10 кбіт): https://github.com/WICG/focus-visible
2.Додайте наступний код десь у своєму css:

.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

Підтримка браузера css4-selector: фокус-видимий зараз дуже слабкий:
https://caniuse.com/#search=focus-visible



1

Це проблема в сім'ї Chrome, і вона існувала назавжди.

Помилка піднята https://bugs.chromium.org/p/chromium/isissue/detail?id=904208

Це можна показати тут: https://codepen.io/anon/pen/Jedvwj, як тільки ви додасте межу до будь-якого типу кнопки (скажімо, роль = "кнопка" додана в тег, наприклад) Chrome заплутався і встановлює стан фокусування при натисканні миші.

Я настійно рекомендую використовувати це виправлення: https://github.com/wicg/focus-visible .

Просто виконайте наступне

npm install --save focus-visible

Додайте скрипт у свій HTML:

<script src="/node_modules/focus-visible/dist/focus-visible.min.js"></script>

або імпортуйте у ваш основний вхідний файл, якщо використовуєте веб-пакет чи щось подібне:

import 'focus-visible/dist/focus-visible.min';

потім помістіть це у свій файл css:

// hide the focus indicator if element receives focus via mouse, but show on keyboard focus (on tab).
.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

// Define a strong focus indicator for keyboard focus.
// If you skip this then the browser's default focus indicator will display instead
// ideally use outline property for those users using windows high contrast mode
.js-focus-visible .focus-visible {
  outline: magenta auto 5px;
}

Ви можете просто встановити:

button:focus {outline:0;}

але якщо у вас є велика кількість користувачів, ви переживаєте тих, хто не може використовувати мишей, або тих, хто просто хоче скористатися клавіатурою для швидкості.


1

У мене була така ж проблема з завантажувальним пристроєм. Я вирішив як контур, так і коробку-тінь

.btn:focus, .btn.focus {
    outline: none !important;
    box-shadow: 0 0 0 0 rgba(0, 123, 255, 0) !important; // or none
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.