Como estilizar o atributo readonly com CSS?

150

Atualmente, estou usando readonly = "readonly" para desativar os campos. Agora estou tentando estilizar o atributo usando CSS. Eu tentei usar

input[readonly] {
/*styling info here*/
}

mas não está funcionando por algum motivo. Eu também tentei

input[readonly='readonly'] {
/*styling info here*/
}

isso também não funciona.

Como posso estilizar o atributo readonly com CSS?

Daphne
fonte
12
input[readonly]Deveria trabalhar. Verifique se ele não está sendo substituído por outros seletores mais específicos em outras partes da folha de estilo.
BoltClock
1
se você quiser desativar, em seguida, usar o atributo desativado e não somente de leitura
Sven Bieder
3
@SvenBieder Somente leitura e desativado têm um comportamento completamente diferente. Os campos somente leitura enviados para o servidor no formulário são enviados, enquanto os campos desativados não são.
21412 Naren
3
input[readonly='readonly']só funcionará se você usar HTML como <input readonly="readonly">, não por exemplo <input readonly>. input[readonly]deve corresponder a ambos.
Mathias Bynens
1
!importantdeve trabalhar para substituir, a menos que você também tenha !importantna classe de configuração?
Matt K

Respostas:

204
input[readonly]
{
    background-color:blue;
}

https://curtistimson.co.uk/post/css/style-readonly-attribute-css/

Curt
fonte
24
Em input[readonly]vez disso, você deve usar como readonlyé um atributo booleano que não foi projetado para ter um valor específico.
BoltClock
1
@BoltClock Sim. Por favor, veja a resolução na resposta abaixo.
Pal R
Como posso torná-lo gravável novamente? Apenas removendo o estilo da classe?
Renaro Santos
@RenaroSantos Isso é uma alteração de HTML. Retire readonly="readonly"do seu inputelemento.
Curt
w / IE7 você ainda pode usar o seletor com jQuery
ladieu
69

Observe que textarea[readonly="readonly"]funciona se você definir readonly="readonly"em HTML, mas NÃO funciona se você definir o readOnlyatributo-para trueou"readonly" via JavaScript.

Para que o seletor CSS funcione, se você definir readOnlycom JavaScript, precisará usar o seletortextarea[readonly] .

Mesmo comportamento no Firefox 14 e Chrome 20.

Para estar do lado seguro, eu uso os dois seletores.

textarea[readonly="readonly"], textarea[readonly] {
...
}
kaka
fonte
18
Você também pode simplesmente usar textarea[readonly]- tudo textarea[readonly="readonly"]é garantido para corresponder a isso.
BoltClock
23

Para estar seguro, você pode usar os dois ...

input[readonly], input[readonly="readonly"] {
    /*styling info here*/
}

O atributo readonly é um "atributo booleano", que pode estar em branco ou "readonly" (os únicos valores válidos). http://www.whatwg.org/specs/web-apps/current-work/#boolean-attribute

Se você estiver usando algo como a .prop('readonly', true)função do jQuery , acabará precisando [readonly], enquanto que se estiver usando .attr("readonly", "readonly"), precisará [readonly="readonly"].


Correção: Você só precisa usar input[readonly]. Incluir input[readonly="readonly"]é redundante. Consulte https://stackoverflow.com/a/19645203/1766230

Lucas
fonte
20

Cargas de respostas aqui, mas ainda não vi a que eu uso:

input[type="text"]:read-only { color: blue; }

Observe o traço no pseudo-seletor. Se a entrada for, readonly="false"também será detectada, pois esse seletor captura a presença de somente leitura, independentemente do valor. Tecnicamente, falseé inválido de acordo com as especificações, mas a internet não é um mundo perfeito. Se precisar cobrir esse caso, você pode fazer o seguinte:

input[type="text"]:read-only:not([read-only="false"]) { color: blue; }

textarea funciona da mesma maneira:

textarea:read-only:not([read-only="false"]) { color: blue; }

Tenha em mente que html agora suporta não só type="text", mas uma série de outros tipos textuais como um number, tel, email, date, time, url, etc. Cada precisaria ser adicionado ao seletor.

IAmNaN
fonte
2
Nem eu. LOL Sim, você está correto! Por enquanto. :read-onlye outros seletores de psuedo foram adicionados ao padrão W3C e podem ser usados ​​com versões de pré-visualização do IE 10 10547 e superior.
IAmNaN
6

Há algumas maneiras de fazer isto.

O primeiro é o mais utilizado. Funciona em todos os principais navegadores.

input[readonly] {
 background-color: #dddddd;
}

Enquanto o item acima selecionará todas as entradas readonlyanexadas, este abaixo selecionará apenas o que você deseja. Substitua demopor qualquer tipo de entrada desejado.

input[type="demo"]:read-only {
 background-color: #dddddd;
}

Esta é uma alternativa à primeira, mas não é muito usada:

input:read-only {
 background-color: #dddddd;
}

O :read-onlyseletor é suportado no Chrome, Opera e Safari. O Firefox usa :-moz-read-only. O IE não suporta o :read-onlyseletor.

Você também pode usar input[readonly="readonly"], mas isso é praticamente o mesmo que input[readonly], pela minha experiência.

Matthew Campbell
fonte
4
input[readonly], input:read-only {
    /* styling info here */
}

Deverá cobrir todos os casos para um campo de entrada somente leitura ...

Sarja
fonte
input: somente leitura é a "pseudo classe de mutabilidade que visa facilitar o estilo de formulário com base em atributos HTML desabilitados, somente leitura e editáveis ​​por conteúdo " Como mencionado aqui, css-tricks.com/almanac/selectors/r/read-write-read , várias implementações são bastante instáveis.
Peater
Isso é estranho, mas apenas a entrada [somente leitura] trabalhou para mim em FF 58
Pavel_K
3

colocar em maiúscula a primeira letra de Only

input[readOnly] {
      background: red !important;
    }
<input type="text" name="country" value="China" readonly="readonly" />

王小 陌
fonte
2

Se você selecionar a entrada pelo id e adicionar a input[readonly="readonly"]tag no css, algo como:

 #inputID input[readonly="readonly"] {
     background-color: #000000;
 }

Isso não vai funcionar. Você precisa selecionar uma classe ou identificação pai e, em seguida, a entrada. Algo como:

 .parentClass, #parentID input[readonly="readonly"] {
     background-color: #000000;
 }

Meus 2 centavos enquanto aguarda novos ingressos no trabalho: D

softwareplay
fonte
"Se você selecionar a entrada pelo id" - qual o OP não é, então como isso é relevante? Mesmo se for o caso, você está errado, basta remover o combinador descendente.
Quentin
AH ok, você quer dizer que eu tenho que digitar algo como input [readonly = "readonly"] # inputID? / me tolo .. você está certo
softwareplay
1

Use o seguinte para trabalhar em todos os navegadores:

 var readOnlyAttr = $('.textBoxClass').attr('readonly');
    if (typeof readOnlyAttr !== 'undefined' && readOnlyAttr !== false) {
        $('.textBoxClass').addClass('locked');
    }
Pal R
fonte
2
Portanto, espero que seu público-alvo não esteja nesses 2%.
Bacco
O que inclui a classe 'bloqueada' ??
AdiT
$ ('. textBoxClass'). addClass ('locked') incluirá 'locked'
Pal R