Rileva se un input contiene del testo tramite CSS - su una pagina che sto visitando e non controllo?


187

C'è un modo per rilevare se un input contiene o meno del testo tramite CSS? Ho provato a usare la :emptypseudo-classe, e ho provato a usare [value=""], nessuno dei quali ha funzionato. Non riesco a trovare un'unica soluzione a questo.

Immagino che questo debba essere possibile, considerando che abbiamo pseudo-classi per :checked, e :indeterminate, entrambe le cose sono un po 'simili.

Nota: lo sto facendo per uno stile "elegante" , che non può utilizzare JavaScript.

Si noti inoltre che Stylish viene utilizzato, sul lato client, nelle pagine che l'utente non controlla.


Non sono sicuro di un modo per farlo con i CSS (che comunque non si aggiornano al volo). Questo è facile con JavaScript, però.
ralph.m,

Non penso di poter usare JavaScript. Sto lavorando a uno stile "elegante". Abbastanza sicuro che deve essere fatto interamente con CSS. Se non si aggiorna mentre l'utente inserisce il testo, suppongo che sia una perdita di tempo. Non ci ho pensato. Hmm. Almeno questo non è fondamentale per lo stile, è solo una cosa che speravo di aggiungere.
JacobTheDev,

Risposte:


66

Stylish non può farlo perché i CSS non possono farlo. CSS non ha selettori (pseudo) per <input>valore / i. Vedere:

Il :emptyselettore si riferisce solo ai nodi figlio, non ai valori di input.
[value=""] lo fa di lavoro; ma solo per lo stato iniziale . Questo perché l' value attributo di un nodo (che CSS vede) non è uguale alla value proprietà del nodo (modificato dall'utente o javascript DOM e inviato come dati del modulo).

A meno che non vi interessa soltanto lo stato iniziale, si deve utilizzare un userscript o uno script Greasemonkey. Fortunatamente questo non è difficile. Il seguente script funzionerà in Chrome o Firefox con Greasemonkey o Scriptish installati o in qualsiasi browser che supporti gli script utente (ovvero la maggior parte dei browser, tranne IE).

Guarda una demo dei limiti del CSS più la soluzione javascript in questa pagina jsBin .

// ==UserScript==
// @name     _Dynamically style inputs based on whether they are blank.
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

var inpsToMonitor = document.querySelectorAll (
    "form[name='JustCSS'] input[name^='inp']"
);
for (var J = inpsToMonitor.length - 1;  J >= 0;  --J) {
    inpsToMonitor[J].addEventListener ("change",    adjustStyling, false);
    inpsToMonitor[J].addEventListener ("keyup",     adjustStyling, false);
    inpsToMonitor[J].addEventListener ("focus",     adjustStyling, false);
    inpsToMonitor[J].addEventListener ("blur",      adjustStyling, false);
    inpsToMonitor[J].addEventListener ("mousedown", adjustStyling, false);

    //-- Initial update. note that IE support is NOT needed.
    var evt = document.createEvent ("HTMLEvents");
    evt.initEvent ("change", false, true);
    inpsToMonitor[J].dispatchEvent (evt);
}

function adjustStyling (zEvent) {
    var inpVal  = zEvent.target.value;
    if (inpVal  &&  inpVal.replace (/^\s+|\s+$/g, "") )
        zEvent.target.style.background = "lime";
    else
        zEvent.target.style.background = "inherit";
}

Vedrò quella cosa usercript. Grazie.
JacobTheDev,

@MartinGottweis, non nel caso del PO, non è così. Questa è una domanda [stilosa] .
Brock Adams,

1
@BrockAdams, op sta dicendo che non può usare javascript, quindi l'opzione: valid è una strada da percorrere. Mi sto perdendo qualcosa?
Martin Gottweis,

1
@MartinGottweis, l' :validopzione richiede la riscrittura della pagina, il che è qualcosa che l'OP non può fare con Stylish e che nessuna delle altre risposte mostra affatto in un contesto di navigazione. L'utente non ha alcun controllo sulla pagina che sta visitando.
Brock Adams,

265

È possibile, con i soliti avvertimenti CSS e se il codice HTML può essere modificato. Se aggiungi l' requiredattributo all'elemento, l'elemento corrisponderà :invalido in :validbase al fatto che il valore del controllo sia vuoto o meno. Se l'elemento non ha alcun valueattributo (o ha value=""), il valore del controllo è inizialmente vuoto e diventa non vuoto quando viene inserito un carattere (anche uno spazio).

Esempio:

<style>
#foo { background: yellow; }
#foo:valid { outline: solid blue 2px; }
#foo:invalid { outline: solid red 2px; }
</style>
<input id=foo required>

Gli pseudo-classificati :valide :invalidsono definiti solo nei documenti CSS a livello di Working Draft, ma il supporto è piuttosto diffuso nei browser, tranne che in IE, è arrivato con IE 10.

Se si desidera rendere "vuoti" includere valori costituiti solo da spazi, è possibile aggiungere l'attributo pattern=.*\S.*.

Non esiste (attualmente) alcun selettore CSS per rilevare direttamente se un controllo di input ha un valore non vuoto, quindi è necessario farlo indirettamente, come descritto sopra.

In genere, i selettori CSS fanno riferimento al markup o, in alcuni casi, alle proprietà degli elementi impostate con lo scripting (JavaScript lato client), piuttosto che con le azioni dell'utente. Ad esempio, :emptyabbina l'elemento con contenuto vuoto nel markup; tutti gli inputelementi sono inevitabilmente vuoti in questo senso. Il selettore [value=""]verifica se l'elemento ha l' valueattributo nel markup e ha la stringa vuota come valore. E :checkede :indeterminatesono cose simili. Non sono interessati dall'effettivo input dell'utente.


7
Questa è un'ottima soluzione se e solo se è richiesto ogni input; in caso contrario, ti imbatti in una situazione in cui hai un campo di input vuoto ma valido non influenzato dallo stile non valido . JS è probabilmente il vincitore di questa soluzione
AdamSchuld

7
questo è sporco ma meravigliosamente intelligente. Non una soluzione alla questione, ma sicuramente ha fatto il trucco per me
Jan

1
Soluzione sporca. Si noti che ciò può causare problemi con il completamento automatico in Chrome se si tenta di aggiungere una logica di visualizzazione delle etichette basata su questo OR se l'input non è effettivamente richiesto e il modulo ha una convalida basata su questo
Artjom Kurapov,

1
Semanticamente questo è sbagliato. Come menzionato nei commenti precedenti, alcuni input possono essere facoltativi e l' requiredattributo può impedire l'invio di moduli.
zhenming,

1
Aggiunto novalidateattributo <form>sull'elemento in modo che non ci si preoccupi della visualizzazione rossa quando il campo è vuoto dopo aver riempito una volta:<form ... novalidate> <input ... required /> </form>
Alcalyn,

228

Puoi usare la :placeholder-shownpseudo classe. Tecnicamente è richiesto un segnaposto, ma è possibile utilizzare uno spazio.

input:not(:placeholder-shown) {
  border-color: green;
}

input:placeholder-shown {
  border-color: red;
}
<input placeholder="Text is required" />
<input placeholder=" " value="This one is valid" />
<input placeholder=" " />


10
Purtroppo questo non è supportato da IE o Firefox. Fonte: caniuse.com/#feat=css-placeholder-shown
Sean Dawson,

2
Risposta fantastica. Il supporto del browser fa schifo, ma se esce un polyfill, :placeholder-shownquesta dovrebbe diventare la risposta accettata. Il requiredmetodo non tiene conto dei casi marginali. Va notato che è possibile passare uno spazio a un segnaposto e questo metodo continuerà a funzionare. Complimenti.
Corysimmons,

5
L'altro aspetto negativo di questo è che sembra che tu abbia effettivamente bisogno di un segnaposto. In altre parole, input:not(:placeholder-shown)corrisponderà sempre <input/>anche se non esiste alcun valore.
Redbmk,

5
Per me funziona in Chrome, Firefox e Safari. Non in IE11.
J0ANMM,

1
@redbmk come menzionato corysimmons, Va notato che è possibile passare uno spazio a un segnaposto e questo metodo continuerà a funzionare.
Naeem Baghi,

32
<input onkeyup="this.setAttribute('value', this.value);" />

e

input[value=""]

funzionerà :-)

modifica: http://jsfiddle.net/XwZR2/


24
Quello è CSS? Sembra HTML e Javascript (ma potrei sbagliarmi).
JWW

Brook Adams ha scritto: [value = ""] funziona; ma solo per lo stato iniziale. Questo perché l'attributo value di un nodo (che CSS vede) non è lo stesso della proprietà value del nodo (modificato dall'utente o javascript DOM e inviato come dati del modulo). -> La magia è aggiornare l'attributo value sulle modifiche: jsfiddle.net/XwZR2
Tom D.

2
@ JánosWeisz no non lo farà. Quel gestore verrà impostato prima che uno script possa manipolare quell'elemento e può funzionare insieme al gestore aggiunto con addEventListener.
Dinoboff,

1
Ovviamente, onkeyup si occupa solo dell'input da tastiera. Non dimenticare, tuttavia, che puoi incollare il testo in una casella di input usando il mouse. Provalo: copia del testo negli appunti, quindi fai clic con il pulsante destro del mouse sull'input e fai clic su Incolla. Guarda il CSS NON funzionare. Lo stesso vale per il trascinamento del testo nella casella di input con il mouse.
beluga,

4
input[value]:not([value=""])- è meglio. Grazie a tutti. codepen.io/iegik/pen/ObZpqo
iegik

30

Fondamentalmente quello che tutti cercano è:

DI MENO:

input:focus:required{
    &:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
    &:valid,
    &:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}
}

CSS puro:

input:focus:required:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
input:focus:required:valid,
input:focus:required:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}

1
Chiaramente hai appena utilizzato la soluzione di lavoro e hai 0 voti positivi WaT?
ProNOOB,

5
Risposta fantastica. La pseudo-classe: segnaposto visualizzata non funziona in IE o Edge, quindi non è una soluzione completa. È dannatamente vicino, però, e mi fa venir voglia di uccidere Edge per non averlo sostenuto. IE che potrei accettare, ma Edge? Dai, Microsoft!
Aaron Martin-Colby,

2
Non è una pura soluzione CSS se devi aggiungere "richiesto" al tuo html
user1566694

Grazie gentile signore, spero sinceramente che questo salga più in alto, poiché secondo me questo è ciò che la maggior parte delle persone vuole davvero.
sivi911,

20

Puoi usare il placeholdertrucco come scritto sopra senzarequired campo.

Il problema con required è che quando hai scritto qualcosa, poi l'hai eliminato - l'input sarà sempre rosso come parte della specifica HTML5 - quindi avrai bisogno di un CSS come scritto sopra per risolverlo / sovrascriverlo.

Puoi fare semplicemente le cose senza required

<input type="text" placeholder="filter here" id="mytest" />

CSS

#mytest:placeholder-shown {
/* if placeholder is shown - meaning - no value in input */
  border: black 1px solid;
  color: black;
}
#mytest {
  /* placeholder isn't shown - we have a value in input */
  border: red 1px solid;
  color: red;
}

Penna codice: https://codepen.io/arlevi/pen/LBgXjZ


1
Questo approccio si adattava perfettamente al mio caso d'uso. Avevo dei filtri di ricerca che avevano comunque dei segnaposto e volevo che il bordo della casella di input fosse evidenziato quando era presente un valore.
Stephen Tuttlebee,

9

CSS semplice:

input[value]:not([value=""])

Questo codice applicherà il css dato al caricamento della pagina se l'input è pieno.


9
Funziona solo al caricamento della pagina. Digitazione non dinamica di un valore.
Ben Racicot

Il problema relativo al caricamento della pagina deve essere esplicitamente indicato per questa risposta.
Bryce Snyder il

6

È possibile applicare uno stile input[type=text]diverso a seconda che l'input abbia o meno del testo assegnando uno stile al segnaposto. Questo non è uno standard ufficiale a questo punto ma ha un ampio supporto del browser, sebbene con prefissi diversi:

input[type=text] {
    color: red;
}
input[type=text]:-moz-placeholder {
    color: green;
}
input[type=text]::-moz-placeholder {
    color: green;
}
input[type=text]:-ms-input-placeholder {
    color: green;
}
input[type=text]::-webkit-input-placeholder {
    color: green;
}

Esempio: http://fiddlesalad.com/scss/input-placeholder-css


Cordiali saluti, questo formatta in modo affidabile il segnaposto, ma solo il segnaposto stesso. Questo ti dà l'illusione di cambiare il colore del testo, ma è già il caso, solo con il grigio e il nero di default.
John Weisz,

Tutto il CSS è un'illusione economica, puoi solo cambiare aspetto senza influire sul contenuto reale :-)
vbraun

Questo è esattamente ciò di cui avevo bisogno. Ho richiesto l'input per modificare gli stili se il testo per il segnaposto differiva dallo stile di input. Perfetto!
Christopher Marshall

Funziona con gli sfondi, ma non con i bordi. Tuttavia, non ho scavato troppo nel tentativo di cambiare il confine.
majinnaibu,

5

Utilizzo di JS e CSS: non pseudoclasse

 input {
        font-size: 13px;
        padding: 5px;
        width: 100px;
    }

    input[value=""] {
        border: 2px solid #fa0000;
    }

    input:not([value=""]) {
        border: 2px solid #fafa00;
    }
<input type="text" onkeyup="this.setAttribute('value', this.value);" value="" />

   


4

Puoi usufruire del segnaposto e utilizzare:

input:not(:placeholder-shown) {
  border: 1px solid red;
}

3

Il selettore valido farà il trucco.

<input type="text" class="myText" required="required" />

.myText {
    //default style of input
}
.myText:valid {
    //style when input has text
}

1

Trucco semplice con jQuery e CSS In questo modo:

JQuery:

$('input[value=""]').addClass('empty');
        $('input').keyup(function(){
            if( $(this).val() == ""){
                $(this).addClass("empty");
            }else{
                $(this).removeClass("empty");
            }
        });

CSS:

input.empty:valid{
        box-shadow: none;
        background-image: none;
        border: 1px solid #000;
    }

    input:invalid,
    input:required {
        box-shadow: 3px 1px 5px rgba(200, 0, 0, 0.85);
        border: 1px solid rgb(200,0,0);
    }




    input:valid{
        box-shadow: none;
        border: 1px solid #0f0;
    }

1

fallo sulla parte HTML in questo modo:

<input type="text" name="Example" placeholder="Example" required/>

Il parametro richiesto richiederà di avere del testo nel campo di input per essere valido.


Questo non aiuta a rilevare se l'input contiene del testo con CSS, che era la domanda.
Jukka K. Korpela,

Siamo spiacenti, in realtà aiuta ... Rende possibile l'uso di pseudo-classi, come spiegato nella mia risposta.
Jukka K. Korpela,

1
Questa è una domanda elegante : ciò significa che l'OP non può controllare o modificare la pagina di destinazione. Vede solo la pagina lato client.
Brock Adams,

3
Questo è stato di grande aiuto, ecco un esempio di ciò di cui parla Xedret
tolmark

****** <input richiesto> && input: valido {...} ******
FremyCompany

0

Sì! puoi farlo con un semplice attributo di base con selettore di valore.

Utilizzare il selettore di attributi con valore vuoto e applicare proprietà input[value='']

input[value=''] {
    background: red;
}

-6

Questo non è possibile con CSS. Per implementarlo dovrai usare JavaScript (es $("#input").val() == "".).


2
So come farlo, devo farlo con i CSS. Si prega di leggere i commenti sul post originale. Sto costruendo uno stile "elegante", che non può utilizzare JavaScript, per quanto ne sappia.
JacobTheDev,
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.