编写你的专属CSS框架-Grid System

对于任何CSS框架而言网格系统都是最基础的部分。

CSS网格包含的要素

Creating Your Own CSS Grid System这篇文章的配图太棒了,这里就直接用了...

  • container 容器
  • row 行
  • column 列
  • gutter 空隙

最普遍的Grid实现方式

就是类似于Bootstrap提供的分栏式栅格系统,通过排方块的方式布局,通常有很多尺寸的块让你挑选,一般提供12栏风格。这些方案通常使用float和inline-block的方式实现,一个典型的6栏式Grid实现方式如文章Creating Your Own CSS Grid System所述,代码如下:

.container {
    width: 100%;
    max-width: 1200px;
    margin: auto;
}

.container * {
    box-sizing: border-box;
}

.row::before,
.row::after {
    content: "";
    display: table;
    clear: both;
}

[class*='col-'] {
    float: left;
    min-height: 1px;
    width: 16.66%;
    padding: 12px;
}

.clo-1 {
    width: 16.66%;
}

.col-2 {
    width: 33.33%;
}

.col-3 {
    width: 50%;
}

.col-4 {
    width: 66.664%;
}

.clo-5 {
    width: 83.33%;
}

.clo-6 {
    width: 100%;
}

不过这些实现方式都有一定的缺点,摘录Better, Simpler Grid Systems中的片段。

Using floats requires clearing them which has a whole host of layout issues, most notoriously that clearing an element sometimes forces it below an unrelated part of the page (take this Bootstrap issue for example). In addition, clearing floats usually requires using both before and after pseudo-elements, preventing you from using them for something else.

Inline block layouts must address the problem of white-space between inline-block items, and all of the solutions to that problem are hacky and annoying.

总的来说就是float的clearfix占用了before和after伪类以及会导致清除浮动后的后遗症,inline-block有默认的空白间隙问题。而flexbox就是为布局而生,很多之前CSS无法解决的问题遇到Flexbox迎刃而解。

使用flexbox来完成栅格系统

如果你还不知道Flexbox是什么,可以看阮老师的Flex 布局教程:语法篇实战篇,语法可能比较枯燥,可以直接看实战,然后看到不知道的回头看语法。布局方面r阮老师参考了Solved by Flexbox ,这篇文章可以用来学习有了Flex之后解决的CSS被诟病的问题。

目前我看到的最好的解决方案就是更棒,更简洁的栅格系统,以及根据这篇文章实现的milligram的栅格系统。这篇文章中作者理想的栅格系统的特性如下:

  • 每一行里的每一个栅格默认都是同宽同高。默认自适应。
  • 为了足够灵活,能够添加尺寸属性到单独的栅格中。没有添加的,仍然简单地平分剩下的可用空间。
  • 支持响应式布局,可以添加媒体查询到栅格中。
  • 每一个栅格可以在纯直方向上置顶,置底,剧中。
  • 如果让所有栅格拥有一致的大小和对其方式,在容器上添加属性,子元素能够继承,而不需要无意义的重复。
  • 栅格能够任意的嵌套。

容器


容器的作用在于限定网格系统的宽度,通常设置为100%,一般会用max-width限定宽度,这里我们用1200p,然后居中,margin auto就好。一个典型的container如下:

.container{
    margin: 0 auto;
    max-width: 120.0rem;
    padding: 0 2.0rem;
    width: 100%;
}

行Row


既然我们用Flexbox实现,那么Row就是Flexbox容器,主轴为垂直方向,起点在上沿。

.row {
    display: flex;
}

列Column

 .column {
        display: block;
        flex: 1;
    }

Flex对齐方式

对齐Flexbox容器中的内容

.row {
    &.row-top      { align-items: flex-start; }
    &.row-middle   { align-items: center; }
    &.row-bottom   { align-items: flex-end; }
    &.row-stretch  { align-items: stretch; }
    &.row-baseline { align-items: baseline; }
    &.row-left     { justify-content: flex-start; }
    &.row-center   { justify-content: center; }
    &.row-right    { justify-content: flex-end; }
    &.row-between  { justify-content: space-between; }
    &.row-around   { justify-content: space-around; }
}

辅助类(栏与偏移)

参考Bootstrap的12栏系统。

.column {
    &.col-1    { flex: 0 0 calc(100% * 1 / 12); }
    &.col-2    { flex: 0 0 calc(100% * 2 / 12); }
    &.col-3    { flex: 0 0 calc(100% * 3 / 12); }
    &.col-4    { flex: 0 0 calc(100% * 4 / 12); }
    &.col-5    { flex: 0 0 calc(100% * 5 / 12); }
    &.col-6    { flex: 0 0 calc(100% * 6 / 12); }
    &.col-7    { flex: 0 0 calc(100% * 7 / 12); }
    &.col-8    { flex: 0 0 calc(100% * 8 / 12); }
    &.col-9    { flex: 0 0 calc(100% * 9 / 12); }
    &.col-10   { flex: 0 0 calc(100% * 10 / 12); }
    &.col-11   { flex: 0 0 calc(100% * 11 / 12); }
}

当然少不了对应的偏移

.column {
    &.col-off-1 {margin-left: calc(100% * 1 / 12); }
    &.col-off-2 {margin-left: calc(100% * 2 / 12); }
    &.col-off-3 {margin-left: calc(100% * 3 / 12); }
    &.col-off-4 {margin-left: calc(100% * 4 / 12); }
    &.col-off-5 {margin-left: calc(100% * 5 / 12); }
    &.col-off-6 {margin-left: calc(100% * 6 / 12); }
    &.col-off-7 {margin-left: calc(100% * 7 / 12); }
    &.col-off-8 {margin-left: calc(100% * 8 / 12); }
    &.col-off-9 {margin-left: calc(100% * 9 / 12); }
    &.col-off-10 {margin-left: calc(100% * 10 / 12); }
    &.col-off-11 {margin-left: calc(100% * 11 / 12); }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,629评论 1 92
  • 一:在制作一个Web应用或Web站点的过程中,你是如何考虑他的UI、安全性、高性能、SEO、可维护性以及技术因素的...
    Arno_z阅读 1,087评论 0 1
  • 简介 CSS Grid布局 (又名"网格"),是一个基于二维网格布局的系统,旨在改变我们基于网格设计的用户界面方式...
    咕咚咚bells阅读 2,423评论 0 4
  • 神园屠梦(全目录) 书音醉书入疯魔,姑姑怒火烧沈园; 万神园宴皆阴谋,梦姬当年神赌约。 ——天屠计划—— 万神宴开...
    金获阅读 167评论 1 1
  • 汹涌澎湃的大海边,有一群玲珑剔透的小贝壳,它们穿着条纹似的小花衣,手拉着手在海边跑。哇!他们身上的每一道划痕啊,不...
    静者居记阅读 522评论 0 3