收藏!40 個(gè) CSS 布局技巧

CSS是Web開發(fā)中不可或缺的一部分,隨著Web技術(shù)的不斷革新,CSS也變得更加強(qiáng)大。CSS的眾多屬性你知道了多少?具體開發(fā)中該使用什么屬性才最適合恰當(dāng)?如今的一些CSS屬性可以讓我們節(jié)約更多的時(shí)間。比如在Web布局中,現(xiàn)代CSS特性就可以更好的幫助我們快速實(shí)現(xiàn)如等高布局,水平垂直居中,經(jīng)典的圣杯布局、寬高比例、頁腳保持在底部等效果。淘系前端技術(shù)專家大漠將詳細(xì)介紹一些不同的CSS屬性來實(shí)現(xiàn)這些效果,希望對同學(xué)們有所幫助。
來源公眾號(hào):阿里技術(shù)
<div class="flex__container"><div class="flex__item">div>div>/* CSS */.flex__container {display: flex;justify-content: center;align-items: center;}

<div class="flex__container"><svg> svg>div>/* CSS */.flex__container {display: inline-flex;align-items: center;justify-content: center;}

<div class="flex__container"><div class="avatar">:)div><div class="media__heading">div><div class="media__content">div><div class="action">div>div>/* CSS */.flex__container {display: flex;flex-direction: column;justify-content: center;align-items: center;}

<div class="flex__container"><div class="flex__item">div>div>/* CSS */.flex__container {display: flex; // 或inline-flexjustify-content: center;}.flex__item {align-self: center;}

.flex__container {display: flex; // 或inline-flexjustify-content: center;}.flex__container > * {align-self: center;}

.flex__container {display: flex;place-content: center;}.flex__item {align-self: center;}

.flex__container {display: flex;place-content: center;place-items: center;}

.flex__container {display: flex;flex-direction: column;place-content: center;}.flex__container > * {align-self: center;}// 或.flex__container {display: flex;flex-direction: column;place-content: center;place-items: center;}

.flex__container {place-content: center;place-items: center;}
.flex__container {align-content: center;justify-content: center;align-items: center;justify-items: center;}
{display: flex;: center;: center;}多行{display: flex;: column;: center;: center;}
.flex__container {display: flex; // 或 inline-flex}.flex__item {margin: auto;}


<div class="grid__container"><div class="grid__item">div>div>/* CSS */.grid {display: grid; // 或 inline-gridplace-items: center}



<div class="grid__container"><div class="avatar">:)div><div class="media__heading">div><div class="media__content">div><div class="action">div>div>

<div class="grid__container"><div class="grid__item"><h3>Special title treatmenth3><p>With supporting text below as a natural lead-in to additional content.p><div class="action">Go somewherediv>div>div>/* CSS */.grid__container {display: grid;place-items: center;grid-template-columns: repeat(2, 1fr);gap: 2vh;}.grid__item {display: grid;place-items: center;}

<flex__container><flex__item>flex__item><flex__item>flex__item><flex__item>flex__item>flex__container>/* CSS */.flex__container {display: flex; // 或 inline-flex}


<grid__container><grid__item>grid__item><grid__item>grid__item><grid__item>grid__item>grid__container>/* CSS */.grid__container {display: grid;grid-template-columns: 20vw 1fr 20vw; /* 根據(jù)需求調(diào)整值*/}


<flex__container><flex__item><content>content>flex__item>flex__container>/* CSS */.flex__container {display: flex;}.content {height: 100%}// 或.grid__container {display: grid;grid-auto-flow: column;}.content {height: 100%;}


<header>header><main>main><footer>footer>
body {display: flex;flex-direction: column;}footer {margin-top: auto;}

body {display: flex;flex-direction: column;}main {flex: 1 0 auto;}

main {flex-grow: 1; /*容器有剩余空間時(shí),main區(qū)域會(huì)擴(kuò)展*/flex-shrink: 0; /*容器有不足空間時(shí),main區(qū)域不會(huì)收縮*/flex-basis: auto; /*main區(qū)域高度的基準(zhǔn)值為main內(nèi)容自動(dòng)高度*/}
.grid__container {display: grid;grid-template-rows: auto 1fr auto;}


<container><column>column><column>column><column>column>container>/* CCSS */.container {inline-size: 50vw;min-inline-size: 320px;display: flex-row;}.column {float: left;width: calc(100% / 3);}


<flex__container><flex__item>flex__item><flex__item>flex__item><flex__item>flex__item>flex__container>/* CSS */.flex__container {inline-size: 50vw;display: flex;}.flex__item {flex: 1;}


<grid__container><grid__item>grid__item><grid__item>grid__item><grid__item>grid__item>grid__container>/* CSS */.grid__container {display: grid;grid-template-columns: repeat(3, 1fr); /*這里的3表示具體的列數(shù)*/}


.flex__container {min-inline-size: 300px;}
.flex__container {display: flex;flex-wrap: wrap;}.flex__item {flex: 0 1 calc((100vw - 18vh) / 4); /* calc(100vw -18vh) / 4 是flex-basis的基準(zhǔn)值 */}


.flex__item {flex: 0 0 400px;}

.flex__item {flex: 1 0 400px;}

.grid__container {display: grid;grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));gap: 2vh;}



<header>header><main><article>article><nav>nav><aside>aside>main><footer>footer>
body {width: 100vw;display: flex;flex-direction: column;}main {flex: 1;min-height: 0;display: flex;align-items: stretch;width: 100%;}footer {margin-top: auto;}nav {width: 220px;order: -1;}article {flex: 1;}aside {width: 220px;}

nav {order: 0;}aside {order: -1;}

注意,order的默認(rèn)值為0,值越大越排在后面!
@media screen and (max-width: 800px) {main {flex-direction: column;}nav, aside {width: 100%;}}


<body><header>header><main>main><nav>nav><aside>aside><footer>footer>body>
body {display: grid;grid-template: auto 1fr auto / 220px 1fr 220px;}header {grid-column: 1 / 4;}main {grid-column: 2 / 3;grid-row: 2 / 3;}nav {grid-column: 1 / 2;grid-row: 2 / 3;}aside {grid-column: 3 / 4;grid-row: 2 / 3;}footer {grid-column: 1 / 4;}


@media screen and (max-width: 800px) {body {grid-template-rows: auto;grid-template-columns: auto;}header,main,nav,aside,footer {grid-column: 1 / 2;min-height: auto;}main {grid-row: 3 / 4;margin: 0;}nav {grid-row: 2 / 3;}aside {grid-row: 4 / 5;}footer {grid-row: 5 / 6;}}

body {display: grid;grid-template-areas:"header header header""nav main aside""footer footer footer";}header {grid-area: header;}main {grid-area: main;}nav {grid-area: nav;}aside {grid-area: aside;}footer {grid-area: footer;}@media screen and (max-width: 800px) {body {grid-template-areas:"header""nav""main""aside""footer";}}



body {display: grid;grid-template-areas:"header header header header header""nav main main main aside""footer footer footer footer footer";}


body {display: grid;grid-template-areas:"header header header""nav main aside""footer footer footer";grid-template-columns: 220px 1fr 220px;grid-template-rows: auto 1fr auto;}header {grid-area: header;}main {grid-area: main;}nav {grid-area: nav;}aside {grid-area: aside;}footer {grid-area: footer;}@media screen and (max-width: 800px) {body {grid-template-areas:"header""nav""main""aside""footer";grid-template-columns: 1fr;grid-template-rows: auto auto 1fr auto auto;}main {margin-left: 0;margin-right: 0;}}




<flex__grid><flex__row><flex__item col4>flex__item col4><flex__item col4>flex__item col4><flex__item col4>flex__item col4>flex__row>flex__grid>


:root {--gutter: 10px;--columns: 12;--span: 1;}.flex__container {display: flex;flex-direction: column;padding-left: var(--gutter);padding-right: var(--gutter);}.flex__row {display: flex;margin-left: calc(var(--gutter) * -1);margin-right: calc(var(--gutter) * -1);}.flex__row + .flex__row {margin-top: 2vh;}.flex__item {flex: 1 1calc((100% / var(--columns) - var(--gutter)) * var(--span));margin: 0 var(--gutter);}.flex__item1 {--span: 1;}.flex__item2 {--span: 2;}.flex__item3 {--span: 3;}.flex__item4 {--span: 4;}.flex__item5 {--span: 5;}.flex__item6 {--span: 6;}.flex__item7 {--span: 7;}.flex__item8 {--span: 8;}.flex__item9 {--span: 9;}.flex__item10 {--span: 10;}.flex__item11 {--span: 11;}.flex__item12 {--span: 12;}

<grid__container><grid__item>grid__item>grid__container>
使用 fr 將網(wǎng)格均分為相等的值,即每列寬度都是 1 個(gè) fr;配合 repeat() 函數(shù),即 repeat(12, 1fr) 創(chuàng)建了12列網(wǎng)格。
使用?gap 可以用來控制網(wǎng)格之間的間距。
配合 minmax() 還可以設(shè)置網(wǎng)格最小值。
:root {--columns: 12;--gap: 10px;--span: 1;}.grid__container {display: grid;grid-template-columns: repeat(var(--columns), 1fr);grid-template-rows: 1fr;gap: var(--gap);padding-left: calc(var(--gap) / 2);padding-right: calc(var(--gap) / 2);}.grid__item {min-block-size: 10vh;grid-column: span var(--span);}.col1 {--span: 1;}.col2 {--span: 2;}.col3 {--span: 3;}.col4 {--span: 4;}.col5 {--span: 5;}.col6 {--span: 6;}.col7 {--span: 7;}.col8 {--span: 8;}.col9 {--span: 9;}.col10 {--span: 10;}.col11 {--span: 11;}.col12 {--span: 12;}


.grid__container {padding: 1em;display: grid;grid-template-columns: repeat(auto-fit, minmax(60px, 1fr));gap: 1em;grid-auto-flow: dense;}


.flex__container {display: flex;flex-wrap: wrap;justify-content: space-between;width: 100%;}


.flex__container::after {content: "";display: flex;flex: 0 1 32vw;}


占位符元素?cái)?shù)量 = 每行最大的列數(shù) - 2
body {padding: 1vh;}.flex__container {display: flex;flex-wrap: wrap;gap: 2vh;width: 100%;}.flex__item {flex: 0 1 calc((100vw - 8vh) / 4);}


body {padding: 1vh;}.grid__container {display: grid;grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));gap: 1vh;}


如果 VAL 在 MIN 和 MAX 之間,則使用 VAL 作為函數(shù)的返回值。
如果 VAL 大于 MAX,則使用 MAX 作為函數(shù)的返回值。
如果 VAL 小于 MIN,則使用 MIN 作為函數(shù)的返回值。
.element {/*** MIN = 100px* VAL = 50vw ? 根據(jù)視窗的寬度計(jì)算* MAX = 500px**/width: clamp(100px, 50vw, 500px);}



元素 .element 的寬度不會(huì)小于 100px(有點(diǎn)類似于元素設(shè)置了 min-width: 100px)。
元素 .element 的寬度不會(huì)大于 500px(有點(diǎn)類似于元素設(shè)置了 max-width: 500px)。
首選值 VAL 為 50vw,只有當(dāng)視窗的寬度大于 200px 且小于 1000px 時(shí)才會(huì)有效,即元素 .element 的寬度為 50vw(有點(diǎn)類似于元素設(shè)置了 width:50vw)。

<ul class="brands"><li class="brands__item"><a href="#"><img src="img/logo.png" alt="">a>li><li> li>ul>
.brands {display: grid;grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));grid-gap: 1rem;}.brands__item {background: #eee;}.brands__item a {display: flex;justify-content: center;align-items: center;height: 100%;}.brands__item img {width: 130px;height: 75px;object-fit: contain;}
.brands__item img {width: 130px;height: 75px;object-fit: contain;mix-blend-mode: multiply;}


