echarts tooltip提示框显示不全

一、背景:

写在前面:

自行封装。一个可由多个柱形图叠加而成的图表,命名为someHoverLine(可自定义)。

下面罗列了移动端和web端的封装组件代码;

展示了vue2、uniapp、vue3的不同封装和使用案列。

二、问题描述:

三、解决办法:

办法一:

tooltip: {
   confine: true,
}

实际代码:

 

效果展示:

 

办法二:

tooltip: {
   appendToBody: true
},

实际代码:

实际效果:

 

推荐使用第一种方法。。。 

写到这儿就完毕了。

下面是封装的一个图表组件,一个由很多柱形图组成的叠加柱形图。。。

四、封装组件:

移动端:

效果展示:

移动端,vue2、uniapp写法:

封装组件: 


//封装组件
//vue2、uniapp
<template>
  <view class="reMoreBar_home" :style="{ width: width, height: height }">
    <view
      ref="dbBarRef"
      :id="echartsId"
      :style="{ width: width, height: height }"
    ></view>
  </view>
</template>

<script module="echarts" lang="renderjs">
import { getAssetsFile, fontSize, nowResize } from "@/utils/index.js";
import * as echarts from "echarts";

let myEcharts;

export default {
  props: {
    echartsId: {
      type: String,
      default: "dbBarRef",
      required: true,
    },
    width: {
      type: String,
      default: "100%",
    },
    height: {
      type: String,
      default: "100%",
    },
    names: {
      type: Array,
      default: [
        // "蓄电池#1/Ah",
        // "蓄电池#2/Ah",
        // "蓄电池#3/Ah",
        // "蓄电池#4/Ah",
        // "蓄电池#5/Ah",
        // "蓄电池#6/Ah",
        // "蓄电池#7/Ah",
      ],
    },
    linxs: {
      type: Array,
      default: [
        // "2024-01-21 15:002",
        // "2024-01-21 15:01",
        // "2024-01-21 15:02",
        // "2024-01-21 15:03",
        // "2024-01-21 15:04",
        // "2024-01-21 15:05",
        // "2024-01-21 15:06",
        // "2024-01-21 15:07",
        // "2024-01-21 15:08",
        // "2024-01-21 15:09",
        // "2024-01-21 15:10",
        // "2024-01-21 15:11",
        // "2024-01-21 15:12",
        // "2024-01-21 15:13",
        // "2024-01-21 15:14",
        // "2024-01-21 15:15",
      ],
    },
    values: {
      type: Array,
      default: [
        // [
        //   580, 236, 217, 534, 580, 236, 217, 580, 151, 231, 0, 192, 453, 524, 165,
        //   0,
        // ],
        // [
        //   625, 345, 65, 192, 120, 180, 192, 80, 150, 153, 152, 128, 125, 625, 345,
        //   65,
        // ],
        // [
        //   4510, 352, 303, 534, 328, 159, 151, 192, 330, 151, 231, 192, 328, 159,
        //   151, 536,
        // ],
        // [
        //   120, 125, 0, 192, 120, 180, 0, 220, 125, 80, 192, 120, 125, 145, 65,
        //   125,
        // ],
        // [
        //   545, 80, 192, 330, 580, 236, 217, 328, 159, 151, 580, 236, 217, 524,
        //   165, 236,
        // ],
        // [
        //   360, 545, 360, 545, 80, 192, 80, 28, 625, 453, 80, 28, 625, 345, 65,
        //   105,
        // ],
        // [220, 125, 28, 625, 345, 65, 325, 80, 150, 153, 0, 128, 0, 220, 125, 80],
      ],
    },
    colors: {
      type: Array,
      default: [
        "rgba(266, 102, 304)",
        "rgba(0, 121, 202)",
        "rgba(247,220,111)",
        "rgba(0, 202, 104)",
        "rgba(909, 66, 22)",
        "rgba(100, 50, 102)",
        "rgba(147,120,211)",
        "rgba(245,107,184)",
        "rgba(35,172,201)",
        "rgba(66, 199, 102)",
        "rgba(241,148,138)",
        "rgba(130,182,220)",
      ],
    },
    xUnit: {
      type: String,
      default: "单位",
    },
    yUnit: {
      type: String,
      default: "单位",
    },
    // legendStyle: {
    //   type: Object,
    //   default: {
    //     fontSize: 12,
    //     color: "#000",
    //     top: "5%",
    //     left: "10%",
    //   },
    // },
    // 图表x,y轴定制
    xType: {
      type: String,
      default: "category",
    },
    unitX: {
      type: String,
      default: "",
    },
  },
  data() {
    return {
      myCharts: null,
    };
  },
  methods: {
    init() {
      let charts = {
        unit: this.yUnit || "数值",
        names: this.names,
        lineX: this.linxs,
        value: this.values,
        colors: this.colors,
        xType: this.xType,
        xUnit: this.xUnit,
        yUnit: this.yUnit,
      };
      let lineY = [];
      for (var i = 0; i < charts.names.length; i++) {
        let seriesItem = {
          name: charts.names[i],
          type: "bar",
          barMaxWidth: 36,
          stack: "Ad",
          emphasis: {
            focus: "series",
          },
          itemStyle: {
            // color: "#5CB1FF",
            color: charts.colors[i],
          },
          data: charts.value[i],
          label: {
            show: true,
            color: "#fff",
          },
        };
        lineY.push(seriesItem);
      }
      let option = {
        tooltip: {
          trigger: "axis",
          // confine: true,//是否将 tooltip 框限制在图表的区域内。
          appendToBody: true,//是否提示框的 DOM 节点添加为 HTML 的 的子节点;默认为本图表的 DOM container 的一个子孙节点
          axisPointer: {
            type: "shadow",
          },
          formatter: function (params) {
            let myTimer = params[0].axisValue.split(" ")[0];
            let totalValue;
            totalValue = params
              .map((item) => item.value)
              .reduce((a, b) => a + b);
            let str =
              "时间:" +
              myTimer +
              " 总消耗:" +
              totalValue.toFixed(2) +
              charts.yUnit;
            for (let i in params) {
              str =str+"<br/>" +
                params[i].marker +
                params[i].seriesName +
                " " +
                params[i].value +
                charts.yUnit;
            }
            return str;
          },
        },
        // legend: {},
        legend: {
          data: charts.names,
          type: "scroll",
          top: "2%",
          left: "5%",
          // left: "right",
          // icon: "circle",
        },
        dataZoom: [
          {
            type: "inside", //1平移 缩放。
            // zoomLock: true, //如果设置为 true 则锁定选择区域的大小,也就是说,只能平移,不能缩放。
            preventDefaultMouseMove: false,
          },
        ],
        grid: {
          left: "1%",
          right: "1%",
          bottom: "2%",
          containLabel: true,
        },
        xAxis: {
          name: charts.xType === "value" ? charts.xUnit : "",
          nameTextStyle: {
            color: "#000",
            fontSize: nowResize(24),
          },
          type: charts.xType,
          data: charts.lineX,
          // maxInterval: 3600 * 1000 * 24,
          boundaryGap: true, // 留白
          splitLine: {
            show: false,
            lineStyle: {
              type: "dotted",
              color: "rgba(255,255,255,0.2)",
            },
          },
          axisLabel: {
            color: "#000",
            fontSize: nowResize(32),
            symbol: [
              "none",
              "path://M5,20 L5,5 L8,8 L5,2 L2,8 L5,5 L5.3,6 L5.3,20",
            ],
            formatter: function (params) {
              // return params.split(" ")[0];
              // return params.replace(' ', '\n')
              let arr = params.split(" ");
              let space = "\n";
              // const myFormatter =
              //   arr[0]?.slice(5) + space + arr[1]?.substring(0, 5);
              const myFormatter = arr[0]?.slice(5);
              return myFormatter;
            },
          },
          axisLine: {
            symbol: ["none", "arrow"],
            symbolOffset: 6,
            symbolSize: [5, 8],
            lineStyle: {
              color: "rgba(104,143,179)",
              width: nowResize(1),
              type: "solid",
            },
          },
          axisTick: {
            show: false,
          },
        },
        yAxis: {
          name: charts.xType !== "value" ? `单位/${charts.yUnit}` : "单位/",
          nameTextStyle: {
            color: "#000",
            fontSize: nowResize(44),
          },
          type: charts.xType === "value" ? "category" : "value",
          minInterval: charts.xType !== "value" && 10,
          data: charts.lineX,
          splitLine: {
            lineStyle: {
              type: "dotted",
              color: "rgba(255,255,255,0.2)",
            },
          },
          axisLabel: {
            interval: 0,
            color: "#000",
            fontSize: nowResize(32),
            formatter: (value) => {
              return Math.ceil(value); // 向上取整,去除小数
            },
          },
          axisLine: {
            symbol: ["none", "arrow"],
            symbolOffset: 6,
            symbolSize: [5, 8],
            lineStyle: {
              color: "rgba(104,143,179)",
              width: nowResize(1),
              type: "solid",
            },
          },
          axisTick: {
            show: false,
          },
        },
        series: lineY, //接口数据
        // series: [
        //   {
        //     name: "Email",
        //     type: "bar",
        //     stack: "Ad",
        //     emphasis: {
        //       focus: "series",
        //     },
        //     itemStyle: {
        //       color: "#4279CA",
        //     },
        //     data: [
        //       120, 132, 101, 134, 90, 230, 210, 120, 132, 101, 134, 90, 230, 210,
        //     ],
        //     label: {
        //       show: true,
        //       textStyle: {
        //         color: "#fff",
        //       },
        //     },
        //   },
        //   {
        //     name: "Union Ads",
        //     type: "bar",
        //     stack: "Ad",
        //     emphasis: {
        //       focus: "series",
        //     },
        //     itemStyle: {
        //       color: "#2FE1E1",
        //     },
        //     data: [
        //       220, 182, 191, 234, 290, 330, 310, 120, 132, 101, 134, 90, 230, 210,
        //     ],
        //     label: {
        //       show: true,
        //       textStyle: {
        //         color: "#fff",
        //       },
        //     },
        //   },
        //   {
        //     name: "Video Ads",
        //     type: "bar",
        //     stack: "Ad",
        //     emphasis: {
        //       focus: "series",
        //     },
        //     itemStyle: {
        //       color: "#5CB1FF",
        //     },
        //     data: [
        //       150, 232, 201, 154, 190, 330, 410, 120, 132, 101, 134, 90, 230, 210,
        //     ],
        //     label: {
        //       show: true,
        //       textStyle: {
        //         color: "#fff",
        //       },
        //     },
        //   },
        // ],
      };
      option && this.myCharts && this.myCharts.setOption(option, true);
    },
    end() {
      this.myCharts && this.myCharts.dispose();
      window.removeEventListener("resize", function () {
        this.myCharts && this.myCharts.resize();
      });
      this.myCharts = null;
    },
  },
  mounted() {
    this.$nextTick(() => {
      this.myCharts = echarts.init(
        document.getElementById(this.echartsId),
        null,
        {
          renderer: "svg",
        }
      );
      window.addEventListener("resize", function () {
        this.myCharts && this.myCharts.resize();
      });
      this.init();
    });
  },
  beforeMount() {
    this.end();
  },
  watch: {
    option: {
      handler: function (newV, olgV) {
        this.myCharts.clear();
        this.init();
      },
      deep: true,
    },
    names: {
      handler: function (newV, olgV) {
        this.myCharts.clear();
        this.init();
      },
      deep: true,
    },
    linxs: {
      handler: function (newV, olgV) {
        this.myCharts.clear();
        this.init();
      },
      deep: true,
    },
    values: {
      handler: function (newV, olgV) {
        this.myCharts.clear();
        this.init();
      },
      deep: true,
    },
  },
};
</script>
<style lang="scss" scoped>
.reMoreBar_home {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;

  #dbBarRef {
    width: calc(100vw - 13vw);
    height: 100%;
  }
}
</style>

组件使用案列:

//1.注册组件     
//2.使用组件
//3.组件传参            
                 <someHoverLine
                    echartsId="mainB"
                    :names="echartData.names"
                    :linxs="echartData.linxs"
                    :values="echartData.values"
                    :colors="echartData.colors"
                    :yUnit="echartData.yUnit"
                  />
this.echartData = {
            yUnit: "t",
            linxs: resTimeArr,
            names: ["主机油耗", "发电机组油耗", "锅炉油耗"],
            values: resNumArr,
            colors: [
              "rgba(93, 177, 251, 1)",
              "rgba(47, 226, 227, 1)",
              "rgba(64, 122, 204, 1)",
            ],
          };
let resTimeArr= [
    "2024-03-13",
    "2024-03-14",
    "2024-03-15",
    "2024-03-16",
    "2024-03-17",
    "2024-03-18",
    "2024-03-19",
    "2024-03-20",
    "2024-03-21",
    "2024-03-22",
    "2024-03-23",
    "2024-03-24",
    "2024-03-25",
    "2024-03-26",
    "2024-03-27",
    "2024-03-28",
    "2024-03-29"
]
let resNumArr = [
    [
        17.22,
        14.08,
        27.26,
        35.03,
        33.98,
        40.75,
        17.87,
        18.37,
        61.39,
        30.26,
        26.01,
        35.21,
        30.03,
        41.89,
        16.27,
        28.02,
        0
    ],
    [
        0,
        0,
        0.01,
        0,
        0,
        0.01,
        0,
        0,
        0.01,
        0,
        0,
        0.01,
        0,
        0,
        0,
        3.05,
        5.51
    ],
    [
        0,
        0,
        0,
        0,
        0.01,
        0,
        0,
        0.01,
        0.01,
        0.01,
        0,
        0.01,
        0.01,
        0.01,
        0,
        1.9,
        3.97
    ]
]

备注:

解决了toolTips提示框显示不全的问题。

解决办法:

confine: true,//是否将 tooltip 框限制在图表的区域内。 

web端: 

效果展示:

 封装组件:

//封装组件
//vue3 setup
<script setup>
import { Warning } from "@element-plus/icons-vue";
import { onMounted, onUnmounted, watch } from "vue";
import { getAssetsFile, fontSize } from "@/utils";
const _echarts = inject("$echarts");
const dbBarRef = ref(null);
const props = defineProps({
  width: {
    type: String,
    default: "100%",
  },
  height: {
    type: String,
    default: "100%",
  },
  names: {
    type: Array,
    default: [
      // "蓄电池#1/Ah",
      // "蓄电池#2/Ah",
      // "蓄电池#3/Ah",
      // "蓄电池#4/Ah",
      // "蓄电池#5/Ah",
      // "蓄电池#6/Ah",
      // "蓄电池#7/Ah",
    ],
  },
  linxs: {
    type: Array,
    default: [
      // "2024-01-21 15:002",
      // "2024-01-21 15:01",
      // "2024-01-21 15:02",
      // "2024-01-21 15:03",
      // "2024-01-21 15:04",
      // "2024-01-21 15:05",
      // "2024-01-21 15:06",
      // "2024-01-21 15:07",
      // "2024-01-21 15:08",
      // "2024-01-21 15:09",
      // "2024-01-21 15:10",
      // "2024-01-21 15:11",
      // "2024-01-21 15:12",
      // "2024-01-21 15:13",
      // "2024-01-21 15:14",
      // "2024-01-21 15:15",
    ],
  },
  values: {
    type: Array,
    default: [
      // [
      //   580, 236, 217, 534, 580, 236, 217, 580, 151, 231, 0, 192, 453, 524, 165,
      //   0,
      // ],
      // [
      //   625, 345, 65, 192, 120, 180, 192, 80, 150, 153, 152, 128, 125, 625, 345,
      //   65,
      // ],
      // [
      //   4510, 352, 303, 534, 328, 159, 151, 192, 330, 151, 231, 192, 328, 159,
      //   151, 536,
      // ],
      // [
      //   120, 125, 0, 192, 120, 180, 0, 220, 125, 80, 192, 120, 125, 145, 65,
      //   125,
      // ],
      // [
      //   545, 80, 192, 330, 580, 236, 217, 328, 159, 151, 580, 236, 217, 524,
      //   165, 236,
      // ],
      // [
      //   360, 545, 360, 545, 80, 192, 80, 28, 625, 453, 80, 28, 625, 345, 65,
      //   105,
      // ],
      // [220, 125, 28, 625, 345, 65, 325, 80, 150, 153, 0, 128, 0, 220, 125, 80],
    ],
  },
  colors: {
    type: Array,
    default: [
      "rgba(266, 102, 304)",
      "rgba(0, 121, 202)",
      "rgba(247,220,111)",
      "rgba(0, 202, 104)",
      "rgba(909, 66, 22)",
      "rgba(100, 50, 102)",
      "rgba(147,120,211)",
      "rgba(245,107,184)",
      "rgba(35,172,201)",
      "rgba(66, 199, 102)",
      "rgba(241,148,138)",
      "rgba(130,182,220)",
    ],
  },
  xUnit: {
    type: String,
    default: "单位",
  },
  yUnit: {
    type: String,
    default: "单位",
  },
  legendStyle: {
    type: Object,
    default: {
      fontSize: 12,
      color: "#000",
      top: "5%",
      left: "10%",
    },
  },
  // 图表x,y轴定制
  xType: {
    type: String,
    default: "category",
  },
  unitX: {
    type: String,
    default: "",
  },
});
let myEcharts;
onMounted(() => {
  nextTick(() => {
    myEcharts = _echarts.init(dbBarRef.value, null, {
      renderer: "svg",
    });
    window.addEventListener("resize", function () {
      myEcharts && myEcharts.resize();
    });
    _init();
  });
});
onUnmounted(() => {
  _end();
});
watch(
  () => props.names,
  (val) => {
    if (val) {
      nextTick(() => {
        _init();
      });
    }
  }
);
watch(
  () => props.linxs,
  (val) => {
    if (val) {
      nextTick(() => {
        _init();
      });
    }
  }
);
watch(
  () => props.values,
  (val) => {
    if (val) {
      nextTick(() => {
        _init();
      });
    }
  }
);
const _init = () => {
  let charts = {
    unit: props.yUnit || "数值",
    names: props.names,
    lineX: props.linxs,
    value: props.values,
    colors: props.colors,
    xType: props.xType,
    xUnit: props.xUnit,
    yUnit: props.yUnit,
  };
  let lineY = [];
  for (var i = 0; i < charts.names.length; i++) {
    let seriesItem = {
      name: charts.names[i],
      type: "bar",
      barMaxWidth: 36,
      stack: "Ad",
      emphasis: {
        focus: "series",
      },
      itemStyle: {
        // color: "#5CB1FF",
        color: charts.colors[i],
      },
      data: charts.value[i],
      label: {
        show: false,
        color: "#fff",
      },
    };
    lineY.push(seriesItem);
  }
  let option = {
    tooltip: {
      trigger: "axis",
      axisPointer: {
        type: "shadow",
      },
      formatter: function (params) {
        let myTimer = params[0].axisValue.split(" ")[0];
        let totalValue;
        totalValue = params.map((item) => item.value).reduce((a, b) => a + b);
        let str =
          "时间:" +
          myTimer +
          " 总消耗:" +
          totalValue.toFixed(2) +
          charts.yUnit;
        for (let i in params) {
          str =str+"<br/>" +
            params[i].marker +
            params[i].seriesName +
            " " +
            params[i].value +
            charts.yUnit;
        }
        // const marker1 = params[0].marker;
        // const seriesName1 = params[0].seriesName;
        // const myValue1 = params[0].value;
        // const marker2 = params[1].marker;
        // const seriesName2 = params[1].seriesName;
        // const myValue2 = params[1].value;
        // const marker3 = params[2].marker;
        // const seriesName3 = params[2].seriesName;
        // const myValue3 = params[2].value;
        // const str1 = marker1 + seriesName1 + " " + myValue1 + charts.yUnit;
        // const str2 = marker2 + seriesName2 + " " + myValue2 + charts.yUnit;
        // const str3 = marker3 + seriesName3 + " " + myValue3 + charts.yUnit;
        // const str =
        //   "时间:" +
        //   myTimer +
        //   " 总消耗:" +
        //   totalValue.toFixed(2) +
        //   charts.yUnit +
        //   "<br/>" +
        //   str +
        //   "<br/>" +
        //   str2 +
        //   "<br/>" +
        //   str3;
        return str;
      },
    },
    // legend: {},
    legend: {
      data: charts.names,
      type: "scroll",
      top: "5%",
      left: "75%",
      // left: "right",
      // icon: "circle",
    },
    grid: {
      left: "1%",
      right: "1%",
      bottom: "2%",
      containLabel: true,
    },
    xAxis: {
      name: charts.xType === "value" ? charts.xUnit : "",
      nameTextStyle: {
        color: "#000",
        fontSize: fontSize(12),
      },
      type: charts.xType,
      data: charts.lineX,
      // maxInterval: 3600 * 1000 * 24,
      boundaryGap: true, // 留白
      splitLine: {
        show: false,
        lineStyle: {
          type: "dotted",
          color: "rgba(255,255,255,0.2)",
        },
      },
      axisLabel: {
        color: "#000",
        fontSize: fontSize(16),
        symbol: [
          "none",
          "path://M5,20 L5,5 L8,8 L5,2 L2,8 L5,5 L5.3,6 L5.3,20",
        ],
        formatter: function (params) {
          // return params.split(" ")[0];
          // return params.replace(' ', '\n')
          let arr = params.split(" ");
          let space = "\n";
          // const myFormatter =
          //   arr[0]?.slice(5) + space + arr[1]?.substring(0, 5);
          const myFormatter = arr[0]?.slice(5);
          return myFormatter;
        },
      },
      axisLine: {
        symbol: ["none", "arrow"],
        symbolOffset: 6,
        symbolSize: [5, 8],
        lineStyle: {
          color: "rgba(104,143,179)",
          width: fontSize(1),
          type: "solid",
        },
      },
      axisTick: {
        show: false,
      },
    },
    yAxis: {
      name: charts.xType !== "value" ? `单位/${charts.yUnit}` : "单位/",
      nameTextStyle: {
        color: "#000",
        fontSize: fontSize(16),
      },
      type: charts.xType === "value" ? "category" : "value",
      minInterval: charts.xType !== "value" && 10,
      data: charts.lineX,
      splitLine: {
        lineStyle: {
          type: "dotted",
          color: "rgba(255,255,255,0.2)",
        },
      },
      axisLabel: {
        interval: 0,
        color: "#000",
        fontSize: fontSize(16),
        formatter: (value) => {
          return Math.ceil(value); // 向上取整,去除小数
        },
      },
      axisLine: {
        symbol: ["none", "arrow"],
        symbolOffset: 6,
        symbolSize: [5, 8],
        lineStyle: {
          color: "rgba(104,143,179)",
          width: fontSize(1),
          type: "solid",
        },
      },
      axisTick: {
        show: false,
      },
    },
    series: lineY, //接口数据
    // series: [
    //   {
    //     name: "Email",
    //     type: "bar",
    //     stack: "Ad",
    //     emphasis: {
    //       focus: "series",
    //     },
    //     itemStyle: {
    //       color: "#4279CA",
    //     },
    //     data: [
    //       120, 132, 101, 134, 90, 230, 210, 120, 132, 101, 134, 90, 230, 210,
    //     ],
    //     label: {
    //       show: true,
    //       textStyle: {
    //         color: "#fff",
    //       },
    //     },
    //   },
    //   {
    //     name: "Union Ads",
    //     type: "bar",
    //     stack: "Ad",
    //     emphasis: {
    //       focus: "series",
    //     },
    //     itemStyle: {
    //       color: "#2FE1E1",
    //     },
    //     data: [
    //       220, 182, 191, 234, 290, 330, 310, 120, 132, 101, 134, 90, 230, 210,
    //     ],
    //     label: {
    //       show: true,
    //       textStyle: {
    //         color: "#fff",
    //       },
    //     },
    //   },
    //   {
    //     name: "Video Ads",
    //     type: "bar",
    //     stack: "Ad",
    //     emphasis: {
    //       focus: "series",
    //     },
    //     itemStyle: {
    //       color: "#5CB1FF",
    //     },
    //     data: [
    //       150, 232, 201, 154, 190, 330, 410, 120, 132, 101, 134, 90, 230, 210,
    //     ],
    //     label: {
    //       show: true,
    //       textStyle: {
    //         color: "#fff",
    //       },
    //     },
    //   },
    // ],
  };
  option && myEcharts && myEcharts.setOption(option, true);
};
const _end = () => {
  myEcharts && myEcharts.dispose();
  window.removeEventListener("resize", function () {
    myEcharts && myEcharts.resize();
  });
  myEcharts = null;
};
</script>

<template>
  <div
    class="reMoreBar_home"
    :style="{ width: props.width, height: props.height }"
  >
    <div
      ref="dbBarRef"
      id="dbBarRef"
      :style="{ width: props.width, height: props.height }"
    ></div>
  </div>
</template>

<style lang="less" scoped>
.reMoreBar_home {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;

  #dbBarRef {
    width: calc(100vw - 13vw);
    height: 100%;
  }
}
</style>

 组件使用案列:

//vue3组件使用
<someHoverLine
            :names="data.echartData.names"
            :linxs="data.echartData.linxs"
            :values="data.echartData.values"
            :colors="data.echartData.colors"
            :yUnit="data.echartData.yUnit"
          />
//组件的参数
data.echartData = {
        yUnit: "kg",
        linxs: resTimeArr,
        names: ["主机油耗", "发电机组油耗", "锅炉油耗"],
        values: resNumArr,
        colors: [
          "rgba(93, 177, 251, 1)",
          "rgba(47, 226, 227, 1)",
          "rgba(64, 122, 204, 1)",
        ],
      };
//备注:resTimeArr、resNumArr同上

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数组常用方法

for循环 使用计数器变量来迭代数组元素 var arr [1,2,3,4,5]for(var i0;i<arr.length;i){console.log(array[i]) }上面的i就是计数器变量&#xff0c;初始值为0&#xff0c;每次循环后加1&#xff0c;直到i等于数组长度为止。在循环体内&#xff0c;可以通过数组索引arr[…

C 强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。例如&#xff0c;如果您想存储一个 long 类型的值到一个简单的整型中&#xff0c;您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型&#xff0c;如下所示&am…

攻防演练 | redis艰难写shell进入内网

背景 某地市级攻防演练 要求 拿到指定单位的靶标系统&#xff08;必须是web后台管理权限数据库服务器&#xff09; 正式开始 redis未授权 首先通过信息收集获取到了一些IP&#xff0c;且发现一个IP中存在redis未授权。 此时兴冲冲的去尝试写入定时任务反弹shell&#xff…

淘宝评论数据API接口:洞察消费者声音的关键工具

淘宝评论数据API接口&#xff1a;洞察消费者声音的关键工具 请求示例&#xff0c;API接口接入Anzexi58 随着电子商务的蓬勃发展&#xff0c;消费者对于商品的评价和反馈成为了购物决策中不可或缺的一部分。淘宝作为中国最大的电商平台之一&#xff0c;汇聚了海量的商品和评论数…

【SpringBoot】-- mapstruct进行类型转换时Converter实现类不能自动生成代码问题解决

问题描述 我的问题如下&#xff1a; 应该在红色区域生成对应的转换细节&#xff0c;但是这里只返回了一个空对象 问题解决 加入lombok-mapstruct-binding依赖,也要注意依赖引用顺序问题 <dependency><groupId>org.projectlombok</groupId><artifactId&…

photomaker:customizing realistic human photos via stacked id embedding

PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次&#xff0c;已列入Github官方Trending榜第一位&#xff0c;PaperswithCode热度榜第一位&#xff0c;HuggingFace Spaces趋势榜第一位。项…

小阳同学刷题日记-54. 螺旋矩阵

题目&#xff1a;给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 思路&#xff1a; 初始化四个边界指针&#xff1a;top, bottom, left, right 分别表示当前螺旋遍历的上边界、下边界、左边界和右边界。不断遍历矩阵直…

Windows虚拟主机上多个域名访问同一个网站

近日老板提出了想要多个域名访问同一个网站的想法。这边了解后&#xff0c;由于我们公司使用的是Hostease的Windows虚拟主机产品&#xff0c;因此咨询了Hostease的技术支持&#xff0c;寻求帮助了解到可以实现Windows主机上多个域名访问同一个网站&#xff0c;是需要进入Window…

win10如何移除此电脑下的“网络”

1.按住winr,然后输入regedit打开注册表&#xff0c;在导航栏输入&#xff0c;定位到ShellFolder文件夹 HKEY_CLASSES_ROOT\CLSID\{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}\ShellFolder2.更改权限&#xff0c;在ShellFolder文件夹上右键选择权限->高级->更改->输入Adm…

antd vue table控件的使用(三)

今天就讲讲Ant Design Vue下的控件----table表格&#xff08;分页、编辑和删除功能&#xff09; 结合项目中的需求&#xff0c;看看如何配置,让table即可以展示列表&#xff0c;又可以直接编辑数据。需求&#xff1a; &#xff08;1&#xff09;展示即将检查的数据列表&#…

通过WebShell登录SQL Server主机并使用SSRS报表服务

背景信息 RDS SQL Server提供了WebShell功能&#xff0c;允许用户通过Web界面登录到RDS SQL Server实例的操作系统中&#xff0c;并在该操作系统中执行命令、上传下载文件等操作。WebShell功能方便用户对RDS SQL Server实例的管理和维护&#xff0c;特别是在无法使用SSH客户端的…

FlashAttention V1 学习笔记

Flash Attention 是一种新型的注意力机制&#xff0c;旨在解决传统 Transformer 模型在处理长序列数据时面临的计算和内存效率问题。它通过一系列创新的技术优化&#xff0c;显著提高了注意力机制的计算速度和内存使用效率&#xff0c;同时保持了精确的结果&#xff0c;不依赖于…

超好用的iframe的postMessage穿参

前言 ❝ 跨域&#xff0c;简单来说是指不同域之间相互请求资源&#xff0c;例如AJAX请求&#xff0c;浏览器根据同源策略对响应结果进行拦截&#xff0c;这是浏览器对JavaScript实施的安全限制。所谓同源是指相同的域名、协议和端口&#xff0c;只要其中一项不同就为跨域 ❞ 背…

C++11异常:到底是怎么个异常

目录​​​​​​​ 一、C/C如何处理错误 1.1C语言传统的处理错误的方式 1.2C异常概念 二、异常的使用 2.1异常的抛出和捕获 2.2try/catch的使用 2.3异常安全 2.4异常的重新抛出 2.5异常的规范 三、服务器开发中异常体系的模拟 一、C/C如何处理错误 1.1C语言传统的处…

SEO关键词布局时如何查找用户爱搜索的关键词?

在关键词布局中&#xff0c;确定完核心词后&#xff0c;就要考虑在网站关键词扩展时&#xff0c;找到用户爱搜索的词&#xff0c;只有在网站页面关键词布局时&#xff0c;布局用户爱搜索的词&#xff0c;才能够使用户在搜索时网站的页面能够有机会出现在用户的搜索结果页&#…

蓝桥杯算法题:栈(Stack)

这道题考的是递推动态规划&#xff0c;可能不是很难&#xff0c;不过这是自己第一次靠自己想出状态转移方程&#xff0c;所以纪念一下&#xff1a; 要做这些题目&#xff0c;首先要把题目中会出现什么状态给找出来&#xff0c;然后想想他们的状态可以通过什么操作转移&#xf…

个人成长秘籍:参加六西格玛绿带培训的好处

在当今竞争激烈的商业环境中&#xff0c;追求卓越与持续改进已成为企业和个人成功的关键。六西格玛绿带培训&#xff0c;作为一种全面提升管理技能和工作效率的培训课程&#xff0c;不仅帮助企业优化流程、提高质量和效率&#xff0c;也为个人职业发展开辟了一条光明大道。张驰…

cog predict docker unknown flag: --file

如图&#xff1a; 使用cog predict -i image“link-to-image” 出现docker unknown flag: --file的问题。 解决方法&#xff08;对我可行&#xff09;&#xff1a;切换cog版本。 这个是我一开始的cog安装命令&#xff08;大概是下的最新版&#xff1f;&#xff09;&#xff1…

cannal的使用

搭建MySQL 安装canal 1.新建文件夹logs, 新建文件canal.properties instance.properties docker.compose.yml instance.properties ################################################# ## mysql serverId , v1.0.26 will autoGen # canal.instance.mysql.slaveId0# enable g…

【话题:工作生活】2022年工作总结--疫情下的上海,疫情中的我。

现在是阳历2023年11月27日星期一&#xff0c;我再次开始撰写自己的年终工作总结。希望再过1、2个月&#xff0c;这份年终总结能够出炉&#xff0c;与大家相遇。 给自己定个小目标&#xff0c;年终的工作生活总结坚持写10年。我2017年毕业&#xff0c;之后就开始写每年的年终总结…