如何用一行CSS分别实现十种现代布局

开发 前端
周日在家看web.dev的2020三天live,发现太多有意思的东西,其中有一项是关于CSS的,主播是Una Kravets(chrome team成员)了,不过以前的底子还在(有兴趣的的可以看我一年前发布)关于CSS的东西。

 

前言

周日在家看web.dev的2020三天live,发现太多有意思的东西,其中有一项是关于CSS的,主播是Una Kravets(chrome team成员)了,不过以前的底子还在(有兴趣的的可以看我一年前发布)关于CSS的东西,虽然由于太过没没啥人愿意看,sad)。

01、超级小中

在没有和flex grid之前,垂直居中一直不能很优雅的实现。而现在,可以结合我们 grid 和 place-items 优雅的实现同时 水平居中 和 垂直居中 。

  1. <div class="parent blue" > 
  2.   <div class="box coral" contenteditable> 
  3.     :) 
  4.   </div> 

 

  1. .ex1 .parent { 
  2.   display: grid; 
  3.   place-items: center; 

源码地址:https://codepen.io/una/pen/YzyYbBx

02、可解构的自适应布局(The Deconstructed Pancake)

flex: 0 1 <baseWidth>

这种布局经常出现在电的网站:

  1. 在视口足够的时候,三个框固定宽度横放

  2. 在视口不够的时候(宽度在移动上面),宽度仍然固定,,但是自动解构(原谅我的中文水平),不在同一水平面上

  1. <div class="parent white"
  2.     <div class="box green">1</div> 
  3.     <div class="box green">2</div> 
  4.     <div class="box green">3</div> 
  5.   </div> 

 

  1. .ex2 .parent { 
  2.   display: flex; 
  3.   flex-wrap: wrap; 
  4.   justify-content: center; 
  5.  
  6. .ex2 .box { 
  7.   flex: 1 1 150px; /*  flex-grow: 1 ,表示自动延展到最大宽度 */ 
  8.   flex: 0 1 150px; /*  No stretching: */ 
  9.   margin: 5px; 

当我们设置 flex: 1 1 150px; 时候:

源码 地址:https://codepen.io/una/pen/WNQdBza

03、经典的侧边栏

grid-template-columns: minmax(<min>, <max>) ...

同样使用 grid 布局,结合可以 minmax() 实现弹性的的这在你要适应大屏幕的时候很有用)。 minmax(<min>, <max>) 就是字面意思。结合 <flex> 单位,非常优雅,避免了数学计算宽度等不灵活的手段(的我们设置间隙手段时候)。

  1. <div class="parent"
  2.   <div class="section yellow" contenteditable> 
  3.   Min: 150px / Max: 25
  4.   </div> 
  5.   <div class="section purple" contenteditable> 
  6.     This element takes the second grid position (1fr), meaning 
  7.     it takes up the rest of the remaining space. 
  8.   </div> 
  9. </div> 

 

  1. .ex3 .parent { 
  2.    display: grid; 
  3.    grid-template-columns: minmax(150px, 25%) 1fr; 
  4.  } 

源码 地址:https://codepen.io/una/pen/gOaNeWL

04、固定的页眉和页脚

grid-template-rows: auto 1fr auto

固定高度的页眉和页脚,并保留剩余空间的主体是经常使用的布局,我们可以利用 grid 和 fr 单位完子实现。

  1. <div class="parent"
  2.   <header class="blue section" contenteditable>Header</header> 
  3.   <main class="coral section" contenteditable>Main</main> 
  4.   <footer class="purple section" contenteditable>Footer Content</footer> 
  5. </div> 

 

  1. .ex4 .parent { 
  2.     display: grid; 
  3.     grid-template-rows: auto 1fr auto; 
  4.   } 

源码 地址:https://codepen.io/una/pen/bGVXPWB

05、经典的圣杯布局(古典圣杯布局)

grid-template: auto 1fr auto / auto 1fr auto

我们可以轻松地使用网格布局来实现圣杯布局,并且是弹性的。

  1. <div class="parent"
  2.     <header class="pink section">Header</header> 
  3.     <div class="left-side blue section" contenteditable>Left Sidebar</div> 
  4.     <main class="section coral" contenteditable> Main Content</main> 
  5.     <div class="right-side yellow section" contenteditable>Right Sidebar</div> 
  6.     <footer class="green section">Footer</footer> 
  7.   </div> 

 

  1. .ex5 .parent { 
  2.    display: grid; 
  3.    grid-template: auto 1fr auto / auto 1fr auto; 
  4.  } 
  5.  
  6.  .ex5 header { 
  7.    padding: 2rem; 
  8.    grid-column: 1 / 4
  9.  } 
  10.  
  11.  .ex5 .left-side { 
  12.    grid-column: 1 / 2
  13.  } 
  14.  
  15.  .ex5 main { 
  16.    grid-column: 2 / 3
  17.  } 
  18.  
  19.  .ex5 .right-side { 
  20.    grid-column: 3 / 4
  21.  } 
  22.  
  23.  .ex5 footer { 
  24.    grid-column: 1 / 4
  25.  } 

源码 地址:https://codepen.io/una/pen/mdVbdBy

06、有意思的的叠块

使用 grid-template-columns 状语从句: grid-column 可以实现如下图产品所示的布局。说明进一步了 repeat 状语从句: fr 的便捷性。

源码 地址:https://codepen.io/una/pen/eYJOYjj

07、RAM技巧

grid-template-columns: repeat(auto-fit, minmax(<base>, 1fr))

这在弹性布局 图片/ box 这种非常有用(行可以排放的卡片数量自动适应)。

  1. .ex7 .parent { 
  2.    display: grid; 
  3.    grid-gap: 1rem; 
  4.    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); 
  5.  } 

 

  1. <div class="parent white"
  2.    <div class="box pink">1</div> 
  3.    <div class="box purple">2</div> 
  4.    <div class="box blue">3</div> 
  5.    <div class="box green">4</div> 
  6.  </div> 

其效果是如果确保能够满足多个盒的最小宽度(例如上面的 150px ),则自动弹性适应放置多行。

  1. 当前宽度是 160px (不考虑gap),那么上面四个 box 的宽度会适应为 160px ,并且分为4行
  2. 当前宽度是 310px (不考虑间隙),上面四个 box 分段两行,两个 box 平分宽度
  3. 当满足满足一行放下3个box时,第三个box自动到第一行

  4. 当满足满足一行放下4个box时,第四个box自动到第一行

我们如果将 auto-fit 对划线 auto-fill :

源码 地址:https://codepen.io/una/pen/oNbvNQv

08、卡片弹性适应性

justify-content: space-between ,结合 grid 和 flex 实现完的布局。

  1. <div class="parent white"
  2.     <div class="card yellow"
  3.       <h3>Title - Card 1</h3> 
  4.       <p contenteditable>Medium length description with a few more words here.</p> 
  5.       <div class="visual pink"></div> 
  6.     </div> 
  7.     <div class="card yellow"
  8.       <h3>Title - Card 2</h3> 
  9.       <p contenteditable>Long Description. Lorem ipsum dolor sit, amet consectetur adipisicing elit.</p> 
  10.       <div class="visual blue"></div> 
  11.     </div> 
  12.     <div class="card yellow"
  13.       <h3>Title - Card 3</h3> 
  14.       <p contenteditable>Short Description.</p> 
  15.       <div class="visual green"></div> 
  16.     </div> 
  17.   </div> 

 

  1. .ex8 .parent { 
  2.    height: auto; 
  3.    display: grid; 
  4.    grid-gap: 1rem; 
  5.    grid-template-columns: repeat(3, 1fr); 
  6.  } 
  7.  
  8.  .ex8 .visual { 
  9.    height: 100px; 
  10.    width: 100%; 
  11.  } 
  12.  
  13.  .ex8 .card { 
  14.    display: flex; 
  15.    flex-direction: column; 
  16.    padding: 1rem; 
  17.    justify-content: space-between; 
  18.  } 
  19.  
  20.  .ex8 h3 { 
  21.    margin: 0 
  22.  } 
 

无论是宽度或高度的收缩还是延展,,都可以完子的展现卡的布局。

地址:https://codepen.io/una/pen/ExPYomq

09、使用夹具实现流体印刷

clamp(<min>, <actual>, <max>)

最新使用的 clamp() 方法可以一行实现流体排版。提高UX,非常适合包含阅读内容的卡,因为我们不希望一行字太短或太长。

  1. <div class="parent white"
  2.    <div class="card purple"
  3.      <h1>Title Here</h1> 
  4.      <div class="visual yellow"></div> 
  5.      <p>Descriptive Text. Lorem ipsum dolor sit, amet consectetur adipisicing elit. Sed est error repellat veritatis.</p> 
  6.    </div> 
  7.  </div> 

 

  1. .ex9 .parent { 
  2.    display: grid; 
  3.    place-items: center; 
  4.  } 
  5.  
  6.  .ex9 .card { 
  7.    width: clamp(23ch, 50%, 46ch); 
  8.    display: flex; 
  9.    flex-direction: column; 
  10.    padding: 1rem; 
  11.  } 
  12.  
  13.  .ex9 .visual { 
  14.      height: 125px; 
  15.      width: 100%; 
  16.    } 

源码 地址:https://codepen.io/una/pen/QWyLxaL

10、完

aspect-ratio: <width> / <height>

在展现CMS或其他设计内容时,我们会期待图片,视频,卡片能够按照固定的比例进行布局。而最新的 aspect-ratio 可以优雅的实现该功能(使用chrome 84+)

  1. <div class="parent white"
  2.     <div class="card blue"
  3.       <h1>Video Title</h1> 
  4.       <div class="visual green"></div> 
  5.       <p>Descriptive Text. This demo works in Chromium 84+.</p> 
  6.     </div> 
  7.   </div> 

 

  1. .ex10 .parent { 
  2.    display: grid; 
  3.    place-items: center; 
  4.  } 
  5.  
  6.  .ex10 .visual { 
  7.    aspect-ratio: 16 / 9
  8.  } 
  9.  
  10.  .ex10 .card { 
  11.    width: 50%; 
  12.    display: flex; 
  13.    flex-direction: column; 
  14.    padding: 1rem; 
  15.  } 

源码 地址:https://codepen.io/una/pen/xxZKzaX

 

责任编辑:张燕妮 来源: 三分钟学前端
相关推荐

2022-05-03 17:04:08

CSS前端

2023-09-21 15:10:55

2024-02-19 07:52:40

CSSJS属性

2020-07-20 09:20:48

代码geventPython

2022-04-09 09:11:33

Python

2022-05-02 18:29:35

bashshellLinux

2023-05-15 15:29:13

设计模式JavaScript

2021-09-13 06:03:42

CSS 技巧搜索引擎

2024-01-22 08:15:42

API协议设计

2023-05-15 20:08:04

Linux字体

2020-08-19 10:30:25

代码Python多线程

2023-08-14 18:25:31

CSSJavaScript业务

2020-08-24 08:25:48

Python开发工具

2020-09-09 16:00:22

Linux进程

2022-05-31 09:36:18

JDKDelayQueueRedis

2010-09-07 13:12:17

2023-08-22 13:18:00

Web 开发CSS

2022-04-26 10:44:27

IT专业人员IT职业道路

2013-08-23 09:13:44

2011-12-21 21:16:58

点赞
收藏

51CTO技术栈公众号