J'essaie d'utiliser le :after
pseudo-élément CSS sur un input
champ, mais cela ne fonctionne pas. Si je l'utilise avec un span
, cela fonctionne bien.
<style type="text/css">
.mystyle:after {content:url(smiley.gif);}
.mystyle {color:red;}
</style>
Cela fonctionne (met le smiley après "buu!" Et avant "un peu plus")
<span class="mystyle">buuu!</span>a some more
Cela ne fonctionne pas - il colore seulement une certaine valeur en rouge, mais il n'y a pas de smiley.
<input class="mystyle" type="text" value="someValue">
Qu'est-ce que je fais mal? dois-je utiliser un autre pseudo-sélecteur?
Remarque: je ne peux pas ajouter un span
autour de mon input
, car il est généré par un contrôle tiers.
border-color
deinput
. Je trouve que c'est plus attirant l'attention.Réponses:
:after
et:before
ne sont pas pris en charge dans Internet Explorer 7 et versions antérieures, sur aucun élément.Il n'est pas non plus destiné à être utilisé sur des éléments remplacés tels que des éléments de formulaire (entrées) et des éléments d'image .
En d'autres termes, c'est impossible avec du CSS pur.
Cependant, si vous utilisez jquery, vous pouvez utiliser
Documents API sur .after
Pour ajouter votre contenu avec javascript. Cela fonctionnera sur tous les navigateurs.
la source
:after
en général, bien qu'il ne prenne en charge ni les entrées:before
ni:after
les entrées.:after
et les:before
pseudo-éléments, ils ne peuvent être placés que sur des éléments conteneurs. Pourquoi? Parce qu'ils sont ajoutés à l' intérieur de cet élément particulier.input
n'est pas un conteneur.button
par exemple, c'est pourquoi vous pouvez les mettre. Fonctionne comme prévu. La spécification dit en fait: avant et après le contenu de l'arborescence de documents d'un élément. Elle dit explicitement CONTENT . Un élément doit donc être un conteneur.:before
et:after
rendre à l'intérieur d'un conteneuret <input> ne peut pas contenir d'autres éléments.
Les pseudo-éléments ne peuvent être définis (ou mieux ne sont supportés que) sur les éléments conteneurs. Parce que la façon dont ils sont rendus est à l' intérieur le conteneur lui-même en tant qu'élément enfant.
input
ne peut pas contenir d'autres éléments, ils ne sont donc pas pris en charge. Abutton
d'autre part, c'est aussi un élément de formulaire qui les prend en charge, car c'est un conteneur d'autres sous-éléments.Si vous me demandez, si un navigateur n'affiche ces deux pseudo-éléments sur des éléments non-conteneurs, il est un bug et une conformité non standard. La spécification parle directement du contenu de l'élément ...
Spécification W3C
Si nous lisons attentivement la spécification, elle indique en fait qu'elle est insérée à l' intérieur un élément conteneur:
Voir? le contenu de l' arborescence de documents d'un élément . Si je comprends bien, cela signifie dans un conteneur.
la source
[required]::before { content "*"; color: red; }
: P<input type="submit" value="Send"/>
, utilisez<button type="submit">Send</button>
plutôt. La présentation est identique mais<button>
est un conteneur et prend donc en charge:before
et:after
.<hr />
? Je pensais que ce n'était pas un élément conteneur, mais il pouvait être rendu:after
et:before
jsfiddle.net/Uf88j/1p
eth1
, le contenu est à l'intérieur de la balise, donc avant / après apparaissent également à l'intérieur. Avec des éléments commeinput
ethr
,: avant et: après apparaîtrait toujours avant ou après le contenu, mais aucun conteneur n'est impliqué (en particulier pourinput
). entrée: vérifié: avant est largement utilisé pour indiquer les cases à cocher en cours de vérification via css.Curieusement, cela fonctionne avec certains types d'entrée. Au moins dans Chrome,
fonctionne bien, comme
C'est juste
type=text
et quelques autres qui ne fonctionnent pas.la source
Voici une autre approche (en supposant que vous avez le contrôle du HTML): ajoutez un vide
<span></span>
juste après l'entrée et ciblez-le en CSS en utilisantinput.mystyle + span:after
J'utilise cette approche dans AngularJS car elle ajoutera
.ng-invalid
automatiquement des classes aux<input>
éléments de formulaire et au formulaire, mais pas au<label>
.la source
input:hover+span:after{color: blue}
. Upvote.:before
et:after
sont appliqués à l'intérieur d'un conteneur, ce qui signifie que vous pouvez l'utiliser pour des éléments avec une balise de fin.En passant, les éléments à fermeture automatique (tels que img / hr / input) sont également appelés «éléments remplacés», car ils sont remplacés par leur contenu respectif. "Objets externes" pour l'absence d'un meilleur terme. Une meilleure lecture ici
la source
J'ai utilisé le
background-image
pour créer le point rouge pour les champs obligatoires.Vue sur Codepen
la source
Vous ne pouvez pas mettre un pseudo-élément dans un élément d'entrée, mais vous pouvez mettre un élément fantôme, comme un espace réservé!
Pour le faire fonctionner dans d' autres navigateurs, l' utilisation
:-moz-placeholder
,::-moz-placeholder
et:-ms-input-placeholder
dans différents sélecteurs . Impossible de regrouper les sélecteurs, car si un navigateur ne reconnaît pas, le sélecteur invalide l'intégralité de l'instruction.MISE À JOUR : Le code ci-dessus fonctionne uniquement avec les pré-processeurs CSS (SASS, LESS ...), sans pré-processeurs utiliser:
la source
glyphicon-search
balisage sans toucher.Les pseudo-éléments comme
:after
,:before
ne sont destinés qu'aux éléments conteneurs. Les éléments commençant et se fermant en un seul endroit comme<input/>
,<img>
etc. ne sont pas des éléments conteneurs et donc les pseudo-éléments ne sont pas pris en charge. Une fois que vous avez appliqué un pseudo-élément à un élément conteneur comme<div>
et si vous inspectez le code (voir l'image), vous pouvez comprendre ce que je veux dire. En fait, le pseudo-élément est créé à l'intérieur de l'élément conteneur. Ce n'est pas possible en cas de<input>
ou<img>
la source
Une solution de travail en CSS pur:
L'astuce consiste à supposer qu'il y a un élément dom après le champ de texte.
(*) Solution limitée, cependant:
Mais dans la plupart des cas, nous connaissons notre code donc cette solution semble efficace et 100% CSS et 0% jQuery.
la source
input#myTextField ~ span:before {
beaucoup mieux, mais span devrait avoir une classe vraiment plus explicite comme.tick
ou.icon
J'ai trouvé ce message car j'avais le même problème, c'était la solution qui fonctionnait pour moi. Au lieu de remplacer la valeur de l'entrée, supprimez-la et placez absolument une plage de taille identique derrière la plage, la plage peut avoir une
:before
pseudo-classe appliquée avec la police d'icône de votre choix.la source
Le plus grand malentendu ici est le sens des mots
before
etafter
. Ils ne se réfèrent pas à l'élément lui-même, mais au contenu de l'élément. Il enelement:before
est de même avant le contenu etelement:after
après le contenu, mais les deux sont toujours à l'intérieur de l'élément d'origine.L'
input
élément n'a pas de contenu dans la vue CSS et n'a donc pas de contenu:before
ou un:after
pseudo-contenu. Cela est vrai pour de nombreux autres éléments vides ou remplacés.Il n'y a pas de pseudo-élément faisant référence à l' extérieur de l'élément.
Dans un univers différent, ces pseudo-éléments auraient pu être appelés autrement pour rendre cette distinction plus claire. Et quelqu'un aurait même pu proposer un pseudo-élément qui est véritablement en dehors de l'élément. Jusqu'à présent, ce n'est pas le cas dans cet univers.
la source
hr
a toujours été ambigu du point de vue CSS, même si vous en voyez davantage dans la discussion sur la couleur.Selon une note de la spécification CSS 2.1, la spécification «ne définit pas entièrement l'interaction de: avant et: après avec les éléments remplacés (comme IMG en HTML). Cela sera défini plus en détail dans une future spécification. » Bien que ce
input
ne soit plus vraiment un élément remplacé, la situation de base n'a pas changé: l'effet de:before
et:after
sur lui de manière non spécifiée et n'a généralement aucun effet.La solution consiste à trouver une approche différente du problème que vous essayez de résoudre de cette façon. Placer le contenu généré dans un contrôle de saisie de texte serait très trompeur: pour l'utilisateur, il semblerait qu'il fasse partie de la valeur initiale du contrôle, mais il ne peut pas être modifié - il semblerait donc que ce soit quelque chose de forcé au début de la mais il ne serait pas soumis dans le cadre des données du formulaire.
la source
input
éléments, simplement non spécifié et en fonction du navigateur.Comme d'autres l'ont expliqué, les
input
s sont des éléments vides un peu remplacés, donc la plupart des navigateurs ne vous permettent pas de générer::before
ni de::after
pseudo-éléments en eux.Cependant, le groupe de travail CSS envisage d'autoriser explicitement
::before
et::after
dans le casinput
contraireappearance: none
.Depuis https://lists.w3.org/Archives/Public/www-style/2016Mar/0190.html ,
la source
essayez ensuite:
la source
Vous devez avoir une sorte de wrapper autour de l'entrée pour utiliser un pseudo-élément avant ou après. Voici un violon qui a un avant sur la div wrapper d'une entrée, puis place l'avant avant à l'intérieur de l'entrée - ou du moins il y ressemble. Évidemment, c'est un travail autour mais efficace dans un pincement et se prête à être réactif. Vous pouvez facilement en faire un après si vous avez besoin de mettre un autre contenu.
Violon de travail
Signe dollar à l'intérieur d'une entrée en tant que pseudo-élément: http://jsfiddle.net/kapunahele/ose4r8uj/1/
Le HTML:
Le CSS:
la source
Si vous essayez de styliser un élément d'entrée avec: avant et: après, les chances sont que vous essayez d' imiter les effets d'autres span, div ou même des éléments de votre pile CSS.
Comme le souligne la réponse de Robert Koritnik,: avant et: après ne peuvent être appliqués qu'aux éléments de conteneur et les éléments d'entrée ne sont pas des conteneurs.
TOUTEFOIS, HTML 5 a introduit l' élément button qui est un conteneur et se comporte comme un élément d'entrée [type = "submit | reset"].
la source
Sommaire
Cela ne fonctionne pas avec
<input type="button">
, mais cela fonctionne très bien avec<input type="checkbox">
.Violon : http://jsfiddle.net/gb2wY/50/
HTML :
CSS :
la source
:before
et:after
ne fonctionne que pour les nœuds pouvant avoir des nœuds enfants car ils insèrent un nouveau nœud comme premier ou dernier nœud.la source
J'ai trouvé que vous pouvez le faire comme ceci:
Afficher l'extrait de code
Vous devez avoir un parent div qui prend le padding et le: after. Le premier parent doit être relatif et le deuxième div doit être absolu afin que vous puissiez définir la position de l'after.
la source
J'ai une autre idée à utiliser à la place:
la source