使用 calc() 创建 CSS 网格
calc() 是 CSS3 的一个属性,可以使用加、减、乘、除数学表达式进行运算,其基本语法如下:
.article {
float: left;
width: calc(100% - 1em);
}
你可以使用任何的长度值做为单位,如 em
、px
或者百分比 %
。
网格系统
在这篇文章中,我们主要使用 calc()
创建一个简单易用的网格系统。
HTML结构
就我个人而言,我比较喜欢 Semantic 网格系统 和不喜欢在HTML结构中使用 column
这样的类名,所以我们的结构看起来像这样:
<header>
<h1>CSS grid with calc()</h1>
</header>
<main>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Duis pretium dui ut massa pretium quis ornare dolor elementum.
</p>
</main>
<aside>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Duis pretium dui ut massa pretium quis ornare dolor elementum.
</p>
</aside>
CSS 样式
一个网格系统至少具备两个基本要素:
- 列(一般是12列或16列)
- 间距(列与列之间的间距)
因此我们需要创建像这样的一些东西:
//没有间距
width: calc(100% / 总列数 * 列数 )
//有间距
width: calc((100% / 总列数 * 列数) - 间距)
看起来并不是很复杂,但我还是花了一定的时间才弄懂他们是怎么回事,因为这样的数学运算还是不简单的。
把总宽度 100% 除以列数,得到每列的宽度,然后乘以具体的列数,从而返回对应的宽度值。
因此我们写了一个函数,他接受列数和列间距两个参数,从而返回宽度:
$columns: 12;
$gutter: 5%;
@function grid-width($cols, $has-gutter:false) {
@if $has-gutter {
@return calc(((100% / #{$columns}) * #{$cols}) - #{$gutter});
}
@else {
@return calc((100% / #{$columns}) * #{$cols});
}
}
我们设置了 $has-gutter
参数,并且设置了其默认值为 false
,只是了为了调用函数更方便些。此外,我们在 cacl()
计算中还需要使用Sass的变量插值。
现在我们需要做的就是调用函数:
header {
width: grid-width(12);
}
main {
width: grid-width(8, true);
background: tomato;
float: left;
}
aside {
width: grid-width(4);
float: right;
background: teal;
}
编译出来的 CSS:
header {
width: calc((100% / 12) * 12);
}
main {
width: calc(((100% / 12) * 8) - 5%);
background: tomato;
float: left;
}
aside {
width: calc((100% / 12) * 4);
float: right;
background: teal;
}
上面基于 12 列创建了一个网格系统,其中主内容 main
占了八列,侧边栏 aside
中了四列。这里有一个示例:demo
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论