使用 calc() 创建 CSS 网格 - 文章教程

使用 calc() 创建 CSS 网格

发布于 2021-10-06 字数 2897 浏览 1002 评论 0

calc() 是 CSS3 的一个属性,可以使用加、减、乘、除数学表达式进行运算,其基本语法如下:

.article {
  float: left;
  width: calc(100% - 1em);
}

你可以使用任何的长度值做为单位,如 empx 或者百分比 %

网格系统

在这篇文章中,我们主要使用 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

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!

关于作者

清晨说ぺ晚安

我之所以活到现在的全部意义,是为了此刻能对你说,我爱你,我会在你身后永远守护你。

16 文章
2 评论
21403 人气
更多

推荐作者

qq_iQVWB

文章 0 评论 0

gyhjy

文章 0 评论 0

dianjvnan

文章 0 评论 0