本篇文章给大家介绍一下BootStrap实现栅格布局的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
|
本篇文章给大家介绍一下BootStrap实现栅格布局的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
【相关推荐:《bootstrap教程》】 1. 基本点
这是最基本的一点,将盒子模型设置成边框盒子.这样 *,
*::before,
*::after {
box-size: border-box;
}知识前置
本文栅格实现参考 bootstrap 源码实现 2. Container一般来说作为应用最顶层的容器分为两种:
响应式容器会根据屏幕宽度的不同,根据媒体查询使用 container 基本数据
断点: $grid-breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px
);不同断点对应的容器宽度: $container-max-widths: (
sm: 540px, // min-width: 576px
md: 720px, // min-width: 768px
lg: 960px, // min-width: 992px
xl: 1140px // min-width: 1200px
);实际上断点到底取在哪里,可以随意自定义。这里只是引用的 bootstrap 的规范而已。 2.1 固定容器实现固定容器实现很简单。无非就是将容器的宽度设置为 /**
* 基本容器的样式
* 宽度 100%
* 有半个槽宽的内边距
* 水平居中
* @param $gutter 槽宽, 如果只是想要一个普通的容器。可以将参数槽宽设置为 0
* 默认值是 $gird-gutter-width
*/
@mixin make-container($gutter: $grid-gutter-width) {
width: 100%;
padding-right: $gutter / 2;
padding-left: $gutter / 2;
margin-right: auto;
margin-left: auto;
}槽宽这个概念如果用过 bootstrap 应该能够理解。如果不理解可以跳到本文底部,有详细介绍。 当屏幕宽度小于 .container,
.container-sm,
.container-md,
.container-lg,
.container-xl,
.container-fluid {
@include make-container();
}2.2 响应式容器实现要实现响应式容器,就是要根据不同的断点分别给不同的容器设置媒体查询,以 根据规范所示:
分析一下,就可以发现。每个断点处需要设置媒体查询的容器数刚好在 使用 sass 描述如下: @each $breakpoint, $container-max-width in $container-max-widths {
/**
* .container
* .container-sm
* .container-md
* .container-lg
* .container-xl
* 按照断点设置媒体查询
* 其实就是通过 max-width 控制容器到底有多宽
*/
@include media-breakpoint-up($breakpoint, $grid-breakpoints) {
// 每个断点的屏幕最大 width
%responsitive-#{$breakpoint} {
max-width: $container-max-width;
}
// 用于确定哪些容器需要设置媒体查询的 flag
$extend-breakpoint: true;
@each $name, $width in $grid-breakpoints {
@if $extend-breakpoint {
.container#{breakpoint-infix($name)} {
@extend %responsitive-#{$breakpoint};
}
}
@if $name == $breakpoint {
$extend-breakpoint: false;
}
}
}
}其中两个辅助函数 /**
* 根据断点名称取得对应的断点 width.
* 注意:如果是 xs 断点,返回的是 null
* @param $name: 传入的 map key
* @param $breakpoints-map: 断点 map
* @return: 断点对应的 mind-width
*/
@function breakpoint-min($name, $breakpoints-map: $grid-breakpoints) {
$min: map-get($map: $breakpoints-map, $key: $name);
@return if($min != 0, $min, null);
}
/**
* 根据断点名称作为 key 查询map
* 若是 map 中 key对应的 value 不为 0 则生成后缀名
* 否则返回空串
*
* @param $name: 传入的 map key
* @param $breakpoints-map: 断点 map
* @return: 断点对应的后缀名 格式 '-sm'
*/
@function breakpoint-infix($name, $breakpoints-map: $grid-breakpoints) {
@return if(breakpoint-min($name) != null, '-#{$name}', '');
}辅助 mixin /**
* 根据 $name 作为 key 查询 $breakpoints-map 中对应的断点值
* 如果断点值存在,则对相应内容设置媒体查询
* 如果断点值不存在,则将混合的内容原样输出
*
* @param $name 断点名称
* @param $breakpoints-map 保存断点的 map
*/
@mixin media-breakpoint-up($name, $breakpoints-map: $grid-breakpoints) {
$min: breakpoint-min($name, $breakpoints-map);
@if $min {
@media (min-width: $min) {
@content;
}
}@else {
@content;
}
}3. Row栅格布局主要就是围绕 行其实就是一个固定的容器,所以样式也很简单。 /**
* 行基础样式
* 开启 flex 布局
* 允许多行容器
* 左右有半个槽宽的负外边距
*
* @param $gutter 槽宽
*/
@mixin make-row($gutter: $grid-gutter-width) {
display: flex;
flex-wrap: wrap;
margin-right: -$gutter / 2;
margin-left: -$gutter / 2;
}// 行
.row {
@include make-row();
}4. Columncolumn 是栅格布局中最重要的部分,同时也是最复杂的一部分。 有多种列可供使用:
如果是在小屏幕下,我们通常不会让一行有很多列,通常一行都只有一列。所以根据不同的屏幕断点,bootstrap 还提供了响应式列。
语义是,当屏幕大于等于断点对应宽度时,呈现列的语义形式。当小于断点宽度时,所有的列都退化成 4.1 列基础样式所有列的最基础的样式: /**
* 列基础样式
* 开启相对定位,作为列中内容绝对定位的参考点
* width 为 100%
* 左右有半个槽宽的外边距
*/
%grid-column {
position: relative;
width: 100%;
padding-left: $gutter / 2;
padding-right: $gutter / 2;
}这个样式用于当屏幕小于对应断点的时候,列的样式进行退化 4.2 设置 .col, .col-${i}, .col-auto 的基础样式$infix: breakpoint-infix($breakpoint, $breakpoints);
// .col-*-i 系列设置基础样式
@if $columns > 0 {
@for $i from 1 through $columns {
.col#{$infix}-#{$i} {
@extend %grid-column;
}
}
}
// .col-*, -col-*-auto 系列设置列基础样式
.col#{$infix},
.col#{$infix}-auto {
@extend %grid-column;
}我们这里以 执行完之后, 之后就开始设置媒体查询,以确定不同的列的样式。 因为此时的例子 4.3 列样式设置等宽列样式设置 即 .col-sm {
flex-basis: 0;
flex-grow: 1;
max-width: 100%;
}
这个是 bootstrap 的特色类,这个类应用在 // 设置 .row-cols-*-i 系列 的样式
@if $grid-row-columns > 0 {
@for $i from 1 through $grid-row-columns {
.row-cols-sm-#{$i} {
@include row-cols($i);
}
}
}辅助 mixin /**
* 设置 .row-col-*-i 系列下的列样式
* flex: 0 0 100% / $count,即是一个不会放大不会缩小,永远按 i 的值等比例平分行的列
*
* @param $count 要平分的列数
*/
@mixin row-cols($count) {
& > * {
flex: 0 0 100% / $count;
max-width: 100% / $count;
}
}即 严格的说,当使用对应断点的 可变宽度弹性列样式设置 // 设置 .col-*-auto 的样式
.col-sm-auto {
@include make-col-auto();
}辅助 mixin /**
* 设置 .col-*-auto 的样式
* 默认情况下是一个不会放大不会缩小,宽度由 flex item 宽度决定的盒子
*/
@mixin make-col-auto() {
flex: 0 0 auto;
width: auto;
max-width: 100%;
}设置比例列样式 // 设置 .col-*-i 系列的样式
@if $columns > 0 {
@for $i from 1 through $columns {
.col-sm-#{$i} {
@include make-col($i, $columns);
}
}
}辅助 mixin /**
* .col-*-i 的样式
*
* @param $size 占据的列数
* @param $columns: 总可用列数
*/
@mixin make-col($size, $columns: $grid-columns) {
flex: 0 0 percentage($size / $columns);
max-width: percentage($size / $columns);
}这里就是按比例分配,如果 flex 布局中使用 // 列排序相关
.order-sm-first {
order: -1;
}
.order-sm-last {
order: $columns + 1;
}
// 一行最多12列,也就是说从 -1 开始编号就可以安排完整行所有的列排列顺序
@for $i from 0 through $columns {
.order-sm-#{$i} {
order: $i;
}
}只要明白浏览器视觉排序是按照 列偏移 实际需求中,总是会有列偏移的需求,这里是通过 // 设置列偏移
@if $columns > 0 {
@for $i from 0 through ($columns - 1) {
@if not ($infix == '' and $i == 0) {
.offset#{$infix}-#{$i} {
@include make-col-offset($i, $columns);
}
}
}
}辅助 mixin @mixin make-col-offset($size, $columns: $grid-columns) {
$num: $size / $columns;
margin-left: if($num == 0, 0, percentage($num));
}整个创建响应式列的流程就是这样,这里只是举了断点为 5. 槽槽(gutter) 是两列之间的间距。槽的数量是列数量 - 1. 槽公式: 设栅格行宽度为 w, 列宽度为 c(这里的列宽指内容区域), 槽宽度为 g, 列数为 n 则 w = n * c + (n - 1) * g bootstarp 的设计是这样的:
6. 完整源码完整源码移步 git 仓库(不是 bootstrap 完整版本,是个人重写加了注释的仅具有 grid 功能的版本。内容不多) bootstrap-grid地址:https://github.com/IliyaRin/bootstrap-grid 更多编程相关知识,请访问:编程入门!! 以上就是浅谈BootStrap实现栅格布局的方法的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
