Usuń niebieską ramkę z przycisku niestandardowego stylu css w Chrome

807

Pracuję na stronie internetowej i chcę niestandardowe <button>tagi. Więc z CSS, powiedziałem: border: none. Teraz działa idealnie w safari, ale w chromie, kiedy klikam jeden z przycisków, otacza go irytująca niebieska ramka. Myślałem button:active { outline: none }lub button:focus { outline:none }zadziała, ale nie działa. Jakieś pomysły?

Tak to wygląda przed kliknięciem (i jak chcę, aby nadal wyglądało po kliknięciu):

A oto granica, o której mówię:

wprowadź opis zdjęcia tutaj

Oto mój 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;
}
eshellborn
źródło
1
Wygląda mi ok? jsbin.com/oSAdovun/1/edit
davidpauljunior
Nie jestem pewien, dlaczego to działa w twojej wersji demo .. Robi to tutaj: jsfiddle.net/NgL8H @davidpauljunior
eshellborn
5
Dodałem regułę skupienia na dole, która, jak powiedziałeś, nie działała, ale wydaje się, że: jsfiddle.net/NgL8H/1
davidpauljunior
21
Nie powinieneś całkowicie usuwać konturu - osoby niepełnosprawne - i ci, tacy jak ja, którzy często używają klawiatury, ponieważ jest szybka - potrzebują jej do nawigacji. O wiele lepiej byłoby zmienić styl konturu na coś, co lubisz.
Chris B
3
Proszę nie ustawiać w outline: noneten sposób, chyba że jesteś gotowy, aby zastąpić utratę dostępności. Zobacz tę stronę internetową: outlinenone.com
Flimm

Odpowiedzi:

1532

Nie jest to zalecane, ponieważ powoduje to cofnięcie dostępności witryny; Aby uzyskać więcej informacji, zobacz ten post .

To powiedziawszy, jeśli nalegasz, ten CSS powinien działać:

button:focus {outline:0;}

Sprawdź to lub JSFiddle: http://jsfiddle.net/u4pXu/

Lub w tym fragmencie:

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>

Ronen Cypis
źródło
49
Czy to nie powinno być, outline: none;czy to nie ma znaczenia?
henrywright
2
@henrywright Cóż, OP próbował tego i nie pracował dla niego.
diosney
58
Proszę nigdy tego nie rób. Twoja drobna skarga jest nieistotna dla ogromnego problemu z dostępnością
phazei 28.04.16
20
Zdecydowanie powinieneś to zmienić, zamiast całkowicie ukrywać. W takim przypadku spróbuj czegoś takiego jak button:focus{ outline-color: #A75000 }... zamiast ukrywania wskaźnika zmienisz go na ciemnopomarańczowy, który pasuje do stylu.
Cloudworks
3
@ SeanO'Brien przyznał, że podana sytuacja PO może dotyczyć witryny, która ma 5 użytkowników, wszyscy sprawni fizycznie. Ale prawdopodobnie większość z 1123 osób, które poparły tę opinię, uważa, że ​​jest to właściwy sposób postępowania w danej sytuacji, ale tak naprawdę nie jest to dyskryminujące.
alexrogers,
296

Czekać! Jest powód tego brzydkiego zarysu!

Przed usunięciem tego brzydkiego niebieskiego obrysu możesz wziąć pod uwagę dostępność . Domyślnie ten niebieski kontur jest umieszczony na elementach, na których można ustawić ostrość. Dzieje się tak, aby użytkownicy mający problemy z dostępnością mogli skupić się na tym przycisku, przechodząc do niego klawiszem Tab. Niektórzy użytkownicy nie mają umiejętności motorycznych do korzystania z myszy i muszą używać tylko klawiatury (lub innego urządzenia wejściowego) do interakcji z komputerem. Po usunięciu niebieskiego obrysu nie będzie już wizualnego wskaźnika tego, na który element jest skupiony. Jeśli zamierzasz usunąć niebieski kontur, należy go zastąpić innym rodzajem wizualnego wskazania, że ​​przycisk jest aktywny.

Możliwe rozwiązanie: przyciemnij przyciski po skupieniu

W poniższych przykładach niebieski kontur Chrome został najpierw usunięty przy użyciu button:focus { outline:0 !important; }

Oto podstawowe przyciski Bootstrap, które wyglądają normalnie: Przyciski ładowania początkowego w stanie normalnym

Oto przyciski, gdy zostaną uaktywnione: Przyciski ładowania początkowego w stanie skupienia

Tutaj przyciski po ich naciśnięciu: wprowadź opis zdjęcia tutaj

Jak widać, przyciski są nieco ciemniejsze, gdy zostaną zogniskowane. Osobiście poleciłbym przyciemnić skupione przyciski jeszcze ciemniej, aby istniała bardzo zauważalna różnica między stanem skupienia a normalnym stanem przycisku.

To nie tylko dla niepełnosprawnych użytkowników

Ułatwienie dostępu do witryny jest często pomijane, ale może pomóc zwiększyć produktywność witryny. Jest wielu zwykłych użytkowników, którzy używają poleceń klawiatury do poruszania się po stronach internetowych, aby trzymać się klawiatury.

Nathan
źródło
40
Problem dotyczy Chrome, zdarza się to nawet po kliknięciu, a nie tylko tabulacji (logiczna implementacja występująca w większości przeglądarek). W rzeczywistości Google ogranicza dostępność, ponieważ większość programistów po prostu je wyłączy (w Chrome). Więcej czasu marnuje się na wyszukiwanie / naprawianie problemów związanych z Google / Chrome (oszczędzanie hasła, obsługa e-mail css, to)
RunLoop
3
Masz rację! Aby wziąć pod uwagę dostępność podczas usuwania konturu, potrzebujesz trochę JavaScript: paciellogroup.com/blog/2012/04/…
mem
nie można nawet stylizować / sformatować komentarza w sposób, w jaki można odpowiedzieć. trudno jest wyrazić opinię na tym poziomie szczegółowości wyłącznie poprzez komentarz.
A-Dubb,
@RunLoop Jak usunąć lub zmienić niebieską ramkę po kliknięciu? Czy można to zrobić za pomocą CSS lub czy wymagany jest Javascript?
Nick
osoby z tymi problemami mogą po prostu użyć vimium-ff
yukashima huksay
60

Po prostu usuwam kontur ze wszystkich tagów na stronie, zaznaczając wszystko i stosując kontur: brak do wszystkiego :)

*:focus {outline:none}

Jak wspomniano bagofcole, być może trzeba dodać! Ważne, aby styl wyglądał następująco:

*:focus {outline:none !important}
Mikrofon
źródło
6
Proszę nie rób tego. Użytkownicy, którzy poruszają się po stronie za pomocą klawiatury, nie będą mogli zobaczyć aktualnie zaznaczonego elementu. Zamiast ukrywać kontur, rozmyj element, jeśli zdarzenie kliknięcia pochodzi z myszy.
joepio
Zasadniczo istnieje inna stylizacja fokusowa ...
Arziel,
46

W moim przypadku tego problemu musiałem określić box-shadow: none

button:focus {
  outline:none;
  box-shadow: none;
}
antonkronaj
źródło
4
Dzięki za twój post! W moim przypadku chodziło o właściwość „box-shadow”.
Nightking
1
To był dla mnie ten sam problem. Nie chodzi o to, ale korzystałem z motywu Roots 'Sage Theme w Chrome na Ubuntu 17.10.
Spencer Hill
1
Tylko to zadziałało późniejbox-shadow
sura2k
1
Musiałem dodać! Ważne, aby to działało, prawdopodobnie bootstrap ma gdzieś konkretną definicję
webMan
1
to zadziałało dla mnie kolego !, dzięki za opublikowanie rozwiązania. na zdrowie
theITvideos
44

Nie zapomnij !importantdeklaracji, aby uzyskać lepszy wynik

button:focus {outline:0 !important;}

Reguła, która ma właściwość! Ważne, będzie zawsze stosowana bez względu na to, gdzie reguła pojawia się w dokumencie CSS.

Scabbia
źródło
14
„dla lepszego rezultatu”? Czy możesz wyjaśnić, co! Ważne jest?
Popnoodles
5
Ale czy możesz wyjaśnić, co to robi? „Z powodu, dla którego istnieje” nie tłumaczy ludziom, którzy nie znają powodu, jaki jest jego powód.
Popnoodles
48
! ważne powinno być używane rzadko i tylko po to, aby upewnić się, że coś nie powinno zostać zastąpione kolejnymi regułami. Podczas nadpisywania poprzednich reguł należy kierować elementy za pomocą właściwego selektora.
Popnoodles
24
Użycie! Ważne jest rzadko uzasadnione. Powinieneś zawsze zawęzić zakres wyboru selektorów css w sposób, który ma większy sens, i nie używać! Ważne tylko dlatego, że daje to „lepszy wynik”.
Ronen Cypis
5
Proszę nie rób tego. Chociaż technicznie odpowiada to na pytanie PO, nukanie każdego wskazania pozycji skupienia outline:0 !importantjest złym UX i złym treningiem deweloperów. Jeśli to robisz, upewnij się, że robisz coś innego, aby wskazać pozycję fokusa (np. Zmieniając kolor tła elementu).
Cloudworks
26

Usuwanie outlinejest straszne dla dostępności! Idealnie, pierścień ostrości pojawia się tylko wtedy, gdy użytkownik zamierza korzystać z klawiatury .

Użyj : widoczne zogniskowanie . Obecnie jest to propozycja W3C dotycząca stylizacji fokusu tylko za pomocą klawiatury za pomocą CSS i jest obsługiwana w Firefox ( caniuse ). Dopóki inne główne przeglądarki go nie obsługują, możesz używać tego solidnego wypełniacza .

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

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

Napisałem też bardziej szczegółowy post na wypadek, gdybyś potrzebował więcej informacji.

Aaron Noel De Leon
źródło
1
Pamiętaj, AFAIK to nie musi być outlinejako takie, tak długo, jak: koncentracja stan jest widoczny przez innych środków, jak border, background-color, box-shadowitp
Már Örlygsson
2
Najlepsza odpowiedź! Twój post jest wart przeczytania (a teraz patrzę na resztę twojego bloga 😅) Widoczny na nim pakiet npm jest naprawdę na miejscu.
FelDev
1
To zdecydowanie najlepsze rozwiązanie. Za pomocą zaledwie kilku linii kodu pozbyłem się tej irytującej niebieskiej ramki po kliknięciu, jednocześnie utrzymując ją na klawiaturze. Dzięki!
pesta
1
Czy te dane są poprawne? Wygląda na to, że ten selektor jest obsługiwany w przeglądarce Chrome, a nie Firefox. developer.mozilla.org/en-US/docs/Web/CSS/…
Kevin Suttle
Wygląda na to, że w Firefoksie selektor jest wywoływany :-moz-focusring, ale w przeciwieństwie do tego, co mówią doktorzy, nie rozróżnia on kliknięcia i fokusa na karcie. W Chrome na razie musisz włączyć określone flagi, aby działało
phil294
12

Dodaj to do swojego pliku CSS.

*{
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;
}
Maleństwo
źródło
3
Dziękuję Ci. działało, ale MDN mówi: Ta funkcja jest niestandardowa i nie jest na standardowym torze. Nie używaj go w witrynach produkcyjnych z dostępem do Internetu: nie będzie działać dla każdego użytkownika. Mogą również występować duże niezgodności między implementacjami, a zachowanie może ulec zmianie w przyszłości.
Behnam Mohammadi
8

Użyj tego:

:active {
    outline:none;
}

lub to, jeśli to nie działa:

:active {
   outline:none !important;
}

To działa dla mnie (przynajmniej FF i Chrome). Zamiast celować w :focusstan, po prostu celuj w :activestan, który usunie natrętne pod względem estetycznym podświetlanie w przeglądarce, gdy użytkownik kliknie link. Ale nadal zachowuje stany skupienia, gdy użytkownik niepełnosprawny przechodzi na zakładkę lub przesuwa ją na stronie. Obie strony są zadowolone. :)

chuk
źródło
4
Po co edytować moją odpowiedź, jeśli zamierzasz zastąpić moją miniaturową wersję tym samym kodem, ale rozszerzoną? To nie wyjaśniło tego lepiej użytkownikom. Czy dostajesz kredyty za odpowiedzi na to czy coś? LOL ...
chuk
3
celem witryn StackExchange jest posiadanie odpowiedzi, które pomogą każdemu czytającemu je zrozumieć. W tym celu odpowiedź zwięzłym, zminimalizowanym kodem nie jest tak pomocna, jak kod w formacie czytelnym. Poprawianie odpowiedzi poprzez uczynienie ich bardziej czytelnymi to normalny sposób na ulepszenie strony dla wszystkich.
bignose
7

dla tego problemu:

wprowadź opis zdjęcia tutaj

Użyj tego:

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

wynik:

wprowadź opis zdjęcia tutaj

Behnam Mohammadi
źródło
7

Każdy, kto używa Bootstrap i ma ten problem, korzysta z: active: focus oraz tylko: active i: focus, więc będziesz potrzebować:

element:active:focus {
    outline: 0;
}

Mam nadzieję, że udało mi się zaoszczędzić komuś czasu na rozgryzienie tego, uderzyłem się w głowę, zastanawiając się, dlaczego tak prosta rzecz nie działa.

Forever Nomad
źródło
5

Większość rozwiązań nie będzie działać, jeśli używasz Bootstrap 4.1 i ewentualnie innych wersji. Po wielu uderzeniach głową odkryłem, że musisz zastosować klasę shadow-none :

<button class="btn shadow-none">Bootstrap (4.1) button without shadow</button>
ATL_DEV
źródło
4

Oto, co zadziałało dla mnie:

button:focus {
    box-shadow:none;
}
Rob Myrick
źródło
4

Poprawka dla Chrome i innych przeglądarek

button:focus { outline: none !important; box-shadow: none !important; }
chronomer
źródło
3

wypróbuj ten kod dla wszystkich elementów, które mają problem z niebieskim obramowaniem

*{
outline: none;
}

lub

*{
outline-style: none;
}
Santosh Khalse
źródło
3

Innym sposobem rozwiązania problemu dostępności , o którym jeszcze tu nie wspomniano, jest odrobina Javascript . Kredyty trafiają do tego wnikliwego posta na blogu z hackernoon: https://hackernoon.com/removing-that-ugly-focus-ring-and-keeping-it-too-6c8727fefcd2

Podejście tutaj jest naprawdę proste, ale skuteczne: dodawanie klasy, gdy ludzie zaczynają używać klawisza Tab do poruszania się po stronie (i opcjonalnie usuwaj ją po ponownym przełączeniu na mysz. Następnie możesz użyć tej klasy, aby wyświetlić kontur fokusa lub nie .

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);
Tobija Fischer
źródło
3

Napotkałem ten sam problem, więc użyłem prostego CSS-

.custom-button {
    outline: none
}
apurv thakur
źródło
2

Jeśli chcesz usunąć ten sam efekt na wejściu, możesz dodać następujący kod oraz przycisk.

input:focus {outline:0;}
aaayumi
źródło
2

Dopóki wszystkie nowoczesne przeglądarki nie zaczną obsługiwać selektora css : focus-visible ,
najprostszym i prawdopodobnie najlepszym sposobem na zapisanie dostępności jest usunięcie tego trudnego fokusa tylko dla użytkowników myszy i zapisanie go dla użytkowników klawiatury :

1. Użyj tego małego polifillu (około 10 KB): https://github.com/WICG/focus-visible
2. Dodaj następny kod gdzieś w twoim css:

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

Obsługa przeglądarki css4-selektora: fokus widoczny teraz bardzo słaby:
https://caniuse.com/#search=focus-visible

pavelkarev
źródło
2

Po prostu napisz outline:none;. Nie ma potrzeby używania pseudoelementufocus

Sandeep Sharma
źródło
1

Jest to problem występujący w rodzinie Chrome i istnieje od zawsze.

Zgłoszono błąd https://bugs.chromium.org/p/chromium/issues/detail?id=904208

Można to pokazać tutaj: https://codepen.io/anon/pen/Jedvwj, gdy tylko dodasz ramkę do dowolnego przycisku podobnego do przycisku (na przykład rola = „przycisk” została dodana do tagu) Chrome się bałagan i ustawia stan skupienia po kliknięciu myszą.

Bardzo polecam użycie tej poprawki: https://github.com/wicg/focus-visible .

Po prostu wykonaj następujące czynności

npm install --save focus-visible

Dodaj skrypt do HTML:

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

lub zaimportuj do głównego pliku wejściowego, jeśli używasz pakietu internetowego lub czegoś podobnego:

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

następnie umieść to w swoim pliku 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;
}

Państwo może po prostu ustawić:

button:focus {outline:0;}

ale jeśli masz dużą liczbę użytkowników, jesteś w niekorzystnej sytuacji dla tych, którzy nie mogą korzystać z myszy lub dla tych, którzy po prostu chcą korzystać z klawiatury w celu uzyskania szybkości.

alexrogers
źródło
1

Miałem ten sam problem z bootstrapem. Rozwiązałem zarówno kontur, jak i cień

.btn:focus, .btn.focus {
    outline: none !important;
    box-shadow: 0 0 0 0 rgba(0, 123, 255, 0) !important; // or none
}
Corso
źródło