Bootstrap: aligner l'entrée avec le bouton

299

Pourquoi les boutons et les entrées ne s'alignent-ils pas bien dans Bootstrap?

J'ai essayé quelque chose de simple comme:

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

Le bouton est à peu près 5pxinférieur à l'entrée dans chrome / firefox.

entrez la description de l'image ici

pguardiario
la source

Réponses:

551

Twitter Bootstrap 4

Dans Twitter Bootstrap 4, les entrées et les boutons peuvent être alignés à l'aide des classes input-group-prependet input-group-append(voir https://getbootstrap.com/docs/4.0/components/input-group/#button-addons )

Bouton de groupe sur le côté gauche (préfixe)

<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>

Bouton de groupe sur le côté droit (ajouter)

<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

Comme indiqué dans la réponse de @abimelex, les entrées et les boutons peuvent être alignés en utilisant les .input-groupclasses (voir http://getbootstrap.com/components/#input-groups-buttons )

Bouton de groupe sur le côté gauche

<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>

Bouton de groupe sur le côté droit

<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>

Cette solution a été ajoutée pour garder ma réponse à jour, mais veuillez coller votre vote positif sur la réponse fournie par @abimelex .


Twitter Bootstrap 2

Bootstrap propose une .input-appendclasse, qui fonctionne comme un élément wrapper et corrige cela pour vous:

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

Comme l'a souligné @OleksiyKhilkevich dans sa réponse, il existe une deuxième façon d'aligner inputet buttond'utiliser la .form-horizontalclasse:

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

Les différences

La différence entre ces deux classes est qu'elles .input-appendplaceront le buttonhaut contre l' inputélément (de sorte qu'elles semblent attachées), où .form-horizontalplacera un espace entre elles.

-- Remarque --

Pour permettre aux éléments inputet buttond'être côte à côte sans espacement, le font-sizea été défini sur 0dans la .input-appendclasse (cela supprime l'espacement blanc entre les inline-blockéléments). Cela peut avoir un effet négatif sur la taille des polices dans l' inputélément si vous souhaitez remplacer les valeurs par défaut à l'aide de emou de %mesures.

J'ai mal à la tête
la source
6
Merci pour votre réponse, mais j'ai l'impression que quelque chose ne va pas ici. Je ne suis sûrement pas la première personne à souhaiter que les composants bootstrap soient alignés avec des éléments de forme.
pguardiario
@pguardiario - vous avez tout à fait raison. Cela semblait faux et après m'être giflé le cerveau, je me suis souvenu du .input-appendcours.
Ma tête fait mal
1
Il semble étrange que vous ayez besoin d'une classe wrapper pour ce faire. Ne devraient-ils pas s'aligner par défaut?
opsb
2
@opsb s'ils occupaient la même quantité d'espace vertical, alors oui, ils le feraient. Cependant, les champs de saisie dans twitter bootstrap ont un margin-bottom: 9pxmais les boutons ne le font pas, ils ne prennent donc pas le même espace vertical. Étant donné que les deux éléments ont un middlealignement vertical, le bouton est décalé en raison de la différence. L'utilisation de l' .input-appendencapsuleur supprime cette valeur de marge inférieure.
Ma tête fait mal le
À droite, je suppose que cela casserait d'autres dispositions de formulaire si elles avaient la même hauteur verticale par défaut.
opsb
187

vous pouvez utiliser la propriété de bouton de groupe d'entrée pour appliquer le bouton directement au champ de saisie.

Bootstrap 3 & 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 -->

Jetez un œil à la doc BS4 Input-Group pour de nombreux autres exemples.

exemple pour le bouton de groupe d'entrée bs3

Karl Adler
la source
3
D'autres ne fonctionnaient pas pour moi, celui-ci fonctionnait cependant comme je le voulais. Je vous remercie.
Colandus
1
Pour moi, cela ne fonctionnait pas si la création d'une balise span supplémentaire pour allouer la classe, mais cela fonctionnait si <div class="form-group input-group-btn">
j'ajoutais
Cette réponse est obsolète pour BS4, jetez un oeil à ma réponse.
Alexander Kim
37

Juste la tête en haut, il semble y avoir une classe CSS spéciale pour cela appelé form-horizontal

input-append a un autre effet secondaire, il réduit la taille de la police à zéro

Oleksiy Khilkevich
la source
1
+1 bon endroit - j'ai dû chercher pourquoi ils ont utilisé font-size: 0et appris quelque chose de nouveau :) Merci!
Ma tête fait mal le
30

Utilisez .form-inline = Cela alignera les étiquettes à gauche et les contrôles de bloc en ligne pour une mise en page compacte

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

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

.form-horizontal = Alignez les étiquettes à droite et faites-les flotter vers la gauche pour les faire apparaître sur la même ligne que les contrôles, ce qui est préférable pour la présentation de formulaire à 2 colonnes.

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

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

ZEESHAN ARSHAD
la source
2
Je peux confirmer que cela form-inlinefonctionne pour Bootstrap 3. Merci.
Austin
Fantastique! Exactement ce dont j'avais besoin pour une forme gênante!
its_notjack
Il semble que .form-inline ne fonctionne que dans les fenêtres d'au moins 768 pixels: w3schools.com/bootstrap/bootstrap_forms.asp
anemaria20
16

J'ai surtout essayé et me retrouve avec peu de changements que j'aimerais partager. Voici le code qui fonctionne pour moi (trouvez la capture d'écran ci-jointe):

<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>

entrez la description de l'image ici

Si vous voulez le voir fonctionner, utilisez simplement le code ci-dessous dans votre éditeur:

<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>

J'espère que cela t'aides.

Abhimanyu
la source
Pour quelle version Bootstrap est-ce? Et quel problème cela cause-t-il de ne pas utiliser style="width:0;"?
Karl Adler
Si vous n'utilisez pas width: 0, cela prendra toute la largeur de la page.
Abhimanyu
façon bootstrap serait d'envelopper avec un élément col comme <div class="col-md-4">Pas besoin dewidth: 0
Karl Adler
j'ai mis parce que je ne veux pas que les contrôles d'entrée prennent toute la largeur de l'écran
Abhimanyu
6

Je me débattais également avec le même problème. Les classes de bootstrap que j'utilise ne fonctionnent pas pour moi. J'ai trouvé une solution de contournement, comme ci-dessous:

<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>

Fondamentalement, j'ai outrepassé la propriété d'affichage de la classe "form-control" et utilisé d'autres propriétés de style pour corriger la taille et la position.

Voici le résultat:

entrez la description de l'image ici

Bikash Bishwokarma
la source
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
la source
3

J'ai essayé tous les codes ci-dessus et aucun d'eux n'a résolu mes problèmes. Voici ce qui a fonctionné pour moi. J'ai utilisé l'addon de groupe d'entrée.

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

Pas directement lié, sauf si vous avez un code similaire, mais je viens de remarquer un comportement étrange pour form-inline, bootstrap 3.3.7

Je n'ai pas utilisé de ligne et de cellule pour cela car c'est un projet de bureau, si la balise d'ouverture était en dessous du tableau (dans ce cas):

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

Les éléments du formulaire s'empileraient.

Switch et il est correctement aligné.

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

Safari 10.0.2 et le dernier Chrome n'ont fait aucune différence. Peut-être que ma disposition était fausse, mais elle n'est pas très indulgente.

Trond
la source
1

Prenez un flotteur d'entrée comme à gauche. Prenez ensuite le bouton et faites-le flotter à droite. Vous pouvez effacer la classe lorsque vous en prenez plusieurs à distance.

<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
la source
-1
style="padding-top: 8px"

Utilisez-le pour déplacer votre div vers le haut ou vers le bas dans votre rangée. Fonctionne des merveilles pour moi.

Zach J.
la source