原文地址: http://j4n.co/blog/Creating-your-own-css-grid-system
CSS栅格已经出现很长时间了,它们经常会被包含在一些框架中,就像Bootstrap。我并不厌恶Bootstarp,但当你需要栅格布局而且使用框架是得不偿失的。那么怎样才能构建我们自己的CSS栅格布局呢?
CSS栅格布局的基本构成
一个基本的栅格,包含以下几个部分:
- a container(容器)
- rows(行)
- columns(列)
- gutters(列与列中的间隙)
The Container(容器)
容器的目的在于控制内部栅格的总宽度。一般来说,容器的宽度为100%,但为了大屏显示,你可能需要设置一个最大宽度。
|
|
The Row(行)
行的目的在于保证列不向别的行溢出,我们使用浮动清除去保证任何在行内的元素仍在行内。
|
|
The Column(列)
列是栅格系统中比较复杂的一部分。首先,在CSS中有各种各样的方法去定位列,由于响应式设计等因素,也有多种宽度需要去考虑。在本文中,我们将会定位列并给予它们宽度,我将暂时不考虑响应式。
Column Positioning(列定位)
Floats
, inline-blocks
, display-table
, display-flex
. 各种不同的方法在CSS中定位列。就我的经验来看,最少错误的可能与最广泛的使用就是float
方法了。如果我们的列是空的,浮动的列将会相互堆叠 。为了避免,我们为列设置了最小宽度。
|
|
Column Widths(列宽度)
为了求得一个列的宽度,我们必须根据容器的宽度去划分列。在我的例子中,容器的宽度是100%,我们需要6列,100/6=16.6,所以我们列的宽度是16.66%。
|
|
当然,这仅仅是个开始。如果我们需要一个部分有2列宽,我们需要创建一列具有两列宽,计算是十分简单的。
|
|
唯一一件我们需要考虑的事情是当我们将不同的列混合组合时,它的宽度号加起来要等于6。
Column Gutters(列间空隙)
在border-box
盒模型之前,一个百分比控制宽度的元素去设置静态的padding是十分痛苦的。幸运的是,使用border-box
我们能够容易得创建空隙。
|
|
(个人角度讲,我使用* {box-sizing: border-box;}在我的CSS里,去允许页面中任何元素都是border-box)。
栅格布局基本完成
|
|
完整的HTML与CSS如下:
CSS
|
|
HTML
|
|
响应式的栅格系统
使我们的栅格系统适应手机屏幕是十分简单的,我们必须去适应列的宽度。
为了这简单的目的,在800px的屏幕下我将加倍列的宽度。
只有一件事情看上去是例外的,行中的最后一列可能会单独成行,像3个col-2,col-5与col-1。我们将最后的.col-2
与.col-1
行宽设为100%。
|
|
当屏幕比800px更小时,我们除了col-1以外,其余列width均设为100%。
|
|
现在我们可以在不使用框架的情况下,建立自己的响应式栅格系统了。
|
|
不过本文仅仅是构建栅格系统的初步要点。虽然这不是框架或是复杂的解决方案,但我希望它为建立CSS栅格系统提供了一个简明的过程。