Comment styliser l'attribut en lecture seule avec CSS?

150

J'utilise actuellement readonly = "readonly" pour désactiver les champs. J'essaye maintenant de styliser l'attribut en utilisant CSS. J'ai essayé d'utiliser

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

mais cela ne fonctionne pas pour une raison quelconque. J'ai aussi essayé

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

cela ne fonctionne pas non plus.

Comment puis-je styliser l'attribut readonly avec CSS?

Daphné
la source
12
input[readonly]devrait marcher. Assurez-vous qu'il n'est pas remplacé par d'autres sélecteurs plus spécifiques ailleurs dans votre feuille de style.
BoltClock
1
si vous souhaitez désactiver, utilisez l'attribut désactivé et non en lecture seule
Sven Bieder
3
@SvenBieder Readonly et désactivé ont un comportement totalement différent. Les champs en lecture seule envoyés au serveur lors de la soumission du formulaire alors que les champs désactivés ne le sont pas.
Naren
3
input[readonly='readonly']ne fonctionnera que si vous utilisez HTML comme <input readonly="readonly">, pas pour par exemple <input readonly>. input[readonly]devrait correspondre aux deux.
Mathias Bynens
1
!importantdevrait fonctionner pour remplacer, sauf si vous avez également !importantsur la classe de réglage?
Matt K

Réponses:

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

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

Sec
la source
24
Vous devez utiliser à la input[readonly]place readonlyun attribut booléen qui n'est pas conçu pour avoir une valeur spécifique.
BoltClock
1
@BoltClock Oui. Veuillez voir la résolution dans la réponse ci-dessous.
Pal R
Comment puis-je le rendre à nouveau inscriptible? Vous supprimez simplement le style de classe?
Renaro Santos du
@RenaroSantos C'est un changement HTML. Supprimer readonly="readonly"de votre inputélément.
Curt
w / IE7 vous pouvez toujours utiliser le sélecteur avec jQuery
ladieu
69

Notez que cela textarea[readonly="readonly"]fonctionne si vous définissez readonly="readonly"en HTML, mais cela ne fonctionne PAS si vous définissez l' readOnlyattribut sur trueou "readonly"via JavaScript.

Pour que le sélecteur CSS fonctionne si vous définissez readOnlyavec JavaScript, vous devez utiliser le sélecteur textarea[readonly].

Même comportement dans Firefox 14 et Chrome 20.

Pour être sûr, j'utilise les deux sélecteurs.

textarea[readonly="readonly"], textarea[readonly] {
...
}
kaka
la source
18
Vous pouvez aussi bien utiliser à la textarea[readonly]place - tout textarea[readonly="readonly"]est garanti pour correspondre à cela.
BoltClock
23

Pour être sûr, vous pouvez utiliser les deux ...

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

L'attribut readonly est un "attribut booléen", qui peut être vide ou "readonly" (les seules valeurs valides). http://www.whatwg.org/specs/web-apps/current-work/#boolean-attribute

Si vous utilisez quelque chose comme la .prop('readonly', true)fonction de jQuery , vous en aurez besoin [readonly], alors que si vous utilisez, .attr("readonly", "readonly")vous en aurez besoin [readonly="readonly"].


Correction: il vous suffit d'utiliser input[readonly]. Y compris input[readonly="readonly"]est redondant. Voir https://stackoverflow.com/a/19645203/1766230

Luke
la source
20

Des tas de réponses ici, mais je n'ai pas vu celle que j'utilise:

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

Notez le tiret dans le pseudo-sélecteur. Si l'entrée est, readonly="false"il l'attrapera aussi puisque ce sélecteur détecte la présence de lecture seule quelle que soit la valeur. Techniquement, il falsen'est pas valide selon les spécifications, mais Internet n'est pas un monde parfait. Si vous devez couvrir ce cas, vous pouvez le faire:

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

textarea fonctionne de la même manière:

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

Gardez à l' esprit que le HTML supporte désormais non seulement type="text", mais un grand nombre d'autres types de texte tel number, tel, email, date, time, url, etc. Chacun devrait être ajouté au sélecteur.

IAmNaN
la source
2
Moi non plus. LOL Oui, vous avez raison! Pour l'instant. :read-onlyet d'autres sélecteurs psuedo ont été ajoutés à la norme W3C et peuvent être utilisés avec les versions de prévisualisation IE 10 10547 et supérieures.
IAmNaN
6

Il y a quelques façons de le faire.

Le premier est le plus utilisé. Cela fonctionne sur tous les principaux navigateurs.

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

Alors que celui ci-dessus sélectionnera toutes les entrées avec readonlyattaché, celui ci-dessous ne sélectionnera que ce que vous désirez. Assurez-vous de le remplacer demopar le type d'entrée souhaité.

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

Ceci est une alternative au premier, mais il n'est pas beaucoup utilisé:

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

Le :read-onlysélecteur est pris en charge dans Chrome, Opera et Safari. Firefox utilise :-moz-read-only. IE ne prend pas en charge le :read-onlysélecteur.

Vous pouvez également utiliser input[readonly="readonly"], mais c'est à peu près la même chose que input[readonly], d'après mon expérience.

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

Shoud couvrir tous les cas pour un champ de saisie en lecture seule ...

Serge
la source
input: read-only est la "pseudo-classe de mutabilité visant à rendre le style de formulaire plus facile basé sur des attributs HTML désactivés, en lecture seule et modifiables par le contenu " Comme mentionné ici, css-tricks.com/almanac/selectors/r/read-write-read , diverses implémentations sont assez bancales.
peater
C'est étrange mais seule l'entrée [lecture seule] a fonctionné pour moi dans FF 58
Pavel_K
3

mettre en majuscule la première lettre de Only

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

王小 陌
la source
2

Si vous sélectionnez l'entrée par l'ID, puis ajoutez la input[readonly="readonly"]balise dans le css, quelque chose comme:

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

Ça ne marchera pas. Vous devez sélectionner une classe parente ou un identifiant puis l'entrée. Quelque chose comme:

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

Mes 2 cents en attendant de nouveaux billets au travail: D

logiciel
la source
"Si vous sélectionnez l'entrée par l'identifiant" - ce que l'OP n'est pas, alors comment est-ce pertinent? Même si c'était le cas, vous vous trompez, il vous suffit de supprimer le combinateur descendant.
Quentin
AH ok vous voulez dire que je dois taper quelque chose comme input [readonly = "readonly"] # inputID? / moi imbécile .. vous avez raison
softwareplay
1

Utilisez ce qui suit pour travailler dans tous les navigateurs:

 var readOnlyAttr = $('.textBoxClass').attr('readonly');
    if (typeof readOnlyAttr !== 'undefined' && readOnlyAttr !== false) {
        $('.textBoxClass').addClass('locked');
    }
Pal R
la source
2
Alors, espérons que votre public cible ne fait pas partie de ces 2%.
Bacco
Qu'inclut la classe «verrouillée» ??
Ajoutée
$ ('. textBoxClass'). addClass ('verrouillé') inclura 'verrouillé'
Pal R