forms.less 10.3 KB
Newer Older
1
2
3
//
// Forms
// --------------------------------------------------
4

5

Mark Otto's avatar
Mark Otto committed
6
7
8
// Normalize non-controls
//
// Restyle and baseline non-control form elements.
9
10
11
12
13

fieldset {
  padding: 0;
  margin: 0;
  border: 0;
14
}
15

16
17
18
legend {
  display: block;
  width: 100%;
19
  padding: 0;
Mark Otto's avatar
Mark Otto committed
20
  margin-bottom: @line-height-computed;
21
  font-size: (@font-size-base * 1.5);
22
  line-height: inherit;
23
  color: @legend-color;
24
  border: 0;
25
  border-bottom: 1px solid @legend-border-color;
26
}
27

28
label {
29
  display: inline-block;
30
  margin-bottom: 5px;
31
  font-weight: bold;
32
}
33

34

Mark Otto's avatar
Mark Otto committed
35
// Normalize form controls
36

37
38
39
40
41
// Override content-box in Normalize (* isn't specific enough)
input[type="search"] {
  .box-sizing(border-box);
}

Mark Otto's avatar
Mark Otto committed
42
// Position radios and checkboxes better
43
44
input[type="radio"],
input[type="checkbox"] {
45
  margin: 4px 0 0;
46
  margin-top: 1px \9; /* IE8-9 */
Mark Otto's avatar
Mark Otto committed
47
  line-height: normal;
48
}
Mark Otto's avatar
Mark Otto committed
49

50
// Set the height of select and file controls to match text inputs
51
input[type="file"] {
52
  display: block;
Mark Otto's avatar
Mark Otto committed
53
}
54

Mark Otto's avatar
Mark Otto committed
55
// Make multiple select elements height not fixed
56
57
select[multiple],
select[size] {
Mark Otto's avatar
Mark Otto committed
58
  height: auto;
Mark Otto's avatar
Mark Otto committed
59
60
}

Chris Rebert's avatar
Chris Rebert committed
61
// Fix optgroup Firefox bug per https://github.com/twbs/bootstrap/issues/7611
62
63
64
65
66
67
select optgroup {
  font-size: inherit;
  font-style: inherit;
  font-family: inherit;
}

68
69
70
71
72
73
// Focus for select, file, radio, and checkbox
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
  .tab-focus();
}
74

75
76
// Fix for Chrome number input
// Setting certain font-sizes causes the `I` bar to appear on hover of the bottom increment button.
Chris Rebert's avatar
Chris Rebert committed
77
// See https://github.com/twbs/bootstrap/issues/8350 for more.
78
input[type="number"] {
79
  &::-webkit-outer-spin-button,
Chris Rebert's avatar
Chris Rebert committed
80
  &::-webkit-inner-spin-button {
81
82
83
84
    height: auto;
  }
}

85
86
87
88
89
90
91
92
// Adjust output element
output {
  display: block;
  padding-top: (@padding-base-vertical + 1);
  font-size: @font-size-base;
  line-height: @line-height-base;
  color: @input-color;
}
93

94

Mark Otto's avatar
Mark Otto committed
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Common form controls
//
// Shared size and type resets for form controls. Apply `.form-control` to any
// of the following form controls:
//
// select
// textarea
// input[type="text"]
// input[type="password"]
// input[type="datetime"]
// input[type="datetime-local"]
// input[type="date"]
// input[type="month"]
// input[type="time"]
// input[type="week"]
// input[type="number"]
// input[type="email"]
// input[type="url"]
// input[type="search"]
// input[type="tel"]
// input[type="color"]

.form-control {
  display: block;
  width: 100%;
  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
  padding: @padding-base-vertical @padding-base-horizontal;
  font-size: @font-size-base;
  line-height: @line-height-base;
124
  color: @input-color;
Mark Otto's avatar
Mark Otto committed
125
  background-color: @input-bg;
126
  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
Mark Otto's avatar
Mark Otto committed
127
128
129
130
131
  border: 1px solid @input-border;
  border-radius: @input-border-radius;
  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
  .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s");

132
133
  // Customize the `:focus` state to imitate native WebKit styles.
  .form-control-focus();
Mark Otto's avatar
Mark Otto committed
134

135
136
137
138
139
140
  // Placeholder
  //
  // Placeholder text gets special styles because when browsers invalidate entire
  // lines if it doesn't understand a selector/
  .placeholder();

Mark Otto's avatar
Mark Otto committed
141
  // Disabled and read-only inputs
142
143
144
  // Note: HTML5 says that controls under a fieldset > legend:first-child won't
  // be disabled if the fieldset is disabled. Due to implementation difficulty,
  // we don't honor that edge case; we style them as disabled anyway.
Mark Otto's avatar
Mark Otto committed
145
146
147
148
149
150
151
152
153
154
155
156
157
  &[disabled],
  &[readonly],
  fieldset[disabled] & {
    cursor: not-allowed;
    background-color: @input-bg-disabled;
  }

  // Reset height for `textarea`s
  textarea& {
    height: auto;
  }
}

158
159
160
161
162
163
164
165
// Special styles for iOS date input
//
// In Mobile Safari, date inputs require a pixel line-height that matches the
// given height of the input.
input[type="date"] {
  line-height: @input-height-base;
}

Mark Otto's avatar
Mark Otto committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179

// Form groups
//
// Designed to help with the organization and spacing of vertical forms. For
// horizontal forms, use the predefined grid classes.

.form-group {
  margin-bottom: 15px;
}


// Checkboxes and radios
//
// Indent the labels to position radios/checkboxes as hanging controls.
180
181
182

.radio,
.checkbox {
183
  display: block;
Mark Otto's avatar
Mark Otto committed
184
  min-height: @line-height-computed; // clear the floating input if there is no label text
Mark Otto's avatar
Mark Otto committed
185
186
  margin-top: 10px;
  margin-bottom: 10px;
187
  padding-left: 20px;
Mark Otto's avatar
Mark Otto committed
188
189
190
  label {
    display: inline;
    font-weight: normal;
191
    cursor: pointer;
Mark Otto's avatar
Mark Otto committed
192
  }
193
}
194
.radio input[type="radio"],
Mark Otto's avatar
Mark Otto committed
195
196
197
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
198
  float: left;
199
  margin-left: -20px;
200
}
Mark Otto's avatar
Mark Otto committed
201
202
.radio + .radio,
.checkbox + .checkbox {
Mark Otto's avatar
Mark Otto committed
203
  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
Mark Otto's avatar
Mark Otto committed
204
}
205

206
// Radios and checkboxes on same line
Mark Otto's avatar
Mark Otto committed
207
208
.radio-inline,
.checkbox-inline {
209
  display: inline-block;
Mark Otto's avatar
Mark Otto committed
210
  padding-left: 20px;
211
  margin-bottom: 0;
212
  vertical-align: middle;
Mark Otto's avatar
Mark Otto committed
213
  font-weight: normal;
214
  cursor: pointer;
215
}
Mark Otto's avatar
Mark Otto committed
216
217
218
.radio-inline + .radio-inline,
.checkbox-inline + .checkbox-inline {
  margin-top: 0;
219
  margin-left: 10px; // space out consecutive inline controls
220
221
}

222
// Apply same disabled cursor tweak as for inputs
223
//
224
// Note: Neither radios nor checkboxes can be readonly.
225
226
input[type="radio"],
input[type="checkbox"],
227
228
229
230
231
232
233
234
235
.radio,
.radio-inline,
.checkbox,
.checkbox-inline {
  &[disabled],
  fieldset[disabled] & {
    cursor: not-allowed;
  }
}
236

Mark Otto's avatar
Mark Otto committed
237

Mark Otto's avatar
Mark Otto committed
238
// Form control sizing
Mark Otto's avatar
Mark Otto committed
239
240
241
242
//
// Build on `.form-control` with modifier classes to decrease or increase the
// height and font-size of form controls.

243
.input-sm {
244
  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
245
246
}

ggam's avatar
ggam committed
247
.input-lg {
248
  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
249
}
250

Mark Otto's avatar
Mark Otto committed
251

Mark Otto's avatar
Mark Otto committed
252
253
254
// Form control feedback states
//
// Apply contextual and semantic states to individual form controls.
255

256
257
258
259
260
261
262
263
264
265
266
267
.has-feedback {
  // Enable absolute positioning
  position: relative;

  // Ensure icons don't overlap text
  .form-control {
    padding-right: (@input-height-base * 1.25);
  }

  // Feedback icon (requires .glyphicon classes)
  .form-control-feedback {
    position: absolute;
Chris Rebert's avatar
Chris Rebert committed
268
    top: (@line-height-computed + 5); // Height of the `label` and its margin
269
270
271
272
273
274
275
276
277
278
    right: 0;
    display: block;
    width: @input-height-base;
    height: @input-height-base;
    line-height: @input-height-base;
    text-align: center;
  }
}

// Feedback states
279
.has-warning {
280
  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);
281
}
282
.has-error {
283
  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);
284
}
285
.has-success {
286
  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);
287
}
288
289


290
291
292
293
294
295
296
297
298
299
// Static form control text
//
// Apply class to a `p` element to make any string of text align with labels in
// a horizontal form layout.

.form-control-static {
  margin-bottom: 0; // Remove default margin from `p`
}


Mark Otto's avatar
Mark Otto committed
300
301
302
303
// Help text
//
// Apply to any element you wish to create light text for placement immediately
// below a form control. Use for general help, formatting, or instructional text.
304

305
.help-block {
306
  display: block; // account for any element using help-block
Mark Otto's avatar
Mark Otto committed
307
308
309
  margin-top: 5px;
  margin-bottom: 10px;
  color: lighten(@text-color, 25%); // lighten the text some for contrast
Jacob Thornton's avatar
Jacob Thornton committed
310
}
311
312
313
314
315



// Inline forms
//
316
317
318
319
320
321
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
// forms begin stacked on extra small (mobile) devices and then go inline when
// viewports reach <768px.
//
// Requires wrapping inputs and labels with `.form-group` for proper display of
// default HTML form controls and our custom form controls (e.g., input groups).
322
323
//
// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
324
325

.form-inline {
326

327
  // Kick in the inline
328
  @media (min-width: @screen-sm) {
329
    // Inline-block all the things for "inline"
330
    .form-group {
331
332
333
334
      display: inline-block;
      margin-bottom: 0;
      vertical-align: middle;
    }
335
336
337
338

    // In navbar-form, allow folks to *not* use `.form-group`
    .form-control {
      display: inline-block;
339
      width: auto; // Prevent labels from stacking above inputs in `.form-group`
340
      vertical-align: middle;
341
    }
342

343
344
345
    .control-label {
      margin-bottom: 0;
      vertical-align: middle;
346
347
    }

348
349
350
351
352
353
354
355
356
    // Remove default margin on radios/checkboxes that were used for stacking, and
    // then undo the floating of radios and checkboxes to match (which also avoids
    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
    .radio,
    .checkbox {
      display: inline-block;
      margin-top: 0;
      margin-bottom: 0;
      padding-left: 0;
357
      vertical-align: middle;
358
359
360
361
362
363
    }
    .radio input[type="radio"],
    .checkbox input[type="checkbox"] {
      float: none;
      margin-left: 0;
    }
364
365
366
367
368
369
370
371

    // Validation states
    //
    // Reposition the icon because it's now within a grid column and columns have
    // `position: relative;` on them. Also accounts for the grid gutter padding.
    .has-feedback .form-control-feedback {
      top: 0;
    }
372
373
374
375
376
377
378
379
380
381
  }
}


// Horizontal forms
//
// Horizontal forms are built on grid classes and allow you to create forms with
// labels on the left and inputs on the right.

.form-horizontal {
382
383
384
385
386
387
388
389
390
391
392

  // Consistent vertical alignment of labels, radios, and checkboxes
  .control-label,
  .radio,
  .checkbox,
  .radio-inline,
  .checkbox-inline {
    margin-top: 0;
    margin-bottom: 0;
    padding-top: (@padding-base-vertical + 1); // Default padding plus a border
  }
393
394
395
396
  // Account for padding we're adding to ensure the alignment and of help text
  // and other content below items
  .radio,
  .checkbox {
397
    min-height: (@line-height-computed + (@padding-base-vertical + 1));
398
  }
399
400

  // Make form groups behave like rows
401
402
403
404
  .form-group {
    .make-row();
  }

405
406
407
408
  .form-control-static {
    padding-top: (@padding-base-vertical + 1);
  }

409
  // Only right align form labels here when the columns stop stacking
Zlatan Vasović's avatar
Zlatan Vasović committed
410
  @media (min-width: @screen-sm-min) {
411
412
413
    .control-label {
      text-align: right;
    }
414
  }
415
416
417
418
419
420
421
422
423

  // Validation states
  //
  // Reposition the icon because it's now within a grid column and columns have
  // `position: relative;` on them. Also accounts for the grid gutter padding.
  .has-feedback .form-control-feedback {
    top: 0;
    right: (@grid-gutter-width / 2);
  }
424
}