forms.md 30.6 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

335
For more structured form layouts, you can utilize Bootstrap's predefined grid classes (or mixins). Add the `.row` class to form groups and use the `.col-*` classes to specify the width of your labels and controls. To vertically center the labels with the textual inputs—nearly anything with `.form-control`—use the `.form-control-label` class.
Mark Otto's avatar
Mark Otto committed
336
337

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

392
## Checkboxes and radios
Mark Otto's avatar
Mark Otto committed
393
394
395

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

398
### Default (stacked)
Mark Otto's avatar
Mark Otto committed
399
400

{% example html %}
Mark Otto's avatar
Mark Otto committed
401
402
403
404
405
406
<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
407
408
409
410
411
412
<div class="checkbox disabled">
  <label>
    <input type="checkbox" value="" disabled>
    Option two is disabled
  </label>
</div>
Mark Otto's avatar
Mark Otto committed
413
414
415

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

434
### Inline
Mark Otto's avatar
Mark Otto committed
435
436
437
438

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
439
440
441
442
443
444
445
446
447
<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>
448
{% endexample %}
Mark Otto's avatar
Mark Otto committed
449

450
{% example html %}
Mark Otto's avatar
Mark Otto committed
451
452
453
454
455
456
457
458
459
<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
460
{% endexample %}
Mark Otto's avatar
Mark Otto committed
461

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

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
479
## Static controls
Mark Otto's avatar
Mark Otto committed
480

Mark Otto's avatar
Mark Otto committed
481
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
482
483

{% example html %}
484
<form>
485
486
  <div class="form-group row">
    <label class="col-sm-2 form-control-label">Email</label>
Mark Otto's avatar
Mark Otto committed
487
488
489
490
    <div class="col-sm-10">
      <p class="form-control-static">email@example.com</p>
    </div>
  </div>
491
492
  <div class="form-group row">
    <label for="inputPassword" class="col-sm-2 form-control-label">Password</label>
Mark Otto's avatar
Mark Otto committed
493
494
495
496
497
    <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
498
{% endexample %}
Mark Otto's avatar
Mark Otto committed
499

Mark Otto's avatar
Mark Otto committed
500
{% example html %}
Mark Otto's avatar
Mark Otto committed
501
<form class="form-inline">
Mark Otto's avatar
Mark Otto committed
502
503
504
505
506
507
508
509
  <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
510
  <button type="submit" class="btn btn-primary">Confirm identity</button>
Mark Otto's avatar
Mark Otto committed
511
512
513
</form>
{% endexample %}

Mark Otto's avatar
Mark Otto committed
514
## Disabled states
Mark Otto's avatar
Mark Otto committed
515

Mark Otto's avatar
Mark Otto committed
516
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
517
518

{% highlight html %}
Mark Otto's avatar
Mark Otto committed
519
520
521
522
523
524
<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
525
<form>
Mark Otto's avatar
Mark Otto committed
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
  <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
545
{% endexample %}
Mark Otto's avatar
Mark Otto committed
546

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

550
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.
551
552
553
554
555
556
557
{% 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
558
559
560

## Readonly inputs

561
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
562
563

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

Mark Otto's avatar
Mark Otto committed
567
568
569
570
571
## Control sizing

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

{% example html %}
572
<input class="form-control form-control-lg" type="text" placeholder=".form-control-lg">
Mark Otto's avatar
Mark Otto committed
573
<input class="form-control" type="text" placeholder="Default input">
574
<input class="form-control form-control-sm" type="text" placeholder=".form-control-sm">
Mark Otto's avatar
Mark Otto committed
575
576
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
{% 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
603
604
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.

605
606
607
608
609
610
{% 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
611
Inline text can use any typical inline HTML element (be it a `<small>`, `<span>`, or something else).
Mark Otto's avatar
Mark Otto committed
612
613

{% example html %}
614
615
616
617
618
619
620
621
622
<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>
623
624
{% endexample %}

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

627
{% example html %}
628
629
630
<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
631
  Your password must be 8-20 characters long, contain letters and numbers, and must not contain spaces, special characters or emoji.
632
</p>
Mark Otto's avatar
Mark Otto committed
633
634
{% endexample %}

Mark Otto's avatar
Mark Otto committed
635
## Validation
Mark Otto's avatar
Mark Otto committed
636

637
638
639
640
641
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.
642
- 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
643

644
{% comment %}
645
646
647
648
649
650
651
{% 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 %}
652
{% endcomment %}
Mark Otto's avatar
Mark Otto committed
653

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

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

688
689
## Custom forms

690
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.
691
692
693
694
695
696
697
698
699

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

Mark Otto's avatar
Mark Otto committed
702
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.
703

XhmikosR's avatar
XhmikosR committed
704
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.
705
706
707
708

#### Checkboxes

{% example html %}
Mark Otto's avatar
Mark Otto committed
709
710
711
712
<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>
713
714
715
</label>
{% endexample %}

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

<div class="bd-example bd-example-indeterminate">
Mark Otto's avatar
Mark Otto committed
719
720
721
722
  <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>
723
724
725
  </label>
</div>

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

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

#### Radios

{% example html %}
Mark Otto's avatar
Mark Otto committed
735
736
737
738
<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>
739
</label>
Mark Otto's avatar
Mark Otto committed
740
741
742
743
<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>
744
745
746
</label>
{% endexample %}

Mark Otto's avatar
Mark Otto committed
747
748
#### Disabled

Mark Otto's avatar
Mark Otto committed
749
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
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765

{% 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 %}


766
767
#### Stacked

Mark Otto's avatar
Mark Otto committed
768
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.
769
770

{% example html %}
Mark Otto's avatar
Mark Otto committed
771
772
773
774
775
<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>
776
  </label>
Mark Otto's avatar
Mark Otto committed
777
778
779
780
  <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>
781
782
783
784
785
786
  </label>
</div>
{% endexample %}

### Select menu

787
Custom `<select>` menus need only a custom class, `.custom-select` to trigger the custom styles.
788
789

{% example html %}
790
<select class="custom-select">
791
792
793
794
795
  <option selected>Open this select menu</option>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>
796
797
{% endexample %}

798
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.**
799
800
801

### File browser

802
803
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.

804
{% example html %}
805
806
807
<label class="custom-file">
  <input type="file" id="file" class="custom-file-input">
  <span class="custom-file-control"></span>
808
809
810
</label>
{% endexample %}

811
Here's how it works:
812
813
814
815
816
817
818
819

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