栅格化系统的原理以及实现

简介: 栅格化系统的原理以及实现

更多技术文章

什么是栅格化

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

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

原理

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

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

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


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

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

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

相信到这里,应该有人看出来了,这就是栅格化,只不过第一个例子是将一行划分为 1 等分,即只有一个格子。

第二个例子将一行划分为 2 等分,即有两个格子。如果我将一行划分为 12 等分,那就跟 bootstrap 中的栅格化系统一模一样了,有 12 个格子。

实现

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

相应的 CSS 可以这样设置:

.col1  {width: 8.33%}
.col2  {width: 16.66%}
.col3  {width: 25%}
.col4  {width: 33.33%}
.col5  {width: 41.66%}
.col6  {width: 50%}
.col7  {width: 58.33%}
.col8  {width: 66.66%}
.col9  {width: 75%}
.col10 {width: 83.33%}
.col11 {width: 91.66%}
.col12 {width: 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  {width: 8.33%}
        .col2  {width: 16.66%}
        .col3  {width: 25%}
        .col4  {width: 33.33%}
        .col5  {width: 41.66%}
        .col6  {width: 50%}
        .col7  {width: 58.33%}
        .col8  {width: 66.66%}
        .col9  {width: 75%}
        .col10 {width: 83.33%}
        .col11 {width: 91.66%}
        .col12 {width: 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>

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

怎么样?是不是很简单。

进阶

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

相信用过 bootstrap 栅格化系统的都知道,在 bootstrap 栅格化系统中,有一些 col-mdcol-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-width: 1200px) {
            .col-md1  {width: 8.33%}
            .col-md2  {width: 16.66%}
            .col-md3  {width: 25%}
            .col-md4  {width: 33.33%}
            .col-md5  {width: 41.66%}
            .col-md6  {width: 50%}
            .col-md7  {width: 58.33%}
            .col-md8  {width: 66.66%}
            .col-md9  {width: 75%}
            .col-md10 {width: 83.33%}
            .col-md11 {width: 91.66%}
            .col-md12 {width: 100%}
        }
        /* 针对屏幕分辨率小于1200的 */
        @media (max-width: 1199px) {
            .col-sm1  {width: 8.33%}
            .col-sm2  {width: 16.66%}
            .col-sm3  {width: 25%}
            .col-sm4  {width: 33.33%}
            .col-sm5  {width: 41.66%}
            .col-sm6  {width: 50%}
            .col-sm7  {width: 58.33%}
            .col-sm8  {width: 66.66%}
            .col-sm9  {width: 75%}
            .col-sm10 {width: 83.33%}
            .col-sm11 {width: 91.66%}
            .col-sm12 {width: 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列,而且是浏览器自动调整。

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

练习任务

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

图一

图二

任务要求:

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

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

目录
相关文章
基于GA遗传优化的TSP问题最优路线规划matlab仿真
本项目使用遗传算法(GA)解决旅行商问题(TSP),目标是在访问一系列城市后返回起点的最短路径。TSP属于NP-难问题,启发式方法尤其GA在此类问题上表现出色。项目在MATLAB 2022a中实现,通过编码、初始化种群、适应度评估、选择、交叉与变异等步骤,最终展示适应度收敛曲线及最优路径。
572 29
|
数据可视化 数据挖掘 定位技术
Python和Geopandas进行地理数据可视化
【10月更文挑战第22天】本文介绍了如何使用Python和Geopandas进行地理数据可视化和分析,涵盖从准备工作、加载数据、数据探索与处理、地理数据可视化、空间分析与查询到交互式地理数据可视化等内容。通过丰富的代码示例和案例演示,帮助读者掌握地理数据分析的基本方法,为实际应用提供支持。
870 19
|
机器学习/深度学习 人工智能 自然语言处理
【2024泰迪杯】C 题:竞赛论文的辅助自动评阅 26页及31页2篇完整论文及Python 代码实现
【8月更文挑战第9天】本文介绍了2024年泰迪杯C题的解决方案,该题目旨在构建一个基于AI的学术论文自动评审模型,通过使用开源大语言模型和自然语言处理技术,自动化地评阅竞赛论文,并根据论文的完整性、实质性工作、摘要质量和写作水平进行打分,最终输出符合特定分布的综合评分结果。
331 6
|
Java Nacos 微服务
微服务中间件之Nacos
Nacos是阿里巴巴开源的动态服务发现、配置管理和服务管理平台,支持服务注册与发现、配置管理及服务健康监测。采用Spring Cloud、Spring Boot、Raft算法等技术,适用于微服务架构和云原生应用,提供简单易用的安装部署方式和丰富的应用场景。
2370 3
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
算法 Linux
Linux中内存问题
【10月更文挑战第6天】
271 2
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
这篇文章介绍了一种简单易懂的全景图高清下载方法,使用在线网站全景管家,支持下载包括建E、720yun、酷雷曼等多个平台的全景图原图,并简要解析了全景图的原理和制作方法。
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
|
前端开发
一键复制微信聊天框效果:HTML+CSS让网页聊天更生动!
一键复制微信聊天框效果:HTML+CSS让网页聊天更生动!
|
Web App开发 JavaScript 前端开发
ChatGPT与基于GUI的自动化测试
ChatGPT与基于GUI的自动化测试,chrome浏览器+ cypress +HTML代码需要主机名脚本语言和测试目标的URL。
192 10
|
自然语言处理 JavaScript Java
CodeFuse新开源模型荣登Big Code评测榜首!
使用多任务高效微调框架MFTCoder,以DeepSeek-Coder-33b模型为底座,微调获得的CodeFuse-DeepSeek-33b模型在Big Code Models Leaderboard代码大模型榜单上以43.58% WinRate成为新晋榜首,同时模型在NLP任务上也取得了很好的表现。本文我们将介绍该模型的得来和使用,包括训练数据、训练超参设置、模型评测效果以及如何获取该模型和基于它继续微调。我们已经在HuggingFace和ModelScope开放了模型下载(下载地址在文末),并同步提供了4bit量化版本供大家直接部署到生产环境。
706 0