Bootstrap: alinhar a entrada com o botão

299

Por que os botões e as entradas não se alinham bem no Bootstrap?

Eu tentei algo simples como:

<input type="text"/><button class="btn">button</button>

O botão é mais 5pxbaixo que a entrada no chrome / firefox.

insira a descrição da imagem aqui

pguardiario
fonte

Respostas:

551

Twitter Bootstrap 4

No Twitter Bootstrap 4, entradas e botões podem ser alinhados usando as classes input-group-prepende input-group-append(consulte https://getbootstrap.com/docs/4.0/components/input-group/#button-addons )

Botão Agrupar no lado esquerdo (prepend)

<div class="input-group mb-3">
  <div class="input-group-prepend">
    <button class="btn btn-outline-secondary" type="button">Button</button>
  </div>
  <input type="text" class="form-control">
</div>

Botão Agrupar no lado direito (anexar)

<div class="input-group mb-3">
  <div class="input-group-append">
    <button class="btn btn-outline-secondary" type="button">Button</button>
  </div>
  <input type="text" class="form-control">
</div>

Twitter Bootstrap 3

Conforme mostrado na resposta de @abimelex, entradas e botões podem ser alinhados usando as .input-groupclasses (consulte http://getbootstrap.com/components/#input-groups-buttons )

Botão de grupo no lado esquerdo

<div class="input-group">
  <span class="input-group-btn">
    <button class="btn btn-default" type="button">Go!</button>
  </span>
  <input type="text" class="form-control">
</div>

Botão de grupo no lado direito

<div class="input-group">
   <input type="text" class="form-control">
   <span class="input-group-btn">
        <button class="btn btn-default" type="button">Go!</button>
   </span>
</div>

Esta solução foi adicionada para manter minha resposta atualizada, mas faça seu voto positivo na resposta fornecida por @abimelex .


Twitter Bootstrap 2

O Bootstrap oferece uma .input-appendclasse, que funciona como um elemento wrapper e corrige isso para você:

<div class="input-append">
    <input name="search" id="search"/>
    <button class="btn">button</button>
</div>

Como apontado por @OleksiyKhilkevich em sua resposta, existe uma segunda maneira de alinhar inpute buttonusando a .form-horizontalclasse:

<div class="form-horizontal">
    <input name="search" id="search"/>
    <button class="btn">button</button>
</div>

As diferenças

A diferença entre essas duas classes é que .input-appendcolocará buttono inputelemento contra o elemento (para que pareçam estar anexados), onde .form-horizontalcolocará um espaço entre eles.

-- Nota --

Para permitir a inpute buttonelementos de ser ao lado do outro sem espaçamento, o font-sizefoi definido como 0na .input-appendclasse (isto remove o espaçamento branco entre os inline-blockelementos). Isso pode ter um efeito adverso no tamanho da fonte do inputelemento, se você deseja substituir os padrões usando emou %medidas.

Minha cabeça dói
fonte
5
Obrigado pela sua resposta, mas sinto que algo está errado aqui. Certamente não sou a primeira pessoa a desejar que os componentes de autoinicialização estejam alinhados com os elementos do formulário.
Pguardiario 16/05/12
@guardiario - você está completamente certo. Parecia errado e depois de dar um tapa no meu cérebro, lembrei-me da .input-appendaula.
Minha cabeça dói
1
Parece estranho que você precisaria de uma classe de wrapper para fazer isso. Eles não deveriam se alinhar por padrão?
opSB
2
@opsb se eles ocupassem a mesma quantidade de espaço vertical, então sim. No entanto, os campos de entrada no bootstrap do twitter têm um, margin-bottom: 9pxmas os botões não, para que eles não ocupem o mesmo espaço vertical. Como os dois elementos têm um middlealinhamento vertical, o botão é deslocado devido à diferença. O uso do .input-appendwrapper remove esse valor da margem inferior.
Minha cabeça dói
Certo, acho que isso quebraria outros layouts de formulário se tivessem a mesma altura vertical por padrão.
opSB
187

você pode usar a propriedade do botão do grupo de entrada para aplicar o botão diretamente ao campo de entrada.

Bootstrap 3 e 4

<div class="input-group">
  <input type="text" class="form-control">
  <span class="input-group-btn">
    <button class="btn btn-default" type="button">Go!</button>
  </span>
</div><!-- /input-group -->

Dê uma olhada no documento do grupo de entrada do BS4 para muitos outros exemplos.

exemplo para botão de grupo de entrada bs3

Karl Adler
fonte
3
Outros não funcionaram para mim, este funcionou da maneira que eu queria. Obrigado.
Colandus
1
Para mim isso não funciona se a criação de uma tag span extra para alocado a classe, mas funcionou se eu adicionei essa classe para a tag div:<div class="form-group input-group-btn">
J0ANMM
Esta resposta está desatualizada para o BS4, dê uma olhada na minha resposta.
Alexander Kim
37

Apenas o aviso, parece haver uma classe CSS especial para isso chamada form-horizontal

input-append tem outro efeito colateral, que reduz o tamanho da fonte a zero

Oleksiy Khilkevich
fonte
1
+1 em um bom local - tive que analisar por que eles usaram font-size: 0e aprenderam algo novo :) Obrigado!
Minha cabeça dói
30

Use .form-inline = Isso alinhará os rótulos à esquerda e os controles de bloco em linha para um layout compacto.

Exemplo: http://jsfiddle.net/hSuy4/292/

<div class="form-inline">
<input type="text">
<input type="button" class="btn" value="submit">
</div>

.form-horizontal = Alinhe os rótulos à direita e flutue-os para a esquerda para fazê-los aparecer na mesma linha dos controles, o que é melhor para o layout de formulário de 2 colunas.

(e.g. 
Label 1: [textbox]
Label 2: [textbox]
     : [button]
)

Exemplos: http://twitter.github.io/bootstrap/base-css.html#forms

ZEESHAN ARSHAD
fonte
2
Posso confirmar que form-inlinefunciona para o Bootstrap 3. Obrigado.
Austin
Fantástico! Exatamente o que eu precisava para uma forma problemática!
its_notjack
Parece .form-inline funciona somente dentro de viewports pelo menos 768px de largura: w3schools.com/bootstrap/bootstrap_forms.asp
anemaria20
16

Tentei acima de tudo e terminei com poucas alterações que gostaria de compartilhar. Aqui está o código que funciona para mim (encontre a captura de tela em anexo):

<div class="input-group">
    <input type="text" class="form-control" placeholder="Search text">
    <span class="input-group-btn" style="width:0;">
        <button class="btn btn-default" type="button">Go!</button>
    </span>
</div>

insira a descrição da imagem aqui

Se você quiser vê-lo funcionando, basta usar o código abaixo no seu editor:

<html>
    <head>
        <link type='text/css' rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css' />
    </head>
    <body>
        <div class="container body-content">
            <div class="form-horizontal">
              <div class="input-group">
                  <input type="text" class="form-control" placeholder="Search text">
                  <span class="input-group-btn" style="width:0;">
                      <button class="btn btn-default" type="button">Go!</button>
                  </span>
              </div>
            </div>
        </div>
    </body>
</html>

Espero que isto ajude.

Abhimanyu
fonte
Qual é a versão do Bootstrap? E qual problema causa não usar style="width:0;"?
Karl Adler
Se você não usar width: 0, isso ocupará a largura total da página.
Abhimanyu 29/01
maneira de bootstrap seria embrulhar com um elemento col como <div class="col-md-4">Não há necessidade dewidth: 0
Karl Adler
i definido porque eu não quero controles de entrada para tomar toda a largura da tela
Abhimanyu
6

Eu também estava lutando com o mesmo problema. As classes de inicialização que eu uso não estão funcionando para mim. Eu vim com uma solução alternativa, como abaixo:

<form action='...' method='POST' class='form-group'>
  <div class="form-horizontal">
    <input type="text" name="..." 
        class="form-control" 
        placeholder="Search People..."
        style="width:280px;max-width:280px;display:inline-block"/>

    <button type="submit" 
        class="btn btn-primary" 
        style="margin-left:-8px;margin-top:-2px;min-height:36px;">
      <i class="glyphicon glyphicon-search"></i>
     </button>
  </div>
</form>

Basicamente, substituí a propriedade display da classe "form-control" e usei outras propriedades de estilo para corrigir o tamanho e a posição.

A seguir está o resultado:

insira a descrição da imagem aqui

Bikash Bishwokarma
fonte
4
<form class="form-inline">
  <div class="form-group">
    <label class="sr-only" for="exampleInputEmail3">Email address</label>
    <input type="email" class="form-control" id="exampleInputEmail3" placeholder="Email">
  </div>
  <button type="submit" class="btn btn-default">Sign in</button>
</form>
Ashu Designer
fonte
3

Tentei todos os códigos acima e nenhum deles corrigiu meus problemas. Aqui está o que funcionou para mim. Eu usei input-group-addon.

<div class = "input-group">
  <span class = "input-group-addon">Go</span>
  <input type = "text" class = "form-control" placeholder="you are the man!">
</div>
kupaff
fonte
1

Não está diretamente relacionado, a menos que você tenha um código semelhante, mas notei um comportamento estranho ao formulário em linha, bootstrap 3.3.7

Eu não usei linha e células para isso, pois é um projeto de área de trabalho, se a tag de abertura estivesse abaixo da tabela (neste caso):

<table class="form-inline"> 
<form> 
<tr>

Os elementos do formulário seriam empilhados.

Interruptor e alinhado corretamente.

<form>
<table class="form-inline">
<tr>

O Safari 10.0.2 e o Chrome mais recente não fizeram nenhuma diferença. Talvez meu layout estivesse errado, mas não perdoasse muito.

Trond
fonte
1

Pegue um flutuador de entrada como à esquerda. Então pegue o botão e flutue para a direita. Você pode corrigir a classe quando levar mais de um para distanciar.

<input style="width:65%;float:left"class="btn btn-primary" type="text" name="name"> 
<div style="width:8%;float:left">&nbsp;</div>
<button class="btn btn-default" type="button">Go!</button>
<div class="clearfix" style="margin-bottom:10px"> </div>
rashedcs
fonte
-1
style="padding-top: 8px"

Use isso para mudar sua div para cima ou para baixo na sua linha. Faz maravilhas para mim.

Zach J.
fonte