Created
January 30, 2020 18:42
-
-
Save adamelliotfields/f8d53fe174c623759e38656c55945d83 to your computer and use it in GitHub Desktop.
Bootstrap 4 Flex Grid
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! | |
* Bootstrap Grid v4.4.1 (https://getbootstrap.com/) | |
* Copyright 2011-2019 The Bootstrap Authors | |
* Copyright 2011-2019 Twitter, Inc. | |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | |
*/ | |
$grid-columns: 12 !default; | |
$grid-row-columns: 6 !default; | |
$grid-gutter-width: 30px !default; | |
$grid-breakpoints: ( | |
xs: 0, | |
sm: 576px, | |
md: 768px, | |
lg: 992px, | |
xl: 1200px | |
) !default; | |
$container-padding-x: $grid-gutter-width / 2 !default; | |
$container-max-widths: ( | |
sm: 540px, | |
md: 720px, | |
lg: 960px, | |
xl: 1140px | |
) !default; | |
html { | |
box-sizing: border-box; | |
-ms-overflow-style: scrollbar; | |
} | |
*, | |
*::before, | |
*::after { | |
box-sizing: inherit; | |
} | |
// Minimum breakpoint width. Null for the smallest (first) breakpoint. | |
@function breakpoint-min($name, $breakpoints: $grid-breakpoints) { | |
$min: map-get($breakpoints, $name); | |
@return if($min != 0, $min, null); | |
} | |
// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. | |
@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) { | |
@return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}"); | |
} | |
// Media of at least the minimum breakpoint width. No query for the smallest breakpoint. | |
// Makes the @content apply to the given breakpoint and wider. | |
@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) { | |
$min: breakpoint-min($name, $breakpoints); | |
@if $min { | |
@media (min-width: $min) { | |
@content; | |
} | |
} @else { | |
@content; | |
} | |
} | |
@mixin make-container($padding-x: $container-padding-x) { | |
width: 100%; | |
padding-right: $padding-x; | |
padding-left: $padding-x; | |
margin-right: auto; | |
margin-left: auto; | |
} | |
// For each breakpoint, define the maximum width of the container in a media query | |
@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) { | |
@each $breakpoint, $container-max-width in $max-widths { | |
@include media-breakpoint-up($breakpoint, $breakpoints) { | |
max-width: $container-max-width; | |
} | |
} | |
} | |
@mixin make-row($gutter: $grid-gutter-width) { | |
display: flex; | |
flex-wrap: wrap; | |
margin-right: -$gutter / 2; | |
margin-left: -$gutter / 2; | |
} | |
// Specify on a parent element(e.g., .row) to force immediate children into N number of columns. | |
// Supports wrapping to new lines, but does not do a Masonry style grid. | |
@mixin row-cols($count) { | |
& > * { | |
flex: 0 0 100% / $count; | |
max-width: 100% / $count; | |
} | |
} | |
@mixin make-col-auto() { | |
flex: 0 0 auto; | |
width: auto; | |
max-width: 100%; // Reset earlier grid tiers | |
} | |
@mixin make-col($size, $columns: $grid-columns) { | |
flex: 0 0 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); | |
} | |
@mixin make-col-offset($size, $columns: $grid-columns) { | |
$num: $size / $columns; | |
margin-left: if($num == 0, 0, percentage($num)); | |
} | |
// Used only by Bootstrap to generate the correct number of grid classes given any value of `$grid-columns`. | |
@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) { | |
// Common properties for all breakpoints | |
%grid-column { | |
position: relative; | |
width: 100%; | |
padding-right: $gutter / 2; | |
padding-left: $gutter / 2; | |
} | |
@each $breakpoint in map-keys($breakpoints) { | |
$infix: breakpoint-infix($breakpoint, $breakpoints); | |
// Allow columns to stretch full width below their breakpoints | |
@for $i from 1 through $columns { | |
.col#{$infix}-#{$i} { | |
@extend %grid-column; | |
} | |
} | |
.col#{$infix}, | |
.col#{$infix}-auto { | |
@extend %grid-column; | |
} | |
@include media-breakpoint-up($breakpoint, $breakpoints) { | |
// Provide basic `.col-{bp}` classes for equal-width flexbox columns | |
.col#{$infix} { | |
flex-basis: 0; | |
flex-grow: 1; | |
min-width: 0; // See https://github.com/twbs/bootstrap/issues/25410 | |
max-width: 100%; | |
} | |
@for $i from 1 through $grid-row-columns { | |
.row-cols#{$infix}-#{$i} { | |
@include row-cols($i); | |
} | |
} | |
.col#{$infix}-auto { | |
@include make-col-auto(); | |
} | |
@for $i from 1 through $columns { | |
.col#{$infix}-#{$i} { | |
@include make-col($i, $columns); | |
} | |
} | |
// `$columns - 1` because offsetting by the width of an entire row isn't possible | |
@for $i from 0 through ($columns - 1) { | |
@if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0 | |
.offset#{$infix}-#{$i} { | |
@include make-col-offset($i, $columns); | |
} | |
} | |
} | |
} | |
} | |
} | |
// Single container class with breakpoint max-widths | |
.container { | |
@include make-container(); | |
@include make-container-max-widths(); | |
} | |
// 100% wide container at all breakpoints | |
.container-fluid { | |
@include make-container(); | |
} | |
// Responsive containers that are 100% wide until a breakpoint | |
@each $breakpoint, $container-max-width in $container-max-widths { | |
.container-#{$breakpoint} { | |
@extend .container-fluid; | |
} | |
@include media-breakpoint-up($breakpoint, $grid-breakpoints) { | |
%responsive-container-#{$breakpoint} { | |
max-width: $container-max-width; | |
} | |
// Extend each breakpoint which is smaller or equal to the current breakpoint | |
$extend-breakpoint: true; | |
@each $name, $width in $grid-breakpoints { | |
@if ($extend-breakpoint) { | |
.container#{breakpoint-infix($name, $grid-breakpoints)} { | |
@extend %responsive-container-#{$breakpoint}; | |
} | |
// Once the current breakpoint is reached, stop extending | |
@if ($breakpoint == $name) { | |
$extend-breakpoint: false; | |
} | |
} | |
} | |
} | |
} | |
.row { | |
@include make-row(); | |
} | |
// Remove the negative margin from default .row, then the horizontal padding from all immediate children columns (to prevent runaway style inheritance). | |
.no-gutters { | |
margin-right: 0; | |
margin-left: 0; | |
> .col, | |
> [class*="col-"] { | |
padding-right: 0; | |
padding-left: 0; | |
} | |
} | |
// Common styles for small and large grid columns | |
@include make-grid-columns(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment