Use CSS para adicionar automaticamente o asterisco do 'campo obrigatório' para formar entradas

133

Qual é uma boa maneira de superar o infeliz fato de que este código não funcionará como desejado:

<div class="required">
    <label>Name:</label>
    <input type="text">
</div>

<style>
    .required input:after { content:"*"; }
</style>

Em um mundo perfeito, todos os inputs necessários receberiam o pequeno asterisco indicando que o campo é obrigatório. Esta solução é impossível, pois o CSS é inserido após o conteúdo do elemento, não após o próprio elemento, mas algo como isso seria ideal. Em um site com milhares de campos obrigatórios, posso mover o asterisco na frente da entrada com uma alteração em uma linha ( :afterpara :before) ou movê-lo para o final do rótulo ( .required label:after) ou na frente do rótulo ou para uma posição na caixa contendo, etc ...

Isso é importante não apenas no caso de eu mudar de idéia sobre onde colocar o asterisco em qualquer lugar, mas também em casos estranhos em que o layout do formulário não permite o asterisco na posição padrão. Ele também funciona bem com a validação que verifica o formulário ou destaca os controles preenchidos incorretamente.

Por fim, ele não adiciona marcação adicional.

Existem boas soluções que tenham todas ou a maioria das vantagens do código impossível?

brentonstrina
fonte
talvez aplique uma imagem de plano de fundo de um asterisco?
Valamas
Para tornar o campo de entrada realmente necessário , adicione o requiredatributo a <input... developer.mozilla.org/en-US/docs/Web/HTML/Element/input/…
tomByrer

Respostas:

229

É isso que você tinha em mente?

http://jsfiddle.net/erqrN/1/

<label class="required">Name:</label>
<input type="text">

<style>
  .required:after {
    content:" *";
    color: red;
  }
</style>

Consulte https://developer.mozilla.org/en-US/docs/Web/CSS/pseudo-elements

Max Girkens
fonte
2
Essa é uma boa solução em muitas situações, no entanto, não funciona se estiverem sendo usados ​​posicionamento absoluto ou flutuadores para alinhar os formulários (por exemplo, jsfiddle.net/erqrN/2 ). Na verdade, estou usando posicionamento absoluto para alinhar meus formulários. Eu poderia absolutamente posicionar o, *mas isso significaria que eu teria que colocar manualmente a distância para cada tamanho de entrada do formulário e não seria capaz de ter nenhuma entrada flexível.
brentonstrine
4
@brentonstrine As probabilidades são de que você não deve usar posicionamento absoluto para alinhar seus formulários. Embora comumente usado, o posicionamento absoluto não é responsivo (a menos que você tenha JS modificando o DOM no redimensionamento), enquanto os mesmos efeitos sempre podem ser alcançados usando a posição estática ou relativa, que pode ser responsiva no design. Leitores, evite usar estilos como posicionamento absoluto em itens como elementos de formulário, pois essa é uma abordagem bastante arcaica ao posicionamento. Sei que seu comentário foi muito antigo, mas isso é para os leitores.
WebWanderer
O asterisco não aparece usando o Lynx , o que pode ser um problema de acessibilidade.
Dave Jarvis
posso colocar isso no meu .css? Se sim, você poderia dar um exemplo? Eu não sabia que : sintaxe
Leonardo Maffei
67
.required label {
    font-weight: bold;
}
.required label:after {
    color: #e32;
    content: ' *';
    display:inline;
}

Brinque com sua estrutura exata: http://jsfiddle.net/bQ859/

Laffuste
fonte
Você ainda precisa de classes em seus rótulos, realmente a única maneira de manter a estrutura do documento organizada é o método de imagem de plano de fundo. Conciso embora.
Henry
37

Embora esta seja a resposta aceita, por favor me ignorar e usar a :aftersintaxe sugerida abaixo. Minha solução não está acessível.


Um resultado semelhante pode ser alcançado usando a imagem de plano de fundo da imagem de um asterisco e definindo o plano de fundo da etiqueta / entrada / div externa e um preenchimento do tamanho da imagem do asterisco. Algo assim:

.required input {
   padding-right: 25px;
   background-image: url(...);
   background-position: right top;
}

Isso colocará o asterisco DENTRO da caixa de texto, mas colocar o mesmo em div.requiredvez de .required inputprovavelmente será mais o que você está procurando, se um pouco menos elegante.

Este método não requer uma entrada adicional.

jaypeagi
fonte
5
Vale ressaltar, no entanto, que isso não é muito agradável para os leitores de tela. A resposta de Max é muito melhor a esse respeito. De fato, na maioria dos casos, a resposta de Max é mais ideal - mas não para o OP.
Jaypeagi
20

Para colocá-lo exatamente na entrada, como é mostrado na imagem a seguir:

insira a descrição da imagem aqui

Eu encontrei a seguinte abordagem:

.asterisk_input::after {
content:" *"; 
color: #e32;
position: absolute; 
margin: 0px 0px 0px -20px; 
font-size: xx-large; 
padding: 0 5px 0 0; }
 <form>
    <div>              
        <input type="text" size="15" />                                 
        <span class="asterisk_input">  </span>            
    </div>            
</form> 

O site no qual trabalho é codificado usando o layout fixo, portanto, tudo bem para mim.

Não tenho certeza de que seja bom para o design de líquidos.

Tebe
fonte
sim, parece o mesmo. A diferença é que ele usou a imagem de fundo. (ou eu tenha entendido mal algo)
Tebe
2
adicionar marcações de span vazio para algo assim derrota todo o ponto do css, não é?
Jason prata
1
período não custa nada, é um truque comum para simplificar as coisas encontrados muito frequentemente entre vasta quantidade de bibliotecas que eu vi
Tebe
14

escrever em CSS

.form-group.required .control-label:after {content:"*";color:red;}

e HTML

<div class="form-group required">

    <label class="control-label">Name:</label>

    <input type="text">

</div>
Kondal
fonte
Eu acho que sua abordagem só funciona se você atribuir a classe control-label na tag label como <label class="control-label">...</label>. Mas ele faz o trabalho (Y)
MarcoLe
Eu dei só amostra de controlo de rótulo exemplo propósito Mr.creep andares
Kondal
Isso tem a sintaxe mais antiga do pseudo-elemento, além de não haver necessidade de sopa div. Eu adicionei uma resposta que mantém o formulário div e class free.
Henry
12
input[required]{
    background-image: radial-gradient(#F00 15%, transparent 16%), radial-gradient(#F00 15%, transparent 16%);
    background-size: 1em 1em;
    background-position: right top;
    background-repeat: no-repeat;
}
faisal
fonte
por que existem dois radial-gradienttermos background-image? Não consigo obter essa sintaxe para se casar com developer.mozilla.org/en-US/docs/Web/CSS/radial-gradient, mas está funcionando corretamente quando tento.
21816 Chris Walsh
É preferível, pois não requer nenhuma marcação adicional para fazê-lo funcionar. Eu gostaria de ver uma solução que utilizasse :: after para opções mais personalizáveis, no entanto.
Jason prata
10
input[required], select[required] {
    background-image: url('/img/star.png');
    background-repeat: no-repeat;
    background-position-x: right;
}

A imagem possui um espaço de 20 px à direita para não se sobrepor à seta suspensa selecionada

insira a descrição da imagem aqui

E fica assim: insira a descrição da imagem aqui

Kit de ferramentas
fonte
Isso é inspirador, veja minha maneira de evitar ter que carregar uma imagem de fundo.
Henry
5

Use jQuery e CSS

jQuery(document).ready(function() {
 jQuery("[required]").after("<span class='required'>*</span>");
});
.required {
    position: absolute;
    margin-left: -10px;
    color: #FB0000;
    font-size: 15px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" value="xxx" required>

Falah
fonte
5

Eu acho que essa é a maneira mais eficiente de fazer, por que tanta dor de cabeça

    <div class="full-row">
     <label for="email-id">Email Address<span style="color:red">*</span></label>
  <input type="email" id="email-id" name="email-id"  ng-model="user.email" >
    </div> 
user2903536
fonte
Observe que o intervalo é aplicado à etiqueta de etiqueta e não à etiqueta de entrada. Se appled à marca de entrada, o asterisco vermelho cai para a próxima linha - o que não é o que a maioria devs gostaria
MarcoZen
5

É 2019 e as respostas anteriores para este problema não estão usando

  1. Grade CSS
  2. Variáveis ​​CSS
  3. Elementos de formulário HTML5
  4. SVG em CSS

A grade CSS é a maneira de criar formulários em 2019, pois você pode ter seus rótulos precedendo suas entradas sem ter divs, extensões, extensões com asteriscos e outras relíquias.

Aqui é onde estamos indo com o mínimo de CSS:

Captura de tela de exemplo

O HTML para o acima:

<form action="https://www.example.com/register/" method="post" id="form-validate" enctype="multipart/form-data">
    <p class="form-instructions">Please enter the following information to create your account.</p>
    <label for="firstname">First name</label>
    <input type="text" id="firstname" name="firstname" value="" title="First name" maxlength="255" required="">
    <label for="lastname">Last name</label>
    <input type="text" id="lastname" name="lastname" value="" title="Last name" maxlength="255" required="">
    <label for="email_address">Email address</label>
    <input type="email" autocapitalize="off" autocorrect="off" spellcheck="false" name="email" id="email_address" value="" title="Email address" size="30" required="">
    <label for="password">Password</label>
    <input type="password" name="password" id="password" title="Password" required="">
    <label for="confirmation">Confirm password</label>
    <input type="password" name="confirmation" title="Confirm password" id="confirmation" required="">
    <input type="checkbox" name="is_subscribed" title="Subscribe to our newsletter" value="1" id="is_subscribed" class="checkbox">
    <label for="is_subscribed">Subscribe to the newsletter</label>
    <input type="checkbox" name="persistent_remember_me" id="remember_meGCJiRe0GbJ" checked="checked" title="Remember me">
    <label for="remember_meGCJiRe0GbJ">Remember me</label>
    <p class="required">* Required</p>
    <button type="submit" title="Register">Register</button>
</form>

O texto do espaço reservado também pode ser adicionado e é altamente recomendado. (Estou apenas respondendo a este formulário).

Agora, para as variáveis ​​CSS:

--icon-required: url('data:image/svg+xml,\
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="-10 -6 16 16"> \
  <line id="line" y1="-3" y2="3" stroke="%23df0000" stroke-linecap="butt" transform="rotate(15)"></line> \
  <line id="line" y1="-3" y2="3" stroke="%23df0000" stroke-linecap="butt" transform="rotate(75)"></line> \
  <line id="line" y1="-3" y2="3" stroke="%23df0000" stroke-linecap="butt" transform="rotate(-45)"></line> \
</svg>');

--icon-tick: url('data:image/svg+xml,\
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="-2 -2 16 16"> \
            <path fill="green" stroke-linejoin="round" d="M2 6L1 7l3 4 7-10h-1L4 8z"/> \
</svg>');

O CSS para os elementos do formulário:

input[type=text][required],
input[type=email][required],
input[type=password][required],
input[type=tel][required] {
    background-image: var(--icon-required);
    background-position-x: right;
    background-repeat: no-repeat;
    background-size: contain;
}

input:valid {
    --icon-required: var(--icon-tick);
}

O próprio formulário deve estar na grade CSS:

form {
    align-items: center;
    display: grid;
    grid-gap: var(--form-grid-gap);
    grid-template-columns: var(--form-grid-template-columns);
    margin: auto;
}

Os valores para as colunas podem ser configurados para 1fr autoou 1frcom algo como<p> tags no formulário definido para estender 1 / -1. Você altera as variáveis ​​nas consultas de mídia para ter as caixas de entrada com largura total no celular e conforme acima no computador. Você também pode alterar sua diferença de grade no celular, se desejar, usando a abordagem de variáveis ​​CSS.

Quando as caixas são válidas, você deve obter uma marca verde em vez do asterisco.

O SVG em CSS é uma maneira de evitar que o navegador faça uma ida e volta ao servidor para obter uma imagem do asterisco. Dessa forma, você pode ajustar os asteriscos, os exemplos aqui estão em um ângulo incomum; você pode editar isso porque o ícone SVG acima é totalmente legível. A caixa de visualização também pode ser alterada para colocar o asterisco acima ou abaixo do centro.

Gato de Henry
fonte
1

.asterisc {
  display: block;
  color: red;
  margin: -19px 185px;
}
<input style="width:200px">
<span class="asterisc">*</span>

Vitaly Zdanevich
fonte
0

Este exemplo coloca um símbolo de asterisco na frente de um rótulo para indicar essa entrada específica como um campo obrigatório. Defino as propriedades CSS usando% e em para garantir que minha página da web seja responsiva. Você pode usar px ou outras unidades absolutas, se desejar.

#name {
   display: inline-block;
   margin-left: 40%;
   font-size:25px;
    
}
.nameinput{
   margin-left: 10px;
   font-size:90%;
   width: 17em;
   
}

.nameinput::placeholder {
  font-size: 0.7em;
  vertical-align: middle;
}

#name p{
   margin:0;
   border:0;
   padding:0;
   display:inline-block;
   font-size: 40%;
   vertical-align: super;
}
<label id="name" value="name">
<p>*</p> 
Name:  <input class="nameinput" type="text" placeholder="Enter your name" required>
</label>

HARSHA UPPUTURI
fonte
Bem-vindo ao SO! Quando você coloca uma resposta com um novo ponto de vista, tente explicar sua resposta, não apenas coloque um código sem explicação.
David García Bodego 19/10/19
0

O que você precisa é: seletor obrigatório - selecionará todos os campos com o atributo 'obrigatório' (portanto, não é necessário adicionar nenhuma classe adicional). Depois, estilize as entradas de acordo com suas necessidades. Você pode usar o seletor ': after' e adicionar asterisco da maneira sugerida entre outras respostas

Skiff
fonte
-1

Você pode obter o resultado desejado encapsulando o código HTML em uma tag div que contém a classe "required" seguida da classe "form-group". * No entanto, isso funciona apenas se você tiver o Bootstrap.

<div class="form-group required">
    <div class="required">
        <label>Name:</label>
        <input type="text">
    </div>
  <div>
chateracks
fonte
-2

Para quem acaba aqui, mas tem o jQuery:

// javascript / jQuery
$("label.required").append('<span class="red-star"> *</span>')

// css
.red-star { color: red; }
Andy Hayden
fonte
Por que usar js se você pode obter o mesmo resultado sem js?
Vitaly Zdanevich
@VitalyZdanevich porque você precisa carregar uma imagem de plano de fundo desnecessária com essa solução. Além disso, eu já tenho js (como muitos outros também).
Andy Hayden