Eliminar el borde azul del botón de estilo personalizado css en Chrome

811

Estoy trabajando en una página web y quiero etiquetas de estilo personalizado <button>. Así que con CSS, dije: border: none. Ahora funciona perfectamente en safari, pero en cromo, cuando hago clic en uno de los botones, pone un borde azul molesto a su alrededor. Pensé button:active { outline: none }o button:focus { outline:none }funcionaría, pero tampoco lo hago. ¿Algunas ideas?

Así es como se ve antes de hacer clic (y cómo quiero que se vea después de hacer clic):

Y esta es la frontera de la que estoy hablando:

ingrese la descripción de la imagen aquí

Aquí está mi 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
fuente
1
¿Me parece bien? jsbin.com/oSAdovun/1/edit
davidpauljunior
No estoy seguro de por qué funciona en su demo. Lo está haciendo aquí: jsfiddle.net/NgL8H @davidpauljunior
eshellborn
55
Agregué la regla de enfoque en la parte inferior que dijiste que no funcionaba, pero parece que: jsfiddle.net/NgL8H/1
davidpauljunior
21
No debe eliminar el esquema por completo, aquellos con discapacidades, y aquellos como yo que a menudo usan el teclado porque es rápido, lo necesitan para navegar. Sería mucho mejor cambiar el estilo del contorno a algo que te guste.
Chris B
3
No establezca de outline: noneesta manera a menos que esté listo para reemplazar la pérdida de accesibilidad. Ver este sitio web: outlinenone.com
Flimm

Respuestas:

1536

No se recomienda hacer esto, ya que hace retroceder la accesibilidad de su sitio; Para más información, vea esta publicación .

Dicho esto, si insiste, este CSS debería funcionar:

button:focus {outline:0;}

Compruébalo o JSFiddle: http://jsfiddle.net/u4pXu/

O en este fragmento:

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
fuente
49
¿No debería ser esto realmente outline: none;o no importa?
henrywright
2
@henrywright Bueno, el OP lo intentó y no funcionó para él.
diosney
58
Por favor nunca hagas esto. Su queja menor es irrelevante para el problema de accesibilidad masiva esto se convierte en
phazei
20
Definitivamente debería cambiar el estilo de esto en lugar de ocultarlo por completo. En este caso, intente algo como button:focus{ outline-color: #A75000 }... en lugar de ocultar el indicador, cámbielo a un naranja oscuro que se ajuste al estilo.
cloudworks
3
@ SeanO'Brien admitió que la situación dada del OP podría ser para un sitio que tiene 5 usuarios, todos con capacidad. Pero probablemente la mayoría de las 1123 personas que votaron por esto piensan que esta es la forma correcta de hacer las cosas para su situación dada, pero en realidad no es tan discriminatorio.
alexrogers
296

¡Espere! ¡Hay una razón para ese esquema feo!

Antes de eliminar ese feo contorno azul, es posible que desee tener en cuenta la accesibilidad . Por defecto, ese contorno azul se coloca en elementos enfocables. Esto es para que los usuarios con problemas de accesibilidad puedan enfocar ese botón presionándolo. Algunos usuarios no tienen las habilidades motoras para usar un mouse y deben usar solo el teclado (o algún otro dispositivo de entrada) para la interacción con la computadora. Cuando elimina el contorno azul, ya no hay un indicador visual sobre qué elemento está enfocado. Si va a eliminar el contorno azul, debe reemplazarlo con otro tipo de indicación visual de que el botón está enfocado.

Posible solución: oscurecer los botones cuando está enfocado

Para los ejemplos a continuación, el contorno azul de Chrome se eliminó primero usando button:focus { outline:0 !important; }

Estos son los botones básicos de Bootstrap tal como aparecen normalmente: Botones de arranque en estado normal

Aquí están los botones cuando reciben foco: Botones Bootstrap en estado enfocado

Aquí los botones cuando se presionan: ingrese la descripción de la imagen aquí

Como puede ver, los botones son un poco más oscuros cuando reciben el foco. Personalmente, recomendaría que los botones enfocados sean aún más oscuros para que haya una diferencia muy notable entre el estado enfocado y el estado normal del botón.

No es solo para usuarios discapacitados

Hacer que su sitio sea más accesible es algo que a menudo se pasa por alto, pero puede ayudar a crear una experiencia más productiva en su sitio web. Hay muchos usuarios normales que usan los comandos del teclado para navegar a través de sitios web con el fin de mantener las manos en el teclado.

Nathan
fuente
40
El problema está en Chrome, ocurre incluso al hacer clic en lugar de simplemente tabular (la implementación lógica que se encuentra en la mayoría de los navegadores). Entonces, en realidad Google está reduciendo la accesibilidad, ya que la mayoría de los desarrolladores simplemente lo desactivarán (en Chrome). Se pierde más tiempo investigando / solucionando problemas relacionados con Google / Chrome (ahorro de contraseña, soporte de css por correo electrónico, esto)
RunLoop
3
¡Tienes razon! Para tener en cuenta la accesibilidad al eliminar el esquema, necesita un poco de JavaScript: paciellogroup.com/blog/2012/04/…
mems
ni siquiera puedes peinar / formatear un comentario de la misma manera que puedes responder, aunque. difícil de proporcionar comentarios a este nivel de detalle únicamente a través de un comentario.
A-Dubb
@RunLoop ¿Cómo se elimina o cambia el borde azul después del clic? ¿Se puede hacer a través de CSS o se requiere Javascript?
Nick
las personas con esos problemas pueden simplemente usar vimium-ff
yukashima huksay
60

Simplemente elimino el esquema de todas las etiquetas de la página seleccionando todas y aplicando el esquema: ninguno a todo :)

*:focus {outline:none}

Como mencionó bagofcole, es posible que también deba agregar! Important, por lo que el estilo se verá así:

*:focus {outline:none !important}
Miguel
fuente
66
Por favor no hagas esto. Los usuarios que naveguen por su página con el teclado no podrán ver el elemento enfocado actualmente. En lugar de ocultar el contorno, desenfoque el elemento si el evento de clic se origina en un mouse.
joepio
Básicamente, seguramente hay otro estilo de enfoque ...
Arziel
47

En mi caso de este problema tuve que especificar box-shadow: none

button:focus {
  outline:none;
  box-shadow: none;
}
antonkronaj
fuente
44
Gracias por tu publicación! La propiedad "box-shadow" era el punto en mi caso.
Nightking
1
Este fue el mismo problema para mí. No es que sea relevante, pero estaba usando Roots 'Sage Theme en Chrome en Ubuntu 17.10.
Spencer Hill
1
Solo esto funcionó despuésbox-shadow
sura2k
1
Tenía que agregar! Importante para que funcione, probablemente bootstrap tiene una definición específica para esto en alguna parte
webMan el
1
¡Esto funcionó para mí, amigo! Gracias por publicar la solución. aplausos
theITvideos
44

No olvide la !importantdeclaración, para un mejor resultado.

button:focus {outline:0 !important;}

Una regla que tiene la propiedad! Important siempre se aplicará sin importar dónde aparezca esa regla en el documento CSS.

Scabbia
fuente
14
"para un mejor resultado"? ¿Podrías explicar qué hace importante?
Popnoodles
55
Pero, ¿puedes explicar lo que hace? "Por la razón por la que existe" no explica a las personas que no saben cuál es la razón.
Popnoodles
48
! important debe usarse raramente, y solo para asegurarse de que las reglas posteriores no sobrescriban algo. Debe orientar sus elementos con el selector correcto al sobrescribir las reglas anteriores.
Popnoodles
24
El uso de! Important rara vez se justifica. Siempre debe buscar sus selectores CSS de una manera que tenga más sentido, y no usar! Importante solo porque le da un "mejor resultado".
Ronen Cypis 01 de
55
Por favor no hagas esto. Si bien técnicamente esto responde a la pregunta del OP, eliminar toda indicación de posición de enfoque outline:0 !importantes una mala experiencia de usuario y una mala práctica de desarrollo. Si está haciendo esto, asegúrese de hacer otra cosa para indicar la posición del foco (como cambiar el color de fondo del elemento).
cloudworks
26

¡Eliminar outlinees terrible para la accesibilidad! Idealmente, el anillo de enfoque aparece solo cuando el usuario tiene la intención de usar el teclado .

Uso : foco-visible . Actualmente es una propuesta del W3C para diseñar el enfoque solo con teclado usando CSS, y es compatible con Firefox ( caniuse ). Hasta que otros navegadores principales lo admitan, puede usar este robusto polyfill .

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

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

También escribí una publicación más detallada en caso de que necesites más información.

Aaron Noel De Leon
fuente
1
Eso sí, que yo sepa, no tiene por qué ser outlinecomo tal, siempre y cuando el: enfoque del estado se hace claramente visible a través de otros medios, como border, background-color, box-shadow, etc.
Már Örlygsson
2
¡La mejor respuesta! Vale la pena leer su publicación (y ahora estoy mirando el resto de su blog 😅) El paquete npm visible en el foco es realmente donde está por ahora.
FelDev
1
Esta es definitivamente la mejor solución. Con solo unas pocas líneas de código, eliminé ese molesto borde azul al hacer clic, mientras lo mantenía en uso con el teclado. ¡Gracias!
pesta
1
¿Son correctos estos datos? Este selector parece admitido en Chrome, no en Firefox. developer.mozilla.org/en-US/docs/Web/CSS/…
Kevin Suttle
Parece que en Firefox se llama al selector :-moz-focusring, pero al contrario de lo que dicen los documentos, no diferencia entre el clic y el foco de la pestaña. En Chrome, a partir de ahora debe habilitar
marcas
12

Agregue esto en su archivo CSS.

*{
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;
}
Roo
fuente
3
gracias. funcionó pero MDN dice: Esta característica no es estándar y no está en una pista estándar. No lo use en sitios de producción orientados a la Web: no funcionará para todos los usuarios. También puede haber grandes incompatibilidades entre implementaciones y el comportamiento puede cambiar en el futuro.
Behnam Mohammadi
8

Use esto:

:active {
    outline:none;
}

o esto si eso no funciona:

:active {
   outline:none !important;
}

Esto funciona para mí (FF y Chrome, al menos). En lugar de apuntar al :focusestado, solo apunte al :activeestado y eso eliminará el resaltado estéticamente molesto en su navegador cuando un usuario hace clic en un enlace. Pero aún conservará los estados de enfoque cuando un usuario con discapacidades pestañe o desplace las pestañas a través de una página. Ambas partes están felices. :)

chuk
fuente
44
¿Por qué editar mi respuesta si solo va a reemplazar mi versión minimizada con el mismo código pero extendido? Eso no lo aclaró mejor para los usuarios. ¿Recibes créditos de respuesta por eso o algo así? LOL ...
chuk
3
El objetivo de los sitios de StackExchange como este es tener respuestas que ayuden a cualquiera que los lea a comprender. Para ese propósito, una respuesta con un código breve y conciso no es tan útil como un código con formato legible. Mejorar las respuestas haciéndolas más legibles es una forma normal de mejorar el sitio para todos.
bignose
7

para este problema:

ingrese la descripción de la imagen aquí

utilizar este:

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

resultado:

ingrese la descripción de la imagen aquí

Behnam Mohammadi
fuente
7

Para cualquiera que use Bootstrap y tenga este problema, usará: active: focus y solo: active y: focus, por lo que necesitará:

element:active:focus {
    outline: 0;
}

Con suerte, ahorré a alguien algo de tiempo para resolverlo, me golpeé la cabeza por preguntarme por qué algo tan simple no estaba funcionando.

Nómada para siempre
fuente
6

La mayoría de las soluciones no funcionarán si está utilizando Bootstrap 4.1 y posiblemente otras versiones. Después de muchos golpes en la cabeza, descubrí que necesitas aplicar la clase shadow-none :

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

Esto es lo que funcionó para mí:

button:focus {
    box-shadow:none;
}
Rob Myrick
fuente
4

La solución para Chrome y otros navegadores.

button:focus { outline: none !important; box-shadow: none !important; }
cronómero
fuente
3

pruebe este código para todos los elementos que tienen un problema de borde azul

*{
outline: none;
}

o

*{
outline-style: none;
}
Santosh Khalse
fuente
3

Otra forma de resolver el problema de accesibilidad que aún no se ha mencionado aquí es a través de un poco de Javascript . Los créditos van a esta publicación de blog perspicaz de hackernoon: https://hackernoon.com/removing-that-ugly-focus-ring-and-keeping-it-too-6c8727fefcd2

El enfoque aquí es realmente simple pero efectivo: agregar una clase cuando las personas comienzan a usar la tecla de tabulación para navegar por la página (y, opcionalmente, eliminarla cuando vuelva a cambiar al mouse. Luego puede usar esta clase para mostrar un esquema de enfoque o no) .

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
fuente
3

Me enfrenté al mismo problema, así que usé CSS simple

.custom-button {
    outline: none
}
apurv thakur
fuente
2

Si desea eliminar el mismo efecto en la entrada, puede agregar el siguiente código y el botón.

input:focus {outline:0;}
aaayumi
fuente
2

Hasta que todos los navegadores modernos comiencen a admitir css-selector : focus-visible ,
la forma más simple y posiblemente la mejor para guardar la accesibilidad es eliminar este enfoque complicado solo para los usuarios del mouse y guardarlo para los usuarios del teclado :

1.Utilice este pequeño polyfill (aproximadamente 10kb): https://github.com/WICG/focus-visible
2.Agregue el siguiente código en algún lugar de su css:

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

Soporte de navegador de css4-selector: foco-visible ahora muy débil:
https://caniuse.com/#search=focus-visible

pavelkarev
fuente
2

Simplemente escribe outline:none;. No es necesario usar el pseudo elementofocus

Sandeep Sharma
fuente
1

Este es un problema en la familia Chrome y ha estado allí para siempre.

Se ha generado un error https://bugs.chromium.org/p/chromium/issues/detail?id=904208

Se puede mostrar aquí: https://codepen.io/anon/pen/Jedvwj tan pronto como agregue un borde a cualquier cosa como un botón (por ejemplo, se ha agregado role = "button" a una etiqueta) Chrome desordena y establece el estado de enfoque cuando hace clic con el mouse.

Recomiendo usar esta solución: https://github.com/wicg/focus-visible .

Solo haz lo siguiente

npm install --save focus-visible

Agregue el script a su html:

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

o importar a su archivo de entrada principal si usa webpack o algo similar:

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

luego pon esto en tu archivo 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;
}

Solo puedes configurar:

button:focus {outline:0;}

pero si tiene una gran cantidad de usuarios, está en desventaja para aquellos que no pueden usar ratones o para aquellos que solo quieren usar su teclado para mayor velocidad.

alexrogers
fuente
1

Tuve el mismo problema con bootstrap. Resolví con contorno y cuadro de sombra

.btn:focus, .btn.focus {
    outline: none !important;
    box-shadow: 0 0 0 0 rgba(0, 123, 255, 0) !important; // or none
}
corsaro
fuente