Como desabilito os campos de formulário usando CSS?

180

É possível desativar os campos do formulário usando CSS? Claro que conheço o atributo desativado, mas é possível especificar isso em uma regra CSS? Algo como -

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

A razão pela qual estou perguntando é que, eu tenho um aplicativo em que os campos do formulário são gerados automaticamente e os campos são ocultos / exibidos com base em algumas regras (que são executadas em Javascript). Agora eu quero estendê-lo para oferecer suporte a campos de desativação / ativação, mas a maneira como as regras são escritas para manipular diretamente as propriedades de estilo dos campos de formulário. Então agora eu tenho que estender o mecanismo de regras para alterar os atributos, bem como o estilo dos campos de formulário e, de alguma forma, parece menos do que o ideal.

É muito curioso que você tenha propriedades visíveis e de exibição em CSS, mas não ative / desative. Existe algo parecido no padrão HTML5 ainda em andamento ou mesmo algo fora do padrão (específico do navegador)?

Anupam Jain
fonte
5
É mencionado várias vezes abaixo, mas está perdido no ruído. Tente eventos-ponteiro: nenhum;
Corey Alix

Respostas:

89

Isso pode ser útil:

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

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

Atualizar:

e se quiser desativar o índice da guia, você pode usá-lo desta maneira:

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

 <style type="text/css">
  input[name=username] {
    pointer-events: none;
   }
 </style>
Fereydoon Barikzehy
fonte
3
Que parecia apenas o que eu estava depois para desativar todos os meus campos de entrada, mas, embora ele bloqueia-los de eventos do mouse, eles ainda podem ser acessadas e alteradas usando guia teclado
Ken
11
A propriedade css do índice de tabulação não existe. Ele precisa ser um atributo html (tabindex = -1)
N4ppeL 2/15/15
1
O tab-index não encontra e não funciona no chrome, pressionando a tecla TAB que passou para desativar o recurso, para que esta não seja a solução completa.
QMaster 17/08
172

Você pode fingir o efeito desativado usando CSS.

pointer-events:none;

Você também pode querer mudar as cores etc.

ANaimi
fonte
68
Isso ajuda, mas não impede a tabulação nos campos.
Jerwood
Eu queria "desativar" o último link de uma trilha de navegação, e não estava com essa solução alternativa em mente ... graças a isso com algumas alterações de cor e sem sublinhado, isso fez o truque! : D
Facundo Colombier
2
Isso também não impede que os valores do formulário sejam enviados.
Ken Wayne Vanderlinde
1
@KenWayneVanderLinde também não atribui o atributo desativado?
theonlygusti
2
@theonlygusti Os elementos <input> desativados em um formulário não serão enviados.
dougd_in_nc
113

Como as regras estão sendo executadas em JavaScript, por que não desativá-las usando javascript (ou, no meu caso de exemplo, jQuery)?

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

ATUALIZAR

A attrfunção não é mais a principal abordagem para isso, como foi apontado nos comentários abaixo. Agora isso é feito com a propfunção

$( "input" ).prop( "disabled", true ); //Disable
$( "input" ).prop( "disabled", false ); //Enable
Dutchie432
fonte
1
Não deveria ser $ ('# filedId'). RemoveAttr ('disabled'); // Ativar
Anupam Jain
6
Provavelmente, vale a pena notar que esta solução não funcionará se o usuário tiver desativado o JavaScript.
precisa saber é o seguinte
1
O Firefox 20.0 (não tenho certeza sobre outras versões, é exatamente isso que estou usando para desenvolver) requer a remoção do atributo. Enquanto @ Dutchie432 estiver certo em teoria, use .removeAttr ('disabled'); é a solução prática correta (pelo menos no meu navegador atual).
1
A menos que você não possa usar o JQuery.
Marines24
3
FYI - a documentação do jQuery sugere o uso em .prop()vez de .attr()para este caso. "No jQuery 1.6, o método .attr () retorna indefinido para atributos que não foram definidos. Para recuperar e alterar propriedades do DOM, como o estado verificado, selecionado ou desativado dos elementos do formulário, use o método .prop (). " Documentação de origem: .attr () e .prop ()
Nicholas Ryan Bowers
54

É muito curioso que você tenha propriedades visíveis e de exibição em CSS, mas não ative / desative.

É muito curioso que você ache isso muito curioso. Você está entendendo mal o propósito do CSS. CSS não pretende alterar o comportamento dos elementos do formulário. É para mudar apenas o estilo deles . Ocultar um campo de texto não significa que ele não esteja mais lá ou que o navegador não enviará seus dados quando você enviar o formulário. Tudo o que faz é esconder dos olhos do usuário.

Para realmente desativar seus campos, você deve usar o disabledatributo em HTML ou a disabledpropriedade DOM em JavaScript.

BoltClock
fonte
35
Claro que sei para que serve o CSS "supostamente". Mas para os aplicativos da web modernos, a distinção entre "apresentação" e "comportamento" é mais turva que a lama. Como os campos desativados não são enviados ao servidor, é uma mudança de comportamento. Mas então como está escondendo todos os campos do formulário, não um ?! Talvez nos bons velhos tempos, quando tudo o que você podia fazer na Web fosse ler texto e preencher formulários, a distinção fosse mais clara. No aplicativo da web moderno, se você deseja separar a apresentação do comportamento, CSS versus HTML / JS é a maneira errada de fazê-lo.
Anupam Jain
17
desativado é um estado, não um comportamento. O que ele está pedindo é perfeitamente razoável. Por exemplo, você pode querer adicionar uma classe ocupada a vários campos enquanto os dados estão sendo processados. Além disso, o W3C parece concordar, pois permite a seleção CSS de elementos por meio da pseudo classe desativada.
IAmNaN
3
@IAmNaN: 1) "desativado é um estado, não um comportamento." O mesmo acontece com todos os outros atributos HTML / DOM. 2) "Por exemplo, você pode querer adicionar uma classe ocupada a vários campos enquanto os dados estão sendo processados." Você faz isso em um script. 3) "Além disso, o W3C parece concordar, pois permite a seleção CSS de elementos através da pseudo classe desativada." Ser capaz de selecionar um elemento com base em se ele está ativado ou desativado não tem nada a ver com a possibilidade de alterar esse estado usando CSS.
BoltClock
5
Existem muitas coisas no CSS que realmente podem ser consideradas mudanças de comportamento, por exemplo, eventos-ponteiro: nenhum; mencionado por @ANaimi. Portanto, a desativação também pode ser facilmente considerada uma propriedade de exibição. Pena que não é, tornaria poucas coisas mais fáceis.
Mikael Lepistö
1
@Mikael Lepistö: Sim, eu também não concordo em pointer-eventsser uma propriedade CSS. FYI, é pointer-events originário de SVG .
BoltClock
22

Você não pode usar CSS para desativar a Caixa de texto. solução seria o atributo HTML.

disabled="disabled"
Vishwanath Dalvi
fonte
Embora isso funcione em princípio, se você ler a pergunta completa, o campo do formulário será gerado automaticamente e precisará ser desativado posteriormente.
thelem 22/09/14
1
@mr_eclair. é possível usando ---> eventos-ponteiro: nenhum; Propriedade CSS.
Fereydoon Barikzehy
3
Nota: Os elementos com disabledatributo não são enviados - seus valores não são postados no servidor. Leia sobre: stackoverflow.com/q/8925716/1066234
Kai Noack
17

A solução prática é usar CSS para realmente ocultar a entrada.

Para levar isso à sua conclusão natural, você pode escrever duas entradas html para cada entrada real (uma ativada e outra desativada) e usar o javascript para controlar o CSS para mostrá-las e ocultá-las.

graphicdivine
fonte
3
Se você estiver usando Javascript, faria sentido apenas desativar / ativar conforme necessário, não?
21416 MindVox
De fato, mas no contexto dessa questão em particular, essa pode ser uma abordagem viável.
GraphicDivine
10

primeira vez respondendo a algo, e aparentemente um pouco tarde ...

Aceito fazê-lo por javascript, se você já estiver usando.

Para uma estrutura composta, como eu costumo usar, criei um elemento pseudo após CSS para bloquear os elementos da interação do usuário e permitir o estilo sem precisar manipular toda a estrutura.

Por exemplo:

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

Eu posso colocar uma disabledaula no embrulhodiv

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

Isso deixaria o texto em cinza dentro do dive o tornaria inutilizável para o usuário.

Meu exemplo JSFiddle

Larchy
fonte
4
BTW: Você ainda precisa manipular as guias, que ainda permitem ao usuário chegar ao campo e alterá-lo.
K Kimble
2
então o <select> não deveria ter uma classe = "desativada"?
TimoSolo #
Isso é brilhante, eu sabia que havia algo assim. :) obrigado
James Harrington
Isso é realmente útil. Eu sei que usar o javascript para definir desativado seria melhor, mas isso resolve meu problema de deixar claro para os usuários (além de uma mensagem de erro) que o envio não funcionará.
jerclarke
8

Eu estou sempre usando:

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

e, em seguida, aplicando a classe css ao campo de entrada:

<input class="disabled" type="text" value="90" name="myinput" id="myinput" />
Kai Noack
fonte
4

input [nome = nome de usuário] {desativado: true; /* Não funciona */ }

Eu sei que essa pergunta é bastante antiga, mas para outros usuários que se deparam com esse problema, suponho que a maneira mais fácil de desativar a entrada é simplesmente ': 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>

Na realidade, se você tiver algum script para desativar a entrada de forma dinâmica / automática com javascript ou jquery que seria desativado automaticamente com base na condição que você adicionar.

No jQuery, por exemplo:

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

Espero que a resposta em CSS ajude.

Shaze
fonte
2

Receio que você não possa fazer isso, mas pode fazer o seguinte no jQuery, se não desejar adicionar os atributos aos campos. Coloque isso dentro da sua <head></head>tag

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

Se você estiver gerando os campos no DOM (com JS), faça isso:

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

Isso pode ser feito para uma finalidade não crítica, colocando uma sobreposição em cima do seu elemento de entrada. Aqui está o meu exemplo em HTML e CSS puro.

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>
DeFeNdog
fonte
1

Não há como usar CSS para esse fim. Meu conselho é incluir um código javascript no qual você atribui ou altera a classe css aplicada às entradas. Algo parecido :

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>

Joel Barba
fonte
0

Uma variação da pointer-events: none;solução, que resolve o problema de a entrada ainda estar acessível por meio de controle rotulado ou tabindex, é agrupar a entrada em uma div, denominada como entrada de texto desabilitada, e definir input { visibility: hidden; }quando a entrada é "desabilitada" .
Ref: 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>

O estilo desativado aplicado no snippet acima é retirado da interface do usuário do Chrome e pode não ser visualmente idêntico às entradas desativadas em outros navegadores. Possivelmente, ele pode ser personalizado para navegadores individuais usando os prefixos de extensão CSS específicos do mecanismo. Embora à primeira vista, acho que não poderia:
extensões CSS da Microsoft , extensões CSS da Mozilla , extensões CSS do WebKit

Parece muito mais sensato para introduzir um valor adicional visibility: disabledou display: disabledou talvez mesmo appearance: disabled, uma vez que visibility: hiddenjá afeta o comportamento dos elementos aplicáveis quaisquer elementos de controlo associadas.

Matthew Millar
fonte