侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

浅谈CSS 栅格系统布局原理分析

前端  /  管理员 发布于 7年前   284

众所周知,现在前端有很多类似于bootstrap,foundation这样优秀的UI框架,它们都提供了自己的一套响应式布局方案,即栅格系统。用过的人都知道只要给页面的元素添加其栅格系统指定的类名,就能达到你想达到的响应式布局效果,简洁而优雅。笔者有很长一段时间不明白栅格系统是基于什么样的原理实现,遂分析了一下主流框架的源码,发现其实并不复杂,甚至自己也可以实现一套很简单的栅格系统。

一、Bootstrap

bootstrap的栅格系统用于通过一系列的行(row)与列(col-*)的组合来创建页面布局,它的栅格系统最大分为12份:

<div class="container">    <div class="row">        <div class="col-md-12">col-12</div>    </div>    <div class="row">        <div class="col-md-4">col-4</div>        <div class="col-md-4">col-4</div>        <div class="col-md-4">col-4</div>    </div>    ...</div>

不过[email protected]版本与@4.0版本实现栅格系统方式不一样:

[email protected]版本为了兼容IE8,采用的是浮动方式来实现栅格系统:

[class |= col] { float: left; }.col-md-1 { width: 8.33333333%; }.col-md-2 { width: 16.66666667%; }.col-md-3 { width: 25%; }.col-md-4 { width: 33.33333333%; }.col-md-5 { width: 41.66666667%; }.col-md-6 { width: 50%; }.col-md-7 { width: 58.33333333%; }.col-md-8 { width: 66.66666667%; }.col-md-9 { width: 75%; }.col-md-10 { width: 83.33333333%; }.col-md-11 { width: 91.66666667%; }.col-md-12 { width: 100%; }

即每行的一个栅格都是用左浮动和百分比来进行排版,当窗口宽度改变,对应改变container容器的宽度,对应栅格宽度自然也跟着改变:

@media (min-width: 768px) {  .container {    width: 750px;  }}@media (min-width: 992px) {  .container {    width: 970px;  }}@media (min-width: 1200px) {  .container {    width: 1170px;  }}

[email protected]版本放弃了对版本IE的支持,栅格系统采用的是最新的伸缩布局方式:

.row {    display: flex;    flex-wrap: wrap;}.col-1 { flex: 0 0 8.333333%; }.col-2 { flex: 0 0 16.666667%; }.col-3 { flex: 0 0 25%; }.col-4 { flex: 0 0 33.333333%; }.col-5 { flex: 0 0 41.666667%; }.col-6 { flex: 0 0 50%; }.col-7 { flex: 0 0 58.333333%; }.col-8 { flex: 0 0 66.666667%; }.col-9 { flex: 0 0 75%; }.col-10 { flex: 0 0 83.333333%; }.col-11 { flex: 0 0 91.666667%; }.col-12 { flex: 0 0 100%; }

栅格系统可以决定每一个栅格的排版顺序,两种栅格系统实现方式不同,自然他们得排版方式也不同:

/* * [email protected]版本 排版 */[class |= col] {    position: relative;}/* 向右移动指定的栅格数 */.col-md-pull-1 { right: 8.33333333%; }.col-md-pull-2 { right: 16.66666667%; }.col-md-pull-3 { right: 25%; }.../* 向左移动指定的栅格数 */.col-md-push-1 { left: 8.33333333%; }.col-md-push-2 { left: 16.66666667%; }.col-md-push-3 { left: 25%; }.../* * [email protected]版本  排版 */.order-1 { order: 1; }.order-2 { order: 2; }.order-3 { order: 3; }...

可以看到,@3.0版本采用的是相对定位进行左右移动栅格来进行排版,@4.0版本就很简洁,只用采用flex布局特有的order属性来进行排版。当然,这两个版本也有相同的排版方式,就是offset偏移:

/* [email protected]版本偏移 */.col-md-offset-1 { margin-left: 8.33333333%; }.col-md-offset-2 { margin-left: 16.66666667%; }.col-md-offset-3 { margin-left: 25%; }.../* [email protected]版本偏移 */.offset-1 { margin-left: 8.33333333%; }.offset-2 { margin-left: 16.66666667%; }.offset-3 { margin-left: 25%; }...

两者都用margin-left进行偏移量设置。

二、Pure

pure的栅格系统又是另外一种方式实现,它支持最大24等分的栅格:

<div class="pure-g">    <div class="pure-u-1-3">1/3</div>    <div class="pure-u-1-3">1/3</div>    <div class="pure-u-1-3">1/3</div></div><div class="pure-g">    <div class="pure-u-1-8">1/8</div>    <div class="pure-u-1-8">1/8</div>    <div class="pure-u-1-8">1/8</div>    ...</div><div class="pure-g">    <div class="pure-u-1-24">1/24</div>    <div class="pure-u-1-24">1/24</div>    <div class="pure-u-1-24">1/24</div>    ...</div>

pure它的栅格系统采用的是伸缩与行内结合的方式:

.pure-g {        display: -webkit-box;        display: -webkit-flex;        display: -ms-flexbox;        display: flex;        flex-flow: row wrap;}[class|=pure-u] {    display: inline-block;    *display: inline;   /*iE < 8*/    zoom: 1;}.pure-u-1-24 { width: 4.1667%; }.pure-u-2-24,.pure-u-1-12 { width: 8.3333%; }.pure-u-3-24,.pure-u-1-8 { width: 12.5000%; }.pure-u-4-24,.pure-u-1-6 { width: 16.6667%; }.pure-u-5-24 { width: 20.8333%; }...

不过它是不支持偏移和指定顺序的排版。

三、Foundation

fundation的栅格系统原理其实是和[email protected]版本如出一辙,都是采用伸缩布局的方式,最大支持12等分的栅格:

.grid-x {  display: -webkit-box;  display: -webkit-flex;  display: -ms-flexbox;  display: flex;  -webkit-box-orient: horizontal;  -webkit-box-direction: normal;  -webkit-flex-flow: row wrap;      -ms-flex-flow: row wrap;          flex-flow: row wrap; }.grid-x > .small-1 { width: 8.33333%; }.grid-x > .small-2 { width: 16.66667%; }.grid-x > .small-3 { width: 25%; }....grid-x > .small-12 { width: 100%; }

四、总结

UI框架栅格系统实现方式基本为三种:

1. 纯伸缩布局flex方式: 这种方式对古老的IE浏览器支持性不是很好,所以一般出现在技术比较激进的框架上,如[email protected],Foundation,基于React的antDesign,基于Vue的ElementUI 等等。
2. 浮动方式:这种方式是为了向下兼容IE低版本浏览器,比如用处很广的[email protected]版本。
3. 伸缩和行内结合的方式:雅虎的Pure。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    CSS实现全屏切换效果的示例代码
    下一条:
    CSS3轻松实现圆角效果
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客