• CSS - 响应式布局(二)响应式栅格系统


    目录

    响应式栅格系统

    栅格

    栅格系统

    响应式栅格系统

    BootStrap响应式栅格系统

    简单说明

    利用SCSS实现BootStrap的响应式栅格系统


    响应式栅格系统

    栅格

    在弄清楚响应式栅格系统前,我们需要先弄明白什么是栅格?

    栅格,也可以叫做网格,是一种最常用的网页布局方式,采用栅格布局的网页最明显的特点就是:网页呈现网格化,卡片化。

    那么什么是网格化、卡片化的网页呢?请看下面几个例子:

    下面例子中,每个红框就是一个卡片,或者说是网格中的一个单元格

    采用栅格布局,给人的感觉就是条理清晰,泾渭分明,非常适合做信息分类展示。

    栅格布局是一种典型的行列式布局,即有行有列,而实现有行有列的布局,最好的方式就是grid布局

    CSS - 网格布局(grid)_伏城之外的博客-CSDN博客_css grid 网格布局

    虽然flex布局也能实现换行布局,但是flex布局本质是一维布局,它无法简单地实现二维布局中单元格的跨行跨列。

    栅格系统

    我认为栅格和栅格系统还是有区别的,区别如下面代码:

    栅格:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    7. <title>Documenttitle>
    8. <style>
    9. div {
    10. box-sizing: border-box;
    11. border: 1px solid black;
    12. }
    13. /* 栅格 */
    14. .grid {
    15. display: grid;
    16. grid-template-columns: repeat(12, 1fr);
    17. grid-template-rows: 1fr;
    18. }
    19. .grid > div:nth-child(1) {
    20. grid-column: span 3;
    21. }
    22. .grid > div:nth-child(2) {
    23. grid-column: span 3;
    24. }
    25. .grid > div:nth-child(3) {
    26. grid-column: span 6;
    27. }
    28. style>
    29. head>
    30. <body>
    31. <div class="grid">
    32. <div>1div>
    33. <div>2div>
    34. <div>3div>
    35. div>
    36. body>
    37. html>

    栅格系统:

    1. /* grid.css */
    2. .row {
    3. display: grid;
    4. grid-template-columns: repeat(12, 1fr);
    5. grid-template-rows: 1fr;
    6. }
    7. .col-1 {
    8. grid-column: span 1;
    9. }
    10. .col-2 {
    11. grid-column: span 2;
    12. }
    13. .col-3 {
    14. grid-column: span 3;
    15. }
    16. .col-4 {
    17. grid-column: span 4;
    18. }
    19. .col-5 {
    20. grid-column: span 5;
    21. }
    22. .col-6 {
    23. grid-column: span 6;
    24. }
    25. .col-7 {
    26. grid-column: span 7;
    27. }
    28. .col-8 {
    29. grid-column: span 8;
    30. }
    31. .col-9 {
    32. grid-column: span 9;
    33. }
    34. .col-10 {
    35. grid-column: span 10;
    36. }
    37. .col-11 {
    38. grid-column: span 11;
    39. }
    40. .col-12 {
    41. grid-column: span 12;
    42. }
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    7. <title>Documenttitle>
    8. <link rel="stylesheet" href="./grid.css">
    9. <style>
    10. div {
    11. box-sizing: border-box;
    12. border: 1px solid black;
    13. }
    14. style>
    15. head>
    16. <body>
    17. <div class="row">
    18. <div class="col-3">1div>
    19. <div class="col-3">2div>
    20. <div class="col-6">3div>
    21. div>
    22. body>
    23. html>

    我们可以发现栅格系统其实就是将常用的栅格布局归纳整理为 样式类,这样的好处是,当用户需要进行栅格布局时,只要引入栅格系统,使用对应的栅格系统样式类即可完成栅格布局,而不是去写底层栅格布局样式。 

    响应式栅格系统

    前面学习响应式布局时

    CSS - 响应式布局(一)媒体查询_伏城之外的博客-CSDN博客

    我们给响应式布局下过定义:

    所谓响应式布局,即监听浏览器视觉视口宽度的变化,当浏览器视觉视口宽度变化到一定程度或一定范围内时,网页的布局就改变,即网页采用另一套样式。

    而实现响应式布局最好的方式就是:媒体查询。

    因此,响应式栅格系统的含义就是:针对不同范围的视口宽度,定制多套栅格系统样式,举个例子,非响应式栅格系统中只需要.col-*类,而响应式栅格系统需要有.col-xs-*、.col-sm-*、.col-md-*、.col-lg-*多个类。

    BootStrap响应式栅格系统

    简单说明

    说到响应式布局,就不得不提大名鼎鼎的BootStrap,而说到BootStrap,就不得不提响应式栅格系统。响应式栅格系统是BootStrap的核心,可以说,不学BootStrap的响应式栅格系统,等于没学BootStrap。

    全局 CSS 样式 · Bootstrap v3 中文文档 | Bootstrap 中文网 (bootcss.com)

    我们可以通过上面的网址来学习BootStrap响应式栅格系统的使用,主要学习点就是:

    • .container和.container-fluid
    • .row
    • .col-?-*
    • .row-no-gutters
    • 列偏移:.col-?-offset-
    • 列排序:.col-?-push-*、.col-?-pull-* 
    • 嵌套列

    【?可以是 xs、sm、md、lg, * 可以是 1~12中任意数字】

    利用SCSS实现BootStrap的响应式栅格系统

    由于BootStrap3采用的是浮动布局(列浮动排于一行)实现的栅格系统,因此存在诸多问题,

    比如需要大量使用伪元素进行清除浮动

    比如同一行中各列的高不相等

    而如果我们使用grid布局,将不存在这些问题,并且在实现上将更加简单,但是grid布局实现响应式栅格系统和BootStrap在细节上会有差别:

    • 首先是列间距,BootStrap3采用的是列元素加左右15px固定宽度的padding,这样列与列之间就有30px的间距,而.container容器本身也有左右15px固定宽度的padding,因此两端的列与容器之间也应该有30px的间距,但是为了美观,.row加了左右-15px的margin,来让两端列的15px padding与容器的左右15px padding重合。这种实现是较为复杂的,且列元素本身的padding将不能清晰改动,否则会影响美观。而基于grid布局的栅格容器,本身就有column-gap样式来控制列间距,且只会产生列与列之间的间距,而不会产生列与容器之间的间距,另外column-gap不属于列元素的盒子模型,因此列元素的padding可以留作己用。
    • 其次是,列偏移和列排序,BootStrap3实现方式是变更列元素的左右margin,来让列元素实现水平偏移,但是在grid布局中,并不适用这种方式,因此基于grid的响应式栅格没有实现.col-xs-offset-*,以及.col-xs-push-*、.col-xs-pull-*,而是用.col-xs-start-*来代替。这里grid网格每一行都默认有12列,第一列的相当于.col-xs-start-1,.col-xs-md-1,第二列相当于.col-xs-start-2,.col-xs-md-1,....,第12列相当于.col-xs-start-12,.col-xs-md-1,这种其实可以算是列定位,可以实现和列偏移相同的效果。另外,在一行上的列排序,需要给行元素.row再加上.row-dense样式类,来让grid网格容器变为密集模式。

    具体例子可以请看github:

    qwx427219/css-responsive-grid-system: 模拟实现BootStrap3的响应式栅格系统 (github.com)https://github.com/qwx427219/css-responsive-grid-system

     响应式栅格系统实现如下代码

    1. // _comm.scss
    2. * {
    3. margin: 0;
    4. padding: 0;
    5. box-sizing: border-box;
    6. }
    7. body {
    8. font-size: 14px
    9. }
    10. // _variables.scss
    11. $infix-breakpoints-width: (
    12. xs: 0 100%,
    13. sm: 768px 750px,
    14. md: 992px 970px,
    15. lg: 1200px 1170px
    16. );
    17. $gutter: 30px;
    18. $columns: 12;
    19. // responsive-grid.scss
    20. .row {
    21. width: 100%;
    22. display: grid;
    23. grid-template-columns: repeat($columns, 1fr);
    24. grid-template-rows: 1fr;
    25. column-gap: $gutter;
    26. }
    27. .row > * {
    28. grid-column-end: span 12;
    29. }
    30. .row-no-gutters {
    31. column-gap: 0;
    32. }
    33. .row-dense {
    34. grid-auto-flow: row dense;
    35. }
    36. $infixs: map-keys($infix-breakpoints-width);
    37. $half-gutter: div($gutter, 2);
    38. .container-fluid {
    39. width: 100%;
    40. padding: 0 $half-gutter;
    41. }
    42. @each $infix in $infixs {
    43. $breakpoints-width: map-get($infix-breakpoints-width, $infix);
    44. $p: nth($breakpoints-width, 1);
    45. $w: nth($breakpoints-width, 2);
    46. @media screen and (min-width: $p) {
    47. .container {
    48. width: $w;
    49. @if $infix !=xs {
    50. margin: 0 auto;
    51. }
    52. padding: 0 $half-gutter;
    53. }
    54. @for $i from 1 through $columns {
    55. .col-#{$infix}-#{$i} {
    56. grid-column-end: span #{$i} !important;
    57. }
    58. .col-#{$infix}-start-#{$i} {
    59. grid-column-start: $i !important;
    60. }
    61. }
    62. }
    63. }

    下面实战一下BootStrap3官网首页:Bootstrap中文网 (bootcss.com)

    源码获取请访问

    qwx427219/css-responsive-grid-system: 模拟实现BootStrap3的响应式栅格系统 (github.com)https://github.com/qwx427219/css-responsive-grid-system 

  • 相关阅读:
    告别BeanUtils,Mapstruct从入门到精通
    【C/C++】类型转换
    .Net 中间件 - 新开源代码生成器 -ReZero
    面试:Fragment懒加载
    与归并排序相关的一些问题
    K线形态识别_身怀六甲和十字胎
    Web3.0世界知识体系分享-什么是Web3.0
    天然气下游大数据技术研究与应用综述
    Hadoop完全分布式搭建
    【JavaScript】-- 继承
  • 原文地址:https://blog.csdn.net/qfc_128220/article/details/126789777