国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

實(shí)現(xiàn)瀑布流布局,就這幾行代碼?

開(kāi)發(fā) 前端
瀑布流布局是一種比較流行的頁(yè)面布局方式,表現(xiàn)為參差不齊的多欄卡片。跟網(wǎng)格布局相比,顯得更靈動(dòng),更具藝術(shù)氣息。

[[416106]]

瀑布流布局是一種比較流行的頁(yè)面布局方式,表現(xiàn)為參差不齊的多欄卡片。跟網(wǎng)格布局相比,顯得更靈動(dòng),更具藝術(shù)氣息。

瀑布流布局

實(shí)現(xiàn)瀑布流布局的方式有多種,比如multi-column布局,grid布局,flex 布局等。但是這些實(shí)現(xiàn)方式都有各自的局限性,代碼也略復(fù)雜。

其實(shí),有個(gè)最原始、最簡(jiǎn)單,也是兼容性最好的實(shí)現(xiàn)方式,那就是使用絕對(duì)定位。瀑布流布局的元素是一些等寬不等高的卡片,只要根據(jù)元素的實(shí)際寬高計(jì)算出自己的坐標(biāo)位置就行了。

要計(jì)算坐標(biāo)自然要用到 JavaScript,這就不是純 CSS 方案,對(duì)某些前端極客來(lái)講顯得不那么純粹。不過(guò)只要理清思路了,也用不了幾行代碼。本文就給出最近實(shí)現(xiàn)的一個(gè)版本。

  1. // 計(jì)算每個(gè)卡片的坐標(biāo) 
  2. export function calcPositions({ columns = 2, gap = 7, elements }) { 
  3.   if (!elements || !elements.length) { 
  4.     return []; 
  5.   } 
  6.   const y = []; //上一行卡片的底部縱坐標(biāo)數(shù)組,用于找到新卡片填充位置 
  7.   const positions = []; // 每個(gè)卡片的坐標(biāo)數(shù)組 
  8.   elements.forEach((item, index) => { 
  9.     if (y.length < columns) { // 還未填滿一行 
  10.       y.push(item.offsetHeight); 
  11.       positions.push({ 
  12.         left: (index % columns) * (item.offsetWidth + gap), 
  13.         top: 0 
  14.       }); 
  15.     } else { 
  16.       const min = Math.min(...y); // 最小縱坐標(biāo) 
  17.       const idx = y.indexOf(min); // 縱坐標(biāo)最小的卡片索引 
  18.       y.splice(idx, 1, min + gap + item.offsetHeight); // 替換成新卡片的縱坐標(biāo) 
  19.       positions.push({ 
  20.         left: idx * (item.offsetWidth + gap), 
  21.         topmin + gap 
  22.       }); 
  23.     } 
  24.   }); 
  25. // 由于采用絕對(duì)定位,容器是無(wú)法自動(dòng)撐開(kāi)的。因此需要計(jì)算實(shí)際高度,即最后一個(gè)卡片的top加上自身高度 
  26.   return { positions, containerHeight: positions[positions.length - 1].top + elements[elements.length - 1].offsetHeight }; 

上面這段代碼的作用就是計(jì)算每個(gè)卡片的left、top,以及容器的總高度。關(guān)鍵位置都有注釋,應(yīng)該不難理解。

有了這幾行核心代碼,要想封裝成瀑布流組件就很容易了。以 Vue 為例,可以這樣封裝:

MasonryLite.vue

  1. <template> 
  2.   <div class="masonry-lite"
  3.     <slot></slot> 
  4.   </div> 
  5. </template> 
  6. <script> 
  7. import { calcPositions } from './index.js'
  8. export default { 
  9.   name'MasonryLite'
  10.   props: { 
  11.     gap: { 
  12.       type: Number, 
  13.       default: 12, 
  14.     }, 
  15.     columns: { 
  16.       type: Number, 
  17.       default: 2, 
  18.     }, 
  19.   }, 
  20.   data() { 
  21.     return {}; 
  22.   }, 
  23.   mounted() { 
  24.     this.doLayout(); 
  25.   }, 
  26.   methods: { 
  27.     doLayout() { 
  28.       const children = [...this.$el.querySelectorAll('.masonry-item')]; 
  29.       if (children.length === 0) { 
  30.         return
  31.       } 
  32.       const { positions, containerHeight } = calcPositions({ 
  33.         elements: children, 
  34.         columns: this.columns, 
  35.         gap: this.gap, 
  36.       }); 
  37.       children.forEach((item, index) => { 
  38.         item.style.cssText = `left:${positions[index].left}px;top:${positions[index].top}px;`; 
  39.       }); 
  40.       this.$el.style.height = `${containerHeight}px`; 
  41.     }, 
  42.   }, 
  43. }; 
  44. </script> 
  45. <style lang="scss" scoped> 
  46. .masonry-lite{ 
  47.   position: relative
  48. .masonry-item { 
  49.   position: absolute
  50. </style> 

使用組件:

  1. <MasonryLite> 
  2.   <div class="product-card masonry-item" v-v-for="(item, index) in items" :key="index"
  3.     <img :src="item.imageUrl" /> 
  4.     <header>{{ item.title }}</header> 
  5.   </div> 
  6. </MasonryLite> 

不過(guò)這樣其實(shí)還會(huì)有點(diǎn)問(wèn)題,就是doLayout的執(zhí)行時(shí)機(jī)。因?yàn)樵摲桨富诮^對(duì)定位,需要元素在渲染完成后才能獲取到實(shí)際寬高。如果卡片內(nèi)有延遲加載的圖片或者其他動(dòng)態(tài)內(nèi)容,高度會(huì)發(fā)生變化。這種情況下就需要在DOM更新后主動(dòng)調(diào)用一次doLayout重新計(jì)算布局。

如果大家有更好的實(shí)現(xiàn)方案,歡迎交流!

代碼倉(cāng)庫(kù):https://github.com/kaysonli/masonry-lite

npm 包:masonry-lite

如果覺(jué)得對(duì)你有幫助,幫忙點(diǎn)個(gè)不要錢(qián)的star。

本文轉(zhuǎn)載自微信公眾號(hào)「1024譯站」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系1024譯站公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 1024譯站
相關(guān)推薦

2013-02-19 10:24:47

瀑布流布局CSS

2025-07-29 00:00:00

2024-08-19 14:01:00

2012-05-02 13:53:00

JavaScript

2020-08-10 06:36:21

強(qiáng)化學(xué)習(xí)代碼深度學(xué)習(xí)

2021-10-18 09:09:16

數(shù)據(jù)庫(kù)

2021-06-22 09:55:05

代碼圖像技術(shù)

2021-04-15 11:10:40

GitHub代碼開(kāi)發(fā)者

2020-09-29 10:09:43

Python文字識(shí)別編程語(yǔ)言

2024-09-03 17:04:15

前端算法布局

2020-07-07 07:55:53

web app數(shù)據(jù)科學(xué)機(jī)器學(xué)習(xí)

2023-11-01 10:36:19

2025-07-18 07:00:00

前端錄屏JavaScript

2024-06-04 14:20:47

數(shù)字化轉(zhuǎn)型數(shù)字化

2020-10-24 20:10:40

Python 開(kāi)發(fā)編程語(yǔ)言

2021-01-29 10:57:57

新基建政策解讀智慧物流

2024-11-12 13:41:49

2021-12-02 09:31:22

Python 代碼進(jìn)度條

2021-02-23 07:01:24

js小游戲技術(shù)

2023-10-27 11:38:09

PythonWord
點(diǎn)贊
收藏

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

国产精品视频久久| 好紧好硬好湿我太爽了| 日本亚洲视频在线| 中文字幕有码av| 国产婷婷成人久久av免费高清| 手机亚洲手机国产手机日韩| 精品免费国产一区二区| 在线观看久久久久久| 日日摸夜夜添夜夜添精品视频 | 日韩一区二区麻豆国产| 人妖欧美1区| 欧美日韩aaaaa| 午夜激情在线观看| 亚洲毛茸茸少妇高潮呻吟| 免费视频成人| 操人视频在线观看欧美| 国模大尺度一区二区三区| 国产高清视频一区二区| 精品亚洲夜色av98在线观看 | 无码人妻精品一区二区三区99v| 中文字幕精品av| 婷婷国产在线综合| 欧美日韩国内自拍| 欧美专区日韩专区| 欧美性猛交xxxx乱大交退制版| 懂色av一区二区三区免费观看| 久久亚洲精品中文字幕蜜潮电影| 欧美调教sm| 欧美激情喷水| 亚洲伊人精品酒店| 97成人在线| 久久动漫网址| 国产欧美日韩免费观看| 精品福利一区| 日韩一区二区三区免费视频| 国产一二区在线| 精品国产综合区久久久久久| 成人亚洲激情网| 欧美成人中文字幕| 国产免费一区视频观看免费| 成人国产精品一区二区| 国产精品十八以下禁看| 日本视频久久久| 欧美激情久久久| 97在线看福利| 欧美激情在线观看视频| 精品国产一二三| 91.com视频| 亚洲第一综合天堂另类专| 中文字幕亚洲激情| 精品国内自产拍在线观看| 日韩精品免费在线观看| 精品女同一区二区| 日韩av电影院| 色偷偷88888欧美精品久久久| 亚洲人午夜色婷婷| 精品国产一区久久| 欧美怡红院视频| 日韩精品免费在线观看| 亚洲成人久久一区| 亚洲国产精品电影| 亚洲国产精品久久久久久| 欧美日韩性生活| 欧美刺激性大交免费视频| 日韩精品一区二区三区在线播放 | 中文字幕精品久久| 久久久女女女女999久久| 国产精品99免视看9| 日本欧美国产在线| 国a精品视频大全| 亚洲人成电影在线播放| 2019亚洲男人天堂| 欧美一区二区视频在线| 欧美极品jizzhd欧美| 日韩免费一区二区三区| 久久狠狠久久综合桃花| 精东传媒在线观看| 免费一级欧美在线大片| 日韩电影免费一区| 91免费版在线| 91.成人天堂一区| 日产精品99久久久久久| 日韩精品免费电影| 欧美性大战久久久久| 日本一区二区三区四区高清视频 | 一区二区欧美久久| 国产精品视频xxx| 亚洲a∨一区二区三区| 欧美视频第三页| 国产亚洲高清一区| 久久se精品一区二区| 亚洲高清不卡在线| 亚洲色图美腿丝袜| 国产中文字幕91| 最新av在线免费观看| 超碰在线播放91| 精品一区二区三区中文字幕在线| 亚洲人成免费| 自拍偷拍亚洲欧美日韩| 亚洲免费一级电影| 97超碰最新| 亚洲五月六月| 在线成人免费| caoporm超碰国产精品| 欧美日韩一区二区不卡| 日韩在线观看免费| 精品人伦一区二区三区| 日韩福利在线| 国产三线在线| 久久久水蜜桃av免费网站| 一区二区三区波多野结衣在线观看| 日韩免费视频线观看| www国产黄色| 久久精品色播| 91美女精品福利| 色综合久久悠悠| 日韩精品电影网站| 国产在线视频你懂得| 国产综合精品一区| 精品99久久久久久| 成年人视频网站免费观看| 天天久久夜夜| 欧美一区二区三区在| 91精品国产91久久久久青草| 成人在线免费观看| 国产一区视频网站| 欧美极品欧美精品欧美视频 | 99re6在线精品视频免费播放| 国内精品国产成人| 欧美中文字幕在线| 色图在线观看| 久久综合色8888| 国产精品人成电影在线观看| 香蕉视频网站在线观看| 久久99国产精品久久99| 色中色综合影院手机版在线观看| 中文字幕在线观看| 久久国产生活片100| 国产91精品久| 中文字幕资源网在线观看免费 | 337p粉嫩大胆噜噜噜噜噜91av| 国产精品电影网| 在线成人视屏| 一道本成人在线| 黄色一级视频播放| 999久久久免费精品国产| 欧美一区二区三区视频| 国产精品videossex国产高清| 久久久久蜜桃| 国产精品va在线播放| 亚洲一区二区三区日本久久九| 欧美吞精做爰啪啪高潮| 又黄又爽在线观看| 亚洲另类中文字| 国产理论片免费观看| 国产精品久久久久久户外露出 | 美女视频黄免费的久久 | 天堂а√在线官网| 99精品国产热久久91蜜凸| 久久久久久精| 一区二区日韩欧美| 欧美乱妇40p| 黄色亚洲网站| 精品国产电影一区二区| 狠狠色伊人亚洲综合网站l| 国产精品久久久久久久久免费樱桃 | 全亚洲第一av番号网站| 欧美视频一区二区| 亚洲色图16p| 欧美日韩精品二区| 国产在线制服美女| 一区精品在线播放| 国产素人在线观看| 青青草原在线亚洲| 精品久久久久久久久中文字幕| 国产麻豆日韩| 亚洲伦理网站| 亚洲欧美偷拍卡通变态| 国产人妖伪娘一区91| 性网站在线观看| 国产真实乱对白精彩久久| 九九热这里只有精品6| 日韩脚交footjobhdboots| 欧美日韩免费视频| 搡女人真爽免费午夜网站| 国精品一区二区三区| 久久久久这里只有精品| 国产一区二区三区亚洲| 91国语精品自产拍在线观看性色| 777久久精品| 欧美在线性爱视频| 日韩毛片视频| 国产精品精品一区二区三区午夜版 | 亚洲夜夜综合| 国产午夜精品理论片a级探花| 国产一区二区精品调教| 这里只有精品视频在线| 狠狠操综合网| 国产视频一区二区不卡| 国产一区二区三区免费|