当前位置: 首页 > 科技观察

新时代创意排版不全指南

时间:2023-03-16 23:13:11 科技观察

依稀记得某年粤语高考作文的相关描述——“有时候,常识容易知行难,有时候常识必须被分解以产生新的。”人们的想象力和创造力很容易被常识的一致认知所削弱。CSS更新太快,只能不断督促自己继续学习,一直呆在舒适区,很容易跟不上节奏。当然,这句话可以适用于任何技术和任何行业,而不仅仅是CSS。回到本文的主题——新时代布局。利用现有的CSS技术,是否可以大胆跳出常规思维,不再局限于一个个矩形框,尝试更具有艺术感?就像下面这些。不拘一格的线条:CSSTricks官网文字在一定时期内沿着图片的边缘排列:不再横竖:还是怪异的网格:GTA5的封面是不是很有意思?不拘一格的布局可以吸引页面更多的关注度和流量,当然这也需要我对CSS的掌握足够好,才能在有限的属性中创造出更多不同的可能。网格布局说到新时代布局和创意布局,就不得不提到网格布局。CSSGrid布局的二维性使得我们对页面的控制能力比传统的浮动布局、定位布局、flex布局更强。使用Grid布局将页面切块这里,我们利用Grid布局的特点,将页面任意切为我们想要的不同块区域。这里有一些工具可以方便我们的Grid布局:QuickGridLayout-GridLayoutit[1]使用这个工具,你可以快速创建你想要的Grid布局,并得到相应的CSS,非常简单方便。这里我用工具把页面分成A、B、C、D、E、F6个区域:复制右边的HTML和CSS,快速得到这样的布局。我把代码复制到CodePen中,简单的添加了勾选背景颜色后,我们可以基于这个布局做任何事情:CodePenDemo--GridLayoutDemo[2]UseGridlayoutwithclip-pathtorealizeGTA5cover这里,我们可以使用grid布局用clip-path实现GTA5的封面,像这样:我们把一个4x4的Grid网格分成9个不同的部分:然后使用clip-path,根据封面图片的形状,对每个网格项进行二次裁剪:ok,最后把里面的色块换成具体的图片即可:CodePenDemo--GTA5poster(GridandClipPath)[3]这里当然有槽点,最后用了9张图,何必呢不是一开始就直接用图片吗?:)Grid是复杂布局过程中非常好的帮手。非常适合各种不规则网格块的布局。这里还有一个DEMO:作者是OliviaNg[4],Demo的链接——CodePenDemo——CSSGrid:TrainTicket[5]WaterfalllayoutWaterfalllayoutWaterfalllayout在现代布局中也很常见,通常用于一些照片墙。像这样:之前,在没有JavaScript帮助的情况下,我们有过三种纯CSS方式实现伪瀑布流布局(注意这是伪瀑布流),分别是:使用CSS栏目实现瀑布流布局[6]使用CSSFlex实现瀑布流布局[7]使用CSSgrid实现瀑布流布局[8]可以点击demo看到使用以上三种方式实现瀑布流布局缺点很明显:对于flex和column布局,只有它可以实现垂直瀑布布局,第一列填充第二列,依此类推。对于Grid布局,缺点是不能自动适配不同高度,需要手动指定每个元素块。未来,标准将实现grid-template-rows:masonry基于Grid布局。使用这个标准,我们可以快速的使用Grid来实现横向瀑布布局。目前,您可以在Firefox中体验该功能。使用grid-template-rows:masonry实现水平排列的瀑布布局。grid-template-rows:masonry是firefox从Firefox87开始支持的一种基于grid布局快速创建瀑布布局的方法。并且firefox一直在将这个属性推入标准。从firefox87开始,在浏览器的URL输入栏输入about:config,开启layout.css.grid-template-masonry-value.enabled配置。能否使用--grid-template-rows:masonry[9]通常情况下,我们还是需要花费一定的功夫来实现瀑布式布局,即使是基于网格布局。以往通过网格布局,我们可以通过精细控制每个网格项来实现垂直瀑布流布局:1

2
3
4
5678。g-container{height:100vh;display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(8,1fr);}.g-item{&:nth-child(1){grid-column:1;grid-row:1/3;}&:nth-child(2){grid-column:2;grid-row:1/4;}&:nth-child(3){grid-column:3;grid-row:1/5;}&:nth-child(4){grid-column:4;grid-row:1/6;}&:nth-child(5){grid-column:1;grid-row:3/9;}&:nth-child(6){grid-column:2;grid-row:4/9;}&:nth-child(7){grid-column:3;grid-row:5/9;}&:nth-child(8){grid-column:4;grid-row:6/9;}}效果如下:CSSGrid实现伪瀑布布局CodePenDemo--CSSGrid实现伪瀑布布局[10]在上面的Demo中,使用grid-template-columns,grid-template-rows将行和列分开,使用grid-row来控制每个griditem的grid的大小,但是这样做的成本太高了。元素太多,计算量非常大,而且我们还是提前知道每个元素的高和宽的前提下,有了grid-template-rows:masonry一切都会变得简单很多。对于没有确定每个元素高度的4列网格布局:.container{display:grid;grid-template-columns:repeat(4,1fr);}正常情况下,你看到的会是这样的:只需在容器中添加grid-template-rows:masonry,表示垂直方向,采用瀑布流布局:。container{display:grid;grid-template-columns:repeat(4,1fr);+grid-template-rows:masonry;}可以轻松得到这样一个水平排列元素的瀑布流布局:如果你使用的是firefox和开启了layout.css.grid-template-masonry-value.enabled配置,可以戳下面DEMO感受一下:CodePenDemo--grid-template-rows:masonryimplementswaterfallflowlayout[11]andmore专栏layout多列布局也是我们现在可以控制的布局之一,利用了CSSMultiple-columnLayoutProperties[12]这个比较新的特性。对于最简单的多列布局,我们只需要使用column-count或column-width即可。假设我们有以下HTML:

Loremipsumdolorsitametconsecteturadipisicingelit...

简单的3列布局:p{width:800px;column-count:3;font-size:16px;line-height:2;}bycolumn-count:3指定3列。column-gap控制间距&column-rule控制列与列之间的样式接下来我们看column-gap和column-rulecolumn-gap:控制列之间的间隔,默认是关键字normal,数值上是1emcolumn-rule:控制列之间的样式规则,其写法类似于border,指定列之间的装饰线仍然是如下HTML:

Loremipsumdolorsitametconsecteturadipisicingelit...

简单的3列布局:p{width:800px;column-count:3;font-size:16px;line-height:2;+column:1pxsolid#999;+column-gap:2em;}CodePenDemo--CSS多列布局Demo[13]column-spansetcross-column接下来还有一个很有意思的属性column-span,用来设置元素的跨栏显示。我们首先使用多栏布局来实现这样一种类似于报纸布局的布局风格。

Loremipsumdolorsitamet...

TitleLoremipsumdolorsitametconsecteturadipisicingelittitle

Loremipsumdolorsitamet...

.g-container{width:800px;column-count:3;column-rule:1pxsolid#aaa;column-gap:2em;}h2{margin:14px0;font-size:24px;line-height:1.4;}可能嵌套在多列布局中标题,标题加粗字体较大:通过设置column-span:all为h2,让h2标题跨越多列显示,更改CSS:h2{margin:14px0;font-size:24px;line-height:1.4;+column-span:all;+text-align:center;}得到这样的布局:CodePenDemo--CSS多列布局Demo2[14]多列布局配合其他布局实现当然更复杂的布局,column-span有个硬伤,就是它的值只有column-span:all或者column-span:none,也就是要么跨越所有列,要么不跨越列。如果我现在有一个3列布局,但只希望标题跨越两列,column-span:all不会这样做。但是,通过嵌套其他布局,我们可以巧妙地升华多列布局。例如,rachelandrew[15]实现了这样一个嵌套布局:

Bywayofprecaution。..

第一个冲进寂静的大海;

还有什么...

通过两列Grid布局嵌套两列多列布局。一般的CSS如下:.container{max-width:800px;display:grid;grid-gap:1em;grid-template-columns:2fr1fr;align-items:start;}h2{column-span:all;text-align:center;}.containerarticle{column-count:2;column-gap:2em;column-rule:1pxsolid#ccc;}.containeraside{border-left:1pxsolid#ccc;padding:01em;}这样我们就可以实现一个视觉上跨越任意列的标题:完整的Demo代码可以点这里:CodePenDemo--SmashingMulticol:mixinglayoutmethods--作者rachelandrew[16]shape-outside让布局插上想象的翅膀OK,进入下一模块,主角是shape-outside。之前我也写过一篇关于shape-outside的精彩CSS形状[17],有兴趣的同学也可以先看看。shape-outside[18]CSS属性定义了一个可能非矩形的形状,相邻的内联内容应该环绕在该形状周围。使用它,我们可以很好的实现各种非横竖向的布局,让布局真正活起来。图文排列的交界处可以是倾斜的,像这样:CodePenDemo--FCC:BuildaTributePage-MichelThomasbyStephanie[19]也可以是弯曲的,像这样:CodePenDemo--shape-outside:circleDemo[20]甚至,它是一个不规则的容器,也可以动态变化:CodePenDemo--shape-outsideanimation[21]如果使用得当,我们可以创造出各种花哨的布局效果,如报纸版:不仅如此,袁川老师[22]竟然还用shape-outside创作了一些css美术,一起来欣赏:CodePenDemo--shape-outside--FaceByyuanchuan[23]以开头这张图为例:巧妙利用的例子shape-outside,它将整个布局分成7块,每块使用shape-outside进行细粒度控制。其实完整的布局是这样的:在这篇文章中,进行了这个DEMO非常详细的解释:ACSSVennDiagram[24]如果你也对shape-outside感兴趣,在这个收藏夹里,有很多优秀的CodePen上的shape-outside布局DEMO,大家不妨看看学习一下——CSSShapesExperiments[25]综上所述,在今天实现创意布局也需要我们掌握更多的CSS属性和技巧。本文简单介绍当今实现创意布局的几个有益属性:Grid布局全家桶以及使用Grid实现瀑布流布局Multiple-columnlayout和多列布局嵌套其他布局Shape-outside各种应用使用clip-path,transform和其他属性穿插在上面的布局中,增强各种布局当然,CSS能实现的远不止这些,比如滚动视差、3D变换等,都是可以用CSS实现然后集成到布局中的属性。当然,这也需要我们有创造美、发现美的眼睛和思维。最后,本文到此结束,希望对你有所帮助:)更多精彩的CSS技术文章汇总在我的Github——iCSS[26],会持续更新。参考资料[1]FastGridLayout-GridLayoutit:https://grid.layoutit.com/[2]CodePenDemo--GridLayoutDemo:https://codepen.io/Chokcoco/pen/ExWWevq[3]CodePenDemo--GTA5海报(网格和剪辑路径):https://codepen.io/Chokcoco/pen/jOVjxjo[4]OliviaNg:https://codepen.io/oliviale[5]CodePen演示--CSS网格:TrainTicket:https://codepen.io/oliviale/pen/MZZYyO[6]使用CSS栏目实现瀑布流布局:https://chokcoco.github.io/CSS-Inspiration/#/./layout/masonry-layout-colum[7]使用CSSflex实现瀑布布局:https://chokcoco.github.io/CSS-Inspiration/#/./layout/masonry-layout-flex[8]使用CSSgrid实现瀑布布局:https://chokcoco.github.io/CSS-Inspiration/#/./layout/masonry-layout-grid[9]我可以使用--grid-template-rows:masonry:https://caniuse.com/吗?search=grid-template-rows[10]CodePenDemo--CSSGrid实现伪瀑布流布局:https://codepen.io/Chokcoco/pen/KGXqyo[11]CodePenDemo--grid-template-rows:masonry实现瀑布流布局:https://codepen.io/Chokcoco/pen/NWdBojd[12]多列布局属性:https://drafts.c??sswg.org/css-multicol-1/[13]CodePenDemo--CSS多列布局演示:https://codepen.io/Chokcoco/pen/PoppVKx[14]CodePenDemo--CSS多列布局Demo2:https://codepen.io/Chokcoco/pen/QWpvgqK[15]rachelandrew:https://codepen.io/rachelandrew[16]CodePen演示--SmashingMulticol:混合布局方法--作者:rachelandrew:https://codepen.io/rachelandrew/pen/aPRjzL[17]奇妙的CSS形状:https://github.com/chokcoco/iCSS/issues/18[18]shape-outside:https://developer.mozilla.org/zh-CN/docs/Web/CSS/shape-outside[19]CodePenDemo--FCC:BuildaTributePage-MichelThomasbyStephanie:https://codepen.io/StuffieStephie/pen/ZLmzKG[20]CodePen演示--shape-outside:circle演示:https://codepen.io/Chokcoco/pen/LYWyOaa[21]CodePen演示--外形动画:https://codepen.io/Chokcoco/pen/RwpgmaK[22]袁川老师:https://twitter.com/yuanchuan23[23]CodePenDemo--shape-outside--FaceByyuanchuan:https://codepen.io/yuanchuan/pen/xoKMKj[24]ACSS维恩图:https://adrianroselli.com/2018/12/a-css-venn-diagram.html[25]CSS形状实验:https://codepen.io/collection/DYeRBR?cursor=ZD0wJm89MCZwPTEmdj00[26]Github——iCSS:https://github.com/chokcoco/iCSS