Estou tendo problemas para entender o comportamento da :after
propriedade CSS . De acordo com as especificações ( aqui e aqui ):
Como seus nomes indicam, os
:before
e:after
pseudo-elementos especificar a localização do conteúdo antes e depois do conteúdo árvore de documentos de um elemento.
Isso não parece colocar restrições sobre quais elementos podem ter uma propriedade :after
(ou :before
). No entanto, parece que só funcionam com elementos específicos ... <p>
obras, <img>
não, <input>
não, <table>
não. Eu poderia testar mais, mas o ponto é válido. Observe que isso parece bastante consistente em todos os navegadores. O que determina se um objeto pode aceitar uma propriedade :before
e :after
?
fonte
<before></before>
" na fonte.<before></before>
. Eu deveria ter dito "fingir DOM" ou algo assim. O objetivo era mostrar isso:before
e:after
estão dentro do elemento, não fora dele.:before
e:after
não funciona para elementos substituídos; apenas diz que não “define totalmente” como e que isso será definido no futuro (o que não aconteceu até agora). O que acontece no DOM é irrelevante aqui. Embora os navegadores não suportem esses pseudo-elementos para alguns elementos, isso não está nas especificações, apenas o que as implementações fazem.::before
e::after
não funcionam para elementos void (vazios) que nunca têm conteúdo real, antes / depois do qual eles poderiam ser aplicados. Mas, surpreendentemente, eles funcionam para ohr
element em quase todos os navegadores.:before
e:after
não precisam funcionar para elementos substituídos, e as especificações CSS não especificam como funcionariam para eles, e o conceito de elemento substituído é um tanto vago.A especificação CSS 2.1 sugere claramente que eles podem funcionar para elementos substituídos, apenas dizendo que não "define totalmente" como. Isso está relacionado ao problema de que um elemento substituído deve ter sua própria renderização visual, que não é controlada por CSS, enquanto os pseudoelementos devem adicionar algo ao conteúdo do elemento. A especificação acrescenta que isso será definido “com mais detalhes” em uma especificação futura, mas isso não ocorreu até agora.
Os fornecedores de navegadores decidiram evitar problemas ao não implementar esses pseudo-elementos para alguns elementos.
Não está claro o que significa “elemento substituído”, e o significado parece ter mudado um pouco. Muitas vezes é interpretado como significando o mesmo que um elemento vazio (um elemento com
EMPTY
conteúdo declarado, ou seja, um elemento que não pode ter nenhum conteúdo), mas o próprio CSS 2.1 mostra uma folha de estilo de amostra com o seletorbr:before
(embora os navegadores tenham ignorado isso, implementandobr
seus próprios maneira). Pode-se argumentar que mais e mais elementos foram movidos para o escopo da renderização CSS, pelo menos em parte. Por exemplo, uminput
elemento (incluindo sua fonte, cores, etc.) é amplamente controlável com CSS em navegadores modernos.Os navegadores atuais (Firefox, IE, Chrome) não parecem suportar o
:after
e:before
pseudo-elementos para fins diferentes elementos vazioshr
. Poishr
, o IE e o Chrome colocam o conteúdo gerado dentro de uma caixa delimitada, que é a implementação dehr
; o conteúdo torna a caixa mais alta. O Firefox coloca o conteúdo de ambos (!) Pseudo-elementos após a regra horizontal que é sua implementaçãohr
. Esta variação ilustra os tipos de problemas de “interação” mencionados no CSS 2.1.Freqüentemente, afirma-se que esses pseudo-elementos não podem ser usados para elementos vazios, pois suas definições HTML não permitem nenhum conteúdo. Este é um erro de categoria. As regras de sintaxe de uma linguagem de marcação não restringem o que você pode fazer em CSS
Para concluir,
:after
e:before
atualmente não são utilizáveis para elementos vazios (exceto marginalmente parahr
), mas isso é principalmente devido a implementações e pode mudar no futuro.fonte
Os elementos que não possuem tag de fechamento são elementos nulos e não podem exibir o conteúdo dentro deles:
https://www.w3.org/TR/html5/syntax.html#void-elements
Todos os navegadores Blink, Webkit e Quantum permitem que você crie pseudoelementos apenas nas caixas de seleção, mas isso é controverso, pois nenhuma especificação permite esse comportamento.
Aqui está um exemplo: https://codepen.io/equinusocio/pen/BOBaEM/
fonte