You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ApexChart容器Div的动画显隐异常问题及优化方案咨询

问题:ApexChart切换显示异常,寻求带动画的优化实现

我是编程新手,自学开发个人项目时,用ApexChart展示不同时段的数据,创建了4个对应不同时段的Div。通过下拉框选择时段后,需要隐藏所有未选中的Div,仅显示选中的Div。用show()/hide()方法实现时出现异常:首次选择“Last Month”能正常显示对应Div,切换到“Current Month”也能隐藏上月Div并显示本月Div,但再次选择“Last Month”时,对应Div及其中的ApexChart无法显示。现咨询带动画的更优实现方式。

现有代码

HTML部分

<div id="totalMilksaleChartfor7days"></div>
<div id="totalMilksaleChartcurrentmonth" style="display:none"></div>
<div id="totalMilksaleChartlastmonth" style="display:none"></div>
<div id="totalMilksaleChart" style="display:none"></div>

JavaScript部分

var durationget = duration;

if (durationget == "currentmonth") {
  $("#totalMilksaleChartcurrentmonth").show();
  $("#totalMilksaleChartfor7days").hide();
  $("#totalMilksaleChartlastmonth").hide();
  $("#totalMilksaleChart").hide();
} else if (durationget == "lastmonth") {
  $("#totalMilksaleChartlastmonth").show();
  $("#totalMilksaleChartfor7days").hide();
  $("#totalMilksaleChartcurrentmonth").hide();
  $("#totalMilksaleChart").hide();
} else if (durationget == "currentyear") {
  $("#totalMilksaleChart").show();
  $("#totalMilksaleChartfor7days").hide();
  $("#totalMilksaleChartlastmonth").hide();
  $("#totalMilksaleChartcurrentmonth").hide();
} else {
  $("#totalMilksaleChartfor7days").show();
  $("#totalMilksaleChartlastmonth").hide();
  $("#totalMilksaleChartcurrentmonth").hide();
  $("#totalMilksaleChart").hide();
}

问题原因

ApexChart依赖容器的尺寸进行渲染,当用hide()方法设置display:none后,容器尺寸会丢失,再次show()时图表无法自动重绘,导致显示异常。

优化实现方案(带动画+修复显示问题)

1. 核心思路

用CSS类控制显示/隐藏(替代show()/hide()),通过过渡动画实现平滑切换,同时避免容器尺寸丢失;逻辑上简化代码,减少重复操作。

2. 具体实现

第一步:调整HTML结构

给所有图表容器添加统一类名chart-container,默认只显示7天的图表:

<div id="totalMilksaleChartfor7days" class="chart-container active"></div>
<div id="totalMilksaleChartcurrentmonth" class="chart-container"></div>
<div id="totalMilksaleChartlastmonth" class="chart-container"></div>
<div id="totalMilksaleChart" class="chart-container"></div>

第二步:添加CSS动画样式

用opacity和height的过渡实现平滑动画,避免display:none导致的尺寸丢失:

.chart-container {
  opacity: 0;
  height: 0;
  overflow: hidden;
  transition: opacity 0.3s ease, height 0.3s ease;
}

.chart-container.active {
  opacity: 1;
  height: auto;
}

第三步:简化JavaScript逻辑

// 获取所有图表容器
const chartContainers = document.querySelectorAll('.chart-container');

function switchChart(duration) {
  // 移除所有容器的激活类
  chartContainers.forEach(container => container.classList.remove('active'));

  // 确定目标容器ID
  let targetId = '';
  switch(duration) {
    case 'currentmonth':
      targetId = 'totalMilksaleChartcurrentmonth';
      break;
    case 'lastmonth':
      targetId = 'totalMilksaleChartlastmonth';
      break;
    case 'currentyear':
      targetId = 'totalMilksaleChart';
      break;
    default:
      targetId = 'totalMilksaleChartfor7days';
  }

  // 给目标容器添加激活类
  document.getElementById(targetId).classList.add('active');

  // 若仍有图表显示问题,可强制重绘(需提前保存图表实例)
  // 示例:if(duration === 'lastmonth') lastMonthChartInstance.render();
}

3. jQuery版本适配(如果继续用jQuery)

function switchChart(duration) {
  $('.chart-container').removeClass('active');
  
  let targetId = '';
  switch(duration) {
    case 'currentmonth':
      targetId = '#totalMilksaleChartcurrentmonth';
      break;
    case 'lastmonth':
      targetId = '#totalMilksaleChartlastmonth';
      break;
    case 'currentyear':
      targetId = '#totalMilksaleChart';
      break;
    default:
      targetId = '#totalMilksaleChartfor7days';
  }
  
  $(targetId).addClass('active');
  
  // 强制重绘示例:if(duration === 'lastmonth') lastMonthChart.render();
}

内容的提问来源于stack exchange,提问作者Rahul W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:57:50