Come disabilitare i campi modulo tramite CSS?


180

È possibile disabilitare i campi modulo tramite CSS? Naturalmente conosco l'attributo disabilitato, ma è possibile specificarlo in una regola CSS? Qualcosa di simile a -

<input type="text" name="username" value="admin" >
<style type="text/css">
  input[name=username] {
    disabled: true; /* Does not work */
  }
</style>

Il motivo per cui lo sto chiedendo è che ho un'applicazione in cui i campi del modulo sono generati automaticamente e i campi sono nascosti / mostrati in base ad alcune regole (che vengono eseguite in Javascript). Ora voglio estenderlo per supportare i campi di disabilitazione / abilitazione, ma il modo in cui le regole sono scritte per manipolare direttamente le proprietà di stile dei campi del modulo. Quindi ora devo estendere il motore delle regole per modificare gli attributi e lo stile dei campi del modulo e in qualche modo sembra meno che ideale.

È molto curioso che tu abbia proprietà visibili e visualizzate nei CSS ma non le abiliti / disabiliti. C'è qualcosa di simile nello standard HTML5 ancora non funzionante o anche qualcosa di non standard (specifico del browser)?


5
Viene menzionato più volte di seguito, ma si perde nel rumore. Prova gli eventi puntatore: nessuno;
Corey Alix,

Risposte:


89

Questo può essere utile:

<input type="text" name="username" value="admin" >

<style type="text/css">
input[name=username] {
    pointer-events: none;
 }
</style>

Aggiornare:

e se vuoi disabilitare dall'indice di tabulazione puoi usarlo in questo modo:

 <input type="text" name="username" value="admin" tabindex="-1" >

 <style type="text/css">
  input[name=username] {
    pointer-events: none;
   }
 </style>

3
Sembrava proprio quello che cercavo di disabilitare tutti i miei campi di input ma, sebbene li blocchi dagli eventi del mouse, è comunque possibile accedervi e modificarli utilizzando la scheda della tastiera
Ken

11
la proprietà css tab-index non esiste. Deve essere un attributo html (tabindex = -1)
N4ppeL

1
tab-index non trova e non funziona in Chrome, premendo il tasto TAB è stata disattivata la funzione di disabilitazione quindi questa non è una soluzione completa.
QMaster

172

Puoi falsificare l'effetto disabilitato usando CSS.

pointer-events:none;

Potresti anche voler cambiare i colori ecc.


68
Questo aiuta, ma non impedisce la tabulazione nei campi.
Jerwood,

Volevo "disabilitare" l'ultimo link di una briciola di pane, e non ero in mente con questa soluzione alternativa ... grazie a questo con qualche cambio di colore e senza sottolineatura, ha fatto il trucco! : D
Facundo Colombier,

2
Ciò inoltre non impedisce l'invio dei valori del modulo.
Ken Wayne VanderLinde,

1
@KenWayneVanderLinde neanche l'attributo disabilitato è corretto?
theonlygusti,

2
@theonlygusti Gli elementi <input> disabilitati in un modulo non verranno inviati.
dougd_in_nc,

113

Dato che le regole sono in esecuzione in JavaScript, perché non disabilitarle usando javascript (o nel mio esempio, jQuery)?

$('#fieldId').attr('disabled', 'disabled'); //Disable
$('#fieldId').removeAttr('disabled'); //Enable

AGGIORNARE

La attrfunzione non è più l'approccio principale a questo, come è stato sottolineato nei commenti qui sotto. Questo è ora fatto con la propfunzione.

$( "input" ).prop( "disabled", true ); //Disable
$( "input" ).prop( "disabled", false ); //Enable

1
Non dovrebbe essere $ ('# filedId'). RemoveAttr ('disabled'); // Abilita
Anupam Jain

6
Vale probabilmente la pena notare che questa soluzione non funzionerà se l'utente ha disabilitato JavaScript.
josh-fuggle,

1
Firefox 20.0 (non sono sicuro delle altre versioni, è proprio quello che sto usando per sviluppare) richiede la rimozione dell'attributo. Mentre @ Dutchie432 ha ragione, in teoria, usando .removeAttr ('disabled'); è la soluzione pratica corretta (almeno nel mio attuale browser).

1
A meno che non sia possibile utilizzare JQuery.
Marines

3
Cordiali saluti - la documentazione di jQuery suggerisce di utilizzare .prop()invece che .attr()per questo caso. "A partire da jQuery 1.6, il metodo .attr () restituisce undefined per gli attributi che non sono stati impostati. Per recuperare e modificare le proprietà DOM come lo stato controllato, selezionato o disabilitato degli elementi del modulo, utilizzare il metodo .prop (). " Documentazione di origine: .attr () e .prop ()
Nicholas Ryan Bowers,

54

È molto curioso che tu abbia proprietà visibili e visualizzate nei CSS ma non le abiliti / disabiliti.

È molto curioso che tu pensi che sia molto curioso. Stai fraintendendo lo scopo del CSS. CSS non intende modificare il comportamento degli elementi del modulo. Ha lo scopo di cambiare il loro stile solo il . Nascondere un campo di testo non significa che il campo di testo non è più presente o che il browser non invierà i suoi dati quando invii il modulo. Tutto ciò che fa è nasconderlo agli occhi dell'utente.

Per disabilitare effettivamente i campi, è necessario utilizzare l' disabledattributo in HTML o la disabledproprietà DOM in JavaScript.


35
Naturalmente so a cosa serve "presumibilmente" CSS. Ma per le webapp moderne la distinzione tra "presentazione" e "comportamento" è più fangosa del fango. Poiché i campi disabilitati non vengono inviati al server, si tratta di una modifica del comportamento. Ma allora come nascondere tutti i campi del modulo non uno ?! Forse ai bei vecchi tempi quando tutto ciò che si poteva fare sul web è leggere testi e compilare moduli, la distinzione era più chiara. Nella webapp moderna, se vuoi separare la presentazione dal comportamento, CSS contro HTML / JS è il modo sbagliato di farlo.
Anupam Jain,

17
disabili è uno stato, non un comportamento. Quello che sta chiedendo è perfettamente ragionevole. Ad esempio, potresti voler aggiungere una classe occupata a più campi durante l'elaborazione dei dati. Inoltre, il W3C sembra essere d'accordo poiché consente la selezione CSS di elementi tramite la pseudo classe disabilitata.
IAmNaN,

3
@IAmNaN: 1) "disabled è uno stato, non un comportamento." Lo stesso vale per ogni altro attributo HTML / DOM. 2) "Ad esempio, potresti voler aggiungere una classe occupata a più campi durante l'elaborazione dei dati." Lo fai in una sceneggiatura. 3) "Inoltre, il W3C sembra essere d'accordo poiché consente la selezione CSS di elementi tramite la pseudo classe disabilitata." Essere in grado di selezionare un elemento in base al fatto che sia abilitato o disabilitato non ha nulla a che fare con la possibilità di cambiare quello stato usando i CSS.
BoltClock

5
Ci sono molte cose nei CSS che in realtà potrebbero essere considerate cambiamenti nel comportamento, ad esempio puntatore-eventi: nessuno; menzionato da @ANaimi. Quindi la disabilitazione può essere facilmente considerata anche proprietà di visualizzazione. Peccato che non lo sia, renderebbe poche cose più facili.
Mikael Lepistö,

1
@Mikael Lepistö: Sì, non sono nemmeno d'accordo con l' pointer-eventsessere una proprietà CSS. Cordiali saluti, pointer-events proviene da SVG .
BoltClock

22

Non è possibile utilizzare CSS per disabilitare Textbox. la soluzione sarebbe l'attributo HTML.

disabled="disabled"

Mentre questo funziona in linea di principio, se leggi l'intera domanda, dice che il campo del modulo viene generato automaticamente e quindi deve essere disabilitato in seguito.
entro il

1
@mr_eclair. è possibile usare ---> pointer-events: none; Proprietà css.
Fereydoon Barikzehy,

3
Nota: gli elementi con disabledattributo non vengono inviati - i loro valori non vengono registrati sul server. Continua a leggere: stackoverflow.com/q/8925716/1066234
Kai Noack

17

La soluzione pratica è utilizzare i CSS per nascondere effettivamente l'input.

Per portarlo alla sua naturale conclusione, puoi scrivere due input html per ciascun input effettivo (uno abilitato e uno disabilitato) e quindi utilizzare JavaScript per controllare il CSS per mostrarli e nasconderli.


3
Se usi Javascript, sarebbe logico disabilitare / abilitare secondo necessità no?
MindVox,

In effetti, ma nel contesto di questa particolare domanda, questo potrebbe essere un approccio praticabile.
graphicdivine,

10

prima volta a rispondere a qualcosa, e apparentemente solo un po 'in ritardo ...

Accetto di farlo tramite JavaScript, se lo stai già utilizzando.

Per una struttura composita, come di solito uso, ho creato un elemento cse pseudo dopo per bloccare gli elementi dall'interazione dell'utente e consentire lo stile senza dover manipolare l'intera struttura.

Per esempio:

<div id=test class=stdInput>
    <label class=stdInputLabel for=selecterthingy>A label for this input</label>
    <label class=selectWrapper>
         <select id=selecterthingy>
             <option selected disabled>Placeholder</option>
             <option value=1>Option 1</option>
             <option value=2>Option 2</option>
         </select>
    </label>
</div>

Posso mettere una disabledclasse sulla confezionediv

.disabled { 
    position : relative; 
    color    : grey;
}
.disabled:after {
    position :absolute;
    left     : 0;
    top      : 0;
    width    : 100%;
    height   : 100%;
    content  :' ';
}

Questo renderebbe grigio il testo all'interno di dive lo renderebbe inutilizzabile per l'utente.

Il mio esempio JSFiddle


4
A proposito: è ancora necessario gestire la tabulazione che consente comunque all'utente di accedere al campo e modificarlo.
K Kimble,

2
quindi <select> non dovrebbe avere una class = "disabled"?
TimoSolo,

È fantastico, sapevo che c'era qualcosa del genere. :) grazie
James Harrington l'

Questo è davvero utile So che usare JavaScript per impostare disabilitato sarebbe meglio, ma questo risolve il mio problema di chiarire agli utenti (oltre a un messaggio di errore) che l'invio non funzionerà.
jerclarke,

8

Uso sempre:

input.disabled {
    pointer-events:none;
    color:#AAA;
    background:#F5F5F5;
}

e quindi applicare la classe css al campo di input:

<input class="disabled" type="text" value="90" name="myinput" id="myinput" />

4

input [nome = nome utente] {disabilitato: vero; /* Non funziona */ }

So che questa domanda è piuttosto vecchia ma per gli altri utenti che riscontrano questo problema, suppongo che il modo più semplice per disabilitare l'input sia semplicemente ": disabled"

<input type="text" name="username" value="admin" disabled />
<style type="text/css">
  input[name=username]:disabled {
    opacity: 0.5 !important; /* Fade effect */
    cursor: not-allowed; /* Cursor change to disabled state*/
  }
</style>

In realtà, se hai qualche script per disabilitare l'input in modo dinamico / automatico con javascript o jquery che si disabiliterebbe automaticamente in base alla condizione che aggiungi.

In jQuery per esempio:

if (condition) {
// Make this input prop disabled state
  $('input').prop('disabled', true);
}
else {
// Do something else
}

Spero che la risposta nei CSS sia di aiuto.


2

Temo che non puoi farlo, ma puoi fare quanto segue in jQuery, se non vuoi aggiungere gli attributi ai campi. Inseriscilo nel <head></head>tag

$(document).ready(function(){ 
  $(".inputClass").focus(function(){
    $(this).blur();
  }); 
});

Se stai generando i campi nel DOM (con JS), dovresti invece farlo:

$(document).ready(function(){ 
  $(document).on("focus", ".inputClass", function(){
    $(this).blur();
  }); 
});

1

Questo può essere fatto per uno scopo non critico mettendo un overlay sopra l'elemento di input. Ecco il mio esempio in puro HTML e CSS.

https://jsfiddle.net/1tL40L99/

    <div id="container">
        <input name="name" type="text" value="Text input here" />
        <span id="overlay"></span>
    </div>

    <style>
        #container {
            width: 300px;
            height: 50px;
            position: relative;
        }
        #container input[type="text"] {
            position: relative;
            top: 15px;
            z-index: 1;
            width: 200px;
            display: block;
            margin: 0 auto;
        }
        #container #overlay {
            width: 300px;
            height: 50px;
            position: absolute;
            top: 0px;
            left: 0px;
            z-index: 2;
            background: rgba(255,0,0, .5);
        }
    </style>

1

Non c'è modo di usare i CSS per questo scopo. Il mio consiglio è di includere un codice javascript in cui si assegna o si modifica la classe css applicata agli input. Qualcosa del genere :

function change_input() {
	$('#id_input1')
		.toggleClass('class_disabled')
		.toggleClass('class_enabled');
		
	$('.class_disabled').attr('disabled', '');
	$('.class_enabled').removeAttr('disabled', '');
}
.class_disabled { background-color : #FF0000; }
.class_enabled { background-color : #00FF00; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<form> 	
	Input: <input id="id_input1" class="class_enabled" />		
	<input type="button" value="Toggle" onclick="change_input()";/>	
</form>


0

Una variante alla pointer-events: none;soluzione, che risolve il problema dell'input ancora accessibile tramite il suo controllo etichettato o tabindex, è di avvolgere l'input in un div, che è definito come input di testo disabilitato, e l'impostazione input { visibility: hidden; }quando l'input è "disabilitato" .
Rif: https://developer.mozilla.org/en-US/docs/Web/CSS/visibility#Values

div.dependant {
  border: 0.1px solid rgb(170, 170, 170);
  background-color: rgb(235,235,228);
  box-sizing: border-box;
}
input[type="checkbox"]:not(:checked) ~ div.dependant:first-of-type {
  display: inline-block;
}
input[type="checkbox"]:checked ~ div.dependant:first-of-type {
  display: contents;
}
input[type="checkbox"]:not(:checked) ~ div.dependant:first-of-type > input {
  visibility: hidden;
}
<form>
  <label for="chk1">Enable textbox?</label>
  <input id="chk1" type="checkbox" />
  <br />
  <label for="text1">Input textbox label</label>
  <div class="dependant">
    <input id="text1" type="text" />
  </div>
</form>

Lo stile disabilitato applicato nello snippet sopra è tratto dall'interfaccia utente di Chrome e potrebbe non essere visivamente identico agli input disabilitati su altri browser. Forse può essere personalizzato per i singoli browser usando prefissi di estensione CSS specifici del motore. Anche se a prima vista, non penso che potrebbe:
estensioni CSS Microsoft , estensioni CSS Mozilla , estensioni CSS WebKit

Sembrerebbe molto più ragionevole introdurre un valore aggiunto visibility: disabledo display: disabledo forse anche appearance: disabled, dato che visibility: hiddengià colpisce il comportamento degli elementi applicabili eventuali elementi di controllo associati.

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.