日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

css布局方式_网页布局都有哪种?一般都用什么布局?

發(fā)布時間:2025/3/12 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 css布局方式_网页布局都有哪种?一般都用什么布局? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
隨著Web技術不斷的革新,CSS近幾年也變得多年前要更強大。在Web開發(fā)中,CSS是不可或缺的一部分,對于很多Web開發(fā)者來說,有很多CSS屬性不知道,或者說他們知道,但忘記在最恰當?shù)臅r候使用最適合的CSS屬性。而且時至今日,其中有一些CSS的屬性可以讓開發(fā)者能節(jié)約更多的時間。比如說,在Web布局中,現(xiàn)代CSS特性就可以更好的幫助我們快速實現(xiàn),例如等高布局,水平垂直居中,經典的圣杯布局、寬高比例、頁腳保持在底部等。在本文中,我將會介紹一些不同的CSS屬性來實現(xiàn)這些效果,希望大家會感興趣。更希望對大家今后的工作有所幫助。水平垂直居中

如何實現(xiàn)水平垂直居中?可以說是CSS面試題中的經典面試題,在多年前這個面試題給很多同學都帶來了困惑,但?Flexbxo布局模塊?和?CSS Grid布局模塊?的到來,可以說實現(xiàn)水平垂直居中已是非常的容易。

? ?Flexbox中實現(xiàn)水平垂直居中

在Flexbox布局模塊中,不管是單行還是多行,要讓它們在容器中水平垂直居中都是件易事,而且方法也有多種。最常見的是在Flex容器上設置對齊方式,在Flex項目上設置margin:auto。

先來看在Flex容器上設置對齊方式。

Flex容器和Flex項目上設置對齊方式

你可能已經知道在Flex容器上設置justify-content、align-items的值為center時,可以讓元素在Flex容器中達到水平垂直居中的效果。來看一個示例:

/* CSS */.flex__container { display: flex; justify-content: center; align-items: center;}

效果如下:

Demo(https://codepen.io/airen/embed/YzwYRRy)

這種方式特別適應于讓Icon圖標在容器中水平垂直居中,不同的是在Icon圖標容器上顯示設置display: inline-flex。比如下面這個示例:

/* CSS */.flex__container { display: inline-flex; align-items: center; justify-content: center;}

效果如下:

Demo(https://codepen.io/airen/embed/xxZpQNv)

在這種模式之下,如果要讓多個元素實現(xiàn)水平垂直居中的效果,那還需要加上flex-direction: column,比如:

:) /* CSS */.flex__container { display: flex; flex-direction: column; justify-content: center; align-items: center;}

效果如下:

Demo(https://codepen.io/airen/embed/QWyazpZ)

在Flexbox布局中,還可以像下面這樣讓Flex項目在Flex容器中達到水平垂直居中的效果:

/* CSS */.flex__container { display: flex; // 或inline-flex justify-content: center;}.flex__item { align-self: center;}

效果如下:

Demo(https://codepen.io/airen/embed/yLepGKW)

如果在Flex容器中有多個Flex項目時,該方法同樣有效:

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

比如下面這個效果:

Demo(https://codepen.io/airen/embed/bGEaOjm)

除此之外,還可以使用place-content: center讓Flex項目實現(xiàn)水平垂直居中:

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

效果如下:

Demo(https://codepen.io/airen/embed/gOPoZQz)

或者換:

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

效果如下:

Demo(https://codepen.io/airen/embed/JjGMwzE)

這兩種方式同樣適用于Flex容器中有多個Flex項目的情景:

.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;}

效果如下:

Demo(https://codepen.io/airen/embed/XWXVoLd)

可能很多同學對于place-content和place-items會感到陌生。其實place-content是align-content和justify-content的簡寫屬性;而place-items是align-items和justify-items的簡寫屬性。即:

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

等效于:

.flex__container { align-content: center; justify-content: center; align-items: center; justify-items: center;}

雖然擴展出來有四個屬性,但最終等效于:

.flex__container { display: flex; align-items: center; justify-content: center;}// 多行.flex__container { display: flex; flex-direction: column; align-items: center; justify-content: center;}

在Flex項目上設置`margin: auto`

如果在Flex容器中只有一個Flex項目,還可以顯式在Flex項目中顯式設置margin的值為auto,這樣也可以讓Flex項目在Flex容器中水平垂直居中。例如:

.flex__container { display: flex; // 或 inline-flex}.flex__item { margin: auto;}

效果如下:

Demo(https://codepen.io/airen/embed/KKVZJNp)

整個過程,你可以通過下面這個示例來體驗。嘗試著選中不同方向的margin值:

Demo(https://codepen.io/airen/embed/gOPoqRq

? ?Grid中實現(xiàn)水平垂直居中

CSS Grid布局可以說是現(xiàn)代Web布局中的銀彈。它也是到目前為止布局系統(tǒng)中唯一一個二維布局系統(tǒng)。

在CSS Grid布局中,只需要僅僅的幾行代碼也可以快速的幫助我們實現(xiàn)水平垂直居中的效果。比如下面這個示例:

/* CSS */.grid { display: grid; // 或 inline-grid place-items: center}

效果如下:

Demo(https://codepen.io/airen/embed/zYrRYxW)

在CSS Grid布局模塊中,只要顯式設置了display: grid(或inline-grid)就會創(chuàng)建Grid容器和Grid項目,也會自動生成網格線,即行和列(默認為一行一列)。

在沒有顯式地在Grid容器上設置grid-template-columns和grid-template-rows,瀏覽器會將Grid容器默認設置為Grid內容大小:

這種方法也適用于CSS Grid容器中有多個子元素(Grid項目),比如:

:)

這個時候你看到的效果如下:

Demo(https://codepen.io/airen/embed/PoZQoGP)

而且palce-items適用于每個單元格。這意味著它將居中單元格的內容。比如下面這個示例:

Special title treatment

With supporting text below as a natural lead-in to additional content.

Go somewhere /* CSS */.grid__container { display: grid; place-items: center; grid-template-columns: repeat(2, 1fr); gap: 2vh;}.grid__item { display: grid; place-items: center;}

效果如下:

Demo(https://codepen.io/airen/embed/mdVXdpe)

等高布局


等高布局也是Web中非常常見的一種布局方式,而且實現(xiàn)等高布局的方案也有很多種。這里我們主要來看Flexbox布局模塊和Grid布局模塊給我們帶來了什么樣的變化。

在Flexbox和Grid布局模塊中,讓我們實現(xiàn)等高布局已經是非常的簡單了,比如:

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

簡單地說,在容器上顯式設置了display的值為flex或inline-flex,該容器的所有子元素的高度都相等,因為容器的align-items的默認值為stretch。

這個時候你看到的效果如下:

Demo(https://codepen.io/airen/embed/NWxyOQq)

這種方式特別適用于卡片組件中:

Demo(https://codepen.io/airen/embed/OJMQoOO)

在Grid布局模塊中類似:

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

效果如下:

Demo(https://codepen.io/airen/embed/mdVXQON)

同樣在一些卡片類布局中運用:

Demo(https://codepen.io/airen/embed/MWKQzmE)

如果需求有所調整,比如在Flex項目?或?Grid項目的子元素高度和容器高度相同。

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

效果如下:

Demo(https://codepen.io/airen/embed/jOWZdbo)

基于Sticky Footer


首先用下圖來描述什么是Sticky Footer布局效果:

Sticky Footer實現(xiàn)方案和等高、垂直居中一樣,同樣有很多種方案可以實現(xiàn)(//css-tricks.com/couple-takes-sticky-footer/)。

比如像下面這樣的結構:

先來看Flexbox布局模塊中的實現(xiàn)方案:

body { display: flex; flex-direction: column;}footer { margin-top: auto;}

Demo(https://codepen.io/airen/embed/bGELzYy)

可以嘗試著在main區(qū)域右下角向下拖動,改變主內容區(qū)域的高度,你會發(fā)現(xiàn)“當內容不足一屏時,會在頁面的最底部,當內容超出一屏時,會自動往后延后”。

在Flexbox布局中,還可以在區(qū)域上設置下面的樣式,達到相等的效果:

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

效果如下:

Demo(https://codepen.io/airen/embed/zYrRXmY)

中的flex: 1 0 auto相當于是:

main { flex-grow: 1; /*容器有剩余空間時,main區(qū)域會擴展*/ flex-shrink: 0; /*容器有不足空間時,main區(qū)域不會收縮*/ flex-basis: auto; /*main區(qū)域高度的基準值為main內容自動高度*/}

如果你想省事的話,可以在main上顯式設置flex-grow:1,因為flex-shrink和flex-basis的默認值為1和auto。

在CSS Grid布局中我們可以借助1fr讓區(qū)域根據(jù)Grid容器剩余空間來做計算。

.grid__container { display: grid; grid-template-rows: auto 1fr auto;}

效果如下:

Demo(https://codepen.io/airen/embed/MWKQRxd)

均分列


在Web布局中,很多時候會對列做均分布局,最為常見的就是在移動端的底部Bar,比如下圖這樣的一個效果:

在Flexbox和Grid還沒出現(xiàn)之前,如果希望真正的做到均分效果,可以用100%(或100vw)除以具體的列數(shù)。比如:

<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);}

效果如下:

Demo(https://codepen.io/airen/embed/LYGQoxL)

通過瀏覽器調試器中可以發(fā)現(xiàn),現(xiàn)個列的寬度都是相等的:

在Flexbox和Grid布局中,實現(xiàn)上面的效果會變得更容易地多。先來看Flexbox中的布局:

<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;}

效果如下:

Demo(https://codepen.io/airen/embed/yLevWEe)

在Flexbox布局模塊中,當flex取的值是一個單值(無單位的數(shù)),比如示例中的flex:1,它會當作顯式的設置了flex-grow: 1。瀏覽器計算出來的flex:

接下來看Grid中如何實現(xiàn)上例的效果:

<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ù)*/}

最終的效果是相同的:

Demo(https://codepen.io/airen/embed/NWxyVQP)

這樣的布局方式也適用于其他的布局中。但不管是Flexbox還是Grid布局中,都存在一定的缺陷,當容器沒有足夠的空間容納Flex項目(或Grid項目)時,Flex項目或Grid項目會溢出(或隱藏,如果Flex容器或Grid容器顯式設置了overflow:hidden):

修復這種現(xiàn)象最簡單的方式是在Flex容器或Grid容器顯式設置一個min-width(或min-inline-size):

.flex__container { min-inline-size: 300px;}

不過話又說回來,比如我們的Flex項目(或Grid項目)是一個卡片,每張卡片寬度是相等之外,更希望容器沒有足夠空間時,Flex項目(或Grid項目)會自動斷行排列。

我們繼續(xù)通過示例向大家展示。先來看Flexbox實現(xiàn)方案:

.flex__container { display: flex; flex-wrap: wrap;}.flex__item { flex: 0 1 calc((100vw - 18vh) / 4); /* calc(100vw -18vh) / 4 是flex-basis的基準值 */}

Demo(https://codepen.io/airen/embed/dyGdBpw)

你可以嘗試著調整瀏覽器的視窗寬度,當瀏覽器的視窗越來越小時,Flex容器寬度也就會越來越小,當Flex容器小到沒有足夠的空間容納四個Flex項目(就此例而言),那么Flex項目就會斷行排列:

基于該例,如果把Flex項目的flex值改成:

.flex__item { flex: 0 0 400px;}

這個時候,當Flex容器沒有足夠空間時,Flex項目會按flex-basis: 400px計算其寬度,Flex容器沒有足夠空間時,Flex就會斷行:

反過來,如果Flex項目的值flex改成:

.flex__item { flex: 1 0 400px;}

當Flex容器沒有足夠空間排列Flex項目時,Flex項目會按flex-basis: 400px計算其寬度,Flex會斷行,并且同一行出現(xiàn)剩余空間時,Flex項目會擴展,占滿整個Flex容器:

在Grid中實現(xiàn)類似的效果要更復雜一點。可以使用repeat()函數(shù),1fr以及auto-fit等特性:

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

效果如下:

Demo(https://codepen.io/airen/embed/RwrQzeN)

如果你對這方面知識感興趣的話,還可以移步閱讀《Container Query Solutions with CSS Grid and Flexbox(//moderncss.dev/container-query-solutions-with-css-grid-and-flexbox/)》一文。

其實在Grid中與auto-fit對比的值還有一個叫auto-fill。但兩者的差異是非常地大,用下圖來描述auto-fit和auto-fill的差異:

另外這種方式也是到目前為止一種不需要借助CSS媒體查詢就可以實現(xiàn)響應式布局效果。

圣杯布局


圣杯布局(Holy Grail Layout)(//en.wikipedia.org/wiki/Holygrail(web_design))是Web中典型的布局模式(//alistapart.com/article/holygrail/)。看上去像下圖這樣:

對于圣杯布局而言,HTML結構是有一定的要求,那就是內容為先:

<header>header><main> <article>article> <nav>nav> <aside>aside>main><footer>footer>

在這里主要還是和大家一起探討,如何使用Flexbox和Grid布局模塊來實現(xiàn)圣杯布局。先來看Flexbox實現(xiàn)方案:

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;}

效果如下:

Demo(https://codepen.io/airen/embed/rNxJXYb)

通過在nav、aside和article上顯式設置order的值,可以很好的控制這三個區(qū)域的布局順序。比如說,希望在之前排列,只需要在上面的示例基礎上做一點點調整:

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

效果如下:

注意,order的默認值為0,值越大越排在后面!

在上例的基礎上,借助CSS媒體對象的特性,可以很容易實現(xiàn)響應式的圣杯布局效果:

@media screen and (max-width: 800px) { main { flex-direction: column; } nav, aside { width: 100%; }}

效果如下:

Demo(https://codepen.io/airen/embed/gOPvVZX)

嘗試著拖動瀏覽器來改變視窗大小,你可以看到如下圖的效果:

在Grid布局模塊中,實現(xiàn)圣杯布局要比Flexbox布局模塊中更容易,而且更靈活。在CSS Grid布局模塊中,HTML結構可以更簡潔:

<body> <header>header> <main>main> <nav>nav> <aside>aside> <footer>footer>body>

在CSS方面有很多種方案可以實現(xiàn)圣杯布局效果。我們先來看第一種:

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;}

效果如下:

Demo(https://codepen.io/airen/embed/PoZRYPa)

上面示例采用的是網格線來給每個區(qū)域進行定位的:

和Flexbox布局類似,在媒體查詢中可以改變每個網格區(qū)域的位置:

@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; }}

Demo(https://codepen.io/airen/embed/vYLRBaa)

除了grid-template(即grid-template-columns和grid-template-rows)之外,在Grid布局中還可以使用grid-area和grid-template-areas屬性的結合,也能很方便的實現(xiàn)CSS圣杯布局。基于上面的示例上,只需要把你的CSS調整為:

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"; }}

效果如下:

Demo(https://codepen.io/airen/embed/LYGdRrG)

你可能發(fā)現(xiàn)了它們之間的差異性:

后面這個示例中,、和區(qū)域寬度相等。這是因為我們示例中通過grid-template-areas來聲明網格,在使用grid-template-areas創(chuàng)建網格時,其實也隱式的創(chuàng)建了網格線,只不過他和grid-template不同的是grid-template可以顯式的指定網格軌道大小,而grid-template-areas在該示例中相當于網格軌道大小都是1fr。

如果我們希望的區(qū)域變得更大,那么可以在grid-template-areas上做個調整:

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

效果如下:

Demo(https://codepen.io/airen/embed/QWymKYZ)

這個時候網格區(qū)域的劃分像下圖這樣:

雖然在效果有所調整了,但還是均分狀態(tài)。更好的解決方案是,將grid-template-areas和grid-template結合起來使用:

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; }}

效果如下:

Demo(https://codepen.io/airen/embed/OJMvRev)

你可以發(fā)現(xiàn),這個時候,網格線的區(qū)域的命名像下圖這樣:

12列網格布局


12列網格布局最早是由960.gs提出的網格布局系統(tǒng)(//960.gs/):

12列網格布局在設計系統(tǒng)和CSS Framework中經常使用,比如業(yè)內經典的Bootstrap(//getbootstrap.com/)就采用了12列網格布局系統(tǒng):

在社區(qū)中也有很多在線工具,幫助我們快速構建12列網格系統(tǒng),比如?Free CSS Grid Tools & Resources For Developers(//1stwebdesigner.com/free-css-grid-tools-resources/)?一文中羅列的工具。

Demo?(http://paulhebertdesigns.com/gridley/)

不過這里主要是想和大家一起看看在Flexbox和Grid布局模塊中是如何實現(xiàn)12列的網格布局系統(tǒng)。

先來看Flexbox布局模塊。12列網格布局的HTMl結構一般類似于下面這樣:

<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>

注意,12列網格中,一般同一行的列數(shù)值和剛好等于12。比如上面的HTML結構,行中有三列,每列的寬度剛好四個網格寬度加兩個列間距。并且在計算的時候有一套成熟的計算公式:

而且還設計上也會有所差異,比如說距離容器兩側有沒有間距等:

這些的差異對于計算公式和樣式代碼的設計都略有差異。我們用其中一個為例:

: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 1 calc((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;}

你會看到的效果如下:

Demo(https://codepen.io/airen/embed/YzwaxwX)

在該示例中采用了CSS自定義屬性相關的特性,讓整個計算變得更容易一些。

對于使用CSS Grid布局模塊來實現(xiàn)12列網格布局,相對而言,不管是HTML結構還是CSS代碼都會更簡易一些。在使用CSS Grid布局模塊實現(xiàn)12列網格布局,將會運用到repeat()、minmax()、gap和fr等特性。具體的來看一個示例吧。

<grid__container> <grid__item>grid__item>grid__container>

我們來看CSS代碼:

  • 使用fr將網格均分為相等的值,即每列寬度都是1個fr;配合repeat()函數(shù),即repeat(12, 1fr)創(chuàng)建了12列網格

  • 使用gap可以用來控制網格之間的間距

  • 配合minmax()還可以設置網格最小值

具體的代碼如下:

: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;}

你將看到的效果如下:

Demo(https://codepen.io/airen/embed/yLeKPPb)

就該示例而言,grid-template-columns: repeat(12, 1fr)創(chuàng)建網格如下圖所示:

除了上述這種粗暴的方式,還可以更靈活一些,將auto-fit、minmax()以及grid-auto-flow: dense等來創(chuàng)建:

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

對于.grid__item可以通過grid-column、grid-row來控制網格項目的位置:

Demo(https://codepen.io/airen/embed/QWymabq)

加上grid-auto-flow: dense會根據(jù)Grid容器空間,Grid項目會自動流到合適的位置:

這種布局對于雜志類的布局非常的適用。有關于這方面更詳細的介紹可以閱讀@Keir Watson的《Responsive Grid Magazine Layout in Just 20 Lines of CSS(//css-tricks.com/responsive-grid-magazine-layout-in-just-20-lines-of-css/)》一文。

兩端對齊


在Web布局中時常碰到兩端對齊的需求。在Flexbox布局中,時常在Flex容器中顯式設置justify-content的值:

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

但在末尾行,如果和前面行的個數(shù)不相同(Flex項目)就會出現(xiàn)下圖這樣的效果:

像上圖這樣的效果,并不是我們所需要的,因為我們希望在最后一行的Flex項目不足夠排列滿一行時,希望Flex項目一個緊挨一個的排列:

在Flexbox要實現(xiàn)上圖這樣的效果,只需要在Flex容器中添加一個偽元素:

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

注意,偽元素的flex-basis建議設置的和卡片的flex-basis(或寬度)等同。這個時候你將看到像下面這樣的示例:

Demo(https://codepen.io/airen/embed/QWymaam)

不過這種方式也不是最佳的方式,當末尾行的個數(shù)不只少一個時,就會出現(xiàn)下圖這樣的效果:

面對這樣的場景,我們需要給Flex容器添加額外的空標簽元素:

占位符元素數(shù)量 = 每行最大的列數(shù) - 2

但是gap屬性出現(xiàn)之后,要實現(xiàn)這樣的效果就不難了:

body { padding: 1vh;}.flex__container { display: flex; flex-wrap: wrap; gap: 2vh; width: 100%;}.flex__item { flex: 0 1 calc((100vw - 8vh) / 4);}

效果如下:

Demo(https://codepen.io/airen/embed/YzwaYBN)

注意,gap運用在Flexbox中到目前為止,僅得到了Firefox瀏覽器的支持。上面的示例,使用Firefox瀏覽器,你看到的效果如下:

在CSS Grid布局中,就可以直接使用gap:

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

效果如下:

Demo(https://codepen.io/airen/embed/eYJMVbz)

選擇最佳的值


很多時候,針對不同的場景,設計師會為我們提供不同的設計風格,比如元素大小:

隨著clam()函數(shù)的到來,這一切都變得容易地多。

clam()函數(shù)接受三個參數(shù),即?clam(MIN, VAL, MAX),其中MIN表示最小值,VAL表示首選值,MAX表示最大值。它們之間:

  • 如果VAL在MIN和MAX之間,則使用VAL作為函數(shù)的返回值;

  • 如果VAL大于MAX,則使用MAX作為函數(shù)的返回值;

  • 如果VAL小于MIN,則使用MIN作為函數(shù)的返回值

我們來看一個示例:

.element { /** * MIN = 100px * VAL = 50vw ? 根據(jù)視窗的寬度計算 * MAX = 500px **/ width: clamp(100px, 50vw, 500px);}

比如瀏覽器視窗現(xiàn)在所處的位置是1200px的寬度,那么.element渲染的結果如下:

這個時候.element元素的width是500px。此時,clamp(100px, 50vw, 500px)相當于clamp(100px, 600px, 500px),對應的VAL值是600px,大于MAX值,那么這個時候clamp()函數(shù)返回的值是MAX,即500px,這個時候.element的width值就是500px(即MAX的值)。

如果我們把瀏覽器視窗縮小至760px:

這個時候.element元素的width是50vw。此時,clamp(100px, 50vw, 500px)相當于clamp(100px, 380px, 500px),對應的VAL值是380px,該值大于MIN值(100px),小于MAX值(500px),那么這個時候clamp()函數(shù)返回的值是VAL,即50vw,這個時候.element的width值就是50vw(即VAL的值)。

如果繼續(xù)將瀏覽器的視窗縮小至170px:

這個時候.element元素的width是100px。此時,clamp(100px, 50vw, 500px)相當于clamp(100px, 85px, 500px),對應的VAL值是85px,該值小于MIN值(100px),那么這個時候clamp()函數(shù)返回的值是MIN,即100px,這個時候.element的width值就是100px(即MIN的值)。

就該示例而言,clamp(100px, 50vw, 500px)還可以這樣來理解:

  • 元素.element的寬度不會小于100px(有點類似于元素設置了min-width: 100px)

  • 元素.element的寬度不會大于500px(有點類似于元素設置了max-width: 500px)

  • 首選值VAL為50vw,只有當視窗的寬度大于200px且小于1000px時才會有效,即元素.element的寬度為50vw(有點類似于元素設置了width:50vw)

具體效果如下占擊這里查看(https://codepen.io/airen/embed/pojVpJv)。

Logo圖標的對齊


我想你在Web開發(fā)中可能碰到過類似下圖的這樣的場景:

正像上圖所示,Logo圖像的有大有小(寬度和高度都不一樣)。面對這樣的業(yè)務場景,很多時候都希望設計師能提供相同尺寸的圖像。但這樣勢必會影響Logo圖像的外觀。

前段時間看到@Ahmad Shadeed專門寫了一篇博文《Aligning Logo Images in CSS(//ishadeed.com/article/aligning-logos-css/)》,就是介紹如何實現(xiàn)上圖這樣的布局效果。

其實實現(xiàn)這樣的布局效果,主要運用到的就是CSS的object-fit屬性,而這個屬性早在多年前就得到了各大主流瀏覽器的支持。

這里我們用一個簡單的示例,來看看具體實現(xiàn)過程。先來看HTML結構:

<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;}

這樣就能實現(xiàn)上圖的效果。你可能發(fā)現(xiàn)了,有些Logo圖像帶有背景顏色,如果讓效果更好一些,可以把CSS混合模式相關的特性運用進來:

.brands__item img { width: 130px; height: 75px; object-fit: contain; mix-blend-mode: multiply;}

這個時候,你看到的效果如下:

object-fit除了取值contain之外,還有其他幾個值,具體的可以看這個示例(https://codepen.io/airen/embed/VweXXoo):

其實這個方案也適用于產品圖片,人物頭像等布局。

小結


文章中主要介紹了Web中一些布局的實現(xiàn)思路和具體方案。其實文章提到的效果,比如水平垂直居中、等高布局、平均分布列和Sticky Footer等,在CSS中一直有多種解決方案,只不過隨著CSS Flexbox布局模塊和CSS Grid布局模塊的到來,實現(xiàn)這些效果變得更為靈活和簡潔。

當然,文章中提到的只是一些最為常見一些效果,其實在Web布局中,特別是Flexbox布局和Grid布局中還存在很多有意思的東西,只不過因為篇幅的時間沒有一一羅列。如果你感興趣可以再挖掘一些出來,如果你在這方面有更好的經驗或方案,歡迎在下面的評論中分享。最后希望這篇文章對你平時的工作有所幫助。

???拓展閱讀

作者|廖偉華(大貘)編輯|橙子君出品|阿里巴巴新零售淘系技術

總結

以上是生活随笔為你收集整理的css布局方式_网页布局都有哪种?一般都用什么布局?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美黄色 | www.88av| 视频在线观看99 | 一区二区国产在线 | 老狼影院伦理片 | 午夜激情一区二区 | 国产区第一页 | 三上悠亚影音先锋 | 在线看福利影 | 少妇粉嫩小泬喷水视频www | 一本久道综合色婷婷五月 | 综合色99 | 成人免费视频久久 | 无码人妻精品一区二区中文 | av中文天堂在线 | 成人在线观看免费爱爱 | 久久一级大片 | 成人福利在线看 | 男人天堂手机在线观看 | 中出在线观看 | 中文无码熟妇人妻av在线 | 最新国产露脸在线观看 | 日韩在观看线 | 欧美理论片在线观看 | 日韩男女啪啪 | 最新91在线| 免费在线观看av片 | аⅴ资源中文在线天堂 | 亚洲日本视频在线观看 | 日本午夜影视 | 天天鲁一鲁摸一摸爽一爽 | 日本免费在线观看 | 日日久 | 特级西西www444人体聚色 | 色偷偷av一区二区三区 | 日本一本视频 | 免费黄色的网站 | 一起草最新网址 | 99热免费在线观看 | 毛片链接 | 日韩三级在线观看 | jizjiz中国少妇高潮水多 | 激情青青草 | 天堂网视频在线观看 | 精品少妇白浆小泬60P | 精品国产制服丝袜高跟 | 日韩精品一区二区亚洲av观看 | 伊人久久大香线蕉av色婷婷色 | 亚洲av无码一区二区三区在线观看 | 精品91久久久久久 | 日韩三级中文 | 中文综合网 | 久色成人 | 日av一区| 美女十八毛片 | 求av网站| 亚洲在线影院 | av生活片 | 久久字幕 | 欧美春色 | 天堂影音 | 午夜少妇福利 | 国产亚洲在线 | 91精品国产综合久久久久久久 | 亚洲色图10p| 日韩精品一区二区三区视频 | 国产三级a | 日韩欧美一区二区三区视频 | 99re国产在线| 中文字幕超碰在线 | 久久久久久久综合 | 绿帽av | mdyd—856冲田杏梨在线 | 久久精品无码中文字幕 | 青青av在线| 日本理论片午伦夜理片在线观看 | 国产日韩精品一区 | 日韩aⅴ视频 | 18禁免费观看网站 | 天天天天天天操 | 亚洲福利一区二区三区 | 99re6热在线精品视频播放 | 亚洲欧美一区二区三区孕妇 | 穿越异世荒淫h啪肉np文 | 老司机精品视频在线 | 98国产精品 | 亚洲一区二区免费 | 日韩欧美在线中文字幕 | 亚洲av无码国产精品久久 | 成人黄色激情视频 | 欧日韩精品 | 日本不卡一区二区 | 色呦呦在线观看视频 | 国产精品黑人一区二区三区 | 日本一区二区在线免费 | 伊人久久久久久久久久久久久 | 免费成人黄 | www.五月激情 | 九色porny丨精品自拍视频 |