css的shadow样式可以设置很容易实现内阴影,但是canvas、svg实现内阴影并不是很容易;echarts目前也没有对内阴影的支持;这里通过svg滤镜实现一个内阴影。
配置项如下
const createSvg = (shadowColor, shadowBlur) => `
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
x="0px" y="0px"
viewBox="0 0 32 128"
xml:space="preserve"
>
<style>
.st2 {
fill: transparent;
stroke: ${shadowColor};
stroke-width: ${shadowBlur}px;
filter: url(#chart-inset-shadow);
}
</style>
<defs>
<filter id="chart-inset-shadow" width="200%" height="200%" x="-50%" y="-50%">
<feGaussianBlur in="SourceGraphic" result="gass" stdDeviation="${shadowBlur * 0.75}" />
<feMerge>
<feMergeNode in="gass" />
</feMerge>
</filter>
</defs>
<path class="st2" d="M0 0 L32 0 L32 128 L0 128 Z" />
</svg>
`;
const svgString = createSvg('#156dff', 8);
const svg = new Blob([svgString], {type: "image/svg+xml;charset=utf-8"});
const DOMURL = window.URL || window.webkitURL || window;
const insetShadowUrl = DOMURL.createObjectURL(svg);
const dataSet = [
['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
[120, 200, 150, 80, 70, 110, 130]
];
option = {
backgroundColor: '#101631',
xAxis: {
type: 'category',
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
color: 'rgba(255,255,255, 0.5)',
},
splitLine: {
show: false,
},
data: dataSet[0],
},
yAxis: {
type: 'value',
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
color: 'rgba(255,255,255, 0.5)',
},
splitLine: {
show: true,
lineStyle: {
type: 'dashed',
color: 'rgba(255,255,255,0.1)',
width: 2,
},
},
},
series: [
{
data: dataSet[1],
type: 'pictorialBar',
symbol: 'image://' + insetShadowUrl,
barWidth: 50,
},
{
data: dataSet[1],
type: 'bar',
barWidth: 50,
itemStyle: {
color: 'transparent',
borderWidth: 3,
borderColor: new echarts.graphic.LinearGradient(
0, 0, 0, 1,
[{
offset: 0,
color: '#156dff'
},
{
offset: 1,
color: '#00eaeb'
},
]
),
shadowColor: 'blue',
shadowBlur: 12,
shadowOffsetX: 0,
shadowOffsetY: 0,
},
},
],
};