Formulário embutido dentro de um formulário horizontal no twitter bootstrap?

200

Qual é a melhor maneira de criar um formulário com esta aparência (veja o link abaixo) no bootstrap do twitter sem aulas particulares?

É possível definir um formulário interno em linha dentro de um formulário horizontal como o exemplo abaixo:

captura de tela do objetivo da interface do usuário

Frntz
fonte

Respostas:

317

Não aninhar <form> tags, isso não funcionará. Basta usar as classes Bootstrap.

Bootstrap 3

<form class="form-horizontal" role="form">
    <div class="form-group">
      <label for="inputType" class="col-md-2 control-label">Type</label>
      <div class="col-md-3">
          <input type="text" class="form-control" id="inputType" placeholder="Type">
      </div>
    </div>
    <div class="form-group">
        <span class="col-md-2 control-label">Metadata</span>
        <div class="col-md-6">
            <div class="form-group row">
                <label for="inputKey" class="col-md-1 control-label">Key</label>
                <div class="col-md-2">
                    <input type="text" class="form-control" id="inputKey" placeholder="Key">
                </div>
                <label for="inputValue" class="col-md-1 control-label">Value</label>
                <div class="col-md-2">
                    <input type="text" class="form-control" id="inputValue" placeholder="Value">
                </div>
            </div>
        </div>
    </div>
</form>

Você pode conseguir esse comportamento de várias maneiras, isso é apenas um exemplo. Teste-o neste bootply

Bootstrap 2

<form class="form-horizontal">
    <div class="control-group">
        <label class="control-label" for="inputType">Type</label>
        <div class="controls">
            <input type="text" id="inputType" placeholder="Type">
        </div>
    </div>
    <div class="control-group">
        <span class="control-label">Metadata</span>
        <div class="controls form-inline">
            <label for="inputKey">Key</label>
            <input type="text" class="input-small" placeholder="Key" id="inputKey">
            <label for="inputValue">Value</label>
            <input type="password" class="input-small" placeholder="Value" id="inputValue">
        </div>
    </div>
</form>

Observe que estou usando .form-inlinepara obter o estilo do propper dentro de a .controls.
Você pode testá-lo neste jsfiddle

albertedevigo
fonte
3
Você também pode adicionar as classes de formulário on divs, no meu caso eu usei classe de formulário vertical sobre um div span6 e uma classe forma horizontal em um div span12
Iftah
3
Isso funciona para o bootstrap2. Para obter o bootstrap 3, visite: stackoverflow.com/questions/18429121/…
Tomislav Muic
1
No bootstrap 3, se houver um espaço embaixo da entrada, remova "form-group". Ele adiciona um espaço de 15px na parte inferior de cada div com a qual você o usa.
Darkzangel # 29/14
Você não precisa misturar grupo de formulários com linha no exemplo Chave + Valor. @ rap-2-h: Você pode copiar e colar o código de exemplo e clicar em executar.
Sebastian
Isso funciona, mas fui capaz de simplificá-lo na versão atual do Bootstrap 3 ... Parece a chave para esta solução apenas colocar quaisquer controles de entrada dentro de uma div, caso contrário, o layout da grade col-xx não funciona. Não foi necessário aninhar o grupo de formulários, o pai-col-xx- # pode compartilhar a mesma div e não há necessidade da classe "row", pois o formulário-pai já é um formulário-horizontal (100%).
Tony Muro
92

Para o bootstrap 3, o exemplo acima funciona, mas é complicado demais, em vez de usar o grupo de formulários, use o formulário em linha para os campos que você deseja em linha.

Por exemplo:

<div class="form-group">
     <label>CVV</label>
     <input type="text" size="4" class="form-control" />
</div>

<div class="form-inline">
      <label>Expiration (MM/YYYY)</label><br>
      <input type="text" size="2" class="form-control" /> / <input type="text" size="4" class="form-control" />
</div>
Ryan Knell
fonte
Pode não funcionar para você devido à classe de controle de formulário que define "display: block". Se você substituí-lo por "display: inline-block", ele deverá funcionar.
Cédric Guillemette
1
Isto não está a funcionar. Tente fazer o que a pergunta pede, isso não é possível com o formulário em linha.
Sebastian
O único problema é que a subárea não é expandida para a largura total e qualquer tentativa de usar o dimensionamento da grade será compactada em relação à largura mínima do conteúdo necessária. A outra solução é melhor apenas sem tantas divs (veja meu comentário lá).
Tony Muro
3
Você deve envolver todos os grupos de formulário na classe de formulário-inline
ymakux
jsfiddle.net/9637fywb Isso parece não funcionar como desejado - usando a CDN de autoinicialização mais recente atual (3.3.5). Este exemplo também não considera dois rótulos dentro da seção "embutido". Talvez o violino esteja com algum tipo de invólucro, mas parece que isso deve ser incluído na resposta, se for o caso.
Emragins
14

Isso usa o twitter bootstrap 3.x com uma classe css para fazer com que os rótulos fiquem no topo das entradas. Aqui está um link para violino , certifique-se de expandir o painel de resultados o suficiente para ver o efeito.

HTML:

  <div class="row myform">
     <div class="col-md-12">
        <form name="myform" role="form" novalidate>
           <div class="form-group">
              <label class="control-label" for="fullName">Address Line</label>
              <input required type="text" name="addr" id="addr" class="form-control" placeholder="Address"/>
           </div>

           <div class="form-inline">
              <div class="form-group">
                 <label>State</label>
                 <input required type="text" name="state" id="state" class="form-control" placeholder="State"/>
              </div>

              <div class="form-group">
                 <label>ZIP</label>
                 <input required type="text" name="zip" id="zip" class="form-control" placeholder="Zip"/>
              </div>
           </div>

           <div class="form-group">
              <label class="control-label" for="country">Country</label>
              <input required type="text" name="country" id="country" class="form-control" placeholder="country"/>
           </div>
        </form>
     </div>
  </div>

CSS:

.myform input.form-control {
   display: block;  /* allows labels to sit on input when inline */
   margin-bottom: 15px; /* gives padding to bottom of inline inputs */
}
BatteryAcid
fonte
2

Desde o bootstrap 4, use div class = "form-row" em combinação com div class = "form-group col-X". X é a largura que você precisa. Você obterá boas colunas inline. Veja violino .

<form class="form-horizontal" name="FORMNAME" method="post" action="ACTION" enctype="multipart/form-data">
    <div class="form-group">
        <label class="control-label col-sm-2" for="naam">Naam:&nbsp;*</label>
        <div class="col-sm-10">
            <input type="text" require class="form-control" id="naam" name="Naam" placeholder="Uw naam" value="{--NAAM--}" >
            <div id="naamx" class="form-error form-hidden">Wat is uw naam?</div>
        </div>
    </div>

    <div class="form-row">

        <div class="form-group col-5">
            <label class="control-label col-sm-4" for="telefoon">Telefoon:&nbsp;*</label>
            <div class="col-sm-12">
                <input type="tel" require class="form-control" id="telefoon" name="Telefoon" placeholder="Telefoon nummer" value="{--TELEFOON--}" >
                <div id="telefoonx" class="form-error form-hidden">Wat is uw telefoonnummer?</div>
            </div>
        </div>

        <div class="form-group col-5">
            <label class="control-label col-sm-4" for="email">E-mail: </label>
            <div class="col-sm-12">
                <input type="email" require class="form-control" id="email" name="E-mail" placeholder="E-mail adres" value="{--E-MAIL--}" >
                <div id="emailx" class="form-error form-hidden">Wat is uw e-mail adres?</div>
                    </div>
                </div>

        </div>

    <div class="form-group">
        <label class="control-label col-sm-2" for="titel">Titel:&nbsp;*</label>
        <div class="col-sm-10">
            <input type="text" require class="form-control" id="titel" name="Titel" placeholder="Titel van uw vraag of aanbod" value="{--TITEL--}" >
            <div id="titelx" class="form-error form-hidden">Wat is de titel van uw vraag of aanbod?</div>
        </div>
    </div>
<from>
Henry
fonte
1

Eu sei que esta é uma resposta antiga, mas aqui está o que eu costumo fazer:

CSS:

.form-control-inline {
   width: auto;
   float:left;
   margin-right: 5px;
}

Em seguida, agrupe os campos que você deseja inserir em uma div e adicione .form-control-inline à entrada, exemplo:

HTML

<label class="control-label">Date of birth:</label>
<div>
<select class="form-control form-control-inline" name="year"> ... </select>
<select class="form-control form-control-inline" name="month"> ... </select>
<select class="form-control form-control-inline" name="day"> ... </select>
</div>
Jesus Gomez
fonte
1

para simplificar, basta adicionar um class="form-inline" antes da entrada.

exemplo:

<div class="col-md-4 form-inline"> //add the class here...
     <label>Lot Size:</label>
     <input type="text" value="" name="" class="form-control" >
 </div>
curiosidade
fonte