vue3 實現簡單瀑布流

一、整理思路

  • 實際場景中,瀑布流一般由 父組件 提供 數據列表,子組件渲染
  • 每個圖片都是根據容器進行 絕對定位 ,從而定好自己的位置
  • 取出 屏幕的寬度,設定 圖片的寬度 固定 為一個值,計算可以鋪 多少列
  • 按列數 先鋪上第一行lefttop 值)
  • 第一行鋪滿以后,后面的每一張都要 鋪在高度最低的列,這是瀑布流的核心!所以要維護一個 長度為 列數 的 列高度數組 用于比較
  • 總結:每次放置一張圖,都要計算它的 lefttop 值丟進瀑布流數組中,并且更新 列高度數據 便于下次對比

二、代碼

父組件

<WaterFall :list="list" />
// 模擬列表數據
const list = [{height: 300,background: "red",},{height: 400,background: "pink",},{height: 500,background: "blue",},{height: 200,background: "green",},{height: 300,background: "gray",},{height: 400,background: "#CC00FF",},{height: 200,background: "gray",},{height: 100,background: "#996666",},{height: 500,background: "skyblue",},{height: 300,background: "#993366",},{height: 100,background: "#33FF33",},{height: 400,background: "skyblue",},{height: 200,background: "#6633CC",},{height: 300,background: "#666699",},{height: 300,background: "#66CCFF",},{height: 300,background: "skyblue",},{height: 200,background: "#CC3366",},{height: 200,background: "#CC9966",},{height: 200,background: "#FF00FF",},{height: 500,background: "#990000",},{height: 400,background: "red",},{height: 100,background: "#999966",},{height: 200,background: "#CCCC66",},{height: 300,background: "#FF33FF",},{height: 400,background: "#FFFF66",},{height: 200,background: "red",},{height: 100,background: "skyblue",},{height: 200,background: "#33CC00",},{height: 300,background: "#330033",},{height: 100,background: "#0066CC",},{height: 200,background: "skyblue",},{height: 100,background: "#006666",},{height: 200,background: "yellow",},{height: 300,background: "skyblue",},{height: 120,background: "#33CCFF",},{height: 400,background: "#999966",},{height: 630,background: "#CC9966",},{height: 250,background: "#33FF00",},{height: 300,background: "yellow",},{height: 500,background: "green",},
];

子組件

<template><div class="list"><divclass="item"v-for="(item, index) in waterList":style="{width: width + 'px',height: item.height + 'px',left: item.left + 'px',top: item.top + 'px',background: item.background,}">{{ index }}</div></div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from "vue";const props = defineProps<{list: any[];
}>();// 圖片寬度
const width = 120;
// 圖片上下間距
const gap = 20;
// 瀑布流數組
const waterList = ref<any[]>([]);
// 列高度數組
const heightList = reactive<number[]>([]);// 屏幕寬度需要在 mounted 之后拿到
onMounted(() => {// 計算列數const column = Math.floor(document.body.clientWidth / width);// 核心內容就是維護每個圖片的 left、topfor (let i = 0; i < props.list.length; i++) {// 先鋪上第一行(i < column 則表示是第一行)if (i < column) {props.list[i].top = 0;props.list[i].left = width * i;// 塞進瀑布流waterList.value?.push(props.list[i]);// 高度數據更新heightList[i] = props.list[i].height;}// 后面的就要一張張塞進去,每次找出最低的列往里塞else {// 最低的高度,先默認為第一列高度let current = heightList[0];// 最低的列,先默認為第一個let col = 0;// 循環每一列進行比較heightList.forEach((h, i) => {if (h < current) {current = h;col = i;}});console.log("最低的列", col, "高度為", current);// 由此計算出該圖片的 left、topprops.list[i].left = col * width;props.list[i].top = current + gap;// 塞進瀑布流waterList.value.push(props.list[i]);// 更新列高度數組heightList[col] = current + gap + props.list[i].height;}}console.log("waterList", waterList.value);console.log("heightList", heightList);
});
</script>
<style lang="scss" scoped>
.list {position: relative;height: 100%;overflow: auto;.item {position: absolute;font-size: 30px;}
}
</style>

效果如圖

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42662.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42662.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42662.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Julia進行核遞歸最小二乘算法(KRLS)的解析與實現

F 標題&#xff1a; 使用Julia進行核遞歸最小二乘算法&#xff08;KRLS&#xff09;的深度解析與實現 第一部分&#xff1a; 核遞歸最小二乘算法 (KRLS) 是一個在線核回歸算法&#xff0c;這種算法的主要特點是能夠一次處理一個樣本&#xff0c;并構建一個訓練點字典&#xf…

5G科技防汛,助力守護一方平安

“立秋雖已至&#xff0c;炎夏尚還在”&#xff0c;受臺風席卷以及季節性影響全國多地正面臨強降水的嚴峻挑戰。“落雨又順秋&#xff0c;綿綿雨不休”&#xff0c;正值“七下八上” 防汛關鍵時期&#xff0c;貴州省水文水資源局已全面進入備戰狀態。 為確保及時響應做好防汛搶…

Vue3 setup新特性簡單應用

去官網學習→組合式 API&#xff1a;setup() | Vue.js 運行示例&#xff1a; 代碼&#xff1a;App.vue <template><div class"home"><img alt"Vue logo" src"../assets/logo.png"><!-- msg 組件傳遞數據 --><Hell…

VBA_MF系列技術資料1-157

MF系列VBA技術資料 為了讓廣大學員在VBA編程中有切實可行的思路及有效的提高自己的編程技巧&#xff0c;我參考大量的資料&#xff0c;并結合自己的經驗總結了這份MF系列VBA技術綜合資料&#xff0c;而且開放源碼&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04屬于定…

MySQL 面試題

一、數據庫基礎 1、MySQL 有哪些數據庫類型? (1) 整數類型&#xff1a; TINYINT 1 字節 SMALLINT 2 字節 MEDIUMINT 3 字節 INT 4 字節 BIGINT 8 字節 ① 任何整數類型都可以加上 UNSIGNED …

【學會動態規劃】最長湍流子數組(23)

目錄 動態規劃怎么學&#xff1f; 1. 題目解析 2. 算法原理 1. 狀態表示 2. 狀態轉移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后&#xff1a; 動態規劃怎么學&#xff1f; 學習一個算法沒有捷徑&#xff0c;更何況是學習動態規劃&#xff0c; 跟我…

vue+elementui 實現文本超出長度顯示省略號,鼠標移上懸浮展示全部內容

一、場景 表單內的輸入框一般為固定寬度&#xff0c;當輸入框內容長度超出輸入框寬度時&#xff0c;需要顯示省略號&#xff0c;并設置鼠標移到輸入框上時懸浮展示全部內容。 <el-tooltipplacement"top-start"effect"light":content"basicData[Or…

在 IDEA 中使用 Git開發 圖文教程

在 IDEA 中使用 Git開發 圖文教程 一、連接遠程倉庫二、IDEA利用Git進行開發操作三、分支操作3.1 新建分支3.2 切換分支3.3 刪除分支3.4 比較分支3.5 合并分支 四、常用快捷鍵 一、連接遠程倉庫 一、打開IDEA&#xff0c;進入目錄&#xff1a;File ->New ->Project from…

Skywalking全鏈路追蹤【學習筆記】

Skywalking全鏈路追蹤的服務搭建&#xff0c;使用docker進行安裝。 搭建服務 搭建【ES】 # 拉取 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.10 # 啟動 docker run -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.typesingle-nod…

什么是 SPI,和API有什么區別?

面試回答 Java 中區分 API 和 SPI&#xff0c;通俗的講&#xff1a;API 和 SPI 都是相對的概念&#xff0c;他們的差別只在語義上&#xff0c;API 直接被應用開發人員使用&#xff0c;SPI 被框架擴展人員使用。 API Application Programming Interface 大多數情況下&#xff…

opencv 矩陣運算

1.矩陣乘&#xff08;*&#xff09; Mat mat1 Mat::ones(2,3,CV_32FC1);Mat mat2 Mat::ones(3,2,CV_32FC1);Mat mat3 mat1 * mat2; //矩陣乘 結果 2.元素乘法或者除法&#xff08;mul&#xff09; Mat m Mat::ones(2, 3, CV_32FC1);m.at<float>(0, 1) 3;m.at…

瀏覽器控制臺調試實用方法

許多程序員僅知道控制臺的console.log&#xff0c;其實控制臺API還包含一些其他實用方法&#xff0c; 這些方法在前端調試時會很有幫助。 目錄 console.dir 查看對象屬性和方法 輸出DOM元素 console.error console.time和console.timeEnd console.log console.clear 總結…

set NOCOUNT on

SET NOCOUNT ON 是一條 SQL 語句&#xff0c;用于禁止在執行查詢時返回受影響的行數消息。通常&#xff0c;當執行 INSERT、UPDATE、DELETE 等操作時&#xff0c;數據庫會返回一個消息&#xff0c;表示受影響的行數。但在某些情況下&#xff0c;你可能希望禁用這些消息&#xf…

(五)、深度學習框架源碼編譯

1、源碼構建與預構建&#xff1a; 源碼構建&#xff1a; 源碼構建是通過獲取軟件的源代碼&#xff0c;然后在本地編譯生成可執行程序或庫文件的過程。這種方法允許根據特定需求進行配置和優化&#xff0c;但可能需要較長的時間和較大的資源來編譯源代碼。 預構建&#xff1a; 預…

dubbo與zookeeper

ZooKeeper 在 Dubbo 應用中的作用 ZooKeeper 是一個開源的分布式協調服務&#xff0c;它在 Dubbo 中被廣泛使用來實現服務注冊、發現和配置管理等功能。在 Dubbo 架構中&#xff0c;ZooKeeper 扮演了一個重要的角色&#xff0c;可以提供以下功能&#xff1a; ZooKeeper 是一個開…

2023年05月 C/C++(二級)真題解析#中國電子學會#全國青少年軟件編程等級考試

第1題:數字放大 給定一個整數序列以及放大倍數x,將序列中每個整數放大x倍后輸出。 時間限制:1000 內存限制:65536 輸入 包含三行: 第一行為N,表示整數序列的長度(N ≤ 100); 第二行為N個整數(不超過整型范圍),整數之間以一個空格分開; 第三行包含一個整數(不超過整…

【RocketMQ】SpringBoot集成RocketMQ

SpringBoot集成RocketMQ 首先依舊是引入依賴 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</version> </dependency>然后就可以編寫發送不同類…

Vue2-全局事件總線、消息的訂閱與發布、TodoList的編輯功能、$nextTick、動畫與過渡

&#x1f954;&#xff1a;高度自律即自由 更多Vue知識請點擊——Vue.js VUE2-Day9 全局事件總線1、安裝全局事件總線2、使用事件總線&#xff08;1&#xff09;接收數據&#xff08;2&#xff09;提供數據&#xff08;3&#xff09;組件銷毀前最好解綁 3、TodoList中的孫傳父&…

【Git】Git中用到的一些命令

Git文件有四種狀態&#xff1a; 未跟蹤未修改&#xff08;已跟蹤&#xff09;已修改&#xff08;已跟蹤&#xff09;已暫存&#xff08;已跟蹤&#xff09; 通常我們將項目clone下來就會處于已跟蹤狀態 1、git diff命令 git diff&#xff1a;查看沒有暫存的文件更新哪些部分…

js判斷手指的上滑,下滑,左滑,右滑,事件監聽 和 判斷鼠標滾輪向上滾動滑輪向下滾動

js判斷手指的上滑&#xff0c;下滑&#xff0c;左滑&#xff0c;右滑&#xff0c;事件監聽 和 判斷鼠標滾輪向上滾動滑輪向下滾動 pc端 判斷鼠標滾輪向上滾動滑輪向下滾動 const scrollFunc (e) > { e e || window.event; let wheelDelta e.wheelDelta ? e.wheelDelta…