成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CSS 如何改變網(wǎng)格布局偶數(shù)行的排序?

開發(fā) 前端
這樣實現(xiàn)有什么優(yōu)勢呢?很明顯 JavaScript 無需關(guān)注布局,只用處理業(yè)務(wù)邏輯就行,也無需單獨對第二行元素做特殊處理,特別是序列,之前很容易混亂,最重要的是實現(xiàn)更加清晰明了,也更加穩(wěn)定。

最近在項目中看到這樣一個布局,如下

圖片圖片

布局本身沒什么奇怪的,就是 「4 * 2」 的網(wǎng)格,比較特殊的是第二行布局是從右往左的,整體是一個這樣的順序

圖片圖片

而這個列表是通過一個數(shù)組動態(tài)渲染的,可能有很多同學(xué)會將這個數(shù)組分成兩份,然后將第二份進(jìn)行反向,類似于這樣

let arr1 = list.slice(0, 4)
let arr2 = list.slice(4, 8).reverse()

然后,由于第二行的第一個其實是原數(shù)組的第八個,還需要針對第二行做額外的處理,比如序列

// 第一行
第 {{ i }} 個
// 第二行
第 {{ 8 - i }} 個

而且,如果有點擊事件,傳值也需要額外處理,雖然也能實現(xiàn),但顯然是太麻煩,而且還容易出 bug。

那么,有沒有其他更簡單、更穩(wěn)定的方式來解決呢?也就是如何讓第二行子項反向呢?

一、flex 布局實現(xiàn)

由于這里是動態(tài)渲染,所以最理想的結(jié)構(gòu)應(yīng)該是這樣的,直接一層循環(huán)搞定

<div class="list">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
</div>

通過 flex 或者 grid都很容易實現(xiàn)4 * 2的布局,先用 flex實現(xiàn)

.list{
  display: flex;
  width: 600px;
  gap: 20px;
  flex-wrap: wrap;
}
.item{
  width: calc( (100% - 60px) / 4 );
  aspect-ratio: 1/1;
  background: royalblue;
  color: #fff;
  font-size: 30px;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
}

可以得到這樣的布局

圖片圖片

有什么辦法在不改變 html 的情況下改變第二行的位置呢???

在 flex中,可以直接通過order進(jìn)行排序,order越大,元素越靠后。

https://developer.mozilla.org/zh-CN/docs/Web/CSS/order

比如,我們將第 5 個元素的order設(shè)置成1

.item:nth-child(5){
  order: 1
}

由于默認(rèn)是0,現(xiàn)在第 5 個元素的order最大,所以它跑到了最后面

圖片圖片

按照這樣的規(guī)則,我們可以將第 5、6、7、8 個子項的order分別一次減少就行了(大于0)

.item:nth-child(5){
  order: 4;
}
.item:nth-child(6){
  order: 3;
}
.item:nth-child(7){
  order: 2;
}
.item:nth-child(8){
  order: 1;
}

這樣第二行就反向了,如下

圖片圖片

當(dāng)然還可以在循環(huán)的時候,加上 CSS 變量

<div class="list">
  <div class="item" style="--i: 1">1</div>
  <div class="item" style="--i: 2">2</div>
  <div class="item" style="--i: 3">3</div>
  <div class="item" style="--i: 4">4</div>
  <div class="item" style="--i: 5">5</div>
  <div class="item" style="--i: 6">6</div>
  <div class="item" style="--i: 7">7</div>
  <div class="item" style="--i: 8">8</div>
</div>

然后可以用 「calc」動態(tài)去改變order,如下

.item:nth-child(n + 5){
  order: calc( 8 - var(--i))
}

同樣能達(dá)到相同的效果,完整代碼可以查看

  • CSS flex order (juejin.cn)[1]
  • CSS flex order (codepen.io)[2]

二、grid 布局實現(xiàn)

還是同樣的布局,現(xiàn)在換 grid 實現(xiàn),正常情況下,可能會直接用repeat(4, 1fr)來實現(xiàn)一個 4 * 2的布局

.list{
  display: grid;
  width: 600px;
  gap: 20px;
  grid-template-columns: repeat(4, 1fr);
}
.item{
  aspect-ratio: 1/1;
  background: royalblue;
  color: #fff;
  font-size: 30px;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
}

效果如下

圖片圖片

那么,如何讓下面一行反過來呢?

除了使用上面的方式,還可以用帶有名稱的grid-template-areas來實現(xiàn),比如我們這樣命名

.list{
  /**/
  grid-template-areas: 
    'a1 a2 a3 a4'
    'a5 a6 a7 a8';
}

這樣就劃分成了a1~a8一共八塊區(qū)域,為了方便映射,我們可以在生成 html時,通過 CSS 變量帶上這些名稱

<div class="list">
  <div class="item" style="--i: a1">1</div>
  <div class="item" style="--i: a2">2</div>
  <div class="item" style="--i: a3">3</div>
  <div class="item" style="--i: a4">4</div>
  <div class="item" style="--i: a5">5</div>
  <div class="item" style="--i: a6">6</div>
  <div class="item" style="--i: a7">7</div>
  <div class="item" style="--i: a8">8</div>
</div>

這樣就可以很方便的把每一個子項“填入”對應(yīng)的區(qū)域了

.item{
  /**/
  grid-area: var(--i);
}

現(xiàn)在仍然是默認(rèn)順序,如果要改變第二行的順序,直接grid-template-areas就行了

.list{
  /**/
  grid-template-areas: 
    'a1 a2 a3 a4'
    'a8 a7 a6 a5'; /* 把第二行反向 */
}

這樣就很方便直觀的改變了子項的位置了,效果如下

圖片圖片

完整代碼可以查看

  • CSS grid area (juejin.cn)[3]
  • CSS grid area (codepen.io)[4]

三、更加自由的“蛇形布局”

上面的例子只有兩行,如果有多行呢,并且行數(shù)不定,如何處理呢?就像這樣的

圖片圖片

這種時候用 grid 可能少許不方便了(可能我還沒找到精髓??),下面用 flex 實現(xiàn)

目前 CSS 中并沒有能夠檢測第幾行的選擇器,所以只能用其他方式。假設(shè)每一行的個數(shù)是確定的,這里是 4,那么,第二行就是5、6、7、8,隔一行,第四行就是13、14、15、16,依次類推。

有什么方式可以匹配第幾個呢?沒錯,就是:nth-child,由于是隔一行,所以是每 8 個一個循環(huán),可以這樣來選擇偶數(shù)行,如下

.item:nth-child(8n + 5){
  /*選擇第5、13、21...*/
}
.item:nth-child(8n + 6){
  /*選擇第6、14、22...*/
}
.item:nth-child(8n + 7){
  /*選擇第7、15、23...*/
}
.item:nth-child(8n + 8){
  /*選擇第8、16、24...*/
}

由于默認(rèn)的order是0,如果改變其他的order肯定會跑到后面去,為了避免影響,可以先手動設(shè)置order

.item{
  /**/
  order: var(--i);
}

下面要對偶數(shù)行的順序進(jìn)行調(diào)整,比如第二行

圖片圖片

第 1 個的位置調(diào)到第4個位置,所以 order需要加 3

第 2 個的位置調(diào)到第3個位置,所以 order需要加 1

第 3 個的位置調(diào)到第2個位置,所以 order需要減 1

第 4 個的位置調(diào)到第1個位置,所以 order需要減 3

最后實現(xiàn)就是

.item:nth-child(8n + 5){
  order: calc(var(--i) + 3)
}
.item:nth-child(8n + 6){
  order: calc(var(--i) + 1)
}
.item:nth-child(8n + 7){
  order: calc(var(--i) - 1)
}
.item:nth-child(8n + 8){
  order: calc(var(--i) - 3)
}

這樣就實現(xiàn)了行數(shù)不固定的“蛇形布局”,完整代碼如下

  • CSS flex snake (juejin.cn)[5]
  • CSS flex snake (codepen.io)[6]

四、優(yōu)勢和總結(jié)

這樣實現(xiàn)有什么優(yōu)勢呢?很明顯 JavaScript 無需關(guān)注布局,只用處理業(yè)務(wù)邏輯就行,也無需單獨對第二行元素做特殊處理,特別是序列,之前很容易混亂,最重要的是實現(xiàn)更加清晰明了,也更加穩(wěn)定。下面總結(jié)一下要點

  1. 用 js 來修改布局比較麻煩,而且邏輯容易混亂
  2. flex 中可以用 order 來改變子項位置
  3. 借助 CSS 變量可以更加方便地映射到每個子項
  4. grid 中可以用 grid-template-areas 手動指定每個子項的位置
  5. 蛇形布局可以用 nth-child 選中偶數(shù)項,從而改變位置

按照我的經(jīng)驗,布局最好 CSS 單獨完成,不要讓 JS 參與其中,這樣邏輯也會更加清晰。

責(zé)任編輯:武曉燕 來源: 前端偵探
相關(guān)推薦

2020-07-14 08:31:42

CSS網(wǎng)格布局項目

2024-05-28 07:53:23

2021-04-12 08:01:21

GridFlexbox網(wǎng)格

2020-10-26 08:06:59

網(wǎng)絡(luò)技巧CSS

2011-12-01 15:51:35

JavaJavaFX

2021-02-26 14:13:48

鴻蒙HarmonyOS應(yīng)用開發(fā)

2020-11-25 12:02:02

TableLayout

2020-07-13 13:00:24

CSS變量技巧

2022-05-03 17:04:08

CSS前端

2023-07-24 09:44:42

人工智能物聯(lián)網(wǎng)

2021-09-13 10:43:12

開發(fā)CSS代碼

2025-04-27 09:12:42

2010-09-02 13:53:58

CSS Sprites

2024-04-09 10:10:23

GridCSS網(wǎng)格

2019-04-03 13:00:27

CSSBFC前端

2021-08-09 07:26:33

瀑布流布局代碼

2023-09-21 15:10:55

2010-08-23 15:22:56

CSSfloat

2022-10-13 09:01:24

GridCSS二維布局

2021-07-31 23:25:34

CSS布局UI
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲欧美综合精品久久成人 | 91久久精品国产91久久性色tv | 亚洲精品1区 | 国产高清视频一区 | www国产成人免费观看视频,深夜成人网 | 精品久久久久久久久久久 | 夜夜草 | 人操人人 | 91精品国产91 | 亚洲精品一区二区三区在线 | 久久久久亚洲精品中文字幕 | 日韩欧美精品一区 | 久久最新精品 | 亚洲一区二区三区在线播放 | 亚洲日韩欧美一区二区在线 | 久久a久久 | 国产人免费人成免费视频 | 国产精品久久久久久影视 | 国产精品午夜电影 | 国产欧美一区二区三区日本久久久 | 在线观看av网站 | 天天成人综合网 | 国产精品乱码一区二区三区 | 成人av观看| 日韩成人在线免费观看 | 伊人久久综合影院 | 久久精品视频在线观看 | 日本一区二区三区精品视频 | 久久久久久久久国产精品 | 久久久久久久久久久久亚洲 | 一区二区三区免费在线观看 | 精品一区二区在线观看 | 在线看中文字幕 | 在线国产一区二区 | 亚洲一区国产 | 久久99国产精品 | 精品亚洲一区二区三区四区五区 | 三级视频在线观看 | 毛片.com| 中文字幕第十五页 | 男女羞羞免费视频 |