Estou tentando usar o :after
pseudoelemento CSS em um input
campo, mas ele não funciona. Se eu usá-lo com um span
, ele funciona bem.
<style type="text/css">
.mystyle:after {content:url(smiley.gif);}
.mystyle {color:red;}
</style>
Isso funciona (coloca o smiley depois de "buu!" E antes de "um pouco mais")
<span class="mystyle">buuu!</span>a some more
Isso não funciona - apenas cores algum valor em vermelho, mas não há smiley.
<input class="mystyle" type="text" value="someValue">
O que estou fazendo errado? devo usar outro pseudo-seletor?
Nota: Não consigo adicionar um span
ao redor do meu input
, porque ele está sendo gerado por um controle de terceiros.
html
css
pseudo-element
css-content
matra
fonte
fonte
border-color
doinput
. Acho que é mais atenção.Respostas:
:after
e:before
não são suportados no Internet Explorer 7 e inferior, em nenhum elemento.Também não deve ser usado em elementos substituídos, como elementos de formulário (entradas) e elementos de imagem .
Em outras palavras, é impossível com CSS puro.
No entanto, se você estiver usando jquery, poderá usar
Documentos da API em .after
Para anexar seu conteúdo com javascript. Isso funcionará em todos os navegadores.
fonte
:after
em geral, embora não seja compatível com entradas:before
ou:after
entradas.:after
e:before
pseudo elementos, eles só podem ser colocados em elementos de contêiner. Por quê? Porque eles são anexados dentro desse elemento específico.input
não é um contêiner.button
por exemplo, é por isso que você pode colocá-los. Funciona como esperado. A especificação realmente diz: antes e depois do conteúdo da árvore de documentos de um elemento Diz explicitamente CONTENT . Portanto, um elemento deve ser um contêiner.:before
e:after
renderizar dentro de um contêinere <input> não pode conter outros elementos.
Os pseudoelementos só podem ser definidos (ou melhor, apenas são suportados) nos elementos do contêiner. Porque a maneira como eles são renderizados está dentro do próprio contêiner como um elemento filho.
input
não pode conter outros elementos, portanto, eles não são suportados. Porbutton
outro lado, também é um elemento de formulário que os suporta, porque é um contêiner de outros subelementos.Se você me perguntar, se algum navegador faz exibir esses dois pseudo-elementos em elementos não-contêiner, que é um bug e uma conformidade não-padrão. A especificação fala diretamente sobre o conteúdo do elemento ...
Especificação W3C
Se lermos com atenção a especificação , na verdade, ela será inserida em um elemento que contém:
Vejo? o conteúdo da árvore de documentos de um elemento . Pelo que entendi, isso significa dentro de um contêiner.
fonte
[required]::before { content "*"; color: red; }
: P<input type="submit" value="Send"/>
, use<button type="submit">Send</button>
. A apresentação é idêntica, mas<button>
é um contêiner e, portanto, suporta:before
e:after
.<hr />
? Eu pensei que não era um elemento de recipiente, mas poderia tornar:after
e:before
jsfiddle.net/Uf88j/1p
eh1
, o conteúdo está dentro da tag, portanto, antes / depois também aparecem dentro. Com elementos comoinput
ehr
,: antes e: depois ainda apareceria antes ou depois do conteúdo, mas não há contêiner envolvido (especialmente parainput
). entrada: marcada: antes é amplamente usada para indicar caixas de seleção sendo checadas via css.Estranhamente, ele funciona com alguns tipos de entrada. Pelo menos no Chrome,
funciona bem, igual a
É apenas
type=text
e alguns outros que não funcionam.fonte
Aqui está outra abordagem (supondo que você tenha controle do HTML): adicione um vazio
<span></span>
logo após a entrada e direcione-o para CSS usandoinput.mystyle + span:after
Estou usando essa abordagem no AngularJS porque ele adicionará
.ng-invalid
classes automaticamente para<input>
formar elementos e para o formulário, mas não para o<label>
.fonte
input:hover+span:after{color: blue}
. Voto a favor.:before
e:after
são aplicados dentro de um contêiner, o que significa que você pode usá-lo para elementos com uma tag final.Em uma nota lateral, os elementos que se fecham automaticamente (como img / hr / input) também são conhecidos como 'Elementos Substituídos', pois são substituídos pelo respectivo conteúdo. "Objetos externos" pela falta de um termo melhor. Uma leitura melhor aqui
fonte
Usei o
background-image
para criar o ponto vermelho para os campos obrigatórios.Ver no Codepen
fonte
Você não pode colocar um pseudo-elemento em um elemento de entrada, mas pode colocar no elemento de sombra, como um espaço reservado!
Para fazê-lo funcionar em outros navegadores, utilização
:-moz-placeholder
,::-moz-placeholder
e:-ms-input-placeholder
em diferentes seletores . Não é possível agrupar os seletores, porque se um navegador não reconhecer, o seletor invalidará toda a instrução.UPDATE : O código acima funciona apenas com o pré-processador CSS (SASS, LESS ...), sem o uso de pré-processadores:
fonte
glyphicon-search
marcação sem tocar.Pseudo-elementos como
:after
,:before
são apenas para elementos de contêiner. Elementos iniciando e fechando em um único local como<input/>
,<img>
etc , não são elementos de contêiner e, portanto, pseudo-elementos não são suportados. Depois de aplicar um pseudo elemento ao elemento container,<div>
e se você inspecionar o código (veja a imagem), poderá entender o que quero dizer. Na verdade, o pseudo elemento é criado dentro do elemento container. Isso não é possível no caso de<input>
ou<img>
fonte
Uma solução funcional em CSS puro:
O truque é supor que exista um elemento dom após o campo de texto.
(*) Solução limitada, no entanto:
Mas, na maioria dos casos, conhecemos o nosso código, portanto essa solução parece eficiente e 100% CSS e 0% jQuery.
fonte
input#myTextField ~ span:before {
muito melhor, mas vão deve ter uma classe realmente ser mais explícito como.tick
ou.icon
Encontrei este post porque estava tendo o mesmo problema, esta foi a solução que funcionou para mim. Em vez de substituir o valor da entrada, basta removê-lo e posicionar absolutamente uma extensão atrás dela que é do mesmo tamanho, a extensão pode ter uma
:before
pseudo classe aplicada a ela com a fonte do ícone de sua escolha.fonte
O maior mal-entendido aqui é o significado das palavras
before
eafter
. Eles não se referem ao próprio elemento, mas ao conteúdo do elemento. O mesmoelement:before
acontece antes do conteúdo eelement:after
depois do conteúdo, mas ambos ainda estão dentro do elemento original.O
input
elemento não possui conteúdo na visualização CSS e, portanto, não possui:before
ou:after
pseudo conteúdo. Isso vale para muitos outros elementos nulos ou substituídos.Não há pseudo-elemento referente a fora do elemento.
Em um universo diferente, esses pseudo-elementos poderiam ter sido chamados de outra coisa para tornar essa distinção mais clara. E alguém pode até ter proposto um pseudo-elemento que está genuinamente fora do elemento. Até agora, este não é o caso neste universo.
fonte
hr
sempre foi ambíguo do ponto de vista do CSS, embora você veja isso mais ao discutir cores.De acordo com uma nota na especificação do CSS 2.1, a especificação “não define completamente a interação de: before e: after com elementos substituídos (como IMG em HTML). Isso será definido em mais detalhes em uma especificação futura. ” Embora
input
não seja mais um elemento substituído, a situação básica não mudou: o efeito de:before
e:after
sobre ele não é especificado e geralmente não tem efeito.A solução é encontrar uma abordagem diferente para o problema que você está tentando resolver dessa maneira. Colocar o conteúdo gerado em um controle de entrada de texto seria muito enganador: para o usuário, isso pareceria fazer parte do valor inicial no controle, mas não poderá ser modificado - portanto, pareceria algo forçado no início do controle, mas ainda assim não seria enviado como parte dos dados do formulário.
fonte
input
elementos, apenas não especificado e dependendo do navegador.Como outros explicaram,
input
s são elementos vazios substituídos, portanto a maioria dos navegadores não permite gerar::before
nem::after
pseudo-elementos neles.No entanto, o Grupo de Trabalho CSS está considerando permitir explicitamente
::before
e::after
no caso deinput
terappearance: none
.Em https://lists.w3.org/Archives/Public/www-style/2016Mar/0190.html ,
fonte
tente a seguir:
fonte
Você precisa ter algum tipo de wrapper ao redor da entrada para usar um pseudoelemento antes ou depois. Aqui está um violino que tem um antes na div wrapper de uma entrada e, em seguida, coloca o antes dentro da entrada - ou pelo menos parece. Obviamente, isso é uma solução alternativa, mas eficaz em um beliscão e se presta a responder. Você pode facilmente fazer isso depois, se precisar colocar algum outro conteúdo.
Violino de trabalho
Cifrão dentro de uma entrada como um pseudo-elemento: http://jsfiddle.net/kapunahele/ose4r8uj/1/
O HTML:
O CSS:
fonte
Se você estiver tentando estilizar um elemento de entrada com: before e: after, é provável que você esteja tentando imitar os efeitos de outro span, div ou mesmo de um elemento em sua pilha CSS.
Como aponta a resposta de Robert Koritnik,: antes e: depois só podem ser aplicados a elementos de contêiner e os elementos de entrada não são contêineres.
NO ENTANTO, o HTML 5 introduziu o elemento button , que é um contêiner e se comporta como um elemento input [type = "submit | reset"].
fonte
Sumário
Não funciona
<input type="button">
, mas funciona bem<input type="checkbox">
.Violino : http://jsfiddle.net/gb2wY/50/
HTML :
CSS :
fonte
:before
e:after
funciona apenas para nós que podem ter nós filhos, pois inserem um novo nó como o primeiro ou o último nó.fonte
Descobri que você pode fazer assim:
Mostrar snippet de código
Você precisa ter um pai div que aceite o preenchimento e o: depois. O primeiro pai precisa ser relativo e o segundo div deve ser absoluto para que você possa definir a posição do depois.
fonte
Eu tenho outra idéia, use isso:
fonte