input-group.md 7.81 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 add-ons on a single side, nor 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
26
  <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
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>
Mark Otto's avatar
Mark Otto committed
40
{% endexample %}
Mark Otto's avatar
Mark Otto committed
41

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

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

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

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

Mark Otto's avatar
Mark Otto committed
88
## Button addons
Mark Otto's avatar
Mark Otto committed
89

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

Mark Otto's avatar
Mark Otto committed
113
114
115
## Buttons with dropdowns

{% example html %}
Mark Otto's avatar
Mark Otto committed
116
117
118
119
<div class="row">
  <div class="col-lg-6">
    <div class="input-group">
      <div class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
120
121
122
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Action
        </button>
123
124
125
126
127
128
129
        <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
130
      </div>
Mark Otto's avatar
Mark Otto committed
131
      <input type="text" class="form-control" aria-label="Text input with dropdown button">
Mark Otto's avatar
Mark Otto committed
132
133
    </div>
  </div>
Mark Otto's avatar
Mark Otto committed
134
135
  <div class="col-lg-6">
    <div class="input-group">
Mark Otto's avatar
Mark Otto committed
136
      <input type="text" class="form-control" aria-label="Text input with dropdown button">
Mark Otto's avatar
Mark Otto committed
137
      <div class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
138
139
140
        <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Action
        </button>
141
142
143
144
145
146
147
        <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
148
149
      </div>
    </div>
Mark Otto's avatar
Mark Otto committed
150
151
  </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
157
158
159
160
## 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
161
        <button type="button" class="btn btn-secondary">Action</button>
Mark Otto's avatar
Mark Otto committed
162
        <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
163
164
          <span class="sr-only">Toggle Dropdown</span>
        </button>
165
166
167
168
169
170
171
        <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
172
      </div>
Mark Otto's avatar
Mark Otto committed
173
      <input type="text" class="form-control" aria-label="Text input with segmented button dropdown">
Mark Otto's avatar
Mark Otto committed
174
175
176
177
    </div>
  </div>
  <div class="col-lg-6">
    <div class="input-group">
Mark Otto's avatar
Mark Otto committed
178
      <input type="text" class="form-control" aria-label="Text input with segmented button dropdown">
Mark Otto's avatar
Mark Otto committed
179
      <div class="input-group-btn">
Mark Otto's avatar
Mark Otto committed
180
        <button type="button" class="btn btn-secondary">Action</button>
Mark Otto's avatar
Mark Otto committed
181
        <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
182
183
          <span class="sr-only">Toggle Dropdown</span>
        </button>
184
185
186
187
188
189
190
        <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
191
192
      </div>
    </div>
Mark Otto's avatar
Mark Otto committed
193
194
  </div>
</div>
Mark Otto's avatar
Mark Otto committed
195
{% endexample %}
196
197
198
199
200
201

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