J'ai du mal à comprendre le comportement de la :after
propriété CSS . Selon les spécifications ( ici et ici ):
Comme leur nom l' indique, les
:before
et:after
pseudo-éléments spécifient l'emplacement du contenu avant et après le contenu de l' arbre de documents d'un élément.
Cela ne semble pas imposer de restrictions sur les éléments qui peuvent avoir une propriété :after
(ou :before
). Cependant, cela semble ne fonctionner qu'avec des éléments spécifiques ... <p>
fonctionne, <img>
ne fonctionne pas, <input>
ne fonctionne pas <table>
. Je pourrais tester plus, mais le point est fait. Notez que cela semble assez cohérent entre les navigateurs. Qu'est-ce qui détermine si un objet peut accepter une propriété :before
and :after
?
la source
<before></before>
" dans la source.<before></before>
. J'aurais dû dire "faire semblant de DOM" ou quelque chose comme ça. Le but était de montrer cela:before
et d':after
être à l'intérieur de l'élément, pas à l'extérieur.:before
et:after
ne fonctionne pas pour les éléments remplacés; il dit simplement qu'il ne «définit pas complètement» comment et que cela sera défini à l'avenir (ce qui ne s'est pas produit jusqu'à présent). Ce qui se passe dans DOM n'a pas d'importance ici. Bien que les navigateurs ne prennent pas en charge ces pseudo-éléments pour certains éléments, ce n'est pas dans les spécifications, juste ce que font les implémentations.::before
et::after
ne pas travailler pour vide élément (vide) qui n'ont un contenu réel, avant / après quoi ils pourraient appliquer. Mais étonnamment, ils fonctionnent pourhr
élément dans presque tous les navigateurs.:before
et:after
ne sont pas obligés de fonctionner pour les éléments remplacés, et les spécifications CSS ne spécifient pas comment ils fonctionneraient pour eux, et le concept d'élément remplacé est quelque peu vague.La spécification CSS 2.1 suggère clairement qu'ils peuvent fonctionner pour les éléments remplacés, en disant simplement qu'elle ne «définit pas complètement» comment. Cela concerne le problème selon lequel un élément remplacé doit avoir son propre rendu visuel, qui n'est pas contrôlé par CSS, alors que les pseudo-éléments devraient ajouter quelque chose au contenu de l'élément. La spécification ajoute que cela sera défini «plus en détail» dans une future spécification, mais cela n'a pas eu lieu jusqu'à présent.
Les fournisseurs de navigateurs ont simplement décidé d'éviter les problèmes en n'implémentant pas du tout ces pseudo-éléments pour certains éléments.
On ne sait pas du tout ce que signifie «élément remplacé», et le sens semble avoir quelque peu changé. Il est souvent interprété comme signifiant la même chose qu'un élément vide (un élément avec un
EMPTY
contenu déclaré, c'est-à-dire un élément qui ne peut pas avoir de contenu), mais CSS 2.1 lui-même montre un exemple de feuille de style avec le sélecteurbr:before
(bien que les navigateurs l'aient ignoré, implémentantbr
leur propre façon). On peut affirmer que de plus en plus d'éléments sont passés dans le champ d'application du rendu CSS, au moins en partie. Par exemple, uninput
élément (y compris sa police, ses couleurs, etc.) est largement contrôlable avec CSS dans les navigateurs modernes.Les navigateurs actuels (Firefox, IE, Chrome) ne semblent pas soutenir les
:after
et:before
pseudo-éléments pour les éléments vides autres quehr
. Pourhr
, IE et Chrome placent le contenu généré dans une zone encadrée, qui est la mise en œuvre dehr
; le contenu rend la boîte plus haute. Firefox place le contenu des deux (!) Pseudo-éléments après la règle horizontale qui est son implémentationhr
. Cette variation illustre les types de problèmes d '«interaction» auxquels se réfère CSS 2.1.On prétend souvent que ces pseudo-éléments ne peuvent pas être utilisés pour des éléments vides car leurs définitions HTML ne permettent aucun contenu. Ceci est une erreur de catégorie. Les règles de syntaxe d'un langage de balisage ne restreignent pas ce que vous pouvez faire en CSS
Pour conclure,
:after
et ne:before
sont actuellement pas utilisables pour les éléments vides (sauf marginalement pourhr
), mais cela est principalement dû aux implémentations et peut changer dans le futur.la source
Les éléments qui n'ont pas de balise de fermeture sont des éléments vides et ils ne peuvent pas afficher de contenu à l'intérieur:
https://www.w3.org/TR/html5/syntax.html#void-elements
Tous les navigateurs Blink, Webkit et Quantum vous permettent de créer des pseudo éléments uniquement sur des cases à cocher, mais cela est controversé car aucune spécification ne permet ce comportement.
Voici un exemple: https://codepen.io/equinusocio/pen/BOBaEM/
la source