可视化图表与源代码显示的动态调整

简介: 【8月更文挑战第6天】本篇文章通过一个前端图表示例由浅入深,从基本图表显示再到页面源代码的显示到最后实现通过拖动一个可调整大小的分隔符,使用户可以动态地调整图表显示区域和源代码显示区域的大小。全文注释标注,小白也可上手尝试

页面效果描述:本篇文章最后实现了通过拖动一个可调整大小的分隔符,用户可以动态地调整图表显示区域和源代码显示区域的大小。通过监听鼠标事件,当用户拖动分隔符时,会动态计算并更新两个区域的大小

1.原图表显示:

页面效果:
屏幕截图 2024-08-06 225017.png

<!DOCTYPE html> <!-- 定义文档类型 -->
<html lang="en" style="height: 100%"> <!-- 定义HTML文档的根元素,并设置样式使高度为100% -->
<head>
  <meta charset="utf-8"> <!-- 设置字符编码为UTF-8 -->
</head>
<body style="height: 100%; margin: 0"> <!-- 定义body元素,并设置样式使高度为100%,边距为0 -->
  <div id="container" style="height: 100%"></div> <!-- 图表容器,设置样式使高度为100% -->

  <script type="text/javascript" src="echarts.min.js"></script> <!-- 引入ECharts库 -->

  <script type="text/javascript">
    var dom = document.getElementById('container'); // 获取图表容器
    var myChart = echarts.init(dom, null, {
    
     // 初始化ECharts实例
      renderer: 'canvas', // 设置渲染器为canvas
      useDirtyRect: false // 关闭脏矩形渲染优化
    });
    var app = {
    
    }; // 定义一个空对象,通常用于存储应用级别的变量
    var option; // 定义一个变量用于存储图表配置

    // 图表配置项开始
    option = {
    
    
      title: {
    
     // 图表标题
        text: '题目' // 标题文本
      },
      tooltip: {
    
     // 提示框组件
        trigger: 'axis', // 触发类型:坐标轴触发
        axisPointer: {
    
     // 坐标轴指示器配置项
          type: 'cross', // 指示器类型:十字准星
          label: {
    
     // 指示器文本标签
            backgroundColor: '#6a7985' // 文本标签背景颜色
          }
        }
      },
      legend: {
    
     // 图例组件
        data: ['数据1', '数据2', '数据3', '数据4', '数据5'] // 图例数据数组
      },
      toolbox: {
    
     // 工具栏组件
        feature: {
    
     // 工具栏功能配置
          saveAsImage: {
    
    } // 保存为图片功能
        }
      },
      grid: {
    
     // 直角坐标系内绘图网格
        left: '3%', // grid 组件离容器左侧的距离
        right: '4%', // grid 组件离容器右侧的距离
        bottom: '3%', // grid 组件离容器底部的距离
        containLabel: true // grid 区域是否包含坐标轴的刻度标签
      },
      xAxis: [ // 直角坐标系 grid 中的 x 轴
        {
    
    
          type: 'category', // 坐标轴类型:类目轴
          boundaryGap: false, // 类目轴两边不留白
          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] // 类目数据
        }
      ],
      yAxis: [ // 直角坐标系 grid 中的 y 轴
        {
    
    
          type: 'value' // 坐标轴类型:数值轴
        }
      ],
      series: [ // 系列列表
        {
    
     // 第一个系列(数据1)
          name: '数据1', // 系列名称
          type: 'line', // 系列类型:折线图
          stack: 'Total', // 数据堆叠
          areaStyle: {
    
    }, // 区域填充样式
          emphasis: {
    
     // 高亮状态的样式和标签设置
            focus: 'series' // 高亮时聚焦到系列
          },
          data: [120, 132, 101, 134, 90, 230, 210] // 系列中的数据内容数组
        },

        // 第二个系列(数据2)配置,与第一个系列类似
        {
    
    
          name: '数据2',
          type: 'line',
          stack: 'Total',
          areaStyle: {
    
    },
          emphasis: {
    
    
            focus: 'series'
          },
          data: [220, 182, 191, 234, 290, 330, 310]
        },

        // 第三个系列(数据3)配置,与第一个系列类似
        {
    
    
          name: '数据3',
          type: 'line',
          stack: 'Total',
          areaStyle: {
    
    },
          emphasis: {
    
    
            focus: 'series'
          },
          data: [150, 232, 201, 154, 190, 330, 410]
        },

        // 第四个系列(数据4)配置,与第一个系列类似
        {
    
    
          name: '数据4',
          type: 'line',
          stack: 'Total',
          areaStyle: {
    
    },
          emphasis: {
    
    
            focus: 'series'
          },
          data: [320, 332, 301, 334, 390, 330, 320]
        },

        // 第五个系列(数据5)配置,与第一个系列类似,但包含额外的标签显示配置
        {
    
    
          name: '数据5',
          type: 'line',
          stack: 'Total',
          label: {
    
    
            show: true, // 显示标签
            position: 'top' // 标签的位置
          },
          areaStyle: {
    
    },
          emphasis: {
    
    
            focus: 'series'
          },
          data: [820, 932, 901, 934, 1290, 1330, 1320]
        }
      ]
    };

    if (option && typeof option === 'object') {
    
     // 判断option是否存在且为对象
      myChart.setOption(option); // 使用刚指定的配置项和数据显示图表
    }

    window.addEventListener('resize', myChart.resize); // 添加窗口大小改变时的监听事件,用于图表自适应

  </script>
</body>
</html>

2.页面源代码显示:

页面效果:

屏幕截图 2024-08-06 225331.png

<!DOCTYPE html>
<html lang="en" style="height: 100%">
<head>
  <meta charset="utf-8">
  <style>
    body {
    
    
      display: flex; /* 使用Flex布局 */
      height: 100%; /* 设置body高度为100% */
      margin: 0; /* 去除默认边距 */
    }
    #container{
    
    
      flex: 1; /* 分配相等的空间给两个容器 */
      height: 100%; /* 设置容器高度为100% */
    }
    #source-container {
    
    
      background-color: rgba(111, 231, 35, 0.36); /* 背景色以便区分 */
      padding: 20px; /* 设置内边距 */
      overflow: auto; /* 设置溢出时自动滚动 */
      flex: 1; /* 分配相等的空间给两个容器 */
    }
    #downloadButton {
    
    
      padding: 10px 20px; /* 设置内边距 */
      background-color: #007bff; /* 设置背景颜色 */
      color: #1ed5cf; /* 设置文字颜色 */
      border: none; /* 去除边框 */
      border-radius: 5px; /* 设置边框圆角 */
      cursor: pointer; /* 鼠标悬停时显示指针 */
      font-size: 16px; /* 设置字体大小 */
      position: absolute; /* 绝对定位 */
      top: 20px; /* 距离顶部20px */
      right: 20px; /* 距离右侧20px */
      z-index: 1000; /* 设置层级 */
    }
  </style>
</head>
<body style="height: 100%; margin: 0">
  <div id="container" style="height: 100%"></div> <!-- 图表容器 -->
  <div id="source-container"> <!-- 源代码显示容器 -->
    <pre id="source-code"></pre> <!-- 用于显示HTML源代码 -->
    <button id="downloadButton" onclick="downloadSourceCode()">下载</button> <!-- 下载按钮 -->
  </div>

  <script type="text/javascript" src="echarts.min.js"></script> <!-- 引入ECharts库 -->

  <script type="text/javascript">
    var dom = document.getElementById('container');
    var myChart = echarts.init(dom, null, {
    
    
      renderer: 'canvas',
      useDirtyRect: false
    });
    var app = {
    
    };
    var option;

    option = {
    
    
      /* 图表配置项开始 */
  title: {
    
    
    text: '题目'
  },
  tooltip: {
    
    
    trigger: 'axis',
    axisPointer: {
    
    
      type: 'cross',
      label: {
    
    
        backgroundColor: '#6a7985'
      }
    }
  },
  legend: {
    
    
    data: ['数据1', '数据2', '数据3', '数据4', '数据5']
  },
  toolbox: {
    
    
    feature: {
    
    
      saveAsImage: {
    
    }
    }
  },
  grid: {
    
    
    left: '3%',
    right: '4%',
    bottom: '3%',
    containLabel: true
  },
  xAxis: [
    {
    
    
      type: 'category',
      boundaryGap: false,
      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    }
  ],
  yAxis: [
    {
    
    
      type: 'value'
    }
  ],
  series: [
    {
    
    
      name: '数据1',
      type: 'line',
      stack: 'Total',
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [120, 132, 101, 134, 90, 230, 210]
    },
    {
    
    
      name: '数据2',
      type: 'line',
      stack: 'Total',
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [220, 182, 191, 234, 290, 330, 310]
    },
    {
    
    
      name: '数据3',
      type: 'line',
      stack: 'Total',
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [150, 232, 201, 154, 190, 330, 410]
    },
    {
    
    
      name: '数据4',
      type: 'line',
      stack: 'Total',
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [320, 332, 301, 334, 390, 330, 320]
    },
    {
    
    
      name: '数据5',
      type: 'line',
      stack: 'Total',
      label: {
    
    
        show: true,
        position: 'top'
      },
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [820, 932, 901, 934, 1290, 1330, 1320]
    }
  ]
};

    if (option && typeof option === 'object') {
    
    
      myChart.setOption(option);
    }

    window.addEventListener('resize', myChart.resize);

    // 设置源代码显示
    document.getElementById('source-code').textContent = document.documentElement.outerHTML;

    // 下载源代码功能
    function downloadSourceCode() {
    
    
      var element = document.createElement('a');
      element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(document.documentElement.outerHTML));
      element.setAttribute('download', '图表.html');

      element.style.display = 'none';
      document.body.appendChild(element);

      element.click();

      document.body.removeChild(element);
    }
  </script>
</body>
</html>

3.页面动态调整:

页面效果:

屏幕截图 2024-08-06 225507.png
屏幕截图 2024-08-06 225528.png

<!DOCTYPE html>
<html lang="en" style="height: 100%">
<head>
  <meta charset="utf-8">
  <style>
    /* 设置html和body元素高度为100%,并启用flex布局 */
    body, html {
    
    
      height: 100%;
      margin: 0;
      display: flex;
      flex-direction: column;
    }

    /* 主容器,flex布局,占据剩余空间 */
    #main-container {
    
    
      display: flex;
      flex: 1; /* 占据剩余空间 */
      overflow: hidden;
    }

    /* 图表容器,初始时占据全部剩余空间 */
    #chart-container {
    
    
      flex: 1;
      height: 100%;
      overflow: hidden;
      position: relative;
    }

    #source-container {
    
    
      flex: 0; /* 初始时不占据空间,根据需要调整 */
      background-color: rgba(111, 231, 35, 0.36);
      padding: 30px;
      overflow: auto;
      /*height: 90%;*/
    }

    /* 分割线,用于调整#chart-container和#source-container的大小 */
    #splitter {
    
    
      background-color: #ccc;
      cursor: ew-resize;
      width: 5px;
      position: absolute;
      right: 0;
      top: 0;
      bottom: 0;
      z-index: 1;
    }

    /* 下载按钮样式 */
    #downloadButton {
    
    
      padding: 10px 20px;
      background-color: #007bff;
      color: #1ed5cf;
      border: none;
      border-radius: 5px;
      cursor: pointer;
      font-size: 16px;
      position: absolute;
      top: 20px;
      right: 20px;
      z-index: 1000;
    }
  </style>
</head>
<body>
  <div id="main-container">
    <div id="chart-container">
      <div id="container" style="height: 100%;"></div> <!-- ECharts图表容器 -->
      <div id="splitter"></div> <!-- 分割线,用于拖动调整大小 -->
    </div>
    <div id="source-container">
      <pre id="source-code"></pre> <!-- 显示HTML源码 -->
      <button id="downloadButton" onclick="downloadSourceCode()">下载</button> <!-- 下载按钮 -->
    </div>
  </div>

  <!-- 引入ECharts库 -->
  <script src="echarts.min.js"></script>
  <script type="text/javascript">

     // 初始化ECharts图表
    var dom = document.getElementById('container');
    var myChart = echarts.init(dom, null, {
    
    
      renderer: 'canvas',
      useDirtyRect: false
    });
    var app = {
    
    };

    var option;
// 设置图表选项
    option = {
    
    
  title: {
    
    
    text: '题目'
  },
  tooltip: {
    
    
    trigger: 'axis',
    axisPointer: {
    
    
      type: 'cross',
      label: {
    
    
        backgroundColor: '#6a7985'
      }
    }
  },
  legend: {
    
    
    data: ['数据1', '数据2', '数据3', '数据4', '数据5']
  },
  // toolbox: {
    
    
  //   feature: {
    
    
  //     saveAsImage: {}
  //   }
  // },
  grid: {
    
    
    left: '3%',
    right: '4%',
    bottom: '3%',
    containLabel: true
  },
  xAxis: [
    {
    
    
      type: 'category',
      boundaryGap: false,
      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    }
  ],
  yAxis: [
    {
    
    
      type: 'value'
    }
  ],
  series: [
    {
    
    
      name: '数据1',
      type: 'line',
      stack: 'Total',
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [120, 132, 101, 134, 90, 230, 210]
    },
    {
    
    
      name: '数据2',
      type: 'line',
      stack: 'Total',
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [220, 182, 191, 234, 290, 330, 310]
    },
    {
    
    
      name: '数据3',
      type: 'line',
      stack: 'Total',
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [150, 232, 201, 154, 190, 330, 410]
    },
    {
    
    
      name: '数据4',
      type: 'line',
      stack: 'Total',
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [320, 332, 301, 334, 390, 330, 320]
    },
    {
    
    
      name: '数据5',
      type: 'line',
      stack: 'Total',
      label: {
    
    
        show: true,
        position: 'top'
      },
      areaStyle: {
    
    },
      emphasis: {
    
    
        focus: 'series'
      },
      data: [820, 932, 901, 934, 1290, 1330, 1320]
    }
  ]
};

    if (option && typeof option === 'object') {
    
    
      myChart.setOption(option);
    }

    // 监听窗口大小变化以调整图表大小
    window.addEventListener('resize', myChart.resize);

    // 设置源代码显示
    document.getElementById('source-code').textContent = document.documentElement.outerHTML;

    // 分割线拖动调整大小的逻辑
    let startX, startWidth, isResizing = false;

    document.getElementById('splitter').addEventListener('mousedown', function(e) {
    
    
      isResizing = true;
      startX = e.clientX;
      startWidth = document.getElementById('chart-container').offsetWidth;
      document.addEventListener('mousemove', onMouseMove);
      document.addEventListener('mouseup', onMouseUp);
      document.addEventListener('mouseleave', onMouseUp);
    });

    /* 拖动时调整大小的逻辑 */
    function onMouseMove(e) {
    
    
      if (!isResizing) return;
      let newWidth = startWidth + (e.clientX - startX);
      newWidth = Math.max(100, Math.min(document.getElementById('main-container').offsetWidth - 5, newWidth));
      document.getElementById('chart-container').style.flex =
              `${
      
      newWidth / document.getElementById('main-container').offsetWidth * 100}%`;
      document.getElementById('source-container').style.flex = `calc(100% - ${
      
      newWidth}px)`;
    }

    /* 停止拖动时的清理逻辑 */
    function onMouseUp() {
    
    
      isResizing = false;
      document.removeEventListener('mousemove', onMouseMove);
      document.removeEventListener('mouseup', onMouseUp);
      document.removeEventListener('mouseleave', onMouseUp);
    }

    // 下载源代码功能
     function downloadSourceCode() {
    
    
      var element = document.createElement('a');
      element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(document.documentElement.outerHTML));
      element.setAttribute('download', '图表.html');
      element.style.display = 'none';
      document.body.appendChild(element);

      element.click();

      document.body.removeChild(element);
    }
  </script>
</body>
</html>
目录
相关文章
|
2月前
|
数据可视化 前端开发 JavaScript
可视化图表与源代码显示配置项及页面的动态调整功能分析
本篇文章对可视化图表与源代码显示配置项及页面的动态调整进行了一个详细的功能分析,我将文章内容分为四个部分(分析图表源代码;分析源代码显示功能;分析源代码显示及动态调整;分析代码编辑器及运行效果显示)。对此,我会一一为大家解释代码的结构,功能的组成;且文章出现的所有代码,为了方便小白也能够读懂,我都做了详细的注释
45 0
可视化图表与源代码显示配置项及页面的动态调整功能分析
好的设计,文本-------------------字体嵌入,图形化管理技术,当你搜索,或者关注某个具体的地方,可以引入一种使用图形进行外标,比如方框,以更快找到该内容
好的设计,文本-------------------字体嵌入,图形化管理技术,当你搜索,或者关注某个具体的地方,可以引入一种使用图形进行外标,比如方框,以更快找到该内容
|
3月前
【wavesurfer.js实战范例】多区域音频标注(含区域实时切换显示)
【wavesurfer.js实战范例】多区域音频标注(含区域实时切换显示)
130 0
|
5月前
|
编解码 数据可视化
R语言动态可视化:绘制历史全球平均温度的累积动态折线图动画gif视频图
R语言动态可视化:绘制历史全球平均温度的累积动态折线图动画gif视频图
|
5月前
|
移动开发 前端开发 JavaScript
构建一个动态交互式图表
构建一个动态交互式图表
|
5月前
|
数据可视化
Echarts5.3.2可视化案例-时间轴动态柱形图
Echarts5.3.2可视化案例-时间轴动态柱形图
Echarts实战案例代码(9):图表纹理填充的解决方案(柱图为例)
Echarts实战案例代码(9):图表纹理填充的解决方案(柱图为例)
1473 0
|
缓存 前端开发 数据可视化
漏刻有时数据可视化大屏常见问题(5)修改样式表和图表核心库页面无变化
漏刻有时数据可视化大屏常见问题(5)修改样式表和图表核心库页面无变化
100 0
|
前端开发
如何在项目中优化的展示对话框?
对话框在前端开发应用中,是一种非常常用的界面模式。对话框作为一个独立的窗口,常常被用于信息的展示,输入信息,亦或者更多其他功能。但是项目的使用过程中,在某些场景下对话框用起来会有一些麻烦。
110 0
如何在项目中优化的展示对话框?
|
数据可视化 BI Python
快速绘制动态排序图 — Pyecharts 高级组件 Timeline 实现!
之前写过一篇关于Python 制作 动态排序图的教程,里面利用的是 Matplotlib 中的 animation 函数,文章内容可参考动态排序图的详细制作教程,动态排序图的最终部分效果如下:
快速绘制动态排序图 — Pyecharts 高级组件 Timeline 实现!