fix: 空气质量指数等级背景层错位和遮挡横坐标问题
- levelBands从硬编码SVG像素坐标改为数据值(0-20/21-50/51-100/101-150/151-200) - 渲染时通过valToY将数据值动态映射为SVG像素坐标,适配手机图表尺寸 - SVG渲染层级重排: levelBands放最底层,网格线和横坐标标签在其上,不再被遮挡
This commit is contained in:
@@ -277,11 +277,11 @@ function genTrend(metricName, period) {
|
||||
isAQI: true, yMax: 200, yTicks: [200,150,100,50,0],
|
||||
limitUpper: null, limitLower: null,
|
||||
levelBands: [
|
||||
{yMin:15,yMax:55,label:'清洁',color:'#13C2C2',opacity:.1},
|
||||
{yMin:55,yMax:105,label:'未污染',color:'#52C41A',opacity:.1},
|
||||
{yMin:105,yMax:135,label:'轻污染',color:'#FAAD14',opacity:.1},
|
||||
{yMin:135,yMax:165,label:'中污染',color:'#FA541C',opacity:.1},
|
||||
{yMin:165,yMax:chartBottom,label:'重污染',color:'#FF4D4F',opacity:.1}
|
||||
{yMin:0,yMax:20,label:'清洁',color:'#13C2C2',opacity:.1},
|
||||
{yMin:21,yMax:50,label:'未污染',color:'#52C41A',opacity:.1},
|
||||
{yMin:51,yMax:100,label:'轻污染',color:'#FAAD14',opacity:.1},
|
||||
{yMin:101,yMax:150,label:'中污染',color:'#FA541C',opacity:.1},
|
||||
{yMin:151,yMax:200,label:'重污染',color:'#FF4D4F',opacity:.1}
|
||||
],
|
||||
'24h': {points:[55,42,35,48,65,78,82,75,62,58,52,48]},
|
||||
'7d': {barData:[
|
||||
@@ -480,6 +480,18 @@ function renderTrend(metricName, period) {
|
||||
var yMax = cfg.yMax;
|
||||
var yTicks = cfg.yTicks;
|
||||
|
||||
// AQI 等级背景(先渲染,作为底层)
|
||||
var levelBandsHtml = '';
|
||||
if (cfg.isAQI && cfg.levelBands) {
|
||||
for (var i = 0; i < cfg.levelBands.length; i++) {
|
||||
var b = cfg.levelBands[i];
|
||||
var bandY1 = valToY(b.yMax, yMax); // yMin value in data → SVG y
|
||||
var bandY2 = valToY(b.yMin, yMax); // yMax value in data → SVG y (inverted)
|
||||
levelBandsHtml += '<rect x="' + chartLeft + '" y="' + bandY1 + '" width="' + chartWidth + '" height="' + (bandY2 - bandY1) + '" fill="' + b.color + '" opacity="' + b.opacity + '"/>';
|
||||
levelBandsHtml += '<text x="' + (chartLeft + 6) + '" y="' + (bandY1 + (bandY2 - bandY1) / 2 + 4) + '" fill="' + b.color + '" font-size="9" font-weight="500">' + b.label + '</text>';
|
||||
}
|
||||
}
|
||||
|
||||
// 网格线
|
||||
var gridLines = '';
|
||||
for (var i = 0; i < yTicks.length; i++) {
|
||||
@@ -497,16 +509,6 @@ function renderTrend(metricName, period) {
|
||||
}
|
||||
}
|
||||
|
||||
// AQI 等级背景
|
||||
var levelBandsHtml = '';
|
||||
if (cfg.isAQI && cfg.levelBands) {
|
||||
for (var i = 0; i < cfg.levelBands.length; i++) {
|
||||
var b = cfg.levelBands[i];
|
||||
levelBandsHtml += '<rect x="' + chartLeft + '" y="' + b.yMin + '" width="' + chartWidth + '" height="' + (b.yMax - b.yMin) + '" fill="' + b.color + '" opacity="' + b.opacity + '"/>';
|
||||
levelBandsHtml += '<text x="' + (chartLeft + 6) + '" y="' + (b.yMin + (b.yMax - b.yMin) / 2 + 4) + '" fill="' + b.color + '" font-size="9" font-weight="500">' + b.label + '</text>';
|
||||
}
|
||||
}
|
||||
|
||||
// 超标区域和虚线
|
||||
var limitHtml = '';
|
||||
if (cfg.limitUpper) {
|
||||
@@ -547,9 +549,10 @@ function renderTrend(metricName, period) {
|
||||
'<stop offset="0%" stop-color="#1aad8d" stop-opacity="0.25"/>' +
|
||||
'<stop offset="100%" stop-color="#1aad8d" stop-opacity="0.02"/>' +
|
||||
'</linearGradient></defs>' +
|
||||
levelBandsHtml +
|
||||
gridLines + xLabelsHtml +
|
||||
'<line x1="' + chartLeft + '" y1="' + chartBottom + '" x2="' + chartRight + '" y2="' + chartBottom + '" class="chart-x-axis"/>' +
|
||||
levelBandsHtml + limitHtml +
|
||||
limitHtml +
|
||||
'<path class="chart-area-fill" d="' + pathD + '"/>' +
|
||||
'<polyline class="chart-line" points="' + polylinePoints.trim() + '"/>' +
|
||||
dotsHtml + '</svg>';
|
||||
|
||||
Reference in New Issue
Block a user