最近我还注意到的一件事就是CSS自定义属性。CSS自定义属性的工作方式有点像SASS和其他预处理器中的变量,主要的区别在于其它方法都是在浏览器中编译后生成,还是原本的CSS写法。CSS自定义属性是真正的动态变量,可以在样式表中或使用javascript即时更新,这使得它们具有更多的可能性。如果你熟悉JavaScript,我喜欢把预处理器变量和CSS自定义属性之间的区别想象成与const和let之间的区别相似——它们都有不同的用途。

CSS自定义属性可以方便的实现很多功能(例如主题变化)。最近我一直在尝试利用CSS自定义属性和CSS网格的组合能实现什么神奇的效果,我需要在不同的断点处重新定义grid-template-rows和grid-template-columns属性。下面的代码中有一个例子,我使用SASS变量定义了页面在不同的宽度下不同的列宽值,这些值将传递到grid-template-rows属性中。我对grid-gap属性也做了同样的操作,这样页面宽度不同时元素之间的间距也是不同的:

$wrapper:1200px;$col:1fr;$gutter:20px;$wrapper-l:90%;$col-l:calc((1000px-(13*40px))/12);$gutter-l:40px;$col-xl:calc((1200px-(13*50px))/12);$gutter-xl:50px;body{background-color:lighten(grey,30%);}.wrapper{max-width:$wrapper;margin:20pxauto;@media(min-width:1300px){max-width:$wrapper-l;}}.grid{display:grid;padding:$gutter;grid-template-columns:1frrepeat(12,$col)1fr;grid-template-rows:repeat(2,minmax(150px,auto));grid-gap:$gutter;border:1pxsolidgrey;background:white;width:auto;@media(min-width:1300px){grid-template-columns:1frrepeat(12,$col-l)1fr;grid-gap:$gutter-l;padding:$col-l;}@media(min-width:1500px){grid-template-columns:1frrepeat(12,$col-xl)1fr;grid-gap:$gutter-xl;padding:$col-xl;}}.grid__item{border:1pxsolidblue;}.grid__item--heading{grid-column:2/11;}

就如你所看到的,基本上必须在媒体查询中再次写出整个代码块来改变样式,因为变量一旦定义就固定了。(我当然可以使用mixin,但是最终效果是一样的——一大块代码。)

使用CSS自定义属性,可以减少代码量,因为我只需更新媒体查询中的变量,浏览器就会重新计算网格。十行(sass)代码可能看起来不是一个巨大的节省,但代码的可读性要高得多,因为不必在好几个地方添加媒体查询来处理我们的新变量,我只需在该组件的代码开头声明它们,并且无需担心是否已替换了正在使用的哪个值:

:root{--wrapper:1200px;--col:1fr;--gutter:20px;@media(min-width:1300px){--wrapper:90%;--col:calc((1000px-(13*40px))/12);--gutter:40px;}@media(min-width:1500px){--wrapper:90%;--col:calc((1200px-(13*50px))/12);--gutter:50px;}}body{background-color:lighten(grey,30%);}.wrapper{max-width:var(--wrapper);margin:20pxauto;}.grid{display:grid;padding:var(--gutter);grid-template-columns:1frrepeat(12,var(--col))1fr;grid-template-rows:repeat(2,minmax(150px,auto));grid-gap:var(--gutter);border:1pxsolidgrey;background:white;width:auto;}.grid__item{border:1pxsolidblue;}.grid__item--heading{grid-column:2/11;}.grid__item--body{grid-column:2/8;grid-row:2/span1;}.grid__item--media{background:hotPink;grid-column:11/14;grid-row:1/span2;}

我发现使用CSS Grid的一个特点是,语法非常冗长,而且并不容易快速、轻松地看到正在发生的事情,特别是在复杂的网格中。但是在这个例子中,使用CSS自定义属性,可以为网格项的大小和坐标设置变量,并且只写一次grid-column和grid-row属性。对我来说,这比每次都写出完整的属性要清楚得多,而且很容易一目了然地看到网格项的位置。

为了帮助大家让学习变得轻松、高效,给大家免费分享一大批资料,帮助大家在成为前端工程师,乃至全栈工程师的路上披荆斩棘。在这里给大家推荐一个前端全栈学习扣qun:784783012 欢迎大家进群。交流讨论,学习交流,共同进步。
当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。
但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以有效资源还是很有必要的。