依稀记得,某年广东语文高考做文的相关描述 -- “有时,常识虽易知而难行,有时,常识须推陈而出新”。人的想象力和创造力很容易在对常识的一向认知中被削弱。css
CSS 更新之快,只能不断鞭策本身持续学习,一直呆在温馨区中,很容易就跟不上节奏。固然,不只仅是 CSS,对于任何技术任何行业也能够套用这句话。html
回归本文的主题 -- 新时代布局。运用现有的 CSS 技术,咱们是否能够大胆的跳出常规思惟,再也不局限于矩形框框一块一块,试着更加艺术一些?前端
像是下面这几个这样。git
不拘一格的线条:github
文字随图片的边缘排列:浏览器
再也不是横平竖直:ide
又或者造型怪异的网格:工具
是否是颇有意思?不拘一格的布局可以给页面吸引更多的目光和流量,固然这也须要我对 CSS 掌握的足够好,才能在有限的属性中创造更多不一样的可能性。布局
说到新时代布局和创意布局,就不得不提到 Grid 的布局。post
CSS Grid 布局的二维特性,让咱们相较于传统的float布局、定位布局、flex 布局有了对页面更强大的掌控力。
这里,咱们利用 Grid 布局的特性,能够将页面按照咱们的所想任意切割成不一样的块状区域。
这里推荐一些可以方便咱们进行 Grid 布局的工具:
利用这个工具,能够快速建立获得本身想要 Grid 布局,而且拿到对应的 CSS,很是的简单便捷。
这里我利用工具,将页面切割成了 A、B、C、D、E、F 6 块区域:
复制右侧的 HTML 和 CSS,能够快速的获得这样一个布局,我把代码拷贝到了 CodePen,简单添加了一下底色,咱们就能够基于这个布局再去作任何事情:
CodePen Demo -- Grid Layout Demo
这里,咱们能够利用 Grid 布局配合 clip-path 实现 GTA5 封面,像是这样:
咱们将一个 4x4 的 Grid 网格,分割为 9 个不一样的部分:
再利用 clip-path,根据封面图片的的造型,对每一块 Gird item 进行二次裁剪:
ok,最后把里面的色块替换成具体的图片便可:
CodePen Demo -- GTA 5 poster ( Grid and Clip Path)
固然这里有一个槽点,最终仍是用了 9 张图片,那为何不一开始直接用一张图片呢?:)
Grid 是在进行复杂布局的过程当中很是好的帮手,它很是适合各类不规则网格块的布局,这里再提供一个 DEMO:
做者是 Olivia Ng,Demo 的连接 -- CodePen Demo -- CSS Grid: Train Ticket
瀑布流布局在现代布局中也很是常见,一般在一些照片墙中使用。像是这样:
在以前,不借助 JavaScript,咱们有 3 种纯 CSS 的方式能够实现伪瀑布流布局(注意,这里是伪瀑布流),分别是:
你能够点进 Demo 看看,利用上述三种方式实现的瀑布流布局,缺点比较明显:
而在将来,标准基于 Grid 布局实现了 grid-template-rows: masonry
,利用该标准,咱们能够快速利用 Grid 实现水平排布的瀑布流布局,目前,你能够在 Firefox 体验该功能。
grid-template-rows: masonry
实现水平方向排布的瀑布流布局grid-template-rows: masonry
是 firefox 在 firefox 87 开始支持的一种基于 grid 布局快速建立瀑布流布局的方式。而且 firefox 一直在推进该属性进入标准当中。
从 firefox 87 开始,在浏览器输入网址栏输入 about:config
而且开启 layout.css.grid-template-masonry-value.enabled
配置使用。Can i use -- grid-template-rows: masonry
正常而言,咱们想要实现瀑布流布局仍是须要花费必定的功夫的,即使是基于 grid 布局。在以前,咱们经过 grid 布局,经过精细化控制每个 grid item
,能够实现竖直方向的瀑布流布局:
<div class="g-container"> <div class="g-item">1</div> <div class="g-item">2</div> <div class="g-item">3</div> <div class="g-item">4</div> <div class="g-item">5</div> <div class="g-item">6</div> <div class="g-item">7</div> <div class="g-item">8</div> </div>
.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; } }
效果以下:
CodePen Demo -- CSS Grid 实现伪瀑布流布局
在上述 Demo 中,使用 grid-template-columns
、grid-template-rows
分割行列,使用 grid-row
控制每一个 grid item
的所占格子的大小,可是这样作的成本过高了,元素一多,计算量也很是大,而且仍是在咱们提早知道每一个元素的高宽的前提下。
而在有了 grid-template-rows: masonry
以后,一切都会变得简单许多,对于一个不肯定每一个元素高度的 4 列的 grid 布局:
.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 感觉一下:
CodePen Demo -- grid-template-rows: masonry 实现瀑布流布局
多栏布局也属于如今咱们可以掌控的布局之一,利用 CSS 较为新的特性 Multiple-column Layout Properties。
最简单的多栏布局,咱们只须要用到 column-count
或者 column-width
。
假设咱们有以下 HTML:
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit...</p>
简单的 3 列布局:
p { width: 800px; column-count: 3; font-size: 16px; line-height: 2; }
经过 column-count: 3
指定 3 栏。
接下来,咱们再了解下 column-gap
和 column-rule
normal
,数值上为 1em
border
相似,指定列之间的装饰线仍是以下 HTML:
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit...</p>
简单的 3 列布局:
p { width: 800px; column-count: 3; font-size: 16px; line-height: 2; + column: 1px solid #999; + column-gap: 2em; }
CodePen Demo -- CSS multi column Layout Demo
接着,还有一个颇有意思的属性 column-span
,用于设置元素的跨列展现。
咱们首先利用多列布局,实现这样一个相似于报纸排版的布局样式。
<div class="g-container"> <p>Lorem ipsum dolor sit amet ... </p> <h2>Title Lorem ipsum dolor sit amet consectetur adipisicing elit title</h2> <p>Lorem ipsum dolor sit amet ... </p> </div>
.g-container { width: 800px; column-count: 3; column-rule: 1px solid #aaa; column-gap: 2em; } h2 { margin: 14px 0; font-size: 24px; line-height: 1.4; }
大概就是多列布局中嵌套标题,标题的加粗而且字号大一点:
经过给 h2
设置 column-span: all
,让 h2
标题跨列多列进行展现,改动一下 CSS:
h2 { margin: 14px 0; font-size: 24px; line-height: 1.4; + column-span: all; + text-align: center; }
便可获得这样一个布局:
CodePen Demo -- CSS multi column Layout Demo 2
固然,column-span
有个缺陷,就是它的取值只有 column-span: all
或者是 column-span: none
,也就是要么横跨全部的列,要么不跨列。
若是如今我有一个 3 列布局,可是只但愿其中的标题横跨两列,column-span: all
就没法实现了。
可是,经过嵌套其余布局,咱们能够巧妙的对多列布局再进行升华,譬如 rachelandrew 就实现了这样一种嵌套布局:
<div class="container"> <article> <p>By way of precaution ...</p> <h2>the first that ever burst Into that silent sea;</h2> <p>and with what ...</p> </article> <aside> <img src="demo.jpg"> <figcaption>The Authoress, her Father and Mr. Spencer making an ascent</figcaption> </aside> </div>
经过一个 2 列的 Grid 布局,嵌套一个两列的 multi-column 布局,大体的 CSS 以下:
.container { max-width: 800px; display: grid; grid-gap: 1em; grid-template-columns: 2fr 1fr; align-items: start; } h2 { column-span: all; text-align: center; } .container article { column-count: 2; column-gap: 2em; column-rule: 1px solid #ccc; } .container aside { border-left: 1px solid #ccc; padding: 0 1em; }
这样,咱们就能实现视觉上的横跨任意列的标题:
完整的 Demo 代码你能够戳这里:CodePen Demo -- Smashing Multicol: mixing layout methods -- By rachelandrew
OK,进入下一个模块,主角是 shape-outside
。
在以前,我也有写过一篇关于 shape-outside
的文章 奇妙的 CSS shapes,感兴趣的同窗也能够先看看。
shape-outside CSS 属性定义了一个能够是非矩形的形状,相邻的内联内容应围绕该形状进行包装。
利用它,咱们就可以很好的实现各类非横平竖直的布局,让布局真正的活起来。
图文排列的交界处,能够是斜的,像是这样:
CodePen Demo -- FCC: Build a Tribute Page - Michel Thomas by Stephanie
也能够是弯曲的,像是这样:
CodePen Demo -- shape-outside: circle Demo
甚至,它是还能够动态变化的不规则容器:
CodePen Demo -- shape-outside animation
合理使用,咱们就能够如报纸版创造各类花式布局效果:
不只如此,袁川老师 甚至使用了 shape-outside
进行了一些 CSS 艺术创做,一块儿欣赏一下:
CodePen Demo -- shape-outside -- Face By yuanchuan
以开篇的这张图为例子:
就是巧妙的运用 shape-outside
的例子,它将整个布局分为了 7 块,每一块分别使用 shape-outside
进行精细化的控制,实际上完整的布局是这样的:
在这篇文章中,对这个 DEMO 进行了很是详细的阐述:A CSS Venn Diagram
若是你也对 shape-outside
感兴趣,在这份收藏夹里,收藏了 CodePen 上很是多精良的 shape-outside
布局 DEMO,不妨一看学习学习 -- CSS Shapes Experiments
在今天,实现有创意的布局也须要咱们掌握更多的 CSS 属性与技巧,本文粗略的介绍了几种在今天实现创意布局的有益属性:
shape-outside
的各类应用clip-path
、transform
等属性以加强各类布局固然,CSS 能实现的远不止如此,像是滚动视差、3D 变换等等都是能够利用 CSS 实现而且再融合进布局当中的属性。固然这也须要咱们有创造和发现美的眼睛和思惟。
好了,本文到此结束,但愿对你有帮助 :)
想 Get 到最有意思的 CSS 资讯,千万不要错过个人公众号 -- iCSS前端趣闻 😄
更多精彩 CSS 技术文章汇总在个人 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
若是还有什么疑问或者建议,能够多多交流,原创文章,文笔有限,才疏学浅,文中如有不正之处,万望告知。