Rimozione del colore di sfondo di input per il completamento automatico di Chrome?


653

Su un modulo su cui sto lavorando, Chrome sta compilando automaticamente i campi email e password. Questo va bene, tuttavia, Chrome cambia il colore di sfondo in un colore giallo pallido.

Il design a cui sto lavorando è l'utilizzo di testo chiaro su uno sfondo scuro, quindi questo incasina davvero l'aspetto del modulo: ho caselle gialle e testo bianco quasi invisibile. Una volta che il campo è focalizzato, i campi tornano alla normalità.

È possibile impedire a Chrome di cambiare il colore di questi campi?


2
Qui si hanno più ampia informazione: stackoverflow.com/questions/2338102/...
DASM

Vedi la mia risposta a un post simile: stackoverflow.com/a/13691346/336235
Ernests Karlsons

Risposte:


1170

Funziona bene, puoi modificare gli stili della casella di input e gli stili di testo all'interno della casella di input:

Qui puoi usare qualsiasi colore white, ad es . #DDD, rgba(102, 163, 177, 0.45).

Ma transparentnon funzionerà qui.

/* Change the white to any color ;) */
input:-webkit-autofill,
input:-webkit-autofill:hover, 
input:-webkit-autofill:focus, 
input:-webkit-autofill:active  {
    -webkit-box-shadow: 0 0 0 30px white inset !important;
}

Inoltre, puoi usarlo per cambiare il colore del testo:

/*Change text in autofill textbox*/
input:-webkit-autofill {
    -webkit-text-fill-color: yellow !important;
}

Consiglio: non utilizzare un raggio di sfocatura eccessivo tra le centinaia o le migliaia. Ciò non ha alcun vantaggio e potrebbe comportare un carico del processore su dispositivi mobili più deboli. (Vero anche per le ombre esterne effettive). Per una normale casella di input di 20 pixel di altezza, il raggio di sfocatura di 30 pixel lo coprirà perfettamente.


1
In Chrome ora il foglio di stile dell'agente utente mostra :-internal-autofill-previewede :-internal-autofill-selectedpseudoclass invece di -webkit-autofill... Misteriosamente, tuttavia, -webkit-autofillfunziona ancora. Personalmente non avevo bisogno di !important.
Andy,

Non avevo bisogno dei pseudo-selettori hover / focus / active
antoine129

318

Le precedenti soluzioni di aggiunta di un box-shadow funzionano bene per le persone che hanno bisogno di uno sfondo a tinta unita. L'altra soluzione di aggiunta di una transizione funziona, ma dover impostare una durata / ritardo significherà che ad un certo punto potrebbe mostrare di nuovo.

La mia soluzione è utilizzare invece i fotogrammi chiave, in questo modo mostrerà sempre i colori di tua scelta.

@-webkit-keyframes autofill {
    0%,100% {
        color: #666;
        background: transparent;
    }
}

input:-webkit-autofill {
    -webkit-animation-delay: 1s; /* Safari support - any positive time runs instantly */
    -webkit-animation-name: autofill;
    -webkit-animation-fill-mode: both;
}

Esempio Codepen: https://codepen.io/-Steve-/pen/dwgxPB


Funziona come il fascino.
Lalnuntluanga Chhakchhuak

1
Questo sicuramente funziona! (Chrome 79)
Lashae,

3
Trovo che sia migliore della risposta accettata ... il metodo box-shadow è intelligente e funziona, ma quando un utente sta selezionando un valore per il riempimento automatico, il colore predefinito lampeggerà brevemente nel campo di input, il che può essere problematico se i tuoi input hanno sfondi scuri. Questa soluzione non presenta tali problemi. Saluti!
skwidbreth,

Perfetto! Ha funzionato ancora meglio di quanto sperassi!
sdlins,

2
Funziona con Vuetify 2 soprattutto se impostatocolor: inherit
Marc

276

Ho una soluzione migliore

Impostare lo sfondo su un altro colore come sotto non ha risolto il problema per me perché avevo bisogno di un campo di input trasparente

-webkit-box-shadow: 0 0 0px 1000px white inset;

Quindi ho provato alcune altre cose e ho pensato a questo:

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
    transition: background-color 5000s ease-in-out 0s;
}

7
Fantastico, ho anche bisogno di uno sfondo trasparente. PS: non dimenticare il -webkit-text-fill-color: yellow !important;colore del testo.
gfpacheco,

Questo mostrerà comunque lo sfondo di riempimento automatico quando l'ingresso è stato nascosto / mostrato con display. Fiddle - Dai un'occhiata
Martin

27
Invece di impostare il transition-durationridicolmente alto, sarebbe meglio impostare transition-delayinvece. In questo modo riduci ulteriormente la possibilità di eventuali cambiamenti nei colori.
Shaggy,

L' transitionhacking funzionerà solo se l'input non viene compilato automaticamente con una voce predefinita registrata dal browser, altrimenti lo sfondo giallo sarà ancora presente.
guari,

1
Ottima soluzione .... ma perché funziona? E perché l'impostazione background-colornon funziona? Chrome deve risolvere questo problema !!
TetraDev,

60

Questa è la mia soluzione, ho usato la transizione e il ritardo di transizione, quindi posso avere uno sfondo trasparente nei miei campi di input.

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
    -webkit-transition: "color 9999s ease-out, background-color 9999s ease-out";
    -webkit-transition-delay: 9999s;
}

6
Ho impostato un'immagine come sfondo del campo di input, questa soluzione rimuove la tonalità gialla, ma l'immagine di sfondo è ancora nascosta
Matteo Tassinari,

La migliore soluzione finora, funziona alla grande con l'esistente box-shadowper la convalida
Yoann

Chrome ha detto che "color 9999s ease-out, background-color 9999s ease-out";non è valida espressione. Allora ho usato il codice -webkit-transition: background-color 9999s ease-out;e-webkit-text-fill-color: #fff !important;
naanace il

1
ha funzionato ma senza la doppia citazione per me;)
Jon

@Yoann come ha funzionato esattamente con la tua box-shadowvalidazione esistente ? Nel mio caso, a causa di questa regola CSS, la mia ombra di scatola rossa personalizzata (che indica un errore di input) viene ritardata, facendo credere all'utente che l'input più recente non è valido quando in realtà è buono.
Paul Razvan Berg,

50

Questo è stato progettato come da quando questo comportamento colorante è stato da WebKit. Consente all'utente di comprendere che i dati sono stati precompilati. Bug 1334

È possibile disattivare il completamento automatico eseguendo (o sul controllo modulo specifico:

<form autocomplete="off">
...
</form

Oppure puoi cambiare il colore del riempimento automatico facendo:

input:-webkit-autofill {
    color: #2a2a2a !important;
}

Nota, c'è un bug che viene rintracciato affinché funzioni nuovamente: http://code.google.com/p/chromium/issues/detail?id=46543

Questo è un comportamento WebKit.


22
grazie ma la regola CSS di webkit non funziona. Il foglio di stile dell'agente utente ha sempre la precedenza sul colore di sfondo, anche con (a) impostato su !importante (b) scelto come target con un ID per una maggiore specificità. Sembra che Chrome lo sostituirà sempre. La rimozione del completamento automatico sembra funzionare, ma in realtà non è quello che voglio fare.
DisgruntledGoat

1
Alcune persone hanno lo stesso problema, hai controllato la segnalazione di bug? code.google.com/p/chromium/issues/detail?id=1334
Mohamed Mansour

6
Chrome blocca qualsiasi tentativo CSS di ignorare quel colore giallo. L'impostazione autocomplete="off"solleverà sicuramente problemi di accessibilità. Perché questa risposta è contrassegnata come corretta comunque?
João

2
Questa è una buona soluzione, ma se si utilizza React, si lamenterà che il completamento automatico è una proprietà DOM sconosciuta. Pertanto, in realtà è il completamento automatico (nota camelcased).
Tim Scollick,

2
Disattivare il completamento automatico è un hack non una soluzione
Paullo

30

Una possibile soluzione al momento è quella di impostare un'ombra "forte" all'interno:

input:-webkit-autofill {
    -webkit-box-shadow:0 0 0 50px white inset; /* Change the color to your own background color */
    -webkit-text-fill-color: #333;
}

input:-webkit-autofill:focus {
    -webkit-box-shadow: /*your box-shadow*/,0 0 0 50px white inset;
    -webkit-text-fill-color: #333;
}  

2
Questa è la soluzione che sta effettivamente funzionando, non vogliamo saltare lo sfondo giallo solo alcune volte, poiché la risposta accettata si tradurrebbe in.
davidkonrad

22

prova questo per nascondere lo stile di riempimento automatico

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:active,
input:-webkit-autofill:focus {
    background-color: #FFFFFF !important;
    color: #555 !important;
    -webkit-box-shadow: 0 0 0 1000px white inset !important;
    -webkit-text-fill-color: #555555 !important;
    }

per i curiosi, il colore di sfondo non ha alcun effetto. -Webkit-box-shadow è il bit intelligente che sovrascrive lo sfondo giallo in Chrome
Geuis,

19

Tutte le risposte di cui sopra hanno funzionato ma avevano i loro difetti. Il codice seguente è una fusione di due delle risposte sopra che funziona perfettamente senza battere ciglio.

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
    transition: background-color 5000s ease-in-out 0s;
    -webkit-box-shadow: 0 0 0px 1000px #fff inset;
}

Ho impostato un'immagine come sfondo del campo di input, questa soluzione rimuove la tonalità gialla, ma l'immagine di sfondo è ancora nascosta
Matteo Tassinari,

Questo è l'unico che funziona per me in Chrome 83. Il più votato funzionava fino a Chrome 82.
sdlins

19

SASS

input:-webkit-autofill

  &,
  &:hover,
  &:focus,
  &:active
    transition-delay: 9999s
    transition-property: background-color, color

1
Questo in realtà ha funzionato per me poiché la risposta accettata lampeggia in un giallo pallido.
CleoR il

miglior soluzione imho
Jan Paepke

15

Dopo 2 ore di ricerche sembra che Google abbia ancora la precedenza sul colore giallo, ma io per la correzione. Giusto. funzionerà anche per hover, focus ecc. tutto ciò che devi fare è aggiungere!

 input:-webkit-autofill,
 input:-webkit-autofill:hover,
 input:-webkit-autofill:focus,
 input:-webkit-autofill:active {
 -webkit-box-shadow: 0 0 0px 1000px white inset !important;
  }

questo rimuoverà completamente il giallo dai campi di input


11

L'aggiunta di un'ora di ritardo metterebbe in pausa eventuali modifiche ai CSS sull'elemento di input.
È meglio piuttosto che aggiungere animazione di transizione o ombra interna.

input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill{
  transition-delay: 3600s;
}

10

In aggiunta a questo:

input:-webkit-autofill{
-webkit-box-shadow: 0 0 0px 1000px white inset;
}

Potresti anche voler aggiungere

input:-webkit-autofill:focus{
-webkit-box-shadow: 0 0 0px 1000px white inset, 0 0 8px rgba(82, 168, 236, 0.6);
}

Altro saggio, quando si fa clic sull'input, il colore giallo tornerà. Per lo stato attivo, se si utilizza bootstrap, la seconda parte è per l'evidenziazione del bordo 0 0 8px rgba (82, 168, 236, 0.6);

In modo tale che sembrerà qualsiasi input bootstrap.


10

Ho avuto un problema in cui non potevo usare box-shadow perché avevo bisogno che il campo di input fosse trasparente. È un po 'un trucco ma CSS puro. Imposta la transizione su un periodo di tempo molto lungo.

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
transition: background-color 50000s ease-in-out 0s, color 5000s ease-in-out 0s;
}

A partire da ora nell'ultimo Chrome 50.xx, l'IT funziona perfettamente. Molte grazie!
vivekkupadhyay,

2
Invece di impostare il transition-durationridicolmente alto, sarebbe meglio impostare transition-delayinvece. In questo modo riduci ulteriormente la possibilità di eventuali cambiamenti nei colori.
Shaggy,

@Shaggy grazie, ho appena cambiato in ritardo. Molto più bello.
Alex,

9

Prova questo: uguale alla risposta @ Nathan-white sopra con piccole modifiche.

/* For removing autocomplete highlight color in chrome (note: use this at bottom of your css file). */

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
    transition: all 5000s ease-in-out 0s;
    transition-property: background-color, color;
}

Questa è la risposta migliore dopo aver provato tutte le risposte.
gfcodix,

8

Se vuoi mantenere intatta la funzionalità di completamento automatico puoi usare un po 'di jQuery per rimuovere lo stile di Chrome. Ho scritto un breve post al riguardo qui: http://www.benjaminmiles.com/2010/11/22/fixing-google-chromes-yellow-autocomplete-styles-with-jquery/

if (navigator.userAgent.toLowerCase().indexOf("chrome") >= 0) {
$(window).load(function(){
    $('input:-webkit-autofill').each(function(){
        var text = $(this).val();
        var name = $(this).attr('name');
        $(this).after(this.outerHTML).remove();
        $('input[name=' + name + ']').val(text);
    });
});}

Questa sembra essere la soluzione migliore, sebbene blocchi il controllo della posta di Kicksend . Qualche idea su come aggirare il problema?
João

Questa non è una buona soluzione da allora il completamento automatico della password di Google Chrome smette di funzionare. Cioè inizialmente si inserisce il nome e Google Chrome inserisce automaticamente la password. Tuttavia, una volta eseguito il javascript sopra, il nome viene cancellato e
reimpostato

6

Ho sviluppato un'altra soluzione utilizzando JavaScript senza JQuery. Se lo trovi utile o decidi di inviare nuovamente la mia soluzione, ti chiedo solo di includere il mio nome. Godere. - Daniel Fairweather

var documentForms = document.forms;

for(i = 0; i < documentForms.length; i++){
    for(j = 0; j < documentForms[i].elements.length; j++){
        var input = documentForms[i].elements[j];

        if(input.type == "text" || input.type == "password" || input.type == null){
            var text = input.value;
            input.focus();
            var event = document.createEvent('TextEvent');
            event.initTextEvent('textInput', true, true, window, 'a');
            input.dispatchEvent(event);
            input.value = text;
            input.blur();
        }
    }
}

Questo codice si basa sul fatto che Google Chrome rimuove lo stile Webkit non appena viene inserito del testo aggiuntivo. La semplice modifica del valore del campo di input non è sufficiente, Chrome vuole un evento. Concentrandosi su ciascun campo di input (testo, password), possiamo inviare un evento da tastiera (la lettera 'a') e quindi impostare il valore del testo sul suo stato precedente (il testo compilato automaticamente). Tieni presente che questo codice verrà eseguito in ogni browser e controllerà tutti i campi di input all'interno della pagina Web, adattandolo di conseguenza alle tue esigenze.


bene, ha funzionato per la maggior parte .. purtroppo cancella la mia password. Cercando di ottenerlo per salvare prima la password e reimpostarla dopo i cicli for, ma Chrome sembra avere dei problemi con questo. mmmm
Dustin Silk,

6

Ho una soluzione CSS pura che utilizza filtri CSS.

filter: grayscale(100%) brightness(110%);

Il filtro di scala di grigi sostituisce il giallo con il grigio, quindi la luminosità rimuove il grigio.

VEDI CODEPEN


Questo non funziona per me?
Ikechukwu Eze,

5

Questo funzionerà per input, textarea e selezionare in stati normale, hover, focus e attivo.

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active,
textarea:-webkit-autofill,
textarea:-webkit-autofill:hover,
textarea:-webkit-autofill:focus,
textarea:-webkit-autofill:active,
select:-webkit-autofill,
select:-webkit-autofill:hover,
select:-webkit-autofill:focus,
select:-webkit-autofill:active,
{
    -webkit-box-shadow: 0 0 0px 1000px white inset !important;
}

Ecco la versione SCSS della soluzione di cui sopra per coloro che lavorano con SASS / SCSS.

input:-webkit-autofill,
textarea:-webkit-autofill,
select:-webkit-autofill
{
    &, &:hover, &:focus, &:active
    {
        -webkit-box-shadow: 0 0 0px 1000px white inset !important;
    }
}

Bello, e grazie per il codice SASS!
Bernoulli IT

4

Per coloro che utilizzano Compass:

@each $prefix in -webkit, -moz {
    @include with-prefix($prefix) {
        @each $element in input, textarea, select {
            #{$element}:#{$prefix}-autofill {
                @include single-box-shadow(0, 0, 0, 1000px, $white, inset);
            }
        }
    }
}

3

Mi arrendo!

Dato che non c'è modo di cambiare il colore dell'input con il completamento automatico, decido di disabilitarli tutti con jQuery per i browser webkit. Come questo:

if (/webkit/.test(navigator.userAgent.toLowerCase())) {
    $('[autocomplete="on"]').each(function() {
        $(this).attr('autocomplete', 'off');
    });
}

3

Ho una soluzione se vuoi impedire il riempimento automatico da Google Chrome ma è un po '"machete", basta rimuovere la classe che Google Chrome aggiunge a quei campi di input e impostare il valore su "" se non è necessario mostrare memorizzare i dati dopo il caricamento.

$(document).ready(function () {
    setTimeout(function () {
            var data = $("input:-webkit-autofill");
            data.each(function (i,obj) {
            $(obj).removeClass("input:-webkit-autofill");
                    obj.value = "";
            });
    },1);           
});

3

La soluzione di Daniel Fairweather ( Rimuovere il colore di sfondo di input per il completamento automatico di Chrome? ) (Mi piacerebbe migliorare la sua soluzione, ma ho ancora bisogno di 15 rep) funziona davvero bene. C'è una differenza davvero enorme con la soluzione più votata: puoi conservare le immagini di sfondo! Ma una piccola modifica (solo controllo Chrome)

E devi tenere a mente, funziona SOLO su campi visibili !

Quindi se stai usando $ .show () per il tuo modulo, devi eseguire questo codice dopo l'evento show ()

La mia soluzione completa (ho un pulsante mostra / nascondi per il modulo di accesso):

 if (!self.isLoginVisible()) {
        var container = $("#loginpage");
        container.stop();
        self.isLoginVisible(true);
        if (navigator.userAgent.toLowerCase().indexOf("chrome") >= 0) {

            var documentForms = document.forms;
            for (i = 0; i < documentForms.length; i++) {
                for (j = 0; j < documentForms[i].elements.length; j++) {
                    var input = documentForms[i].elements[j];

                    if (input.type == "text" || input.type == "password" || input.type == null) {
                        var text = input.value;
                        input.focus();
                        var event = document.createEvent('TextEvent');
                        event.initTextEvent('textInput', true, true, window, 'a');
                        input.dispatchEvent(event);
                        input.value = text;
                        input.blur();
                    }
                }
            }
        }

    } else {
        self.hideLogon();
    }

Scusami ancora, preferirei che fosse un commento.

Se vuoi, posso mettere un link al sito in cui l'ho usato.


3

e questo ha funzionato per me (testato Chrome 76)

input:-internal-autofill-selected {
    background-color: transparent;
}

3

Ho provato quasi tutte le soluzioni di cui sopra. Niente funziona per me. Finalmente ha lavorato con questa soluzione. Spero che qualcuno lo aiuti.

/* Change Autocomplete styles in Chrome*/
input:-webkit-autofill,
input:-webkit-autofill:hover, 
input:-webkit-autofill:focus,
textarea:-webkit-autofill,
textarea:-webkit-autofill:hover,
textarea:-webkit-autofill:focus,
select:-webkit-autofill,
select:-webkit-autofill:hover,
select:-webkit-autofill:focus {
  border: 1px solid green;
  -webkit-text-fill-color: green;
  -webkit-box-shadow: 0 0 0px 1000px #000 inset;
  transition: background-color 5000s ease-in-out 0s;
}

Questo non funziona (più) ed è stato copiato da CSS Tricks BTW
Bernoulli IT

1
Questo ha funzionato per me.
AzizStark,

2

Grazie Benjamin!

La soluzione Mootools è un po 'più complicata, poiché non riesco a ottenere i campi utilizzando $('input:-webkit-autofill'), quindi quello che ho usato è il seguente:

if (navigator.userAgent.toLowerCase().indexOf("chrome") >= 0) {

  window.addEvent('load', function() {
    setTimeout(clearWebkitBg, 20);
    var elems = getElems();
    for (var i = 0; i < elems.length; i++) {
      $(elems[i]).addEvent('blur', clearWebkitBg);
    }
  });
}
function clearWebkitBg () {
  var elems = getElems();
  for (var i = 0; i < elems.length; i++) {
    var oldInput = $(elems[i]);
    var newInput = new Element('input', {
      'name': oldInput.get('name'),
      'id': oldInput.get('id'),
      'type': oldInput.get('type'),
      'class': oldInput.get('class'),
      'value': oldInput.get('value')
    });
    var container = oldInput.getParent();
    oldInput.destroy();
    container.adopt(newInput);
  }
}
function getElems() {
  return ['pass', 'login']; // ids
}

2

Nessuna delle soluzioni ha funzionato per me, l'ombra dell'inser non funzionerà per me perché gli input hanno uno sfondo traslucido sovrapposto allo sfondo della pagina.

Quindi mi sono chiesto: "In che modo Chrome determina cosa deve essere compilato automaticamente in una determinata pagina?"

"Cerca ID di input, nomi di input? ID di modulo? Azione modulo?"

Attraverso la mia sperimentazione con il nome utente e gli input della password, ho trovato solo due modi per impedire a Chrome di trovare i campi da compilare automaticamente:

1) Inserire l'inserimento della password prima dell'inserimento del testo. 2) Dai loro lo stesso nome e id ... o nessun nome e id affatto.

Dopo che la pagina è stata caricata, con javascript puoi cambiare dinamicamente l'ordine degli input nella pagina o dare loro dinamicamente il loro nome e id ...

E Chrome non sa cosa l'ha colpito ... il completamento automatico è rotto!

Pazzo hack, lo so. Ma funziona per me.

Chrome 34.0.1847.116, OSX 10.7.5


2

Sfortunatamente nessuna delle soluzioni sopra menzionate ha funzionato per me nel 2016 (un paio di anni dopo la domanda)

Ecco quindi la soluzione aggressiva che utilizzo:

function remake(e){
    var val = e.value;
    var id = e.id;
    e.outerHTML = e.outerHTML;
    document.getElementById(id).value = val;
    return true;
}

<input id=MustHaveAnId type=text name=email autocomplete=on onblur="remake(this)">

Fondamentalmente, elimina il tag durante il salvataggio del valore e lo ricrea, quindi ripristina il valore.


La soluzione di namrouti classificata funziona perfettamente per me su Chrome 51.0.2704.106 / OSX 10.11.5.
Oens

2

lo uso. lavora per me. rimuove lo sfondo giallo del campo.

input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active,
input:-webkit-autofill:valid,
select:-webkit-autofill,
select:-webkit-autofill:hover,
select:-webkit-autofill:focus
{
    -webkit-transition-delay: 99999s;
    -webkit-text-fill-color:#D7D8CE;
}

1

Come accennato in precedenza, l'inset -webkit-box-shadow per me funziona meglio.

/* Code witch overwrites input background-color */
input:-webkit-autofill {
     -webkit-box-shadow: 0 0 0px 1000px #fbfbfb inset;
}

Inoltre snippet di codice per cambiare il colore del testo:

input:-webkit-autofill:first-line {
     color: #797979;
}

1

Questo ha funzionato per me:

padding: 5px;
background-clip: content-box;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.