Adicionando asterisco aos campos obrigatórios no Bootstrap 3

166

Meu HTML tem uma classe chamada .required que é atribuída aos campos obrigatórios.

Aqui está o HTML:

<form action="/accounts/register/" method="post" role="form" class="form-horizontal">
    <input type='hidden' name='csrfmiddlewaretoken' value='brGfMU16YyyG2QEcpLqhb3Zh8AvkYkJt' />
    <div class="form-group required">
       <label class="col-md-2 control-label">Username</label>
       <div class="col-md-4">
         <input class="form-control" id="id_username" maxlength="30" name="username" placeholder="Username" required="required" title="" type="text" />
       </div>
    </div>
    <div class="form-group required"><label class="col-md-2 control-label">E-mail</label><div class="col-md-4"><input class="form-control" id="id_email" name="email" placeholder="E-mail" required="required" title="" type="email" /></div></div>
    <div class="form-group required"><label class="col-md-2 control-label">Password</label><div class="col-md-4"><input class="form-control" id="id_password1" name="password1" placeholder="Password" required="required" title="" type="password" /></div></div>
    <div class="form-group required"><label class="col-md-2 control-label">Password (again)</label><div class="col-md-4"><input class="form-control" id="id_password2" name="password2" placeholder="Password (again)" required="required" title="" type="password" /></div></div>
    <div class="form-group required"><label class="col-md-2 control-label">first name</label><div class="col-md-4"><input class="form-control" id="id_first_name" maxlength="30" name="first_name" placeholder="first name" required="required" title="" type="text" /></div></div>
    <div class="form-group required"><label class="col-md-2 control-label">last name</label><div class="col-md-4"><input class="form-control" id="id_last_name" maxlength="30" name="last_name" placeholder="last name" required="required" title="" type="text" /></div></div>
    <div class="form-group required"><label class="col-md-2 control-label">&#160;</label><div class="col-md-4"><div class="checkbox"><label><input class="" id="id_tos" name="tos" required="required" type="checkbox" /> I have read and agree to the Terms of Service</label></div></div></div>

    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
           <button type="submit" class="btn btn-primary">
              <span class="glyphicon glyphicon-star"></span> Sign Me Up!
           </button>
        </div>
    </div>
</form>

Eu adicionei o seguinte ao meu CSS;

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

Ainda assim, isso não indica vermelho *ao redor dos campos obrigatórios. O que estou perdendo aqui? Não existe uma maneira direta no Bootstrap 3 de introduzir *os campos obrigatórios?


EDITAR

Os *termos e condições não aparecem imediatamente em uma caixa de seleção. Como consertar isto?

insira a descrição da imagem aqui

chuva de ideias
fonte
2
Por favor, marque a pergunta respondida.
LoveAndHappiness

Respostas:

283

Use .form-group.requiredsem o espaço.

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

Editar:

Para a caixa de seleção, você pode usar a pseudo classe: not (). Você adiciona o * necessário após cada rótulo, a menos que seja uma caixa de seleção

.form-group.required:not(.checkbox) .control-label:after, 
.form-group.required .text:after { /* change .text in whatever class of the text after the checkbox has */
   content:"*";
   color:red;
}

Nota: não testado

Você deve usar a classe .text ou direcioná-la para o caso contrário, provavelmente, tente este html:

<div class="form-group required">
   <label class="col-md-2 control-label">&#160;</label>
   <div class="col-md-4">
      <div class="checkbox">
         <label class='text'> <!-- use this class -->
            <input class="" id="id_tos" name="tos" required="required" type="checkbox" /> I have read and agree to the Terms of Service
         </label>
      </div>
   </div>
</div>

Ok terceira edição:

CSS volta ao que era

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

HTML:

<div class="form-group required">
   <label class="col-md-2">&#160;</label> <!-- remove class control-label -->
   <div class="col-md-4">
      <div class="checkbox">
         <label class='control-label'> <!-- use this class as the red * will be after control-label -->
            <input class="" id="id_tos" name="tos" required="required" type="checkbox" /> I have read and agree to the Terms of Service
         </label>
      </div>
   </div>
</div>
Timvp
fonte
3
Eu tentei o editado, mas não funcionou. você pode verificar?
tempestade cérebro
Mudar algumas coisas, também no CSS
Timvp
1
Parece não ser BS3 genérico, mas CSS personalizado? Parece-me sensível também, então talvez seja bom adicionar isso (ao seu arquivo de tema BS, por exemplo bootstrap-theme.css).
Roland
Para diferenciar pseudo-classe e pseudo-elementos, você pode usar ::after. A especulação de CSS de nível 3 acabou.
Niyongabo
73

Supondo que é assim que o HTML se parece

<div class="form-group required">
   <label class="col-md-2 control-label">E-mail</label>
   <div class="col-md-4"><input class="form-control" id="id_email" name="email" placeholder="E-mail" required="required" title="" type="email" /></div>
</div>

Para exibir um asterisco à direita do rótulo:

.form-group.required .control-label:after { 
    color: #d00;
    content: "*";
    position: absolute;
    margin-left: 8px;
    top:7px;
}

Ou à esquerda do rótulo:

.form-group.required .control-label:before{
   color: red;
   content: "*";
   position: absolute;
   margin-left: -15px;
}

Para criar um bom asterisco vermelho grande, você pode adicionar estas linhas:

font-family: 'Glyphicons Halflings';
font-weight: normal;
font-size: 14px;

Ou, se você estiver usando o Font Awesome, adicione estas linhas (e altere a linha de conteúdo):

font-family: 'FontAwesome';
font-weight: normal;
font-size: 14px;
content: "\f069";
th3uiguy
fonte
1
top:7px;causará problemas se o rótulo for de várias linhas. Seria melhor substituí-lo por, margin-top: -4px;por exemplo.
precisa saber é o seguinte
7

.form-group .required .control-label:afterprovavelmente deveria ser .form-group.required .control-label:after. A remoção do espaço entre .form-group e .required é a alteração.

Jeremy Cook
fonte
obrigado! também funciona para o bootstrap 2.3 com .control-group.required .control-label:after { content:"*"; color:red; }
edditor
4

As outras duas respostas estão corretas. Quando você inclui espaços em seus seletores de CSS, está direcionando elementos filho para:

.form-group .required {
    styles
}

Está direcionando um elemento com a classe "obrigatório" que está dentro de um elemento com a classe "formulário-grupo".

Sem o espaço, ele tem como alvo um elemento que possui ambas as classes. 'required' e 'form-group'

Corey
fonte
Este é um problema separado da sua pergunta original. Mas seu CSS está fazendo exatamente o que você está dizendo. Está colocando o asterisco no campo do rótulo (que para seus termos e condições está em branco) e não no campo de entrada. Se você deseja que eles apareçam juntos, precisará agrupá-los no HTML. Mas então você tem um campo de rótulo em branco que é ruim. Gostaria apenas de abandonar o rótulo nos termos e condições, mas manter as validações.
Corey
1

Este CSS funcionou para mim:

.form-group.required.control-label:before{
   color: red;
   content: "*";
   position: absolute;
   margin-left: -10px;
}

e este HTML:

<div class="form-group required control-label">
  <label for="emailField">Email</label>
  <input type="email" class="form-control" id="emailField" placeholder="Type Your Email Address Here" />
</div>
tomahawk
fonte
É um pouco estranho ter o rótulo de controle na div que contém o rótulo e a entrada.
Devlin Carnate