vue-ganttastic甘特圖label標簽橫向滾動固定方法

這個甘特圖之前插件里,沒有找到能固定label標簽在屏幕上的辦法,用css各種辦法都沒有實現,所以我我直接手寫定位,用js監聽滾動條滾動的距離,然后同步移動甘特圖label標簽,造成一種定位的錯覺,以下是代碼:

我用的是介紹 | Pure Admin 保姆級文檔(已更新至最新版v6.0.0)這個前端框架,感覺功能還是非常完善的,作者全職做開源,希望大家也多多支持。

這個是全部甘特圖的示例代碼

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from "vue";
// https://zunnzunn.github.io/vue-ganttastic/introduction.html
import { GGanttChart, GGanttRow } from "@infectoone/vue-ganttastic";// 添加滾動位置狀態
const scrollLeft = ref(0);
// 添加容器引用
const containerRef = ref(null);// 現有數據保持不變
const context = ref([[{week: "星期一",beginDate: "06:00",endDate: "22:00",label_column_title: "123",ganttBarConfig: {id: "0",hasHandles: true,label: "需求收集和分析  負責人:小張",style: {background: "#e96560"}}}],[{week: "星期二",beginDate: "09:00",endDate: "18:00",ganttBarConfig: {id: "1",hasHandles: true,label: "系統設計  負責人:小強",style: {background: "#5ccfa3"}}}],[{week: "星期三",beginDate: "07:00",endDate: "20:00",ganttBarConfig: {id: "2",hasHandles: true,label: "編碼實現  負責人:老李",style: {background: "#77d6fa"}}}],[{week: "星期四",beginDate: "06:00",endDate: "21:00",ganttBarConfig: {id: "3",hasHandles: true,label: "編碼實現  負責人:小明",style: {color: "#fff",background: "#1b2a47"}}}],[{week: "星期五",beginDate: "05:00",endDate: "19:00",ganttBarConfig: {id: "4",hasHandles: true,label: "內部測試  負責人:小雪",style: {background: "#5ccfa3"}}}],[{week: "星期六",beginDate: "10:00",endDate: "22:00",ganttBarConfig: {id: "5",hasHandles: true,label: "系統優化和文檔整理  負責人:小欣",style: {background: "#f8bc45"}}}],[{week: "星期天",beginDate: "04:00",endDate: "23:59",ganttBarConfig: {id: "6",immobile: false,hasHandles: false,label: "部署和上線  負責人:老王",style: {background: "#f3953d"}}}],[{week: "星期天",beginDate: "04:00",endDate: "23:59",ganttBarConfig: {id: "6",immobile: false,hasHandles: false,label: "部署和上線  負責人:老王",style: {background: "#f3953d"}}}]
]);// 滾動事件處理函數
function handleScroll(e) {scrollLeft.value = e.target.scrollLeft;console.log("滾動事件觸發", scrollLeft.value);const labels = document.querySelectorAll(".g-gantt-row-label, .g-gantt-row-label-container");labels.forEach(label => {label.style.position = "absolute";label.style.left = scrollLeft.value + "px";});
}// 添加和移除滾動事件監聽
onMounted(() => {// 延遲添加事件監聽,確保DOM已完全渲染setTimeout(() => {if (containerRef.value) {containerRef.value.addEventListener("scroll", handleScroll);console.log("滾動監聽已添加", containerRef.value);}}, 500);
});onUnmounted(() => {if (containerRef.value) {containerRef.value.removeEventListener("scroll", handleScroll);console.log("滾動監聽已移除");}
});function getWeekRange() {const today = new Date();const dayOfWeek = today.getDay();const startDate = new Date(today);startDate.setDate(today.getDate() - dayOfWeek + 1);const endDate = new Date(startDate);endDate.setDate(startDate.getDate() + 6);const formatDate = date => {const year = date.getFullYear();const month = String(date.getMonth() + 1).padStart(2, "0");const day = String(date.getDate()).padStart(2, "0");return `${year}-${month}-${day}`;};const currentWeekStart = formatDate(startDate);const currentWeekEnd = formatDate(endDate);return {currentWeekStart,currentWeekEnd};
}const weekRangeInChina = getWeekRange();
</script><template><div ref="containerRef" class="gantt-container"><g-gantt-chartchart-start="00:00"chart-end="23:59"precision="hour"date-format="HH:mm"bar-start="beginDate"bar-end="endDate"gridclass="full-width-gantt"><template #upper-timeunit><h1>{{`${weekRangeInChina.currentWeekStart} / ${weekRangeInChina.currentWeekEnd}`}}</h1></template><g-gantt-rowv-for="(item, index) in context":key="index":bars="item":label="item[0].week"highlight-on-hover/></g-gantt-chart></div>
</template><style>
/* 全局樣式,確保能覆蓋組件內部樣式 */
.g-gantt-row-label,
.g-gantt-row-label-container {position: relative !important;transition: none !important;
}.gantt-container {width: 100%;overflow-x: auto;padding-bottom: 10px;
}.full-width-gantt {min-width: 1500px;width: 200%;
}/* 修改標簽寬度樣式 */
.g-gantt-row-label {width: 100px !important;min-width: 100px !important;max-width: 100px !important;box-sizing: border-box !important;overflow: hidden !important;text-overflow: ellipsis !important;
}
</style>

重點處理方法是:

// 添加滾動位置狀態
const scrollLeft = ref(0);
// 添加容器引用
const containerRef = ref(null);// 添加和移除滾動事件監聽
onMounted(() => {// 延遲添加事件監聽,確保DOM已完全渲染setTimeout(() => {if (containerRef.value) {containerRef.value.addEventListener("scroll", handleScroll);console.log("滾動監聽已添加", containerRef.value);}}, 500);
});// 滾動事件處理函數
function handleScroll(e) {scrollLeft.value = e.target.scrollLeft;console.log("滾動事件觸發", scrollLeft.value);const labels = document.querySelectorAll(".g-gantt-row-label, .g-gantt-row-label-container");labels.forEach(label => {label.style.position = "absolute";label.style.left = scrollLeft.value + "px";});
}
onUnmounted(() => {if (containerRef.value) {containerRef.value.removeEventListener("scroll", handleScroll);console.log("滾動監聽已移除");}
});

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

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

相關文章

VS2017編譯openssl3.0.8

openssl是一個功能豐富且自包含的開源安全工具箱。它提供的主要功能有:SSL協議實現(包括SSLv2、SSLv3和TLSv1)、大量軟算法(對稱/非對稱/摘要)、大數運算、非對稱算法密鑰生成、ASN.1編解碼庫、證書請求(PKCS10)編解碼、數字證書編解碼、CRL編解碼、OCSP協議、數字證書驗證、P…

16【架構進階】Flask藍圖與應用工廠模式:構建企業級Web應用的核心技巧

【架構進階】Flask藍圖與應用工廠模式&#xff1a;構建企業級Web應用的核心技巧 前言&#xff1a;為什么應用架構決定項目的天花板&#xff1f; 在Flask開發中&#xff0c;隨著項目規模的擴大&#xff0c;如何組織代碼結構成為決定項目可維護性和擴展性的關鍵因素。單文件應用…

系統架構設計-案例分析總結

系統架構設計-案例分析總結 2024年下半年系統架構設計師案例第1題 2022年下半年系統架構設計師案例第1題第2題 2021年下半年系統架構設計師案例第1題第2題 2024年下半年系統架構設計師案例 題&#xff1a;效用樹可用性中ping/echo策略和心跳策略比較 第1題 閱讀以下關于面向質…

軟件架構風格系列(6):解釋器架構

文章目錄 引言一、從計算器到規則引擎&#xff1a;解釋器架構的核心本質&#xff08;一&#xff09;什么是解釋器架構&#xff1f;&#xff08;二&#xff09;核心組件&#xff1a;構建“語言理解系統”的三駕馬車 二、架構設計圖&#xff1a;從輸入到執行的完整鏈路三、Java實…

Serverless 的未來與進階:持續學習之路

Serverless 的未來與進階&#xff1a;持續學習之路 恭喜你&#xff0c;堅持走到了《輕松入門 Serverless》系列博客的最后一篇&#xff01; 回顧我們的旅程&#xff0c;我們一起&#xff1a; 揭開了 Serverless 的神秘面紗&#xff0c;理解了它的核心思想、關鍵特征以及 Faa…

設備數據看板助力自動化工廠實現生產智能精細化管理

工廠數字化轉型需要實現自動化設備生產現場可視化、設備系統間的互聯互通&#xff0c;以及數據的智能決策。然而&#xff0c;當前許多制造企業仍面臨著傳統單機設備同質化嚴重、數字化服務能力不足、售后成本高企、系統集成效率低下等挑戰。企業如何通過自動化裝備看板和實時數…

pcie phy電氣層(PCS)詳解gen1、2 (rx)

注&#xff1a;推薦大家查看英文原版&#xff0c;筆者大部分內容也為翻譯&#xff1b; S IP&#xff1a; 1. pcie供電&#xff1a; Vph&#xff1a; 1.2&#xff0c;1.5&#xff0c; 1.8V high voltage IO supply&#xff1b; Vp/VptxX/Vpdig &#xff1a;analog supply&am…

Java—— File詳解

說明 File對象就表示一個路徑&#xff0c;可以是文件的路徑、也可以是文件夾的路徑 這個路徑可以是存在的&#xff0c;也允許是不存在的 獲取File對象 方法名稱說明public File(String pathname)根據文件路徑創建文件對象public File(String parent,String child)根據父路徑名…

【數字圖像處理】半開卷復習提綱

1&#xff1a;要求 2張A4紙以內&#xff0c;正反面均可寫 &#xff08;不過博主由于墨水浸到背面了&#xff0c;采用了把2張單面通過雙面膠粘起來的方法&#xff0c;結果考前半個小時都在用這個難用的雙面膠。。。&#xff09; 2&#xff1a;提綱內容 3&#xff1a;提示 考的…

Neovim 如何安裝和配置縮進標識插件 indent-blankline.nvim

Neovim 0.9 以?lazy.nvim?為核心的現代化配置指南 一次性搞定插件管理、UI 優化與高效行跳轉 適用平臺&#xff1a;Linux&#xff0f;macOS&#xff0f;WSL&#xff0f;Windows (Neovim ≥?0.9) 目錄 為什么選?lazy.nvim安裝與初始化 2.1 創建配置目錄 2.2 克隆?lazy.nvi…

VulnHub | Breach - 1

&#x1f31f; 關注這個靶場的其它相關筆記&#xff1a;[網安靶場] 紅隊綜合滲透靶場 —— VulnHub 靶場筆記合集 Breach: 1 ~ VulnHubBreach: 1, made by mrb3n. Download & walkthrough links are available.https://vulnhub.com/entry/breach-1,152/ 0x01&#xff1a;…

城市綜合管廊監測與維護一體化解決方案

一、 方案概述 城市綜合管廊監測主要源于現代城市對地下管線管理的迫切需求。隨著城市化進程的加快&#xff0c;地下管線作為城市的“生命線”&#xff0c;其重要性日益凸顯。傳統的地下管線管理方式存在分散、低效、易產生信息孤島和管理盲區等問題&#xff0c;已無法滿足現代…

【iOS】alloc的實際流程

目錄 前言 為什么不按源碼流程調用&#xff1f; alloc的調用流程 前言 在之前的博客中我們有學習到過alloc的底層原理&#xff0c;沿著源碼一步步找到了alloc的調用鏈——alloc—>_objc_rootAlloc—>callAlloc—>_objc_rootAllocWithZone—>_class_createInstan…

MySQL 故障排查與生產環境優化

目錄 一、前置知識點 MySQL的運行原理 1. 客戶端連接 2. SQL 解析與優化 3. 存儲引擎處理 4. 日志與持久化 二、MySQL 單實例故障排查 &#xff08;1&#xff09;故障現象1 &#xff08;2&#xff09;故障現象2 &#xff08;3&#xff09;故障現象3 &#xff08;4&am…

C++學習:六個月從基礎到就業——C++20:模塊(Modules)與其他特性

C學習&#xff1a;六個月從基礎到就業——C20&#xff1a;模塊(Modules)與其他特性 本文是我C學習之旅系列的第五十三篇技術文章&#xff0c;也是第三階段"現代C特性"的第十五篇&#xff0c;深入探討C20引入的模塊(Modules)系統及其他重要特性。查看完整系列目錄了解…

Vue百日學習計劃Day36-42天詳細計劃-Gemini版

總目標: 在 Day 36-42 理解組件化開發的思想&#xff0c;熟練掌握 Vue 組件的注冊、Props、Events、v-model、Slots、Provide/Inject 等核心概念和實踐&#xff0c;能夠構建可復用和易于維護的組件結構。 所需資源: Vue 3 官方文檔 (組件基礎): https://cn.vuejs.org/guide/es…

深入解析Spring Boot與Kafka集成:構建高效消息驅動微服務

深入解析Spring Boot與Kafka集成&#xff1a;構建高效消息驅動微服務 引言 在現代微服務架構中&#xff0c;消息隊列扮演著至關重要的角色&#xff0c;而Apache Kafka憑借其高吞吐量、低延遲和可擴展性&#xff0c;成為了許多企業的首選。本文將詳細介紹如何在Spring Boot應用…

谷歌 NotebookLM 即將推出 Sparks 視頻概覽:Gemini 與 Deep Research 加持,可生成 1 - 3 分鐘 AI 視頻

近期&#xff0c;谷歌旗下的 NotebookLM 即將推出一項令人矚目的新功能 ——Sparks 視頻概覽。這一功能借助 Gemini 與 Deep Research 的強大能力&#xff0c;能夠生成 1 - 3 分鐘的 AI 視頻&#xff0c;為用戶帶來全新的內容創作與信息獲取體驗。 NotebookLM&#xff1a;AI 筆…

第十六屆藍橋杯復盤

文章目錄 1.數位倍數2.IPv63.變換數組4.最大數字5.小說6.01串7.甘蔗8.原料采購 省賽過去一段時間了&#xff0c;現在復盤下&#xff0c;省賽報完名后一直沒準備所以沒打算參賽&#xff0c;直到比賽前兩天才決定參加&#xff0c;賽前兩天匆匆忙忙下載安裝了比賽要用的編譯器ecli…

Manus AI 突破多語言手寫識別技術壁壘:創新架構、算法與應用解析

在人工智能領域&#xff0c;手寫識別技術作為連接人類自然書寫與數字世界的橋梁&#xff0c;一直備受關注。然而&#xff0c;多語言手寫識別面臨諸多技術挑戰&#xff0c;如語言多樣性、書寫風格差異、數據稀缺性等。Manus AI 作為該領域的領軍者&#xff0c;通過一系列創新技術…