Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v4 grid tweaks #22271

Merged
merged 12 commits into from
Mar 26, 2017
34 changes: 34 additions & 0 deletions docs/assets/scss/_component-examples.scss
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,40 @@
border: 1px solid rgba($bd-purple, .15);
}

// Grid mixins
.example-container {
width: 800px;
@include make-container();
}

.example-row {
@include make-row();
}

.example-content-main {
@include make-col-ready();

@include media-breakpoint-up(sm) {
@include make-col(6);
}

@include media-breakpoint-up(lg) {
@include make-col(8);
}
}

.example-content-secondary {
@include make-col-ready();

@include media-breakpoint-up(sm) {
@include make-col(6);
}

@include media-breakpoint-up(lg) {
@include make-col(4);
}
}


//
// Container illustrations
Expand Down
42 changes: 22 additions & 20 deletions docs/components/forms.md
Original file line number Diff line number Diff line change
Expand Up @@ -350,26 +350,28 @@ Be sure to add `.col-form-label` to your `<label>`s as well so they're verticall
<input type="password" class="form-control" id="inputPassword3" placeholder="Password">
</div>
</div>
<fieldset class="form-group row">
<legend class="col-form-legend col-sm-2">Radios</legend>
<div class="col-sm-10">
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios1" value="option1" checked>
Option one is this and that&mdash;be sure to include why it's great
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios2" value="option2">
Option two can be something else and selecting it will deselect option one
</label>
</div>
<div class="form-check disabled">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios3" value="option3" disabled>
Option three is disabled
</label>
<fieldset class="form-group">
<div class="row">
<legend class="col-form-legend col-sm-2">Radios</legend>
<div class="col-sm-10">
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios1" value="option1" checked>
Option one is this and that&mdash;be sure to include why it's great
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios2" value="option2">
Option two can be something else and selecting it will deselect option one
</label>
</div>
<div class="form-check disabled">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios3" value="option3" disabled>
Option three is disabled
</label>
</div>
</div>
</div>
</fieldset>
Expand Down
122 changes: 50 additions & 72 deletions docs/layout/grid.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,11 +130,11 @@ See how aspects of the Bootstrap grid system work across multiple devices with a

## Auto-layout columns

Utilize breakpoint-specific column classes for equal-width columns. Add any number of unit-less classes for each breakpoint you need and every column will be the same width.
Utilize breakpoint-specific column classes for easy column sizing without an explicit numbered class like `.col-sm-6`.

### Equal-width

For example, here are two grid layouts that apply to every device and viewport, from `xs` to `xl`.
For example, here are two grid layouts that apply to every device and viewport, from `xs` to `xl`. Add any number of unit-less classes for each breakpoint you need and every column will be the same width.

<div class="bd-example-row">
{% example html %}
Expand Down Expand Up @@ -162,9 +162,27 @@ For example, here are two grid layouts that apply to every device and viewport,
{% endexample %}
</div>

Equal-width columns can be broken into multiple lines, but there is a [Safari flexbox bug](https://github.com/philipwalton/flexbugs#11-min-and-max-size-declarations-are-ignored-when-wrapping-flex-items) that prevents this from working without an explicit `flex-basis` or `border`. Our example works thanks to the `border` being set; you can do the same with `.col { border: 1px solid transparent; }`. Alternatively, you can set the flex-basis to the width of the column (e.g., `.col { flex: 1 0 50%; }`).

Both these fixes have been documented in a [reduced test case outside Bootstrap](https://output.jsbin.com/micohor).

<div class="bd-example-row">
{% example html %}
<div class="container">
<div class="row">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="w-100"></div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
</div>
{% endexample %}
</div>

### Setting one column width

Auto-layout for flexbox grid columns also means you can set the width of one column and the others will automatically resize around it. You may use predefined grid classes (as shown below), grid mixins, or inline widths. Note that the other columns will resize no matter the width of the center column.
Auto-layout for flexbox grid columns also means you can set the width of one column and have the sibling columns automatically resize around it. You may use predefined grid classes (as shown below), grid mixins, or inline widths. Note that the other columns will resize no matter the width of the center column.

<div class="bd-example-row">
{% example html %}
Expand Down Expand Up @@ -197,7 +215,7 @@ Auto-layout for flexbox grid columns also means you can set the width of one col

### Variable width content

Using the `col-{breakpoint}-auto` classes, columns can size itself based on the natural width of its content. This is super handy with single line content like inputs, numbers, etc. This, in conjunction with [horizontal alignment](#horizontal-alignment) classes, is very useful for centering layouts with uneven column sizes as viewport width changes.
Use `col-{breakpoint}-auto` classes to size columns based on the natural width of their content.

<div class="bd-example-row">
{% example html %}
Expand All @@ -206,7 +224,7 @@ Using the `col-{breakpoint}-auto` classes, columns can size itself based on the
<div class="col col-lg-2">
1 of 3
</div>
<div class="col-12 col-md-auto">
<div class="col-md-auto">
Variable width content
</div>
<div class="col col-lg-2">
Expand All @@ -217,7 +235,7 @@ Using the `col-{breakpoint}-auto` classes, columns can size itself based on the
<div class="col">
1 of 3
</div>
<div class="col-12 col-md-auto">
<div class="col-md-auto">
Variable width content
</div>
<div class="col col-lg-2">
Expand Down Expand Up @@ -630,104 +648,63 @@ Mixins are used in conjunction with the grid variables to generate semantic CSS

{% highlight scss %}
// Creates a wrapper for a series of columns
@mixin make-row($gutters: $grid-gutter-widths) {
display: flex;
flex-wrap: wrap;

@each $breakpoint in map-keys($gutters) {
@include media-breakpoint-up($breakpoint) {
$gutter: map-get($gutters, $breakpoint);
margin-right: ($gutter / -2);
margin-left: ($gutter / -2);
}
}
}
@include make-row($gutters: $grid-gutter-widths);

// Make the element grid-ready (applying everything but the width)
@mixin make-col-ready($gutters: $grid-gutter-widths) {
position: relative;
// Prevent columns from becoming too narrow when at smaller grid tiers by
// always setting `width: 100%;`. This works because we use `flex` values
// later on to override this initial width.
width: 100%;
min-height: 1px; // Prevent collapsing

@each $breakpoint in map-keys($gutters) {
@include media-breakpoint-up($breakpoint) {
$gutter: map-get($gutters, $breakpoint);
padding-right: ($gutter / 2);
padding-left: ($gutter / 2);
}
}
}

@mixin make-col($size, $columns: $grid-columns) {
flex: 0 0 percentage($size / $columns);
width: percentage($size / $columns);
// Add a `max-width` to ensure content within each column does not blow out
// the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
// do not appear to require this.
max-width: percentage($size / $columns);
}
@include make-col-ready($gutters: $grid-gutter-widths);
@include make-col($size, $columns: $grid-columns);

// Get fancy by offsetting, or changing the sort order
@mixin make-col-offset($size, $columns: $grid-columns) {
margin-left: percentage($size / $columns);
}

@mixin make-col-push($size, $columns: $grid-columns) {
left: if($size > 0, percentage($size / $columns), auto);
}

@mixin make-col-pull($size, $columns: $grid-columns) {
right: if($size > 0, percentage($size / $columns), auto);
}
@include make-col-offset($size, $columns: $grid-columns);
@include make-col-push($size, $columns: $grid-columns);
@include make-col-pull($size, $columns: $grid-columns);
{% endhighlight %}

### Example usage

You can modify the variables to your own custom values, or just use the mixins with their default values. Here's an example of using the default settings to create a two-column layout with a gap between.

See it in action in <a href="https://jsbin.com/ruxona/edit?html,output">this rendered example</a>.

{% highlight scss %}
.container {
max-width: 60em;
.example-container {
width: 800px;
@include make-container();
}
.row {

.example-row {
@include make-row();
}
.content-main {

.example-content-main {
@include make-col-ready();

@media (max-width: 32em) {
@include media-breakpoint-up(sm) {
@include make-col(6);
}
@media (min-width: 32.1em) {
@include media-breakpoint-up(lg) {
@include make-col(8);
}
}
.content-secondary {

.example-content-secondary {
@include make-col-ready();

@media (max-width: 32em) {
@include media-breakpoint-up(sm) {
@include make-col(6);
}
@media (min-width: 32.1em) {
@include media-breakpoint-up(lg) {
@include make-col(4);
}
}
{% endhighlight %}

{% highlight html %}
<div class="container">
<div class="row">
<div class="content-main">...</div>
<div class="content-secondary">...</div>
{% example html %}
<div class="example-container">
<div class="example-row">
<div class="example-content-main">Main content</div>
<div class="example-content-secondary">Secondary content</div>
</div>
</div>
{% endhighlight %}
{% endexample %}

## Customizing the grid

Expand All @@ -751,10 +728,11 @@ $grid-gutter-widths: (

### Grid tiers

Moving beyond the columns themselves, you may also customize the number of grid tiers. If you wanted just three grid tiers, you'd update the `$grid-breakpoints` and `$container-max-widths` to something like this:
Moving beyond the columns themselves, you may also customize the number of grid tiers. If you wanted just four grid tiers, you'd update the `$grid-breakpoints` and `$container-max-widths` to something like this:

{% highlight scss %}
$grid-breakpoints: (
xs: 0,
sm: 480px,
md: 768px,
lg: 1024px
Expand Down
14 changes: 9 additions & 5 deletions scss/mixins/_breakpoints.scss
Original file line number Diff line number Diff line change
Expand Up @@ -78,18 +78,22 @@
// Media that spans multiple breakpoint widths.
// Makes the @content apply between the min and max breakpoints
@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {
@include media-breakpoint-up($lower, $breakpoints) {
@include media-breakpoint-down($upper, $breakpoints) {
@content;
}
$min: breakpoint-max($lower, $breakpoints);
$max: breakpoint-max($upper, $breakpoints);

@media (min-width: $min) and (max-width: $max) {
@content;
}
}

// Media between the breakpoint's minimum and maximum widths.
// No minimum for the smallest breakpoint, and no maximum for the largest one.
// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
@include media-breakpoint-between($name, $name, $breakpoints) {
$min: breakpoint-min($name, $breakpoints);
$max: breakpoint-max($name, $breakpoints);

@media (min-width: $min) and (max-width: $max) {
@content;
}
}
3 changes: 2 additions & 1 deletion scss/mixins/_grid-framework.scss
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
@extend %grid-column;
}
}
.col#{$infix} {
.col#{$infix},
.col#{$infix}-auto {
@extend %grid-column;
}

Expand Down
1 change: 0 additions & 1 deletion scss/mixins/_grid.scss
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// Generate semantic grid columns with these mixins.

@mixin make-container($gutters: $grid-gutter-widths) {
position: relative;
margin-right: auto;
margin-left: auto;

Expand Down