forms.md 32.7 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: Forms
4
group: components
Mark Otto's avatar
Mark Otto committed
5
6
---

7
Bootstrap provides several form control styles, layout options, and custom components for creating a wide variety of forms.
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}

14
## Form controls
Mark Otto's avatar
Mark Otto committed
15

16
Bootstrap's form controls expand on [our Rebooted form styles]({{ site.baseurl }}/content/reboot/#forms) with classes. Use these classes to opt into their customized displays for a more consistent rendering across browsers and devices. The example form below demonstrates common HTML form elements that receive updated styles from Bootstrap with additional classes.
Mark Otto's avatar
Mark Otto committed
17

18
Remember, since Bootstrap utilizes the HTML5 doctype, **all inputs must have a `type` attribute**.
19

Mark Otto's avatar
Mark Otto committed
20
{% example html %}
Mark Otto's avatar
Mark Otto committed
21
<form>
22
  <fieldset class="form-group">
Mark Otto's avatar
Mark Otto committed
23
    <label for="exampleInputEmail1">Email address</label>
24
25
    <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
    <small id="emailHelp" class="text-muted">We'll never share your email with anyone else.</small>
26
27
  </fieldset>
  <fieldset class="form-group">
Mark Otto's avatar
Mark Otto committed
28
29
    <label for="exampleInputPassword1">Password</label>
    <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
30
31
32
  </fieldset>
  <fieldset class="form-group">
    <label for="exampleSelect1">Example select</label>
33
    <select class="form-control" id="exampleSelect1">
34
35
36
37
38
39
40
41
42
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
      <option>5</option>
    </select>
  </fieldset>
  <fieldset class="form-group">
    <label for="exampleSelect2">Example multiple select</label>
43
    <select multiple class="form-control" id="exampleSelect2">
44
45
46
47
48
49
50
51
52
53
54
55
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
      <option>5</option>
    </select>
  </fieldset>
  <fieldset class="form-group">
    <label for="exampleTextarea">Example textarea</label>
    <textarea class="form-control" id="exampleTextarea" rows="3"></textarea>
  </fieldset>
  <fieldset class="form-group">
Mark Otto's avatar
Mark Otto committed
56
    <label for="exampleInputFile">File input</label>
57
58
    <input type="file" class="form-control-file" id="exampleInputFile" aria-describedby="fileHelp">
    <small id="fileHelp" class="text-muted">This is some placeholder block-level help text for the above input. It's a bit lighter and easily wraps to a new line.</small>
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  </fieldset>
  <div class="radio">
    <label>
      <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
      Option one is this and that&mdash;be sure to include why it's great
    </label>
  </div>
  <div class="radio">
    <label>
      <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2">
      Option two can be something else and selecting it will deselect option one
    </label>
  </div>
  <div class="radio disabled">
    <label>
      <input type="radio" name="optionsRadios" id="optionsRadios3" value="option3" disabled>
      Option three is disabled
    </label>
Mark Otto's avatar
Mark Otto committed
77
78
79
80
81
82
  </div>
  <div class="checkbox">
    <label>
      <input type="checkbox"> Check me out
    </label>
  </div>
Mark Otto's avatar
Mark Otto committed
83
  <button type="submit" class="btn btn-primary">Submit</button>
Mark Otto's avatar
Mark Otto committed
84
</form>
Mark Otto's avatar
Mark Otto committed
85
{% endexample %}
Mark Otto's avatar
Mark Otto committed
86

87
Below is a complete list of the specific form controls supported by Bootstrap and the classes that customize them. Additional documentation is available for each group.
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
115
116

<table>
  <thead>
    <tr>
      <th>Classes</th>
      <th>Used for</th>
      <th>Supported variations</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        {% markdown %}`.form-group`{% endmarkdown %}
      </td>
      <td class="text-nowrap">
        Any group of form controls
      </td>
      <td>
        {% markdown %}Use with any block-level element like `<fieldset>` or `<div>`{% endmarkdown %}
      </td>
    </tr>
    <tr>
      <td rowspan="3">
        {% markdown %}`.form-control`{% endmarkdown %}
      </td>
      <td>
        Textual inputs
      </td>
      <td>
117
        {% markdown %}`text`, `password`, `datetime-local`, `date`, `month`, `time`, `week`, `number`, `email`, `url`, `search`, `tel`, `color`{% endmarkdown %}
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
      </td>
    </tr>
    <tr>
      <td>
        Select menus
      </td>
      <td>
        {% markdown %}`multiple`, `size`{% endmarkdown %}
      </td>
    </tr>
    <tr>
      <td>
        Textareas
      </td>
      <td>
        <span class="text-muted">N/A</span>
      </td>
    </tr>
    <tr>
      <td class="text-nowrap">
        {% markdown %}`.form-control-file`{% endmarkdown %}
      </td>
      <td>
        File inputs
      </td>
      <td>
        {% markdown %}`file`{% endmarkdown %}
      </td>
    </tr>
    <tr>
      <td class="text-nowrap">
{% markdown %}
`.radio`<br>
`.radio-inline`<br>
`.checkbox`<br>
`.checkbox-inline`
{% endmarkdown %}
      </td>
      <td class="text-nowrap">
        Checkboxes and radios
      </td>
      <td>
        <span class="text-muted">N/A</span>
      </td>
    </tr>
  </tbody>
</table>

166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
### Textual inputs

Here are examples of `.form-control` applied to each textual HTML5 `<input>` `type`.

{% example html %}
<div class="form-group row">
  <label for="example-text-input" class="col-xs-2 form-control-label">Text</label>
  <div class="col-xs-10">
    <input class="form-control" type="text" value="Artisanal kale" id="example-text-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-search-input" class="col-xs-2 form-control-label">Search</label>
  <div class="col-xs-10">
    <input class="form-control" type="search" value="How do I shoot web" id="example-search-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-email-input" class="col-xs-2 form-control-label">Email</label>
  <div class="col-xs-10">
    <input class="form-control" type="email" value="bootstrap@example.com" id="example-email-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-url-input" class="col-xs-2 form-control-label">URL</label>
  <div class="col-xs-10">
    <input class="form-control" type="url" value="http://getbootstrap.com" id="example-url-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-tel-input" class="col-xs-2 form-control-label">Telephone</label>
  <div class="col-xs-10">
    <input class="form-control" type="tel" value="1-(555)-555-5555" id="example-tel-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-password-input" class="col-xs-2 form-control-label">Password</label>
  <div class="col-xs-10">
    <input class="form-control" type="password" value="hunter2" id="example-password-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-number-input" class="col-xs-2 form-control-label">Number</label>
  <div class="col-xs-10">
    <input class="form-control" type="number" value="42" id="example-number-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-datetime-local-input" class="col-xs-2 form-control-label">Date and time</label>
  <div class="col-xs-10">
    <input class="form-control" type="datetime-local" value="2011-08-19T13:45:00" id="example-datetime-local-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-date-input" class="col-xs-2 form-control-label">Date</label>
  <div class="col-xs-10">
    <input class="form-control" type="date" value="2011-08-19" id="example-date-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-month-input" class="col-xs-2 form-control-label">Month</label>
  <div class="col-xs-10">
    <input class="form-control" type="month" value="2011-08" id="example-month-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-week-input" class="col-xs-2 form-control-label">Week</label>
  <div class="col-xs-10">
    <input class="form-control" type="week" value="2011-W33" id="example-week-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-time-input" class="col-xs-2 form-control-label">Time</label>
  <div class="col-xs-10">
    <input class="form-control" type="time" value="13:45:00" id="example-time-input">
  </div>
</div>
<div class="form-group row">
  <label for="example-color-input" class="col-xs-2 form-control-label">Color</label>
  <div class="col-xs-10">
    <input class="form-control" type="color" value="#563d7c" id="example-color-input">
  </div>
</div>
{% endexample %}

251
252
253
254
255
256
## Form layouts

Since Bootstrap applies `display: block` and `width: 100%` to almost all our form controls, forms will by default stack vertically. Additional classes can be used to vary this layout on a per-form basis.

### Form groups

257
The `.form-group` class is the easiest way to add some structure to forms. Its only purpose is to provide `margin-bottom` around a label and control pairing. As a bonus, since it's a class you can use it with `<fieldset>`s, `<div>`s, or nearly any other element.
Mark Otto's avatar
Mark Otto committed
258

259
260
261
{% example html %}
<form>
  <fieldset class="form-group">
262
    <label for="formGroupExampleInput">Example label</label>
263
264
265
    <input type="text" class="form-control" id="formGroupExampleInput" placeholder="Example input">
  </fieldset>
  <fieldset class="form-group">
266
    <label for="formGroupExampleInput2">Another label</label>
267
268
269
270
271
272
273
    <input type="text" class="form-control" id="formGroupExampleInput2" placeholder="Another input">
  </fieldset>
</form>
{% endexample %}

### Inline forms

cndpzc's avatar
cndpzc committed
274
Use the `.form-inline` class to display a series of labels, form controls, and buttons on a single horizontal row. Form controls within inline forms behave differently:
275
276
277
278

- Controls are `display: inline-block` to provide alignment control via `vertical-align` and `margin`.
- Controls receive `width: auto` to override the Bootstrap default `width: 100%`.
- Controls **only appear inline in viewports that are at least 768px wide** to account for narrow viewports on mobile devices.
Mark Otto's avatar
Mark Otto committed
279

Chris Rebert's avatar
Chris Rebert committed
280
Because of this, you may need to manually address the width and alignment of individual form controls. Lastly, as shown below, you should always include a `<label>` with each form control.
Mark Otto's avatar
Mark Otto committed
281

282
#### Visible labels
Mark Otto's avatar
Mark Otto committed
283
284

{% example html %}
285
286
287
288
289
290
291
292
293
294
295
<form class="form-inline">
  <div class="form-group">
    <label for="exampleInputName2">Name</label>
    <input type="text" class="form-control" id="exampleInputName2" placeholder="Jane Doe">
  </div>
  <div class="form-group">
    <label for="exampleInputEmail2">Email</label>
    <input type="email" class="form-control" id="exampleInputEmail2" placeholder="jane.doe@example.com">
  </div>
  <button type="submit" class="btn btn-primary">Send invitation</button>
</form>
Mark Otto's avatar
Mark Otto committed
296
297
{% endexample %}

298
#### Hidden labels
Mark Otto's avatar
Mark Otto committed
299

Mark Otto's avatar
Mark Otto committed
300
{% example html %}
Mark Otto's avatar
Mark Otto committed
301
<form class="form-inline">
Mark Otto's avatar
Mark Otto committed
302
  <div class="form-group">
Mark Otto's avatar
Mark Otto committed
303
304
    <label class="sr-only" for="exampleInputEmail3">Email address</label>
    <input type="email" class="form-control" id="exampleInputEmail3" placeholder="Enter email">
Mark Otto's avatar
Mark Otto committed
305
306
  </div>
  <div class="form-group">
Mark Otto's avatar
Mark Otto committed
307
308
    <label class="sr-only" for="exampleInputPassword3">Password</label>
    <input type="password" class="form-control" id="exampleInputPassword3" placeholder="Password">
Mark Otto's avatar
Mark Otto committed
309
310
311
312
313
314
  </div>
  <div class="checkbox">
    <label>
      <input type="checkbox"> Remember me
    </label>
  </div>
Mark Otto's avatar
Mark Otto committed
315
  <button type="submit" class="btn btn-primary">Sign in</button>
Mark Otto's avatar
Mark Otto committed
316
317
318
319
320
321
322
323
324
325
326
327
328
329
</form>
{% endexample %}

{% example html %}
<form class="form-inline">
  <div class="form-group">
    <label class="sr-only" for="exampleInputAmount">Amount (in dollars)</label>
    <div class="input-group">
      <div class="input-group-addon">$</div>
      <input type="text" class="form-control" id="exampleInputAmount" placeholder="Amount">
      <div class="input-group-addon">.00</div>
    </div>
  </div>
  <button type="submit" class="btn btn-primary">Transfer cash</button>
Mark Otto's avatar
Mark Otto committed
330
</form>
Mark Otto's avatar
Mark Otto committed
331
{% endexample %}
Mark Otto's avatar
Mark Otto committed
332

333
### Using the Grid
Mark Otto's avatar
Mark Otto committed
334

Mark Otto's avatar
Mark Otto committed
335
336
337
For more structured form layouts, you can utilize Bootstrap's predefined grid classes (or mixins) to create horizontal forms. Add the `.row` class to form groups and use the `.col-*-*` classes to specify the width of your labels and controls.

Be sure to add `.form-control-label` to your `<label>`s as well so they're vertically centered with their associated labels.
Mark Otto's avatar
Mark Otto committed
338
339

{% example html %}
340
341
<form>
  <div class="form-group row">
342
    <label for="inputEmail3" class="col-sm-2 form-control-label">Email</label>
Mark Otto's avatar
Mark Otto committed
343
344
345
346
    <div class="col-sm-10">
      <input type="email" class="form-control" id="inputEmail3" placeholder="Email">
    </div>
  </div>
347
  <div class="form-group row">
348
    <label for="inputPassword3" class="col-sm-2 form-control-label">Password</label>
Mark Otto's avatar
Mark Otto committed
349
350
351
352
    <div class="col-sm-10">
      <input type="password" class="form-control" id="inputPassword3" placeholder="Password">
    </div>
  </div>
353
  <div class="form-group row">
354
    <label class="col-sm-2">Radios</label>
355
356
357
    <div class="col-sm-10">
      <div class="radio">
        <label>
358
          <input type="radio" name="gridRadios" id="gridRadios1" value="option1" checked>
359
360
361
362
363
          Option one is this and that&mdash;be sure to include why it's great
        </label>
      </div>
      <div class="radio">
        <label>
364
          <input type="radio" name="gridRadios" id="gridRadios2" value="option2">
365
366
367
368
369
          Option two can be something else and selecting it will deselect option one
        </label>
      </div>
      <div class="radio disabled">
        <label>
370
          <input type="radio" name="gridRadios" id="gridRadios3" value="option3" disabled>
371
372
373
374
375
376
          Option three is disabled
        </label>
      </div>
    </div>
  </div>
  <div class="form-group row">
377
    <label class="col-sm-2">Checkbox</label>
378
    <div class="col-sm-10">
Mark Otto's avatar
Mark Otto committed
379
380
      <div class="checkbox">
        <label>
381
          <input type="checkbox"> Check me out
Mark Otto's avatar
Mark Otto committed
382
383
        </label>
      </div>
384
385
386
387
    </div>
  </div>
  <div class="form-group row">
    <div class="col-sm-offset-2 col-sm-10">
Mark Otto's avatar
Mark Otto committed
388
      <button type="submit" class="btn btn-secondary">Sign in</button>
Mark Otto's avatar
Mark Otto committed
389
390
391
    </div>
  </div>
</form>
Mark Otto's avatar
Mark Otto committed
392
{% endexample %}
Mark Otto's avatar
Mark Otto committed
393

394
## Checkboxes and radios
Mark Otto's avatar
Mark Otto committed
395
396
397

Checkboxes are for selecting one or several options in a list, while radios are for selecting one option from many.

Mark Otto's avatar
Mark Otto committed
398
Disabled checkboxes and radios are supported, but to provide a "not-allowed" cursor on hover of the parent `<label>`, you'll need to add the <code>.disabled</code> class to the parent `.radio`, `.radio-inline`, `.checkbox`, or `.checkbox-inline`.
Mark Otto's avatar
Mark Otto committed
399

400
### Default (stacked)
Mark Otto's avatar
Mark Otto committed
401
402

{% example html %}
Mark Otto's avatar
Mark Otto committed
403
404
405
406
407
408
<div class="checkbox">
  <label>
    <input type="checkbox" value="">
    Option one is this and that&mdash;be sure to include why it's great
  </label>
</div>
Chris Rebert's avatar
Chris Rebert committed
409
410
411
412
413
414
<div class="checkbox disabled">
  <label>
    <input type="checkbox" value="" disabled>
    Option two is disabled
  </label>
</div>
Mark Otto's avatar
Mark Otto committed
415
416
417

<div class="radio">
  <label>
418
    <input type="radio" name="exampleRadios" id="exampleRadios1" value="option1" checked>
Mark Otto's avatar
Mark Otto committed
419
420
421
422
423
    Option one is this and that&mdash;be sure to include why it's great
  </label>
</div>
<div class="radio">
  <label>
424
    <input type="radio" name="exampleRadios" id="exampleRadios2" value="option2">
Mark Otto's avatar
Mark Otto committed
425
426
427
    Option two can be something else and selecting it will deselect option one
  </label>
</div>
Chris Rebert's avatar
Chris Rebert committed
428
429
<div class="radio disabled">
  <label>
430
    <input type="radio" name="exampleRadios" id="exampleRadios3" value="option3" disabled>
Chris Rebert's avatar
Chris Rebert committed
431
432
433
    Option three is disabled
  </label>
</div>
Mark Otto's avatar
Mark Otto committed
434
{% endexample %}
Mark Otto's avatar
Mark Otto committed
435

436
### Inline
Mark Otto's avatar
Mark Otto committed
437
438
439
440

Use the `.checkbox-inline` or `.radio-inline` classes on a series of checkboxes or radios for controls that appear on the same line.

{% example html %}
Mark Otto's avatar
Mark Otto committed
441
442
443
444
445
446
447
448
449
<label class="checkbox-inline">
  <input type="checkbox" id="inlineCheckbox1" value="option1"> 1
</label>
<label class="checkbox-inline">
  <input type="checkbox" id="inlineCheckbox2" value="option2"> 2
</label>
<label class="checkbox-inline">
  <input type="checkbox" id="inlineCheckbox3" value="option3"> 3
</label>
450
{% endexample %}
Mark Otto's avatar
Mark Otto committed
451

452
{% example html %}
Mark Otto's avatar
Mark Otto committed
453
454
455
456
457
458
459
460
461
<label class="radio-inline">
  <input type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1"> 1
</label>
<label class="radio-inline">
  <input type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2"> 2
</label>
<label class="radio-inline">
  <input type="radio" name="inlineRadioOptions" id="inlineRadio3" value="option3"> 3
</label>
Mark Otto's avatar
Mark Otto committed
462
{% endexample %}
Mark Otto's avatar
Mark Otto committed
463

464
### Without labels
Mark Otto's avatar
Mark Otto committed
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480

Should you have no text within the `<label>`, the input is positioned as you'd expect. **Currently only works on non-inline checkboxes and radios.**

{% example html %}
<div class="checkbox">
  <label>
    <input type="checkbox" id="blankCheckbox" value="option1">
  </label>
</div>
<div class="radio">
  <label>
    <input type="radio" name="blankRadio" id="blankRadio1" value="option1">
  </label>
</div>
{% endexample %}

Mark Otto's avatar
Mark Otto committed
481
## Static controls
Mark Otto's avatar
Mark Otto committed
482

Mark Otto's avatar
Mark Otto committed
483
When you need to place plain text next to a form label within a form, use the `.form-control-static` class on a `<p>`.
Mark Otto's avatar
Mark Otto committed
484
485

{% example html %}
486
<form>
487
488
  <div class="form-group row">
    <label class="col-sm-2 form-control-label">Email</label>
Mark Otto's avatar
Mark Otto committed
489
490
491
492
    <div class="col-sm-10">
      <p class="form-control-static">email@example.com</p>
    </div>
  </div>
493
494
  <div class="form-group row">
    <label for="inputPassword" class="col-sm-2 form-control-label">Password</label>
Mark Otto's avatar
Mark Otto committed
495
496
497
498
499
    <div class="col-sm-10">
      <input type="password" class="form-control" id="inputPassword" placeholder="Password">
    </div>
  </div>
</form>
Mark Otto's avatar
Mark Otto committed
500
{% endexample %}
Mark Otto's avatar
Mark Otto committed
501

Mark Otto's avatar
Mark Otto committed
502
{% example html %}
Mark Otto's avatar
Mark Otto committed
503
<form class="form-inline">
Mark Otto's avatar
Mark Otto committed
504
505
506
507
508
509
510
511
  <div class="form-group">
    <label class="sr-only">Email</label>
    <p class="form-control-static">email@example.com</p>
  </div>
  <div class="form-group">
    <label for="inputPassword2" class="sr-only">Password</label>
    <input type="password" class="form-control" id="inputPassword2" placeholder="Password">
  </div>
Mark Otto's avatar
Mark Otto committed
512
  <button type="submit" class="btn btn-primary">Confirm identity</button>
Mark Otto's avatar
Mark Otto committed
513
514
515
</form>
{% endexample %}

Mark Otto's avatar
Mark Otto committed
516
## Disabled states
Mark Otto's avatar
Mark Otto committed
517

Mark Otto's avatar
Mark Otto committed
518
Add the `disabled` boolean attribute on an input to prevent user interactions. Disabled inputs appear lighter and add a `not-allowed` cursor.
Mark Otto's avatar
Mark Otto committed
519
520

{% highlight html %}
Mark Otto's avatar
Mark Otto committed
521
522
523
524
525
526
<input class="form-control" id="disabledInput" type="text" placeholder="Disabled input here..." disabled>
{% endhighlight %}

Add the `disabled` attribute to a `<fieldset>` to disable all the controls within.

{% example html %}
Mark Otto's avatar
Mark Otto committed
527
<form>
Mark Otto's avatar
Mark Otto committed
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
  <fieldset disabled>
    <div class="form-group">
      <label for="disabledTextInput">Disabled input</label>
      <input type="text" id="disabledTextInput" class="form-control" placeholder="Disabled input">
    </div>
    <div class="form-group">
      <label for="disabledSelect">Disabled select menu</label>
      <select id="disabledSelect" class="form-control">
        <option>Disabled select</option>
      </select>
    </div>
    <div class="checkbox">
      <label>
        <input type="checkbox"> Can't check this
      </label>
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
  </fieldset>
</form>
Mark Otto's avatar
Mark Otto committed
547
{% endexample %}
Mark Otto's avatar
Mark Otto committed
548

549
550
{% callout warning %}
#### Caveat about link functionality of `<a>`
Mark Otto's avatar
Mark Otto committed
551

552
By default, browsers will treat all native form controls (`<input>`, `<select>` and `<button>` elements) inside a `<fieldset disabled>` as disabled, preventing both keyboard and mouse interactions on them. However, if your form also includes `<a ... class="btn btn-*">` elements, these will only be given a style of `pointer-events: none`. As noted in the section about [disabled state for buttons](../buttons/#disabled-state) (and specifically in the sub-section for anchor elements), this CSS property is not yet standardized and isn't fully supported in Opera 18 and below, or in Internet Explorer 11, and won't prevent keyboard users from being able to focus or activate these links. So to be safe, use custom JavaScript to disable such links.
553
554
555
556
557
558
559
{% endcallout %}

{% callout danger %}
#### Cross-browser compatibility

While Bootstrap will apply these styles in all browsers, Internet Explorer 11 and below don't fully support the `disabled` attribute on a `<fieldset>`. Use custom JavaScript to disable the fieldset in these browsers.
{% endcallout %}
Mark Otto's avatar
Mark Otto committed
560
561
562

## Readonly inputs

563
Add the `readonly` boolean attribute on an input to prevent modification of the input's value. Read-only inputs appear lighter (just like disabled inputs), but retain the standard cursor.
Mark Otto's avatar
Mark Otto committed
564
565

{% example html %}
Mark Otto's avatar
Mark Otto committed
566
<input class="form-control" type="text" placeholder="Readonly input here…" readonly>
Mark Otto's avatar
Mark Otto committed
567
{% endexample %}
Mark Otto's avatar
Mark Otto committed
568

Mark Otto's avatar
Mark Otto committed
569
570
571
572
573
## Control sizing

Set heights using classes like `.form-control-lg`, and set widths using grid column classes like `.col-lg-*`.

{% example html %}
574
<input class="form-control form-control-lg" type="text" placeholder=".form-control-lg">
Mark Otto's avatar
Mark Otto committed
575
<input class="form-control" type="text" placeholder="Default input">
576
<input class="form-control form-control-sm" type="text" placeholder=".form-control-sm">
Mark Otto's avatar
Mark Otto committed
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
{% endexample %}

{% example html %}
<select class="form-control form-control-lg"></select>
<select class="form-control"></select>
<select class="form-control form-control-sm"></select>
{% endexample %}

## Column sizing

Wrap inputs in grid columns, or any custom parent element, to easily enforce desired widths.

{% example html %}
<div class="row">
  <div class="col-xs-2">
    <input type="text" class="form-control" placeholder=".col-xs-2">
  </div>
  <div class="col-xs-3">
    <input type="text" class="form-control" placeholder=".col-xs-3">
  </div>
  <div class="col-xs-4">
    <input type="text" class="form-control" placeholder=".col-xs-4">
  </div>
</div>
{% endexample %}

## Help text

Mark Otto's avatar
Mark Otto committed
605
606
No official help text classes exist in Bootstrap 4 (previously we had `.help-block` in v3), but thanks to our utility classes like `.text-muted`, you can create much more flexible help text as you need it.

607
608
609
610
611
612
{% callout warning %}
#### Associating help text with form controls

Help text should be explicitly associated with the form control it relates to using the `aria-describedby` attribute. This will ensure that assistive technologies – such as screen readers – will announce this help text when the user focuses or enters the control.
{% endcallout %}

Mark Otto's avatar
Mark Otto committed
613
Inline text can use any typical inline HTML element (be it a `<small>`, `<span>`, or something else).
Mark Otto's avatar
Mark Otto committed
614
615

{% example html %}
616
617
618
619
620
621
622
623
624
<form class="form-inline">
  <div class="form-group">
    <label for="inputPassword4">Password</label>
    <input type="password" id="inputPassword4" class="form-control" aria-describedby="passwordHelpInline">
    <small id="passwordHelpInline" class="text-muted">
      Must be 8-20 characters long.
    </small>
  </div>
</form>
625
626
{% endexample %}

Mark Otto's avatar
Mark Otto committed
627
628
Block help text—for below inputs or for longer lines of help text—can be easily achieved with a `<p>`.

629
{% example html %}
630
631
632
<label for="inputPassword5">Password</label>
<input type="password" id="inputPassword5" class="form-control" aria-describedby="passwordHelpBlock">
<p id="passwordHelpBlock" class="text-muted">
Mark Otto's avatar
Mark Otto committed
633
  Your password must be 8-20 characters long, contain letters and numbers, and must not contain spaces, special characters or emoji.
634
</p>
Mark Otto's avatar
Mark Otto committed
635
636
{% endexample %}

Mark Otto's avatar
Mark Otto committed
637
## Validation
Mark Otto's avatar
Mark Otto committed
638

639
640
641
642
643
Bootstrap includes validation styles for danger, warning, and success states on form controls.

- To use, add `.has-warning`, `.has-danger`, or `.has-success` to the parent element. Any `.form-control-label`, `.form-control`, and `.text-help` within that element will receive the validation styles.
- Validation icons are `url()`s configured via Sass variables that are applied to `background-image` declarations for each state.
- You may use your own base64 PNGs or SVGs by updating the Sass variables and recompiling.
644
- Icons can also be disabled entirely by setting the variables to `none` or commenting out the source Sass.
Mark Otto's avatar
Mark Otto committed
645

646
{% comment %}
647
648
649
650
651
652
653
{% callout warning %}
#### Conveying validation state to assistive technologies and colorblind users

Using these validation styles to denote the state of a form control only provides a visual, color-based indication, which will not be conveyed to users of assistive technologies - such as screen readers - or to colorblind users.

Ensure that an alternative indication of state is also provided. For instance, you can include a hint about state in the form control's `<label>` text itself (as is the case in the following code example), include a [Glyphicon](../components/#glyphicons) (with appropriate alternative text using the `.sr-only` class - see the [Glyphicon examples](../components/#glyphicons-examples)), or by providing an additional [help text](#forms-help-text) block. Specifically for assistive technologies, invalid form controls can also be assigned an `aria-invalid="true"` attribute.
{% endcallout %}
654
{% endcomment %}
Mark Otto's avatar
Mark Otto committed
655

Mark Otto's avatar
Mark Otto committed
656
{% example html %}
Mark Otto's avatar
Mark Otto committed
657
<div class="form-group has-success">
658
  <label class="form-control-label" for="inputSuccess1">Input with success</label>
659
  <input type="text" class="form-control form-control-success" id="inputSuccess1">
Mark Otto's avatar
Mark Otto committed
660
661
</div>
<div class="form-group has-warning">
662
  <label class="form-control-label" for="inputWarning1">Input with warning</label>
663
  <input type="text" class="form-control form-control-warning" id="inputWarning1">
Mark Otto's avatar
Mark Otto committed
664
</div>
665
<div class="form-group has-danger">
Mark Otto's avatar
Mark Otto committed
666
667
  <label class="form-control-label" for="inputDanger1">Input with danger</label>
  <input type="text" class="form-control form-control-danger" id="inputDanger1">
Mark Otto's avatar
Mark Otto committed
668
</div>
669

670
671
672
673
674
<div class="checkbox has-success">
  <label>
    <input type="checkbox" id="checkboxSuccess" value="option1">
    Checkbox with success
  </label>
675
</div>
676
677
678
679
680
<div class="checkbox has-warning">
  <label>
    <input type="checkbox" id="checkboxWarning" value="option1">
    Checkbox with warning
  </label>
Mark Otto's avatar
Mark Otto committed
681
</div>
682
683
<div class="checkbox has-danger">
  <label>
Mark Otto's avatar
Mark Otto committed
684
685
    <input type="checkbox" id="checkboxDanger" value="option1">
    Checkbox with danger
686
  </label>
687
</div>
Mark Otto's avatar
Mark Otto committed
688
{% endexample %}
Mark Otto's avatar
Mark Otto committed
689

690
691
## Custom forms

692
For even more customization and cross browser consistency, use our completely custom form elements to replace the browser defaults. They're built on top of semantic and accessible markup, so they're solid replacements for any default form control.
693
694
695
696
697
698
699
700
701

### Checkboxes and radios

Each checkbox and radio is wrapped in a `<label>` for three reasons:

- It provides a larger hit areas for checking the control.
- It provides a helpful and semantic wrapper to help us replace the default `<input>`s.
- It triggers the state of the `<input>` automatically, meaning no JavaScript is required.

Mark Otto's avatar
Mark Otto committed
702
We hide the default `<input>` with `opacity` and use the `.custom-control-indicator` to build a new custom form indicator in its place. Unfortunately we can't build a custom one from just the `<input>` because CSS's `content` doesn't work on that element.
703

Mark Otto's avatar
Mark Otto committed
704
We use the sibling selector (`~`) for all our `<input>` states—like `:checked`—to properly style our custom form indicator. When combined with the `.custom-control-description` class, we can also style the text for each item based on the `<input>`'s state.
705

XhmikosR's avatar
XhmikosR committed
706
In the checked states, we use **base64 embedded SVG icons** from [Open Iconic](https://useiconic.com/open). This provides us the best control for styling and positioning across browsers and devices.
707
708
709
710

#### Checkboxes

{% example html %}
Mark Otto's avatar
Mark Otto committed
711
712
713
714
<label class="custom-control custom-checkbox">
  <input type="checkbox" class="custom-control-input">
  <span class="custom-control-indicator"></span>
  <span class="custom-control-description">Check this custom checkbox</span>
715
716
717
</label>
{% endexample %}

718
Custom checkboxes can also utilize the `:indeterminate` pseudo class when manually set via JavaScript (there is no available HTML attribute for specifying it).
719
720

<div class="bd-example bd-example-indeterminate">
Mark Otto's avatar
Mark Otto committed
721
722
723
724
  <label class="custom-control custom-checkbox">
    <input type="checkbox" class="custom-control-input">
    <span class="custom-control-indicator"></span>
    <span class="custom-control-description">Check this custom checkbox</span>
725
726
727
  </label>
</div>

Mark Otto's avatar
Mark Otto committed
728
If you're using jQuery, something like this should suffice:
729
730
731
732
733
734
735
736

{% highlight js %}
$('.your-checkbox').prop('indeterminate', true)
{% endhighlight %}

#### Radios

{% example html %}
Mark Otto's avatar
Mark Otto committed
737
738
739
740
<label class="custom-control custom-radio">
  <input id="radio1" name="radio" type="radio" class="custom-control-input">
  <span class="custom-control-indicator"></span>
  <span class="custom-control-description">Toggle this custom radio</span>
741
</label>
Mark Otto's avatar
Mark Otto committed
742
743
744
745
<label class="custom-control custom-radio">
  <input id="radio2" name="radio" type="radio" class="custom-control-input">
  <span class="custom-control-indicator"></span>
  <span class="custom-control-description">Or toggle this other custom radio</span>
746
747
748
</label>
{% endexample %}

Mark Otto's avatar
Mark Otto committed
749
750
#### Disabled

Mark Otto's avatar
Mark Otto committed
751
Custom checkboxes and radios can also be disabled. Add the `disabled` boolean attribute to the `<input>` and the custom indicator and label description will be automatically styled.
Mark Otto's avatar
Mark Otto committed
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766

{% example html %}
<label class="custom-control custom-checkbox">
  <input type="checkbox" class="custom-control-input" disabled>
  <span class="custom-control-indicator"></span>
  <span class="custom-control-description">Check this custom checkbox</span>
</label>

<label class="custom-control custom-radio">
  <input id="radio3" name="radioDisabled" type="radio" class="custom-control-input" disabled>
  <span class="custom-control-indicator"></span>
  <span class="custom-control-description">Toggle this custom radio</span>
</label>
{% endexample %}

767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
#### Validation states

Add other states to your custom forms with our validation classes.

{% example html %}
<div class="form-group has-success">
  <label class="custom-control custom-checkbox">
    <input type="checkbox" class="custom-control-input">
    <span class="custom-control-indicator"></span>
    <span class="custom-control-description">Check this custom checkbox</span>
  </label>
</div>
<div class="form-group has-warning">
  <label class="custom-control custom-checkbox">
    <input type="checkbox" class="custom-control-input">
    <span class="custom-control-indicator"></span>
    <span class="custom-control-description">Check this custom checkbox</span>
  </label>
</div>
<div class="form-group has-danger m-b-0">
  <label class="custom-control custom-checkbox">
    <input type="checkbox" class="custom-control-input">
    <span class="custom-control-indicator"></span>
    <span class="custom-control-description">Check this custom checkbox</span>
  </label>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
794

795
796
#### Stacked

Mark Otto's avatar
Mark Otto committed
797
Custom checkboxes and radios are inline to start. Add a parent with class `.custom-controls-stacked` to ensure each form control is on separate lines.
798
799

{% example html %}
Mark Otto's avatar
Mark Otto committed
800
801
802
803
804
<div class="custom-controls-stacked">
  <label class="custom-control custom-radio">
    <input id="radioStacked1" name="radio-stacked" type="radio" class="custom-control-input">
    <span class="custom-control-indicator"></span>
    <span class="custom-control-description">Toggle this custom radio</span>
805
  </label>
Mark Otto's avatar
Mark Otto committed
806
807
808
809
  <label class="custom-control custom-radio">
    <input id="radioStacked2" name="radio-stacked" type="radio" class="custom-control-input">
    <span class="custom-control-indicator"></span>
    <span class="custom-control-description">Or toggle this other custom radio</span>
810
811
812
813
814
815
  </label>
</div>
{% endexample %}

### Select menu

816
Custom `<select>` menus need only a custom class, `.custom-select` to trigger the custom styles.
817
818

{% example html %}
819
<select class="custom-select">
820
821
822
823
824
  <option selected>Open this select menu</option>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>
825
826
{% endexample %}

827
Custom selects degrade nicely in IE9, receiving only a handful of overrides to remove the custom `background-image`. **Multiple selects (e.g., `<select multiple>`) are not currently supported.**
828
829
830

### File browser

831
832
The file input is the most gnarly of the bunch and require additional JavaScript if you'd like to hook them up with functional *Choose file...* and selected file name text.

833
{% example html %}
834
835
836
<label class="custom-file">
  <input type="file" id="file" class="custom-file-input">
  <span class="custom-file-control"></span>
837
838
839
</label>
{% endexample %}

840
Here's how it works:
841
842
843
844
845
846
847
848

- We wrap the `<input>` in a `<label>` so the custom control properly triggers the file browser.
- We hide the default file `<input>` via `opacity`.
- We use `:after` to generate a custom background and directive (*Choose file...*).
- We use `:before` to generate and position the *Browse* button.
- We declare a `height` on the `<input>` for proper spacing for surrounding content.

In other words, it's an entirely custom element, all generated via CSS.
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867

#### Translating or customizing the strings

The [`:lang()` pseudo-class](https://developer.mozilla.org/en-US/docs/Web/CSS/:lang) is used to allow for easy translation of the "Browse" and "Choose file..." text into other languages. Simply override or add entries to the `$custom-file-text` SCSS variable with the relevant [language tag](https://en.wikipedia.org/wiki/IETF_language_tag) and localized strings. The English strings can be customized the same way. For example, here's how one might add a Spanish translation (Spanish's language code is `es`):

{% highlight scss %}
$custom-file-text: (
  placeholder: (
    en: "Choose file...",
    es: "Seleccionar archivo..."
  ),
  button-label: (
    en: "Browse",
    es: "Navegar"
  )
);
{% endhighlight %}

You'll need to set the language of your document (or subtree thereof) correctly in order for the correct text to be shown. This can be done using [the `lang` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) or the [`Content-Language` HTTP header](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.12), among other methods.