aboutsummaryrefslogtreecommitdiff
path: root/site/content/docs/4.3/forms/layout.md
diff options
context:
space:
mode:
authorMark Otto <[email protected]>2019-07-12 16:52:33 -0500
committerGitHub <[email protected]>2019-07-12 16:52:33 -0500
commitaaf03bdc9e3cfa0d625f9758ad059c0db9fe2abe (patch)
tree025c273faa4b8fe6665126c815cba4eba2a17cfb /site/content/docs/4.3/forms/layout.md
parent50f97710eb96c8c713a036f07ebd65766917ca23 (diff)
downloadbootstrap-aaf03bdc9e3cfa0d625f9758ad059c0db9fe2abe.tar.xz
bootstrap-aaf03bdc9e3cfa0d625f9758ad059c0db9fe2abe.zip
v5: Forms update (#28450)
* Initial spike of consolidated form checks * Stub out forms rearrangement - Prepping to drop non-custom file and range inputs - Prepping to merge custom and native checks and radios (with switches) - Prepping to merge custom select with form select - Moving docs arround so forms has it's own area given volume of CSS * Move input group Sass file to forms subdir * Start to split and move the docs around * Simpler imports * Copyediting * delete overview file * Remove commented out code * remove the custom-forms import * rewrite flex-check as form-check, replace all custom properties * Remove old forms doc * stub out new subpage link section * update migration guide * Update nav, forms overview in page nav, and descriptions * fix check bg position * fix margin-top calculation * rename .custom-select to .form-select * Update validation styles for new checks * add some vertical margin, fix inline checks * fix docs examples * better way to do this contents stuff, redo the toc while i'm at it * page restyle for docs while here * un-callout that, edit text * redo padding on toc * fix toc * start to cleanup checks docs * Rewrite Markdown tables into HTML * Redesign tables, redo their docs * Replace Open Iconic icons with custom Bootstrap icons * Redesign the docs navbar, add a subheader, redo the sidebar * Redesign docs homepage a bit * Simplify table style overrides for docs tables * Simplify docs typography for page titles and reading line length * Stub out icons page * Part of sidebar update, remove migration from nav.yml * Move toc CSS to separate partial * Change appearance of overview page * fix sidebar arrow direction * Add footer to docs layout * Update descriptions * Drop the .form-group class for margin utilities * Remove lingering form-group-margin-bottom var * improve footer spacing * add headings to range page * uncomment form range css * Rename .custom-range to .form-range * Drop unused docs var * Uncomment the comment * Remove unused variable * Fix radio image sizing * Reboot update: reset horizontal ul and ol padding * de-dupe IDs * tweak toc styles * nvm, fix dropdown versions stuff * remove sidebar nav toggle for now * broken html * fix more broken html, move css * scss linting * comment out broken helper docs * scope styles * scope styles * Fixes #25540 and fixes #26407 for v5 only * Update sidebar once more * Match new sidenav order * fix syntax error * Rename custom-file to form-file, update paths, update migration docs for previous changes in #28696 * rename back * fix size and alignment * rename that back too
Diffstat (limited to 'site/content/docs/4.3/forms/layout.md')
-rw-r--r--site/content/docs/4.3/forms/layout.md388
1 files changed, 388 insertions, 0 deletions
diff --git a/site/content/docs/4.3/forms/layout.md b/site/content/docs/4.3/forms/layout.md
new file mode 100644
index 000000000..e9cdda2c1
--- /dev/null
+++ b/site/content/docs/4.3/forms/layout.md
@@ -0,0 +1,388 @@
+---
+layout: docs
+title: Layout
+description: Give your forms some structure—from inline to horizontal to custom grid implementations—with our form layout options.
+group: forms
+toc: true
+---
+
+## Forms
+
+Every group of form fields should reside in a `<form>` element. Bootstrap provides no default styling for the `<form>` element, but there are some powerful browser features that are provided by default.
+
+- New to browser forms? Consider reviewing [the MDN form docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form) for an overview and complete list of available attributes.
+- `<button>`s within a `<form>` default to `type="submit"`, so strive to be specific and always include a `type`.
+- You can disable every form element within a form with the `disabled` attribute on the `<form>`.
+
+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.
+
+## Utilities
+
+[Margin utilities]({{< docsref "/utilities/spacing" >}}) are the easiest way to add some structure to forms. They provide basic grouping of labels, controls, optional help text, and form validation messaging. We recommend sticking to `margin-bottom` utilities, and using a single direction throughout the form for consistency.
+
+Feel free to build your forms however you like, with `<fieldset>`s, `<div>`s, or nearly any other element.
+
+{{< example >}}
+<form>
+ <div class="mb-3">
+ <label for="formGroupExampleInput">Example label</label>
+ <input type="text" class="form-control" id="formGroupExampleInput" placeholder="Example input placeholder">
+ </div>
+ <div class="mb-3">
+ <label for="formGroupExampleInput2">Another label</label>
+ <input type="text" class="form-control" id="formGroupExampleInput2" placeholder="Another input placeholder">
+ </div>
+</form>
+{{< /example >}}
+
+## Form grid
+
+More complex forms can be built using our grid classes. Use these for form layouts that require multiple columns, varied widths, and additional alignment options. **Requires the `$enable-grid-classes` Sass variable to be enabled** (on by default).
+
+{{< example >}}
+<form>
+ <div class="row">
+ <div class="col">
+ <input type="text" class="form-control" placeholder="First name">
+ </div>
+ <div class="col">
+ <input type="text" class="form-control" placeholder="Last name">
+ </div>
+ </div>
+</form>
+{{< /example >}}
+
+## Form row
+
+You may also swap `.row` for `.form-row`, a variation of our standard grid row that overrides the default column gutters for tighter and more compact layouts. **Also requires the `$enable-grid-classes` Sass variable to be enabled** (on by default).
+
+{{< example >}}
+<form>
+ <div class="form-row">
+ <div class="col">
+ <input type="text" class="form-control" placeholder="First name">
+ </div>
+ <div class="col">
+ <input type="text" class="form-control" placeholder="Last name">
+ </div>
+ </div>
+</form>
+{{< /example >}}
+
+More complex layouts can also be created with the grid system.
+
+{{< example >}}
+<form>
+ <div class="form-row">
+ <div class="mb-3 col-md-6">
+ <label for="inputEmail4">Email</label>
+ <input type="email" class="form-control" id="inputEmail4">
+ </div>
+ <div class="mb-3 col-md-6">
+ <label for="inputPassword4">Password</label>
+ <input type="password" class="form-control" id="inputPassword4">
+ </div>
+ </div>
+ <div class="mb-3">
+ <label for="inputAddress">Address</label>
+ <input type="text" class="form-control" id="inputAddress" placeholder="1234 Main St">
+ </div>
+ <div class="mb-3">
+ <label for="inputAddress2">Address 2</label>
+ <input type="text" class="form-control" id="inputAddress2" placeholder="Apartment, studio, or floor">
+ </div>
+ <div class="form-row">
+ <div class="mb-3 col-md-6">
+ <label for="inputCity">City</label>
+ <input type="text" class="form-control" id="inputCity">
+ </div>
+ <div class="mb-3 col-md-4">
+ <label for="inputState">State</label>
+ <select id="inputState" class="form-select">
+ <option selected>Choose...</option>
+ <option>...</option>
+ </select>
+ </div>
+ <div class="mb-3 col-md-2">
+ <label for="inputZip">Zip</label>
+ <input type="text" class="form-control" id="inputZip">
+ </div>
+ </div>
+ <div class="mb-3">
+ <div class="form-check">
+ <input class="form-check-input" type="checkbox" id="gridCheck">
+ <label class="form-check-label" for="gridCheck">
+ Check me out
+ </label>
+ </div>
+ </div>
+ <button type="submit" class="btn btn-primary">Sign in</button>
+</form>
+{{< /example >}}
+
+## Horizontal form
+
+Create horizontal forms with the grid by adding the `.row` class to form groups and using the `.col-*-*` classes to specify the width of your labels and controls. Be sure to add `.col-form-label` to your `<label>`s as well so they're vertically centered with their associated form controls.
+
+At times, you maybe need to use margin or padding utilities to create that perfect alignment you need. For example, we've removed the `padding-top` on our stacked radio inputs label to better align the text baseline.
+
+{{< example >}}
+<form>
+ <div class="mb-3 row">
+ <label for="inputEmail3" class="col-sm-2 col-form-label">Email</label>
+ <div class="col-sm-10">
+ <input type="email" class="form-control" id="inputEmail3">
+ </div>
+ </div>
+ <div class="mb-3 row">
+ <label for="inputPassword3" class="col-sm-2 col-form-label">Password</label>
+ <div class="col-sm-10">
+ <input type="password" class="form-control" id="inputPassword3">
+ </div>
+ </div>
+ <fieldset class="mb-3">
+ <div class="row">
+ <legend class="col-form-label col-sm-2 pt-0">Radios</legend>
+ <div class="col-sm-10">
+ <div class="form-check">
+ <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios1" value="option1" checked>
+ <label class="form-check-label" for="gridRadios1">
+ First radio
+ </label>
+ </div>
+ <div class="form-check">
+ <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios2" value="option2">
+ <label class="form-check-label" for="gridRadios2">
+ Second radio
+ </label>
+ </div>
+ <div class="form-check disabled">
+ <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios3" value="option3" disabled>
+ <label class="form-check-label" for="gridRadios3">
+ Third disabled radio
+ </label>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ <div class="mb-3 row">
+ <div class="col-sm-2">Checkbox</div>
+ <div class="col-sm-10">
+ <div class="form-check">
+ <input class="form-check-input" type="checkbox" id="gridCheck1">
+ <label class="form-check-label" for="gridCheck1">
+ Example checkbox
+ </label>
+ </div>
+ </div>
+ </div>
+ <div class="mb-3 row">
+ <div class="col-sm-10">
+ <button type="submit" class="btn btn-primary">Sign in</button>
+ </div>
+ </div>
+</form>
+{{< /example >}}
+
+### Horizontal form label sizing
+
+Be sure to use `.col-form-label-sm` or `.col-form-label-lg` to your `<label>`s or `<legend>`s to correctly follow the size of `.form-control-lg` and `.form-control-sm`.
+
+{{< example >}}
+<form>
+ <div class="mb-3 row">
+ <label for="colFormLabelSm" class="col-sm-2 col-form-label col-form-label-sm">Email</label>
+ <div class="col-sm-10">
+ <input type="email" class="form-control form-control-sm" id="colFormLabelSm" placeholder="col-form-label-sm">
+ </div>
+ </div>
+ <div class="mb-3 row">
+ <label for="colFormLabel" class="col-sm-2 col-form-label">Email</label>
+ <div class="col-sm-10">
+ <input type="email" class="form-control" id="colFormLabel" placeholder="col-form-label">
+ </div>
+ </div>
+ <div class="mb-3 row">
+ <label for="colFormLabelLg" class="col-sm-2 col-form-label col-form-label-lg">Email</label>
+ <div class="col-sm-10">
+ <input type="email" class="form-control form-control-lg" id="colFormLabelLg" placeholder="col-form-label-lg">
+ </div>
+ </div>
+</form>
+{{< /example >}}
+
+## Column sizing
+
+As shown in the previous examples, our grid system allows you to place any number of `.col`s within a `.row` or `.form-row`. They'll split the available width equally between them. You may also pick a subset of your columns to take up more or less space, while the remaining `.col`s equally split the rest, with specific column classes like `.col-7`.
+
+{{< example >}}
+<form>
+ <div class="form-row">
+ <div class="col-7">
+ <input type="text" class="form-control" placeholder="City">
+ </div>
+ <div class="col">
+ <input type="text" class="form-control" placeholder="State">
+ </div>
+ <div class="col">
+ <input type="text" class="form-control" placeholder="Zip">
+ </div>
+ </div>
+</form>
+{{< /example >}}
+
+## Auto-sizing
+
+The example below uses a flexbox utility to vertically center the contents and changes `.col` to `.col-auto` so that your columns only take up as much space as needed. Put another way, the column sizes itself based on the contents.
+
+{{< example >}}
+<form>
+ <div class="form-row align-items-center">
+ <div class="col-auto">
+ <label class="sr-only" for="inlineFormInput">Name</label>
+ <input type="text" class="form-control mb-2" id="inlineFormInput" placeholder="Jane Doe">
+ </div>
+ <div class="col-auto">
+ <label class="sr-only" for="inlineFormInputGroup">Username</label>
+ <div class="input-group mb-2">
+ <div class="input-group-prepend">
+ <div class="input-group-text">@</div>
+ </div>
+ <input type="text" class="form-control" id="inlineFormInputGroup" placeholder="Username">
+ </div>
+ </div>
+ <div class="col-auto">
+ <div class="form-check mb-2">
+ <input class="form-check-input" type="checkbox" id="autoSizingCheck">
+ <label class="form-check-label" for="autoSizingCheck">
+ Remember me
+ </label>
+ </div>
+ </div>
+ <div class="col-auto">
+ <button type="submit" class="btn btn-primary mb-2">Submit</button>
+ </div>
+ </div>
+</form>
+{{< /example >}}
+
+You can then remix that once again with size-specific column classes.
+
+{{< example >}}
+<form>
+ <div class="form-row align-items-center">
+ <div class="col-sm-3 my-1">
+ <label class="sr-only" for="inlineFormInputName">Name</label>
+ <input type="text" class="form-control" id="inlineFormInputName" placeholder="Jane Doe">
+ </div>
+ <div class="col-sm-3 my-1">
+ <label class="sr-only" for="inlineFormInputGroupUsername">Username</label>
+ <div class="input-group">
+ <div class="input-group-prepend">
+ <div class="input-group-text">@</div>
+ </div>
+ <input type="text" class="form-control" id="inlineFormInputGroupUsername" placeholder="Username">
+ </div>
+ </div>
+ <div class="col-auto my-1">
+ <div class="form-check">
+ <input class="form-check-input" type="checkbox" id="autoSizingCheck2">
+ <label class="form-check-label" for="autoSizingCheck2">
+ Remember me
+ </label>
+ </div>
+ </div>
+ <div class="col-auto my-1">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ </div>
+ </div>
+</form>
+{{< /example >}}
+
+And of course [custom form controls](#custom-forms) are supported.
+
+{{< example >}}
+<form>
+ <div class="form-row align-items-center">
+ <div class="col-auto my-1">
+ <label class="mr-sm-2 sr-only" for="inlineFormSelect">Preference</label>
+ <select class="form-select mr-sm-2" id="inlineFormSelect">
+ <option selected>Choose...</option>
+ <option value="1">One</option>
+ <option value="2">Two</option>
+ <option value="3">Three</option>
+ </select>
+ </div>
+ <div class="col-auto my-1">
+ <div class="form-check mr-sm-2">
+ <input type="checkbox" class="form-check-input" id="formCheckAutosizing">
+ <label class="form-check-label" for="formCheckAutosizing">Remember my preference</label>
+ </div>
+ </div>
+ <div class="col-auto my-1">
+ <button type="submit" class="btn btn-primary">Submit</button>
+ </div>
+ </div>
+</form>
+{{< /example >}}
+
+## Inline forms
+
+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 vary slightly from their default states.
+
+- Controls are `display: flex`, collapsing any HTML white space and allowing you to provide alignment control with [spacing]({{< docsref "/utilities/spacing" >}}) and [flexbox]({{< docsref "/utilities/flex" >}}) utilities.
+- Controls and input groups receive `width: auto` to override the Bootstrap default `width: 100%`.
+- Controls **only appear inline in viewports that are at least 576px wide** to account for narrow viewports on mobile devices.
+
+You may need to manually address the width and alignment of individual form controls with [spacing utilities]({{< docsref "/utilities/spacing" >}}) (as shown below). Lastly, be sure to always include a `<label>` with each form control, even if you need to hide it from non-screenreader visitors with `.sr-only`.
+
+{{< example >}}
+<form class="form-inline">
+ <label class="sr-only" for="inlineFormInputName2">Name</label>
+ <input type="text" class="form-control mb-2 mr-sm-2" id="inlineFormInputName2" placeholder="Jane Doe">
+
+ <label class="sr-only" for="inlineFormInputGroupUsername2">Username</label>
+ <div class="input-group mb-2 mr-sm-2">
+ <div class="input-group-prepend">
+ <div class="input-group-text">@</div>
+ </div>
+ <input type="text" class="form-control" id="inlineFormInputGroupUsername2" placeholder="Username">
+ </div>
+
+ <div class="form-check mb-2 mr-sm-2">
+ <input class="form-check-input" type="checkbox" id="inlineFormCheck">
+ <label class="form-check-label" for="inlineFormCheck">
+ Remember me
+ </label>
+ </div>
+
+ <button type="submit" class="btn btn-primary mb-2">Submit</button>
+</form>
+{{< /example >}}
+
+Custom form controls and selects are also supported.
+
+{{< example >}}
+<form class="form-inline">
+ <label class="my-1 mr-2" for="inlineFormSelectPref">Preference</label>
+ <select class="form-select my-1 mr-sm-2" id="inlineFormSelectPref">
+ <option selected>Choose...</option>
+ <option value="1">One</option>
+ <option value="2">Two</option>
+ <option value="3">Three</option>
+ </select>
+
+ <div class="form-check my-1 mr-sm-2">
+ <input type="checkbox" class="form-check-input" id="formCheckInline">
+ <label class="form-check-label" for="formCheckInline">Remember my preference</label>
+ </div>
+
+ <button type="submit" class="btn btn-primary my-1">Submit</button>
+</form>
+{{< /example >}}
+
+{{< callout warning >}}
+### Alternatives to hidden labels
+
+Assistive technologies such as screen readers will have trouble with your forms if you don't include a label for every input. For these inline forms, you can hide the labels using the `.sr-only` class. There are further alternative methods of providing a label for assistive technologies, such as the `aria-label`, `aria-labelledby` or `title` attribute. If none of these are present, assistive technologies may resort to using the `placeholder` attribute, if present, but note that use of `placeholder` as a replacement for other labelling methods is not advised.
+{{< /callout >}}