温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

CSS自定义属性+CSS Grid网格实现超级的布局能力

发布时间:2020-08-07 17:07:01 来源:ITPUB博客 阅读:167 作者:智云编程 栏目:web开发

最近我还注意到的一件事就是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: 20px auto;     @media (min-width: 1300px) {         max-width: $wrapper-l;     } } .grid {     display: grid;     padding: $gutter;     grid-template-columns: 1fr repeat(12, $col) 1fr;     grid-template-rows: repeat(2, minmax(150px, auto));     grid-gap: $gutter;     border: 1px solid grey;     background: white;     width: auto;     @media (min-width: 1300px) {         grid-template-columns: 1fr repeat(12, $col-l) 1fr;         grid-gap: $gutter-l;         padding: $col-l;     }     @media (min-width: 1500px) {         grid-template-columns: 1fr repeat(12, $col-xl) 1fr;         grid-gap: $gutter-xl;         padding: $col-xl;     } } .grid__item {     border: 1px solid blue; } .grid__item--heading {     grid-column: 2 / 11; } 
CSS自定义属性+CSS Grid网格实现超级的布局能力

就如你所看到的,基本上必须在媒体查询中再次写出整个代码块来改变样式,因为变量一旦定义就固定了。(我当然可以使用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: 20px auto; } .grid {     display: grid;     padding: var(--gutter);     grid-template-columns: 1fr repeat(12, var(--col)) 1fr;     grid-template-rows: repeat(2, minmax(150px, auto));     grid-gap: var(--gutter);     border: 1px solid grey;     background: white;     width: auto; } .grid__item {     border: 1px solid blue; } .grid__item--heading {     grid-column: 2 / 11; } .grid__item--body {     grid-column: 2 / 8;     grid-row: 2 / span 1; } .grid__item--media {     background: hotPink;     grid-column: 11 / 14;     grid-row: 1 / span 2; } 
CSS自定义属性+CSS Grid网格实现超级的布局能力

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

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


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI