如何用一行CSS分別實現(xiàn)十種現(xiàn)代布局
前言
周日在家看web.dev的2020三天live,發(fā)現(xiàn)太多有意思的東西,其中有一項是關(guān)于CSS的,主播是Una Kravets(chrome team成員)了,不過以前的底子還在(有興趣的的可以看我一年前發(fā)布)關(guān)于CSS的東西,雖然由于太過沒沒啥人愿意看,sad)。
01、超級小中
在沒有和flex grid之前,垂直居中一直不能很優(yōu)雅的實現(xiàn)。而現(xiàn)在,可以結(jié)合我們 grid
和 place-items
優(yōu)雅的實現(xiàn)同時 水平居中 和 垂直居中 。
- <div class="parent blue" >
- <div class="box coral" contenteditable>
- :)
- </div>
- .ex1 .parent {
- display: grid;
- place-items: center;
- }
源碼地址:https://codepen.io/una/pen/YzyYbBx
02、可解構(gòu)的自適應(yīng)布局(The Deconstructed Pancake)
flex: 0 1 <baseWidth>
這種布局經(jīng)常出現(xiàn)在電的網(wǎng)站:
-
在視口足夠的時候,三個框固定寬度橫放
-
在視口不夠的時候(寬度在移動上面),寬度仍然固定,,但是自動解構(gòu)(原諒我的中文水平),不在同一水平面上
- <div class="parent white">
- <div class="box green">1</div>
- <div class="box green">2</div>
- <div class="box green">3</div>
- </div>
- .ex2 .parent {
- display: flex;
- flex-wrap: wrap;
- justify-content: center;
- }
- .ex2 .box {
- flex: 1 1 150px; /* flex-grow: 1 ,表示自動延展到最大寬度 */
- flex: 0 1 150px; /* No stretching: */
- margin: 5px;
- }
當(dāng)我們設(shè)置 flex: 1 1 150px;
時候:
源碼 地址:https://codepen.io/una/pen/WNQdBza
03、經(jīng)典的側(cè)邊欄
grid-template-columns: minmax(<min>, <max>) ...
同樣使用 grid
布局,結(jié)合可以 minmax()
實現(xiàn)彈性的的這在你要適應(yīng)大屏幕的時候很有用)。 minmax(<min>, <max>)
就是字面意思。結(jié)合 <flex>
單位,非常優(yōu)雅,避免了數(shù)學(xué)計算寬度等不靈活的手段(的我們設(shè)置間隙手段時候)。
- <div class="parent">
- <div class="section yellow" contenteditable>
- Min: 150px / Max: 25%
- </div>
- <div class="section purple" contenteditable>
- This element takes the second grid position (1fr), meaning
- it takes up the rest of the remaining space.
- </div>
- </div>
- .ex3 .parent {
- display: grid;
- grid-template-columns: minmax(150px, 25%) 1fr;
- }
源碼 地址:https://codepen.io/una/pen/gOaNeWL
04、固定的頁眉和頁腳
grid-template-rows: auto 1fr auto
固定高度的頁眉和頁腳,并保留剩余空間的主體是經(jīng)常使用的布局,我們可以利用 grid
和 fr
單位完子實現(xiàn)。
- <div class="parent">
- <header class="blue section" contenteditable>Header</header>
- <main class="coral section" contenteditable>Main</main>
- <footer class="purple section" contenteditable>Footer Content</footer>
- </div>
- .ex4 .parent {
- display: grid;
- grid-template-rows: auto 1fr auto;
- }
源碼 地址:https://codepen.io/una/pen/bGVXPWB
05、經(jīng)典的圣杯布局(古典圣杯布局)
grid-template: auto 1fr auto / auto 1fr auto
我們可以輕松地使用網(wǎng)格布局來實現(xiàn)圣杯布局,并且是彈性的。
- <div class="parent">
- <header class="pink section">Header</header>
- <div class="left-side blue section" contenteditable>Left Sidebar</div>
- <main class="section coral" contenteditable> Main Content</main>
- <div class="right-side yellow section" contenteditable>Right Sidebar</div>
- <footer class="green section">Footer</footer>
- </div>
- .ex5 .parent {
- display: grid;
- grid-template: auto 1fr auto / auto 1fr auto;
- }
- .ex5 header {
- padding: 2rem;
- grid-column: 1 / 4;
- }
- .ex5 .left-side {
- grid-column: 1 / 2;
- }
- .ex5 main {
- grid-column: 2 / 3;
- }
- .ex5 .right-side {
- grid-column: 3 / 4;
- }
- .ex5 footer {
- grid-column: 1 / 4;
- }
源碼 地址:https://codepen.io/una/pen/mdVbdBy
06、有意思的的疊塊
使用 grid-template-columns
狀語從句: grid-column
可以實現(xiàn)如下圖產(chǎn)品所示的布局。說明進一步了 repeat
狀語從句: fr
的便捷性。
源碼 地址:https://codepen.io/una/pen/eYJOYjj
07、RAM技巧
grid-template-columns: repeat(auto-fit, minmax(<base>, 1fr))
這在彈性布局 圖片/ box 這種非常有用(行可以排放的卡片數(shù)量自動適應(yīng))。
- .ex7 .parent {
- display: grid;
- grid-gap: 1rem;
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- }
- <div class="parent white">
- <div class="box pink">1</div>
- <div class="box purple">2</div>
- <div class="box blue">3</div>
- <div class="box green">4</div>
- </div>
其效果是如果確保能夠滿足多個盒的最小寬度(例如上面的 150px
),則自動彈性適應(yīng)放置多行。
- 當(dāng)前寬度是
160px
(不考慮gap),那么上面四個box
的寬度會適應(yīng)為160px
,并且分為4行 - 當(dāng)前寬度是
310px
(不考慮間隙),上面四個box
分段兩行,兩個box
平分寬度 -
當(dāng)滿足滿足一行放下3個box時,第三個box自動到第一行
-
當(dāng)滿足滿足一行放下4個box時,第四個box自動到第一行
我們?nèi)绻麑?nbsp;auto-fit
對劃線 auto-fill
:
源碼 地址:https://codepen.io/una/pen/oNbvNQv
08、卡片彈性適應(yīng)性
justify-content: space-between
,結(jié)合 grid
和 flex
實現(xiàn)完的布局。
- <div class="parent white">
- <div class="card yellow">
- <h3>Title - Card 1</h3>
- <p contenteditable>Medium length description with a few more words here.</p>
- <div class="visual pink"></div>
- </div>
- <div class="card yellow">
- <h3>Title - Card 2</h3>
- <p contenteditable>Long Description. Lorem ipsum dolor sit, amet consectetur adipisicing elit.</p>
- <div class="visual blue"></div>
- </div>
- <div class="card yellow">
- <h3>Title - Card 3</h3>
- <p contenteditable>Short Description.</p>
- <div class="visual green"></div>
- </div>
- </div>
- .ex8 .parent {
- height: auto;
- display: grid;
- grid-gap: 1rem;
- grid-template-columns: repeat(3, 1fr);
- }
- .ex8 .visual {
- height: 100px;
- width: 100%;
- }
- .ex8 .card {
- display: flex;
- flex-direction: column;
- padding: 1rem;
- justify-content: space-between;
- }
- .ex8 h3 {
- margin: 0
- }
無論是寬度或高度的收縮還是延展,,都可以完子的展現(xiàn)卡的布局。
地址:https://codepen.io/una/pen/ExPYomq
09、使用夾具實現(xiàn)流體印刷
clamp(<min>, <actual>, <max>)
最新使用的 clamp()
方法可以一行實現(xiàn)流體排版。提高UX,非常適合包含閱讀內(nèi)容的卡,因為我們不希望一行字太短或太長。
- <div class="parent white">
- <div class="card purple">
- <h1>Title Here</h1>
- <div class="visual yellow"></div>
- <p>Descriptive Text. Lorem ipsum dolor sit, amet consectetur adipisicing elit. Sed est error repellat veritatis.</p>
- </div>
- </div>
- .ex9 .parent {
- display: grid;
- place-items: center;
- }
- .ex9 .card {
- width: clamp(23ch, 50%, 46ch);
- display: flex;
- flex-direction: column;
- padding: 1rem;
- }
- .ex9 .visual {
- height: 125px;
- width: 100%;
- }
源碼 地址:https://codepen.io/una/pen/QWyLxaL
10、完
aspect-ratio: <width> / <height>
在展現(xiàn)CMS或其他設(shè)計內(nèi)容時,我們會期待圖片,視頻,卡片能夠按照固定的比例進行布局。而最新的 aspect-ratio
可以優(yōu)雅的實現(xiàn)該功能(使用chrome 84+)
- <div class="parent white">
- <div class="card blue">
- <h1>Video Title</h1>
- <div class="visual green"></div>
- <p>Descriptive Text. This demo works in Chromium 84+.</p>
- </div>
- </div>
- .ex10 .parent {
- display: grid;
- place-items: center;
- }
- .ex10 .visual {
- aspect-ratio: 16 / 9;
- }
- .ex10 .card {
- width: 50%;
- display: flex;
- flex-direction: column;
- padding: 1rem;
- }
源碼 地址:https://codepen.io/una/pen/xxZKzaX