highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

news2025/3/12 13:47:16

效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时,让指定元素跟随滚动
请添加图片描述

如果元素需要滚动,但是不显示滚动条的话可以设置

首先,确保目标元素具有固定的高度和宽度,并且超过该尺寸的内容会溢出。
将元素的 CSS 样式中的 overflow 属性设置为 hidden,以隐藏默认的滚动条。

<div style="overflow: hidden"></div>

highcharts监听滚动事件

const chart = Highcharts.chart('container', {
  chart: {
    ...
    },
    ...
  },
  ...
});
chart.scrollingContainer.addEventListener('scroll', (el) => {
    console.log(el);
});

引用到的包
highcharts-gantt.js下载地址

需要引入highcharts-gantt.js,moment.js

完整代码示例:

<template>
  <div style="width: 100%; height: 100%; display: flex">
    <div
      style="
        width: 100px;
        display: flex;
        flex-direction: column;
        height: 508px;
        margin: 10px 0 0 10px;
      "
    >
      <div
        style="
          height: 105px;
          border: 1px solid #ccc;
          display: flex;
          align-items: center;
          justify-content: center;
        "
      >
        分类
      </div>
      <!-- 设置指定元素可以滚动但不显示滚动条overflow: hidden -->
      <!-- 高度为length计算出来的高度 -->
      <div style="overflow: hidden; height: 721px" id="areaContainer">
        <div
          v-for="(item, index) in categories"
          style="width: 100px; height: 50px"
          :key="item.id"
        >
          <div
            style="
              width: 100px;
              height: 52px;
              border: 1px solid red;
              display: flex;
              align-items: center;
              justify-content: center;
            "
            :style="{
              'border-bottom':
                index + 1 === categories.length ? '1px solid red' : 'none',
              'border-top': index === 0 ? 'none' : '1px solid red',
            }"
          >
            {{ item.value }}
          </div>
        </div>
      </div>
    </div>
    <!-- 固定x轴设置高度,值比508大一点,范围得自己调 -->
    <div id="container" style="flex: 1; height: 535px"></div>
  </div>
</template>
<script>
import moment from "moment";
import Highcharts from "@/utils/highcharts-gantt";
export default {
  data() {
    return {
      ganttData: [
        {
          name: "任务1",
          x: new Date("2022-12-01 09:00:00").getTime(),
          x2: new Date("2022-12-11 09:00:00").getTime(),
          y: 0,
        },
        {
          name: "任务2",
          x: new Date("2022-12-08 09:00:00").getTime(),
          x2: new Date("2022-12-10 19:20:40").getTime(),
          y: 1,
        },
        {
          name: "任务3",
          x: new Date("2022-12-06 09:00:00").getTime(),
          x2: new Date("2022-12-20 19:20:40").getTime(),
          y: 2,
        },
        {
          name: "任务4",
          x: new Date("2022-12-18 09:00:00").getTime(),
          x2: new Date("2022-12-22 19:20:40").getTime(),
          y: 10,
        },
        {
          name: "任务5",
          x: new Date("2022-12-05 09:00:00").getTime(),
          x2: new Date("2022-12-15 19:20:40").getTime(),
          y: 12,
        },
      ],
      categories: [
        {
          id: 1,
          value: "分类1",
        },
        {
          id: 2,
          value: "分类2",
        },
        {
          id: 3,
          value: "分类3",
        },
        {
          id: 4,
          value: "分类4",
        },
        {
          id: 5,
          value: "分类5",
        },
        {
          id: 6,
          value: "分类6",
        },
        {
          id: 7,
          value: "分类7",
        },
        {
          id: 8,
          value: "分类8",
        },
        {
          id: 9,
          value: "分类9",
        },
        {
          id: 10,
          value: "分类10",
        },
        {
          id: 11,
          value: "分类11",
        },
        {
          id: 12,
          value: "分类12",
        },
        {
          id: 13,
          value: "分类13",
        },
      ],
      areas: [
        {
          id: 11,
          value: "卷包车间",
          // length: 8
        },
        {
          id: 22,
          value: "异型车间",
          // length: 5
        },
        {
          id: 223,
          value: "异型车间1",
          // length: 5
        },
      ],
    };
  },
  mounted() {
    this.categories = this.categories.map((i) => ({
      ...i,
      checked: false,
    }));
    let month = "2022-12";
    const WEEKS = {
      0: "日",
      1: "一",
      2: "二",
      3: "三",
      4: "四",
      5: "五",
      6: "六",
    };
    Highcharts.setOptions({
      global: {
        useUTC: false, // 不使用utc时间
      },
      lang: {
        noData: "暂无数据",
      },
    });
    const gChart = Highcharts.ganttChart("container", {
      alignTicks: false,
      series: [
        {
          type: "gantt",
          name: "设备",
          data: this.ganttData,
          dataLabels: {
            enabled: true,
            format: "{point.name}",
          },
          tooltip: {
            pointFormatter: function () {
              return `<div>
                <span style="color:{point.color}">\u25CF</span> ${this.name}  
                <br />
                开始时间:${moment(this.x).format("YYYY-MM-DD HH:mm:ss")}
                <br />
                结束时间:${moment(this.x2).format("YYYY-MM-DD HH:mm:ss")}
              </div>`;
            },
          },
        },
      ],
      xAxis: [
        {
          min: moment(month).valueOf(),
          max: moment(month).endOf("month").valueOf(),
          gridLineEidth: 1,
          minTickInterval: 1000 * 60 * 60 * 24,
          currentDateIndicator: true,
          tickPixelInterval: 70,
          grid: {
            borderWidth: 1, // 右侧表头边框宽度
            cellHeight: 35, // 右侧日期表头高度
          },
          labels: {
            align: "center",
            formatter: function () {
              return `${WEEKS[moment(this.value).day()]}`;
            },
          },
        },
        {
          gridLineWidth: 1,
          minTickInterval: 1000 * 60 * 60 * 24,
          tickPixelInterval: 100,
          grid: {
            borderWidth: 1, // 右侧表头边框宽度
            cellHeight: 30, // 右侧日期表头高度
          },
          labels: {
            align: "center",
            formatter: function () {
              return `${moment(this.value).format("D")} `;
            },
          },
        },
      ],
      yAxis: {
        type: "category",
        grid: {
          columns: [
            {
              title: {
                text: "任务分类",
              },
              reversed: true,
              categories: this.categories,
              labels: {
                useHTML: true,
                formatter: function () {
                  var label = `
                <div style="display:flex;align-items:center">
                  <div class="checkbox" style="width:16px;height:16px;border:1px solid #444;margin-right:5px;cursor:pointer" id='${this.value.id}'>
                    <span
                      class="has-check"
                      style="opacity: 0;font-size:12px;padding-left:3px;">✔</span>
                  </div>
                  ${this.value.value}
                </div>`;
                  return label;
                },
              },
            },
          ],
        },
      },
      chart: {
        spacingLeft: 0,
        scrollablePlotArea: {
          minHeight: 741, // 52 * this.categories.length + 65(52是每个y轴label的高度,65是2个xAxis的高度),设置这个属性能在页面滚动时,头部固定
        },
      },
    });
    let areadiv = document.querySelector("#areaContainer");
    // 监听甘特图的滚动事件
    gChart.scrollingContainer.addEventListener("scroll", (e) => {
      // 给指定元素设置滚动距离
      areadiv.scrollTo({
        top: e.target.scrollTop,
        behavior: "smooth",
      });
    });

    const labelElements = document.querySelectorAll(
      "#container .highcharts-yaxis-labels .checkbox"
    );

    // 自定义复选框,给复选框添加点击事件
    labelElements.forEach((label) => {
      label.addEventListener(
        "click",
        (el) => {
          let element = el.target; // element是.checkbox元素
          const addClickElement = this.getParentElement(element, "checkbox");
          let id = "";
          if (element.classList.toString().indexOf("checkbox") !== -1) {
            id = element.getAttribute("id");
          }
          if (addClickElement) {
            id = addClickElement.getAttribute("id");
            element = addClickElement;
          }
          this.categories[id - 1].checked = !this.categories[id - 1].checked;
          element.style.background = this.categories[id - 1].checked
            ? "#0061ff"
            : "none";
          element.style.borderColor = this.categories[id - 1].checked
            ? "#0061ff"
            : "#444";
          element.querySelector(".has-check").style.opacity = 1;
          element.querySelector(".has-check").style.color = "#fff";
        },
        true
      );
    });

    // 监听鼠标滚轮事件
    // document.querySelector('#container').addEventListener('wheel', (el) => {
    //   console.log(el)
    // })
  },
  methods: {
    // 根据当前target元素找到指定className的父元素
    getParentElement(target, className) {
      let parent = target.parentElement;
      while (parent) {
        if (parent.classList.toString().indexOf(className) !== -1) {
          return parent;
        }
        parent = parent.parentElement;
      }
      return null;
    },
  },
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1338661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新多模态大模型SOTA - EMU (Generative Multimodal Models are In-Context Learners)

前言 设计的模型叫EMU&#xff0c;通过统一的自回归方式&#xff08;其预测的输出依赖于过去的输出&#xff09;训练。参数37B&#xff08;370亿&#xff09;。指标在目前多项视觉&#xff08;图像&#xff0c;视频&#xff09;问答的SOTA tips&#xff1a; 不过这里吐槽一点…

如何搭建Tomcat服务并结合内网穿透实现公网访问本地站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

SA 接通案例(2)

1.测试卡开通增值业务导致VONR呼叫时延增大 关键字&#xff1a;VONR拉网测试&#xff0c;VONR时延&#xff0c;增值业务 【问题描述】 3月VONR拉网测试呼叫时延增加&#xff0c;2月VONR呼叫时延1.1s&#xff0c;3月VONR呼叫时延1.4s。 【问题分析】 一、2月和3月典型Case对比…

CMMI-项目总体计划模版

目录 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章 运维计划 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章运维计划

最佳实践!Apipost使用指南

自诞生以来&#xff0c;Apipost凭借其简洁直观的用户界面、强大的功能以及简单、易上手的操作&#xff0c;让Apipost成为了开发人员不可或缺的工具。本文将详细介绍Apipost的主要功能和使用方法&#xff0c;帮助大家更好地了解这款优秀的API开发工具。 下载安装 直接进入Apip…

桃红葡萄酒是如何成为当代宠儿的?

在过去的几年里&#xff0c;桃红葡萄酒的质量和受欢迎程度都有了很大的提高。夏天是花园和烧烤聚会的旺季&#xff0c;玫瑰红是许多美食家最喜欢的颜色。桃红葡萄酒满足了味觉的各种需求&#xff0c;它们是三文鱼和烤鸡等各种美食的绝佳伴侣&#xff0c;是任何精致辛辣菜肴的真…

ARM串口通信编程实验

完成&#xff1a;从终端输入选项&#xff0c;完成点灯关灯&#xff0c;打开风扇关闭风扇等操作 #include "gpio.h" int main() {char a;//char buf[128];uart4_config();gpio_config();while(1){//接收一个字符数据a getchar();//发送接收的字符putchar(a);switch(…

MAVEN依赖生成后idea依然爆红问题

以下是对MAVEN依赖生成后idea依然爆红问题的一种猜测 ----- 碰到解决不了可以试一下&#xff08;也请大佬们指正&#xff09; 把所有后端服务停了&#xff08;当微服务项目件存在依赖相互引用的情况时&#xff0c;在install时可能影响到新包的生成&#xff0c;因为存在包占用&…

4. 从零开始学Sqoop大数据框架,这些学习网站助你一臂之力!

介绍&#xff1a;Sqoop是一款开源的工具&#xff0c;主要用于在Hadoop与传统的数据库系统间进行数据的传递。它可以将一个关系型数据库&#xff08;例如&#xff1a;MySQL、Oracle、Postgres等&#xff09;中的数据导进到Hadoop的HDFS中&#xff0c;也可以将HDFS的数据导进到关…

WPS中如何根据身份证号生成出生日期并排序

1. wps中如何根据身份证号导出出生日期并排序 1.1 wps中建一张表 1.2 使用转日期格式导出出生日期 DATE(VALUE(MID(C2,7,4)),VALUE(MID(C2,11,2)),VALUE(MID(C2,13,2)))MID(C2, 7, 4)&#xff1a;这部分从单元格 C2 中提取文本字符串&#xff0c;从第7个字符开始提取长度为4的…

网红是怎样炼成的 数据统计网红的共同特征 利用数据来分析热点问题与事件 如何将软件编程专业能力与直播结合,创造出独特且具有技术优势的直播体验

为了成为一名网红&#xff0c;需要做好一系列的准备工作&#xff0c;同时也要了解网红们通常具备的共同特征。以下是准备步骤和网红的一些共同特征&#xff1a; 准备步骤 明确定位&#xff1a;确定自己的兴趣领域和特长&#xff0c;这将成为你的个人品牌和内容创作的核心。 了…

camera 客观校准 (2)——抓图

#灵感# 延续camera 客观校准 &#xff08;1&#xff09;——抓图&#xff0c;继续补充 noise calibration: 1、拍摄灰卡&#xff0c;一个光源&#xff08;可以参考摄影那种竖着的灯管&#xff09;垂直照射在灰卡一端&#xff0c;采集的图片亮度要渐变&#xff0c;亮度直方图最…

Echarts图表添加蒙层 (拖拽、拉伸)

图表支持区域拖动和拉伸 文章目录 图表支持区域拖动和拉伸前言背景&#xff08;个人经历&#xff09;简单例子的效果图如下&#xff08;本次大致就是下面的功能&#xff09; 一、具体代码如下&#xff1a;1. HTML部分如下2. JS部分如下3. 具体效果图如下 二、完善方法和时间可以…

继电保护测试仪的使用寿命有10年吗?

继电器保护测试仪在电力检测行业非常重要。它经常被电力检测工人用来检测各种继电器保护电力设施&#xff0c;从而发现这些设备的潜在问题&#xff0c;这对设备的维护非常重要。然后&#xff0c;随着继电器保护测试仪的使用不断增加&#xff0c;设备的一些性能和使用寿命也会相…

Azure 学习总结

文章目录 1. Azure Function1.1 Azure Function 概念1.2 Azure Function 实现原理1.3 Azure Function 本地调试1.4 Azure Function 云部署 2. Azure API Managment 概念 以及使用2.1 Azure API 概念2.2 Azure API 基本使用 3. Service Bus 应用场景及相关特性4. Azure Monitor相…

欧洲影像学人工智能和影像组学文章审稿指南解读--用于训练/验证AI/影像组学的参考标准是否可靠?

欧洲影像学人工智能和影像组 学文章审稿指南解读 针对人工智能&#xff08;AI&#xff09;和影像组学领域的研究文章&#xff0c;欧洲影像学&#xff08;European Radiology&#xff09;期刊为审稿人提出了一系列特别的说明和要求。这些要求不仅仅是审稿的准则&#xff0c;更是…

redis cluster判断key属于那个分片。

一、判断阿里云 redis cluster&#xff0c;的key属于那个分片。 阿里云特有的命令info key 可以查看key属于那个slot&#xff0c;那个分片 命令行查看&#xff1a; xxxx:6379> info key xxxx_compressed_xxx slot:4941 node_index:9 xxxx:6379> cluster keyslot xxxx_…

低代码平台在金融银行中的应用场景

随着数字化转型的推进&#xff0c;商业银行越来越重视技术在业务发展中的作用。在这个背景下&#xff0c;白码低代码平台作为一种新型的开发方式&#xff0c;正逐渐受到广大商业银行的关注和应用。白码低代码平台能够快速构建各类应用程序&#xff0c;提高开发效率&#xff0c;…

ArcGIS渔网的多种用法

在ArcGIS中有一个渔网工具&#xff0c;顾名思义&#xff0c;可以用来创建包含由矩形像元所组成网络的要素类。不太起眼&#xff0c;但它的用途却有很多&#xff0c;今天跟大家分享一篇关于渔网的多种用途。 1.马赛克地图制作 2.基于网格的设施密度统计制作马赛克地图 准备材…