精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實現瀑布流布局,就這幾行代碼?

開發 前端
瀑布流布局是一種比較流行的頁面布局方式,表現為參差不齊的多欄卡片。跟網格布局相比,顯得更靈動,更具藝術氣息。

[[416106]]

瀑布流布局是一種比較流行的頁面布局方式,表現為參差不齊的多欄卡片。跟網格布局相比,顯得更靈動,更具藝術氣息。

瀑布流布局

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

其實,有個最原始、最簡單,也是兼容性最好的實現方式,那就是使用絕對定位。瀑布流布局的元素是一些等寬不等高的卡片,只要根據元素的實際寬高計算出自己的坐標位置就行了。

要計算坐標自然要用到 JavaScript,這就不是純 CSS 方案,對某些前端極客來講顯得不那么純粹。不過只要理清思路了,也用不了幾行代碼。本文就給出最近實現的一個版本。

  1. // 計算每個卡片的坐標 
  2. export function calcPositions({ columns = 2, gap = 7, elements }) { 
  3.   if (!elements || !elements.length) { 
  4.     return []; 
  5.   } 
  6.   const y = []; //上一行卡片的底部縱坐標數組,用于找到新卡片填充位置 
  7.   const positions = []; // 每個卡片的坐標數組 
  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); // 最小縱坐標 
  17.       const idx = y.indexOf(min); // 縱坐標最小的卡片索引 
  18.       y.splice(idx, 1, min + gap + item.offsetHeight); // 替換成新卡片的縱坐標 
  19.       positions.push({ 
  20.         left: idx * (item.offsetWidth + gap), 
  21.         topmin + gap 
  22.       }); 
  23.     } 
  24.   }); 
  25. // 由于采用絕對定位,容器是無法自動撐開的。因此需要計算實際高度,即最后一個卡片的top加上自身高度 
  26.   return { positions, containerHeight: positions[positions.length - 1].top + elements[elements.length - 1].offsetHeight }; 

上面這段代碼的作用就是計算每個卡片的left、top,以及容器的總高度。關鍵位置都有注釋,應該不難理解。

有了這幾行核心代碼,要想封裝成瀑布流組件就很容易了。以 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> 

不過這樣其實還會有點問題,就是doLayout的執行時機。因為該方案基于絕對定位,需要元素在渲染完成后才能獲取到實際寬高。如果卡片內有延遲加載的圖片或者其他動態內容,高度會發生變化。這種情況下就需要在DOM更新后主動調用一次doLayout重新計算布局。

如果大家有更好的實現方案,歡迎交流!

代碼倉庫:https://github.com/kaysonli/masonry-lite

npm 包:masonry-lite

如果覺得對你有幫助,幫忙點個不要錢的star。

本文轉載自微信公眾號「1024譯站」,可以通過以下二維碼關注。轉載本文請聯系1024譯站公眾號。

 

責任編輯:武曉燕 來源: 1024譯站
相關推薦

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

強化學習代碼深度學習

2021-10-18 09:09:16

數據庫

2021-06-22 09:55:05

代碼圖像技術

2021-04-15 11:10:40

GitHub代碼開發者

2020-09-29 10:09:43

Python文字識別編程語言

2020-07-07 07:55:53

web app數據科學機器學習

2024-09-03 17:04:15

前端算法布局

2023-11-01 10:36:19

2024-06-04 14:20:47

數字化轉型數字化

2025-07-18 07:00:00

前端錄屏JavaScript

2020-10-24 20:10:40

Python 開發編程語言

2021-01-29 10:57:57

新基建政策解讀智慧物流

2024-11-12 13:41:49

2021-12-02 09:31:22

Python 代碼進度條

2021-02-23 07:01:24

js小游戲技術

2024-01-10 14:45:46

Redis數據庫存儲
點贊
收藏

51CTO技術棧公眾號

日韩成人精品在线| 西野翔中文久久精品字幕| 日韩毛片精品高清免费| 成人av影视在线| 国产在线观看黄色| 午夜精品毛片| 精品偷拍各种wc美女嘘嘘| 一级黄色香蕉视频| 久草在线资源站资源站| 国产日韩欧美麻豆| 国产99视频精品免费视频36| 亚洲成人av网址| 亚洲黄色影院| 北条麻妃一区二区三区中文字幕| 亚洲av成人片无码| 看片一区二区| 欧美日韩国产中文字幕| 异国色恋浪漫潭| 黄色在线视频观看网站| 懂色中文一区二区在线播放| 国产精品视频免费观看www| 国产91av视频| 91精品一区国产高清在线gif| 亚洲精品一区二区在线| 美女被爆操网站| 欧美三级电影网址| 色综合久久久网| 成人精品视频在线播放| 黄色网在线免费观看| 久久久精品免费免费| 91精品综合久久久久久五月天| 日本三级小视频| 亚洲一级高清| 欧美精品免费在线| 美女三级黄色片| 国产一区二区观看| 日韩精品视频三区| 黄色在线免费播放| 日本免费一区二区视频| 91精品国产色综合久久久蜜香臀| 视色视频在线观看| 中文字幕成在线观看| 亚洲电影一级黄| 国产欧美精品aaaaaa片| 在线三级电影| 亚洲女同女同女同女同女同69| 亚洲一区二区在线免费观看| 国产对白叫床清晰在线播放| 久久久蜜桃精品| 久久综合久久久| 天天摸天天干天天操| 成人精品一区二区三区中文字幕| 91久久极品少妇xxxxⅹ软件| 国产av无码专区亚洲a∨毛片| 久久99精品久久久| 91免费版网站入口| 中文字幕在线播出| 久久99精品久久久久| 国产深夜精品福利| 国产又大又黑又粗| 国产在线不卡视频| 91精品久久久久久蜜桃| 亚洲成人第一区| 成人免费三级在线| 精品在线不卡| 国产三级在线| 国产精品久久久久久久久搜平片 | 亚洲线精品一区二区三区| 六月婷婷激情网| 2020av在线| 欧美日韩在线视频首页| 美女网站免费观看视频| 成人在线中文| 日韩欧美一区中文| 精品久久久久一区二区| 亚洲美女15p| 中文字幕精品在线视频| 在线看的片片片免费| 欧美成人有码| 97成人精品视频在线观看| 特级做a爱片免费69| 日一区二区三区| 91视频8mav| 五月天婷婷视频| 欧美高清在线一区| 777久久精品一区二区三区无码 | 国产黄色片在线观看| 亚洲欧美一区二区在线观看| 成人av在线播放观看| 成人小电影网站| 欧美精品粉嫩高潮一区二区| 在线观看免费视频黄| 欧洲毛片在线视频免费观看| 久久91超碰青草是什么| 无码人妻黑人中文字幕| 国产一区二区成人久久免费影院| 九九九九九九精品| 毛片在线看片| 精品久久久久久国产91| 一个色综合久久| 欧美91在线| 久久精品99久久久久久久久 | 日韩欧美视频免费观看| 激情久久久久久| 国产欧美日韩精品专区| 日日躁夜夜躁白天躁晚上躁91| 欧美国产欧美综合| 日本a视频在线观看| 久久日本片精品aaaaa国产| 亚洲高清av在线| 天天做夜夜爱爱爱| 天堂精品中文字幕在线| 国产精品免费在线播放| 免费在线午夜视频| 色一情一乱一乱一91av| zjzjzjzjzj亚洲女人| 四虎8848精品成人免费网站| 91成人在线视频| 亚洲精品久久久久avwww潮水 | 四虎永久国产精品| 9765激情中文在线| 欧美一区二区三区免费大片| 一级黄色片网址| 亚洲综合不卡| 激情一区二区三区| 久久五月精品中文字幕| 3d动漫精品啪啪| 国产真人真事毛片视频| 久久久久综合| 欧美日韩国产精品一区二区| 999av小视频在线| 日韩欧美国产精品| 中文字幕手机在线观看| 久久精品国产精品亚洲红杏| 日韩欧美亚洲精品| 欧美黑人粗大| 亚洲人成网站999久久久综合| 国产精品xxxx喷水欧美| 国产成人久久精品77777最新版本| 亚洲AV无码成人精品一区| 欧美日韩免费电影| 日韩专区中文字幕| 一卡二卡三卡在线| 中文字幕制服丝袜一区二区三区| 少妇激情一区二区三区| 激情综合网站| 国产精国产精品| 国产中文字幕在线看| 91成人在线观看喷潮| 97超碰在线免费观看| 亚洲综合二区| 久久亚洲高清| 成人性生交大片免费观看网站| 亚洲国产精品久久久久| 国产精品6666| 91麻豆高清视频| 熟妇人妻va精品中文字幕| 九热爱视频精品视频| 国产97在线|日韩| aaa在线观看| 欧美一区二区在线不卡| 国产性xxxx| 丰满亚洲少妇av| 成年人网站免费视频| 亚洲毛片免费看| 国产精品老牛影院在线观看| 欧美一区二区三区在线观看免费| 这里只有精品免费| 国产福利久久久| eeuss国产一区二区三区 | 日韩国产一区久久| 激情欧美一区二区三区黑长吊| 久久好看免费视频| 成 人片 黄 色 大 片| 亚洲国产中文字幕| 欧美一区二区三区成人精品| 日本欧美加勒比视频| 免费看啪啪网站| 国产精品极品国产中出| 国产a∨精品一区二区三区不卡| av在线播放网| 欧美成人精品高清在线播放| 特黄视频免费看| 国产精品不卡一区二区三区| 午夜福利三级理论电影| 天堂va蜜桃一区二区三区漫画版| 午夜欧美性电影| 亚洲五码在线| 国产97免费视| 少妇视频在线| 亚洲天堂av在线免费| 97caocao| 欧美日韩亚洲精品内裤| 阿v天堂2014| 国产成人亚洲综合a∨婷婷| 毛片在线视频播放| 国产精品久久占久久| 国内不卡一区二区三区| 成人午夜一级| 韩国v欧美v日本v亚洲| 69久久精品| 日韩av在线免费| 国产美女无遮挡永久免费| 欧美日韩在线视频首页| 三级影片在线看| 国产亚洲视频系列| 日本69式三人交| 精品一区二区免费视频| 92看片淫黄大片一级| 黄色亚洲免费| 天天爱天天做天天操| 久久av中文| 国产精品加勒比| 成人在线视频国产| 国产精品第一页在线| 国产激情在线播放| 欧美黑人性生活视频| 美女免费久久| 中文字幕亚洲综合久久筱田步美| 少妇无码一区二区三区| 日韩一区二区在线免费观看| 波多野结衣一二区| 欧美日韩一区二区精品| 国产亚洲自拍av| 一区二区视频在线看| 五月天免费网站| 国产欧美日韩麻豆91| 国产男女猛烈无遮挡a片漫画 | 国产精品久久久免费看| 国产视频亚洲色图| wwwwxxxx国产| 99国产精品久| 在线免费看黄色片| 国产suv精品一区二区6| 麻豆传媒在线看| 狠狠网亚洲精品| 亚洲涩涩在线观看| 久久成人免费网| 国产美女18xxxx免费视频| 日韩国产精品久久| 成人午夜激情av| 蜜臀久久99精品久久久画质超高清| 国产精品第12页| 久久午夜精品| 亚洲精品一二三四五区| 人人超碰91尤物精品国产| 日韩欧美在线免费观看视频| 日韩中文字幕不卡| 一路向西2在线观看| 久久国产乱子精品免费女| 性chinese极品按摩| 免费成人在线网站| 国产高潮免费视频| 极品少妇一区二区三区精品视频| 男女污污的视频| 麻豆国产精品一区二区三区| 五月天开心婷婷| 国产在线视频一区二区三区| 亚洲精品国产久| 国产成人鲁色资源国产91色综| 韩国av中国字幕| www.日本不卡| 97人妻精品一区二区免费| 国产日韩欧美a| 99成人在线观看| 亚洲国产日产av| 国产精品777777| 欧美精品久久久久久久久老牛影院| 国产女人高潮的av毛片| 精品国精品自拍自在线| 青青草在线视频免费观看| 亚洲午夜av电影| 久久综合之合合综合久久| 久操成人在线视频| 伊人网在线播放| 国产日韩在线精品av| 秋霞一区二区三区| 精品九九九九| 国产免费久久| 在线观看三级网站| 亚洲男女自偷自拍| 国产永久免费网站| 成人高清伦理免费影院在线观看| 在线观看福利片| 伊人婷婷欧美激情| 亚洲黄色免费观看| 欧美一区二区三区视频免费 | 黄色免费观看视频网站| 奇米综合一区二区三区精品视频| 手机看片国产精品| 久久中文娱乐网| 久久精品亚洲a| 精品久久久久久久久久久| 中文字幕日韩经典| 亚洲成av人乱码色午夜| 尤物视频在线免费观看| 69视频在线播放| 老司机亚洲精品一区二区| 欧美久久久久久一卡四| 欧美1区3d| 色婷婷狠狠18| 久久久亚洲欧洲日产国码αv| 无码人妻精品一区二区三区夜夜嗨| 色老汉一区二区三区| 刘亦菲久久免费一区二区| 色黄久久久久久| 欧美日韩电影免费看| 国产精品视频在线免费观看 | 欧美激情一区二区三区不卡 | sm捆绑调教视频| 欧美午夜激情视频| 亚洲精品97久久中文字幕无码| 日韩性生活视频| 日韩影片中文字幕| 精品999在线观看| 欧美日本一区二区高清播放视频| 亚洲第一狼人区| 久久人人超碰精品| 日韩免费视频网站| 日韩一级视频免费观看在线| 婷婷成人激情| 国产成人久久久精品一区| 久久综合五月婷婷| 日韩在线视频在线| 国产揄拍国内精品对白| 欧美极品jizzhd欧美18| 欧美在线不卡一区| 国产一级片在线| 热久久免费国产视频| 一区二区三区视频免费观看| 无码av天堂一区二区三区| 国产大陆a不卡| 美女的奶胸大爽爽大片| 91精品国产全国免费观看| 午夜不卡视频| 国产欧美精品xxxx另类| 欧美黄色大片在线观看| 亚洲黄色a v| 中文一区在线播放| 中文字幕人妻精品一区| 神马久久桃色视频| 欧美电影在线观看网站| 亚洲成人自拍视频| 麻豆成人免费电影| 91狠狠综合久久久| 欧美一二区视频| 欧美videos另类精品| www.久久草| 日韩视频一区二区三区在线播放免费观看| 中文字幕亚洲日本| 亚洲一区在线电影| 午夜av免费在线观看| 欧美自拍视频在线观看| 欧美日韩播放| 婷婷免费在线观看| 亚洲欧美中日韩| 亚洲伦理在线观看| 高清一区二区三区日本久| 欧美日韩大片免费观看| 日韩亚洲在线视频| 中文字幕第一区二区| 国产欧美一区二区三区视频在线观看| 乱亲女秽乱长久久久| theporn国产在线精品| 5月婷婷6月丁香| 国产日韩三级在线| 国产精品热久久| 久久久免费精品| 国产亚洲电影| 香蕉视频色在线观看| 五月天一区二区三区| 久久米奇亚洲| 91在线国产电影| 亚洲一区国产一区| 精品一区二区三区蜜桃在线| 欧美一区二区三区视频在线观看| av漫画网站在线观看| 日本一区二区三区视频在线播放| 久久99久久99小草精品免视看| 久久免费公开视频| 亚洲欧美日韩中文在线| 成人在线分类| www国产黄色| 亚洲视频免费观看| 四虎影视精品成人| 成人欧美在线视频| 国产欧美大片| 日本一二三区在线观看| 日韩av在线网页| 国产日韩欧美中文在线| 日韩中文字幕三区| 亚洲男同1069视频| 免费成人av电影| av日韩中文字幕| 日韩电影在线免费看| 国产在线视频你懂的| 中文字幕日韩精品在线观看| 国产色噜噜噜91在线精品| 欧美特黄aaa| 色视频一区二区|