现在手机都有天气app,使用echarts展示十五天天气预报的需要你遇到过这样离大谱的需求吗?如果没有或许你能从中找到些许思路。
效果
看效果是不是有点那么个意思,开局一张图,代码全靠ctrl + c。不多说上代码。
vue模板引擎代码
<template>
<div ref="xAxisChartRef" class="chart"></div>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { useECharts } from '@/utils';
import { options } from './options';
let chart: EChartsType;
const xAxisChartRef = ref();
onMounted(() => {
chart = useECharts(xAxisChartRef.value, options);
});
</script>
<style lang="less" scoped>
.chart {
height: 300px;
background: linear-gradient(90deg, #dde4ff, #fff, #fff, #dde4ff);
}
</style>
图表配置
import mock from 'mockjs';
import clear from './assets/clear.png';
import cloudy from './assets/cloudy.png';
import rainy from './assets/rainy.png';
import thundershower from './assets/thundershower.png';
import type { EChartsType } from 'echarts';
const weather = [clear, cloudy, rainy, thundershower];
export const optons = {
tooltip: {
trigger: 'none',
axisPointer: {
type: 'cross',
},
},
grid: {
top: 80,
left: 30,
bottom: 50,
right: 30,
},
xAxis: [
{
type: 'category',
boundaryGap: false,
position: 'top',
offset: 50,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
interval: 0,
formatter: ['{a|{value}}'].join('\n'),
rich: {
a: {
fontSize: 13,
},
},
},
nameTextStyle: {},
data: Array.from({ length: 15 }, (_, i) => {
const day = new Date().getDate();
const date = new Date(new Date().setDate(day + i));
return `${date.getMonth() + 1}/${date.getDate()}`;
}),
},
{
type: 'category',
boundaryGap: false,
position: 'top',
offset: 32,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
interval: 0,
formatter: ['{a|{value}}'].join('\n'),
rich: {
a: {
// color: 'white',
fontSize: 12,
},
},
},
nameTextStyle: {
fontWeight: 'bold',
fontSize: 19,
},
data: Array.from({ length: 15 }, (_, i) => {
const day = new Date().getDate();
const date = new Date(new Date().setDate(day + i));
const week = ['日', '一', '二', '三', '四', '五', '六'];
return `周${week[date.getDay()]}`;
}),
},
{
type: 'category',
boundaryGap: false,
position: 'top',
offset: 32,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
interval: 0,
formatter: ['{a|{value}}'].join('\n'),
rich: {
a: {
// color: 'white',
fontSize: 12,
},
},
},
nameTextStyle: {
fontWeight: 'bold',
fontSize: 19,
},
data: Array.from({ length: 15 }, (_, i) => {
const day = new Date().getDate();
const date = new Date(new Date().setDate(day + i));
const week = ['日', '一', '二', '三', '四', '五', '六'];
return `周${week[date.getDay()]}`;
}),
},
{
type: 'category',
boundaryGap: false,
position: 'top',
offset: -24,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
interval: 0,
formatter: function (value, index) {
return '{' + index + '| }\n{b|' + value + '}';
},
rich: {
...Array.from({ length: 15 }, () => ({
backgroundColor: {
image: weather[mock.Random.integer(0, 3)],
},
height: 16,
})),
b: {
fontSize: 11,
lineHeight: 30,
height: 20,
},
},
},
nameTextStyle: {
fontWeight: 'bold',
fontSize: 19,
},
data: Array.from(
{ length: 15 },
() =>
['小雨', '阴', '多云', '小雨', '晴', '雨夹雪'][
mock.Random.integer(0, 5)
]
),
},
{
type: 'category',
boundaryGap: false,
position: 'bottom',
offset: -5,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
interval: 0,
formatter: function (value, index) {
return '{' + index + '| }\n{b|' + value + '}';
},
rich: {
...Array.from({ length: 15 }, () => ({
backgroundColor: {
image: weather[mock.Random.integer(0, 3)],
},
height: 16,
})),
b: {
fontSize: 11,
lineHeight: 30,
height: 20,
},
},
},
nameTextStyle: {
fontWeight: 'bold',
fontSize: 19,
},
data: Array.from(
{ length: 15 },
() =>
['小雨', '阴', '多云', '小雨', '晴', '雨夹雪'][
mock.Random.integer(0, 5)
]
),
},
],
yAxis: [
{
type: 'value',
boundaryGap: true,
show: false,
scale: true,
},
],
series: [
{
name: '最高气温',
type: 'line',
emphasis: {
focus: 'series',
},
lineStyle: {
color: '#FF8A15',
},
itemStyle: {
color: '#FF8A15',
},
data: Array.from(
{ length: 24 },
() => `${mock.Random.integer(18, 29)}`
),
},
{
name: '最低气温',
type: 'line',
emphasis: {
focus: 'series',
},
lineStyle: {
color: '#0091FF',
},
itemStyle: {
color: '#0091FF',
},
data: Array.from({ length: 24 }, () => mock.Random.float(9, 17)),
},
],
}
实际效果地址
- demo