一、效果图如下:
二、代码配置
(1)父组件
<template>
<div class="page-con">
<div class="main-con">
<item></item>
</div>
</div>
</template>
<script>
import item from '../bigdata/components/item.vue'
export default {
components: {
item
}
}
</script>
<style lang="scss" scoped>
.page-con {
width: 100%;
height: 100%;
.main-con {
width: 40%;
height: 33%;
}
}
</style>
(2)子组件
<template>
<div class="main">
<div class="volume" ref="container"></div>
</div>
</template>
<script>
import echarts from "echarts";
export default {
data() {
return {
myChart: null,
};
},
mounted() {
//获取数据。
if (this.$refs.container) {
this.reloadChart();
//自适应浏览器。
window.addEventListener("resize", () => {
this.reloadChart();
});
}
},
//组件销毁。
beforeDestroy() {
this.disposeChart();
},
methods: {
drawChart() {
this.myChart = this.$echarts.init(this.$refs.container);
const offsetX = this.fontSize(0.25);
const offsetY = this.fontSize(0.1);
const CubeLeft = echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
// 会canvas的应该都能看得懂,shape是从custom传入的
const xAxisPoint = shape.xAxisPoint;
// console.log(shape);
const c0 = [shape.x, shape.y];
const c1 = [shape.x - offsetX, shape.y - offsetY];
const c2 = [xAxisPoint[0] - offsetX, xAxisPoint[1] - offsetY];
const c3 = [xAxisPoint[0], xAxisPoint[1]];
ctx
.moveTo(c0[0], c0[1])
.lineTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.closePath();
},
});
// 绘制右侧面
const CubeRight = echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
const xAxisPoint = shape.xAxisPoint;
const c1 = [shape.x, shape.y];
const c2 = [xAxisPoint[0], xAxisPoint[1]];
const c3 = [xAxisPoint[0] + offsetX, xAxisPoint[1] - offsetY];
const c4 = [shape.x + offsetX, shape.y - offsetY];
ctx
.moveTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.lineTo(c4[0], c4[1])
.closePath();
},
});
// 绘制顶面
const CubeTop = echarts.graphic.extendShape({
shape: {
x: 0,
y: 0,
},
buildPath: function (ctx, shape) {
const c1 = [shape.x, shape.y];
const c2 = [shape.x + offsetX, shape.y - offsetY]; //右点
const c3 = [shape.x, shape.y - offsetX];
const c4 = [shape.x - offsetX, shape.y - offsetY];
ctx
.moveTo(c1[0], c1[1])
.lineTo(c2[0], c2[1])
.lineTo(c3[0], c3[1])
.lineTo(c4[0], c4[1])
.closePath();
},
});
// 注册三个面图形
echarts.graphic.registerShape("CubeLeft", CubeLeft);
echarts.graphic.registerShape("CubeRight", CubeRight);
echarts.graphic.registerShape("CubeTop", CubeTop);
const VALUE = [100, 200, 300, 400, 300, 200, 100];
var option = {
backgroundColor: "#012366",
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
formatter: function (params, ticket, callback) {
const item = params[1];
return item.name + " : " + item.value;
},
},
grid: {
left: "6%",
right: "6%",
top: "20%",
bottom: "6%",
containLabel: true,
},
xAxis: {
type: "category",
data: ["1001", "1002", "1003", "1004", "1005", "1006", "1007"],
axisLine: {
show: true,
lineStyle: {
width: 2,
color: "#2B7BD6",
},
},
axisTick: {
show: false,
},
axisLabel: {
fontSize: this.fontSize(0.35),
},
},
yAxis: {
type: "value",
axisLine: {
show: true,
lineStyle: {
width: 2,
color: "#2B7BD6",
},
},
splitLine: {
show: true,
lineStyle: {
color: "#153D7D",
},
},
axisTick: {
show: false,
},
axisLabel: {
fontSize: this.fontSize(0.35),
},
// boundaryGap: ['20%', '20%'],
},
series: [
{
type: "custom",
renderItem: (params, api) => {
const location = api.coord([api.value(0), api.value(1)]);
return {
type: "group",
children: [
{
type: "CubeLeft",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#33BCEB",
},
{
offset: 1,
color: "#337CEB",
},
]),
},
},
{
type: "CubeRight",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#28A2CE",
},
{
offset: 1,
color: "#1A57B7",
},
]),
},
},
{
type: "CubeTop",
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0]),
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#43C4F1",
},
{
offset: 1,
color: "#28A2CE",
},
]),
},
},
],
};
},
data: VALUE,
},
{
type: "bar",
label: {
normal: {
show: true,
position: "top",
formatter: (e) => {
return e.value + "次";
},
fontSize: this.fontSize(0.35),
color: "#43C4F1",
offset: [0, -this.fontSize(0.26)],
},
},
itemStyle: {
color: "transparent",
},
tooltip: {},
data: VALUE,
},
],
};
this.myChart.setOption(option);
},
//字体自适应。
fontSize(res) {
let clientWidth =
window.innerWidth ||
document.documentElement.clientWidth ||
document.body.clientWidth;
if (!clientWidth) return;
let fontSize = 40 * (clientWidth / 1920);
return res * fontSize;
},
//销毁图表。
disposeChart() {
if (this.myChart) {
this.myChart.dispose();
}
},
//重新加载图表。
reloadChart() {
this.disposeChart();
this.drawChart();
},
},
};
</script>
<style lang="scss" scoped>
.main {
width: 100%;
height: 100%;
.volume {
width: 100%;
height: 100%;
}
}
</style>