zoukankan      html  css  js  c++  java
  • 栅格化系统的原理以及实现

    更多技术文章

    什么是栅格化

    在一个有限的、固定的平面上,用水平线和垂直线(虚拟的线,“参考线”),将平面划分成有规律的一系列“格子”(虚拟的格子),并依托这些格子、或以格子的边线为基准线,来进行有规律的版面布局。

    通俗点来说,就是人为的把网页中的一行,等比例划分,比如将一行划分为 12 等分。然后在每个格子里进行页面开发,这就栅格化。
    grid1

    原理

    假如在页面里定义了一个 DIV,并设置如下 CSS 属性:

    div {
      border: 1px solid #ddd;
      height: 200px;
       100%;
    }
    

    grid2
    页面上将会展示一个带有灰色边框的,宽度 100% 的矩形。如果手动控制浏览器放大缩小,此 DIV 也会相应的放大缩小,但宽度始终是 100%。

    如果在页面定义了两个 DIV,并设置如下 CSS 属性:

    body {
        font-size: 0; // 将inline-block布局两个DIV之间的距离清除
    }
    div {
        height: 200px;
        border: 1px solid #ddd;
         50%;
        display: inline-block;
        box-sizing: border-box;
        vertical-align: top; // 顶部对齐
    }
    

    grid3
    页面上将会有两个宽度各占 50% 的 DIV,如果页面放大或缩小,这两个 DIV 都会始终保持着页面 50% 的宽度。

    相信到这里,应该有人看出来了,这就是栅格化,只不过第一个例子是将一行划分为 1 等分,即只有一个格子。
    第二个例子将一行划分为 2 等分,即有两个格子。如果我将一行划分为 12 等分,那就跟 bootstrap 中的栅格化系统一模一样了,有 12 个格子。

    实现

    让我们来亲自实现一个栅格化系统,假设我们要将一行划分为 12 等分,那 1 等分就占有 100% / 12 = 8.33% 的宽度。

    相应的 CSS 可以这样设置:

    .col1  { 8.33%}
    .col2  { 16.66%}
    .col3  { 25%}
    .col4  { 33.33%}
    .col5  { 41.66%}
    .col6  { 50%}
    .col7  { 58.33%}
    .col8  { 66.66%}
    .col9  { 75%}
    .col10 { 83.33%}
    .col11 { 91.66%}
    .col12 { 100%}
    

    上一个完整的示例来看看吧:

    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body {
                margin: 0;
            }
            .app {
                font-size: 0;
            }
            .app div {
                box-sizing: border-box;
                border: 1px solid red;
                height: 200px;
                display: inline-block;
                vertical-align: top;
            }
            .col1  { 8.33%}
            .col2  { 16.66%}
            .col3  { 25%}
            .col4  { 33.33%}
            .col5  { 41.66%}
            .col6  { 50%}
            .col7  { 58.33%}
            .col8  { 66.66%}
            .col9  { 75%}
            .col10 { 83.33%}
            .col11 { 91.66%}
            .col12 { 100%}
        </style>
    </head>
    <body>
        <div class="app">
            <!-- 4个div 占满一行 -->
            <div class="col1"></div>
            <div class="col2"></div>
            <div class="col3"></div>
            <div class="col6"></div>
        </div>
    </script>
    </body>
    </html>
    

    最后呈现出来的效果是这样的。
    grid4

    怎么样?是不是很简单。

    进阶

    结合 @media 媒体查询,我们可以做得更多。@media 详情请看MDN

    相信用过 bootstrap 栅格化系统的都知道,在 bootstrap 栅格化系统中,有一些 col-md col-sm 属性,它们是干什么用的呢?
    其实,它们都是栅格化系统的 CSS 类名,只是针对了不同的屏幕宽度。

    假如我们有这样的一个需求:
    在 PC 上,因为屏幕比较大,我们要求一行显示 4 列的内容。但是在手机上,因为屏幕比较小,要求一行显示 3 列的内容。
    即一个网站同时适配 PC 和手机端,根据不同的端自动调整页面。

    此时,我们可以这样做:

    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body {
                margin: 0;
            }
            .app {
                font-size: 0;
            }
            .app div {
                box-sizing: border-box;
                border: 1px solid red;
                height: 200px;
                display: inline-block;
                vertical-align: top;
            }
            /* 针对屏幕分辨率大于等于1200的 */
            @media (min- 1200px) {
                .col-md1  { 8.33%}
                .col-md2  { 16.66%}
                .col-md3  { 25%}
                .col-md4  { 33.33%}
                .col-md5  { 41.66%}
                .col-md6  { 50%}
                .col-md7  { 58.33%}
                .col-md8  { 66.66%}
                .col-md9  { 75%}
                .col-md10 { 83.33%}
                .col-md11 { 91.66%}
                .col-md12 { 100%}
    	}
            /* 针对屏幕分辨率小于1200的 */
    	@media (max- 1199px) {
                .col-sm1  { 8.33%}
                .col-sm2  { 16.66%}
                .col-sm3  { 25%}
                .col-sm4  { 33.33%}
                .col-sm5  { 41.66%}
                .col-sm6  { 50%}
                .col-sm7  { 58.33%}
                .col-sm8  { 66.66%}
                .col-sm9  { 75%}
                .col-sm10 { 83.33%}
                .col-sm11 { 91.66%}
                .col-sm12 { 100%}
    	}
        </style>
    </head>
    <body>
        <div class="app">
            <div class="col-md3 col-sm4"></div>
            <div class="col-md3 col-sm4"></div>
            <div class="col-md3 col-sm4"></div>
            <div class="col-md3 col-sm4"></div>
        </div>
    </script>
    </body>
    </html>
    

    一个 DIV,同时设置两个类名。当屏幕 >=1200px 时,一行显示 4 列,当屏幕 <1200px 时,一行显示3列,而且是浏览器自动调整。

    grid5

    grid6

    一个栅格化系统就这样实现了。

    练习任务

    对于栅格化的介绍就到此结束了,但如果你看完了文章后什么都不做,不到一周,就会把学到的知识忘得七七八八,为了帮助你巩固知识,特地布置了一个小任务,按要求实现如下页面:

    图一

    grid7

    图二

    grid8

    任务要求:

    1. 当页面大于 768px 时,页面如图1所示。
    2. 当页面小于等于 768px 时, 页面如图2所示。

    这里是答案在线DEMO,但是最好先试试能不能自己做出来,如果实在做不出来,再看答案。

  • 相关阅读:
    Kostya the Sculptor
    Parade
    zoj 1097 普吕弗序列
    API分析——Jquery UI Dialog
    伸缩性和可用性反模式(转)
    可伸缩性最佳实战(转)
    二叉索引树BIT
    RMQ
    线段树(区间树)
    双栈计算算术表达式
  • 原文地址:https://www.cnblogs.com/woai3c/p/10653971.html
Copyright © 2011-2022 走看看