input-group.md 7.66 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
2
3
4
5
---
layout: page
title: Input group
---

6
Easily extend form controls by adding text, buttons, or button groups on either side of textual `<input>`s.
Mark Otto's avatar
Mark Otto committed
7

Mark Otto's avatar
Mark Otto committed
8
9
10
11
<div class="bs-callout bs-callout-warning">
  <h4>Tooltips &amp; popovers in input groups require special setting</h4>
  <p>When using tooltips or popovers on elements within an <code>.input-group</code>, you'll have to specify the option <code>container: 'body'</code> to avoid unwanted side effects (such as the element growing wider and/or losing its rounded corners when the tooltip or popover is triggered).</p>
</div>
Mark Otto's avatar
Mark Otto committed
12
13
14
15
16
<div class="bs-callout bs-callout-warning" id="callout-inputgroup-form-labels">
  <h4>Always add labels</h4>
  <p>Screen readers will have trouble with your forms if you don't include a label for every input. For these input groups, ensure that any additional label or functionality is conveyed to assistive technologies.</p>
  <p>The exact technique to be used (<code>&lt;label&gt;</code> elements hidden using the <code>.sr-only</code> class, or use of the <code>aria-label</code>, <code>aria-labelledby</code>, <code>aria-describedby</code>, <code>title</code> or <code>placeholder</code> attribute) and what additional information will need to be conveyed will vary depending on the exact type of interface widget you're implementing. The examples in this section provide a few suggested, case-specific approaches.</p>
</div>
Mark Otto's avatar
Mark Otto committed
17

Mark Otto's avatar
Mark Otto committed
18
## Basic example
Mark Otto's avatar
Mark Otto committed
19

20
Place one add-on or button on either side of an input. You may also place one on both sides of an input. **We do not support multiple add-ons on a single side, nor multiple form-controls in a single input group.**
Mark Otto's avatar
Mark Otto committed
21
22

{% example html %}
Mark Otto's avatar
Mark Otto committed
23
<div class="input-group">
Mark Otto's avatar
Mark Otto committed
24
25
  <span class="input-group-addon" id="basic-addon1">@</span>
  <input type="text" class="form-control" placeholder="Username" aria-describedby="basic-addon1">
Mark Otto's avatar
Mark Otto committed
26
</div>
Mark Otto's avatar
Mark Otto committed
27
<br>
Mark Otto's avatar
Mark Otto committed
28
<div class="input-group">
Mark Otto's avatar
Mark Otto committed
29
30
  <input type="text" class="form-control" placeholder="Recipient's username" aria-describedby="basic-addon2">
  <span class="input-group-addon" id="basic-addon2">.00</span>
Mark Otto's avatar
Mark Otto committed
31
</div>
Mark Otto's avatar
Mark Otto committed
32
<br>
Mark Otto's avatar
Mark Otto committed
33
34
<div class="input-group">
  <span class="input-group-addon">$</span>
Mark Otto's avatar
Mark Otto committed
35
  <input type="text" class="form-control" aria-label="Amount (to the nearest dollar)">
Mark Otto's avatar
Mark Otto committed
36
37
  <span class="input-group-addon">.00</span>
</div>
Mark Otto's avatar
Mark Otto committed
38
{% endexample %}
Mark Otto's avatar
Mark Otto committed
39

Mark Otto's avatar
Mark Otto committed
40
41
42
43
44
## Sizing

Add the relative form sizing classes to the `.input-group` itself and contents within will automatically resize—no need for repeating the form control size classes on each element.

{% example html %}
Mark Otto's avatar
Mark Otto committed
45
<div class="input-group input-group-lg">
Mark Otto's avatar
Mark Otto committed
46
47
  <span class="input-group-addon" id="sizing-addon1">@</span>
  <input type="text" class="form-control" placeholder="Username" aria-describedby="sizing-addon1">
Mark Otto's avatar
Mark Otto committed
48
</div>
Mark Otto's avatar
Mark Otto committed
49
<br>
Mark Otto's avatar
Mark Otto committed
50
<div class="input-group">
Mark Otto's avatar
Mark Otto committed
51
52
  <span class="input-group-addon" id="sizing-addon2">@</span>
  <input type="text" class="form-control" placeholder="Username" aria-describedby="sizing-addon2">
Mark Otto's avatar
Mark Otto committed
53
</div>
Mark Otto's avatar
Mark Otto committed
54
<br>
Mark Otto's avatar
Mark Otto committed
55
<div class="input-group input-group-sm">
Mark Otto's avatar
Mark Otto committed
56
57
  <span class="input-group-addon" id="sizing-addon3">@</span>
  <input type="text" class="form-control" placeholder="Username" aria-describedby="sizing-addon3">
Mark Otto's avatar
Mark Otto committed
58
</div>
Mark Otto's avatar
Mark Otto committed
59
60
61
{% endexample %}

## Checkboxes and radio addons
Mark Otto's avatar
Mark Otto committed
62

Mark Otto's avatar
Mark Otto committed
63
Place any checkbox or radio option within an input group's addon instead of text.
Mark Otto's avatar
Mark Otto committed
64

Mark Otto's avatar
Mark Otto committed
65
{% example html %}
Mark Otto's avatar
Mark Otto committed
66
67
68
69
<div class="row">
  <div class="col-lg-6">
    <div class="input-group">
      <span class="input-group-addon">
Mark Otto's avatar
Mark Otto committed
70
        <input type="checkbox" aria-label="Checkbox for following text input">
Mark Otto's avatar
Mark Otto committed
71
      </span>
Mark Otto's avatar
Mark Otto committed
72
      <input type="text" class="form-control" aria-label="Text input with checkbox">
Mark Otto's avatar
Mark Otto committed
73
74
    </div>
  </div>
Mark Otto's avatar
Mark Otto committed
75
76
77
  <div class="col-lg-6">
    <div class="input-group">
      <span class="input-group-addon">
Mark Otto's avatar
Mark Otto committed
78
        <input type="radio" aria-label="Radio button for following text input">
Mark Otto's avatar
Mark Otto committed
79
      </span>
Mark Otto's avatar
Mark Otto committed
80
      <input type="text" class="form-control" aria-label="Text input with radio button">
Mark Otto's avatar
Mark Otto committed
81
82
83
84
    </div>
  </div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
85

Mark Otto's avatar
Mark Otto committed
86
## Button addons
Mark Otto's avatar
Mark Otto committed
87

Mark Otto's avatar
Mark Otto committed
88
89
90
Buttons in input groups are a bit different and require one extra level of nesting. Instead of `.input-group-addon`, you'll need to use `.input-group-btn` to wrap the buttons. This is required due to default browser styles that cannot be overridden.

{% example html %}
Mark Otto's avatar
Mark Otto committed
91
92
93
94
<div class="row">
  <div class="col-lg-6">
    <div class="input-group">
      <span class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
95
        <button class="btn btn-secondary" type="button">Go!</button>
Mark Otto's avatar
Mark Otto committed
96
      </span>
Mark Otto's avatar
Mark Otto committed
97
      <input type="text" class="form-control" placeholder="Search for...">
Mark Otto's avatar
Mark Otto committed
98
99
    </div>
  </div>
Mark Otto's avatar
Mark Otto committed
100
101
  <div class="col-lg-6">
    <div class="input-group">
Mark Otto's avatar
Mark Otto committed
102
      <input type="text" class="form-control" placeholder="Search for...">
Mark Otto's avatar
Mark Otto committed
103
      <span class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
104
        <button class="btn btn-secondary" type="button">Go!</button>
Mark Otto's avatar
Mark Otto committed
105
      </span>
Mark Otto's avatar
Mark Otto committed
106
107
108
109
    </div>
  </div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
110

Mark Otto's avatar
Mark Otto committed
111
112
113
## Buttons with dropdowns

{% example html %}
Mark Otto's avatar
Mark Otto committed
114
115
116
117
<div class="row">
  <div class="col-lg-6">
    <div class="input-group">
      <div class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
118
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Action</button>
Chris Rebert's avatar
Chris Rebert committed
119
        <ul class="dropdown-menu" role="menu">
Mark Otto's avatar
Mark Otto committed
120
121
122
123
124
125
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
          <li><a href="#">Something else here</a></li>
          <li class="divider"></li>
          <li><a href="#">Separated link</a></li>
        </ul>
Mark Otto's avatar
Mark Otto committed
126
      </div>
Mark Otto's avatar
Mark Otto committed
127
      <input type="text" class="form-control" aria-label="Text input with dropdown button">
Mark Otto's avatar
Mark Otto committed
128
129
    </div>
  </div>
Mark Otto's avatar
Mark Otto committed
130
131
  <div class="col-lg-6">
    <div class="input-group">
Mark Otto's avatar
Mark Otto committed
132
      <input type="text" class="form-control" aria-label="Text input with dropdown button">
Mark Otto's avatar
Mark Otto committed
133
      <div class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
134
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Action</button>
Chris Rebert's avatar
Chris Rebert committed
135
        <ul class="dropdown-menu dropdown-menu-right" role="menu">
Mark Otto's avatar
Mark Otto committed
136
137
138
139
140
141
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
          <li><a href="#">Something else here</a></li>
          <li class="divider"></li>
          <li><a href="#">Separated link</a></li>
        </ul>
Mark Otto's avatar
Mark Otto committed
142
143
      </div>
    </div>
Mark Otto's avatar
Mark Otto committed
144
145
  </div>
</div>
Mark Otto's avatar
Mark Otto committed
146
{% endexample %}
Mark Otto's avatar
Mark Otto committed
147

Mark Otto's avatar
Mark Otto committed
148
149
150
151
152
153
154
## Segmented buttons

{% example html %}
<div class="row">
  <div class="col-lg-6">
    <div class="input-group">
      <div class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
155
156
        <button type="button" class="btn btn-secondary">Action</button>
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
157
158
159
160
161
162
163
164
165
166
          <span class="sr-only">Toggle Dropdown</span>
        </button>
        <ul class="dropdown-menu" role="menu">
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
          <li><a href="#">Something else here</a></li>
          <li class="divider"></li>
          <li><a href="#">Separated link</a></li>
        </ul>
      </div>
Mark Otto's avatar
Mark Otto committed
167
      <input type="text" class="form-control" aria-label="Text input with segmented button dropdown">
Mark Otto's avatar
Mark Otto committed
168
169
170
171
    </div>
  </div>
  <div class="col-lg-6">
    <div class="input-group">
Mark Otto's avatar
Mark Otto committed
172
      <input type="text" class="form-control" aria-label="Text input with segmented button dropdown">
Mark Otto's avatar
Mark Otto committed
173
      <div class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
174
175
        <button type="button" class="btn btn-secondary">Action</button>
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
176
177
178
179
180
181
182
183
184
185
186
          <span class="sr-only">Toggle Dropdown</span>
        </button>
        <ul class="dropdown-menu dropdown-menu-right" role="menu">
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
          <li><a href="#">Something else here</a></li>
          <li class="divider"></li>
          <li><a href="#">Separated link</a></li>
        </ul>
      </div>
    </div>
Mark Otto's avatar
Mark Otto committed
187
188
  </div>
</div>
Mark Otto's avatar
Mark Otto committed
189
{% endexample %}