LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

freeflydom
2023年8月26日 10:37 本文熱度 1637

最近在項(xiàng)目中看到這樣一個(gè)布局,如下

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

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

let arr1 = list.slice(0, 4)

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

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

// 第一行

第 {{ i }} 個(gè)

// 第二行

第 {{ 8 - i }} 個(gè)

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

那么,有沒(méi)有其他更簡(jiǎn)單、更穩(wěn)定的方式來(lái)解決呢?也就是如何讓第二行子項(xiàng)反向呢?

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

由于這里是動(dòng)態(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>

通過(guò) flex 或者 grid都很容易實(shí)現(xiàn)4 * 2的布局,先用 flex實(shí)現(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中,可以直接通過(guò)order進(jìn)行排序,order越大,元素越靠后。

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

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

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

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

按照這樣的規(guī)則,我們可以將第 5、6、7、8 個(gè)子項(xiàng)的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)的時(shí)候,加上 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動(dòng)態(tài)去改變order,如下

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

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

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

還是同樣的布局,現(xiàn)在換 grid 實(shí)現(xiàn),正常情況下,可能會(huì)直接用repeat(4, 1fr)來(lái)實(shí)現(xiàn)一個(gè) 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;
}

效果如下

那么,如何讓下面一行反過(guò)來(lái)呢?

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

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

這樣就劃分成了a1~a8一共八塊區(qū)域,為了方便映射,我們可以在生成 html時(shí),通過(guò) 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>

這樣就可以很方便的把每一個(gè)子項(xiàng)“填入”對(duì)應(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'; /* 把第二行反向 */}

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

完整代碼可以查看

三、更加靈活的“蛇形布局”

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

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

目前 CSS 中并沒(méi)有能夠檢測(cè)第幾行的選擇器,所以只能用其他方式。假設(shè)每一行的個(gè)數(shù)是確定的,這里是 4,那么,第二行就是5678,隔一行,第四行就是13141516,依次類推。

有什么方式可以匹配第幾個(gè)呢?沒(méi)錯(cuò),就是:nth-child,由于是隔一行,所以是每 8 個(gè)一個(gè)循環(huán),可以這樣來(lái)選擇偶數(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)的order0,如果改變其他的order肯定會(huì)跑到后面去,為了避免影響,可以先手動(dòng)設(shè)置order

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

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

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

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

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

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

最后實(shí)現(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)
}

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

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

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

  1. 用 js 來(lái)修改布局比較麻煩,而且邏輯容易混亂

  2. flex 中可以用 order 來(lái)改變子項(xiàng)位置

  3. 借助 CSS 變量可以更加方便地映射到每個(gè)子項(xiàng)

  4. grid 中可以用 grid-template-areas 手動(dòng)指定每個(gè)子項(xiàng)的位置

  5. 蛇形布局可以用 nth-child 選中偶數(shù)項(xiàng),從而改變位置

按照我的經(jīng)驗(yàn),布局最好 CSS 單獨(dú)完成,不要讓 JS 參與其中,這樣邏輯也會(huì)更加清晰。最后,如果覺(jué)得還不錯(cuò),對(duì)你有幫助的話,歡迎點(diǎn)贊、收藏、轉(zhuǎn)發(fā)❤❤❤

查看原文



該文章在 2023/8/26 10:40:34 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
日韩精精品一区二区三区四区 | 中文字幕巨大的乳专区 | 亚洲男人女人热热 | 亚洲日韩精品欧美一区二区 | 在线人成亚洲视频免费观看 | 日本人韩国国产一区二区三区 |