input-group.md 8.96 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
---
Mark Otto's avatar
Mark Otto committed
2
layout: docs
Mark Otto's avatar
Mark Otto committed
3
title: Input group
4
group: components
Mark Otto's avatar
Mark Otto committed
5
6
---

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

Mark Otto's avatar
Mark Otto committed
9
10
11
12
13
## Contents

* Will be replaced with the ToC, excluding the "Contents" header
{:toc}

Mark Otto's avatar
Mark Otto committed
14
## Basic example
Mark Otto's avatar
Mark Otto committed
15

16
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 form-controls in a single input group.**
Mark Otto's avatar
Mark Otto committed
17
18

{% example html %}
Mark Otto's avatar
Mark Otto committed
19
<div class="input-group">
Mark Otto's avatar
Mark Otto committed
20
21
  <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
22
</div>
Mark Otto's avatar
Mark Otto committed
23
<br>
Mark Otto's avatar
Mark Otto committed
24
<div class="input-group">
Mark Otto's avatar
Mark Otto committed
25
  <input type="text" class="form-control" placeholder="Recipient's username" aria-describedby="basic-addon2">
26
  <span class="input-group-addon" id="basic-addon2">@example.com</span>
Mark Otto's avatar
Mark Otto committed
27
</div>
Mark Otto's avatar
Mark Otto committed
28
<br>
Mark Otto's avatar
Mark Otto committed
29
30
31
32
33
34
<label for="basic-url">Your vanity URL</label>
<div class="input-group">
  <span class="input-group-addon" id="basic-addon3">https://example.com/users/</span>
  <input type="text" class="form-control" id="basic-url" aria-describedby="basic-addon3">
</div>
<br>
Mark Otto's avatar
Mark Otto committed
35
36
<div class="input-group">
  <span class="input-group-addon">$</span>
Mark Otto's avatar
Mark Otto committed
37
  <input type="text" class="form-control" aria-label="Amount (to the nearest dollar)">
Mark Otto's avatar
Mark Otto committed
38
39
  <span class="input-group-addon">.00</span>
</div>
40
41
42
43
44
45
<br>
<div class="input-group">
  <span class="input-group-addon">$</span>
  <span class="input-group-addon">0.00</span>
  <input type="text" class="form-control" aria-label="Amount (to the nearest dollar)">
</div>
Mark Otto's avatar
Mark Otto committed
46
{% endexample %}
Mark Otto's avatar
Mark Otto committed
47

Mark Otto's avatar
Mark Otto committed
48
49
50
51
52
## 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
53
<div class="input-group input-group-lg">
Mark Otto's avatar
Mark Otto committed
54
55
  <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
56
</div>
Mark Otto's avatar
Mark Otto committed
57
<br>
Mark Otto's avatar
Mark Otto committed
58
<div class="input-group">
Mark Otto's avatar
Mark Otto committed
59
60
  <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
61
</div>
Mark Otto's avatar
Mark Otto committed
62
63
64
{% endexample %}

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

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

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

89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
## Multiple addons

Multiple add-ons are supported and can be mixed with checkbox and radio input versions.

{% example html %}
<div class="row">
  <div class="col-lg-6">
    <div class="input-group">
      <span class="input-group-addon">
        <input type="checkbox" aria-label="Checkbox for following text input">
      </span>
      <span class="input-group-addon">$</span>
      <input type="text" class="form-control" aria-label="Text input with checkbox">
    </div>
  </div>
  <div class="col-lg-6">
    <div class="input-group">
      <span class="input-group-addon">$</span>
      <span class="input-group-addon">0.00</span>
      <input type="text" class="form-control" aria-label="Text input with radio button">
    </div>
  </div>
</div>
{% endexample %}


Mark Otto's avatar
Mark Otto committed
115
## Button addons
Mark Otto's avatar
Mark Otto committed
116

Mark Otto's avatar
Mark Otto committed
117
118
119
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
120
121
122
123
<div class="row">
  <div class="col-lg-6">
    <div class="input-group">
      <span class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
124
        <button class="btn btn-secondary" type="button">Go!</button>
Mark Otto's avatar
Mark Otto committed
125
      </span>
Mark Otto's avatar
Mark Otto committed
126
      <input type="text" class="form-control" placeholder="Search for...">
Mark Otto's avatar
Mark Otto committed
127
128
    </div>
  </div>
Mark Otto's avatar
Mark Otto committed
129
130
  <div class="col-lg-6">
    <div class="input-group">
Mark Otto's avatar
Mark Otto committed
131
      <input type="text" class="form-control" placeholder="Search for...">
Mark Otto's avatar
Mark Otto committed
132
      <span class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
133
        <button class="btn btn-secondary" type="button">Go!</button>
Mark Otto's avatar
Mark Otto committed
134
      </span>
Mark Otto's avatar
Mark Otto committed
135
136
137
    </div>
  </div>
</div>
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<br>
<div class="row">
  <div class="col-lg-offset-3 col-lg-6">
    <div class="input-group">
      <span class="input-group-btn">
        <button class="btn btn-secondary" type="button">Hate it</button>
      </span>
      <input type="text" class="form-control" placeholder="Product name">
      <span class="input-group-btn">
        <button class="btn btn-secondary" type="button">Love it</button>
      </span>
    </div>
  </div>
</div>
Mark Otto's avatar
Mark Otto committed
152
{% endexample %}
Mark Otto's avatar
Mark Otto committed
153

Mark Otto's avatar
Mark Otto committed
154
155
156
## Buttons with dropdowns

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

Mark Otto's avatar
Mark Otto committed
195
196
197
198
199
200
201
## 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
202
        <button type="button" class="btn btn-secondary">Action</button>
Mark Otto's avatar
Mark Otto committed
203
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
204
205
          <span class="sr-only">Toggle Dropdown</span>
        </button>
206
207
208
209
210
211
212
        <div class="dropdown-menu">
          <a class="dropdown-item" href="#">Action</a>
          <a class="dropdown-item" href="#">Another action</a>
          <a class="dropdown-item" href="#">Something else here</a>
          <div role="separator" class="dropdown-divider"></div>
          <a class="dropdown-item" href="#">Separated link</a>
        </div>
Mark Otto's avatar
Mark Otto committed
213
      </div>
Mark Otto's avatar
Mark Otto committed
214
      <input type="text" class="form-control" aria-label="Text input with segmented button dropdown">
Mark Otto's avatar
Mark Otto committed
215
216
217
218
    </div>
  </div>
  <div class="col-lg-6">
    <div class="input-group">
Mark Otto's avatar
Mark Otto committed
219
      <input type="text" class="form-control" aria-label="Text input with segmented button dropdown">
Mark Otto's avatar
Mark Otto committed
220
      <div class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
221
        <button type="button" class="btn btn-secondary">Action</button>
Mark Otto's avatar
Mark Otto committed
222
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
223
224
          <span class="sr-only">Toggle Dropdown</span>
        </button>
225
226
227
228
229
230
231
        <div class="dropdown-menu dropdown-menu-right">
          <a class="dropdown-item" href="#">Action</a>
          <a class="dropdown-item" href="#">Another action</a>
          <a class="dropdown-item" href="#">Something else here</a>
          <div role="separator" class="dropdown-divider"></div>
          <a class="dropdown-item" href="#">Separated link</a>
        </div>
Mark Otto's avatar
Mark Otto committed
232
233
      </div>
    </div>
Mark Otto's avatar
Mark Otto committed
234
235
  </div>
</div>
Mark Otto's avatar
Mark Otto committed
236
{% endexample %}
237
238
239
240
241
242

## Accessibility

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.

The exact technique to be used (`<label>` elements hidden using the `.sr-only` class, or use of the `aria-label`, `aria-labelledby`, `aria-describedby`, `title` or `placeholder` 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.