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?


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/


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] {
...
}

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


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.


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.


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

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


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


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


"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');
    }

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.