javascript - 文本未显示在 SVG 矩形上
问题描述
我查看了我能找到的所有解决方案,但没有任何内容显示文本。检查元素时,文本在正确的位置(矩形中间)和正确的文本(.name of datum),但不显示。我怎样才能让它显示出来?
小提琴:https ://jsfiddle.net/wojnry60/3/
const ID = "test";
const SCALE = 20;
const PAD = 50;
const MAX_X = 10;
const MAX_Y = 10;
const WIDTH = (MAX_X*SCALE) + (PAD*4);
const HEIGHT = (MAX_Y*SCALE) + (PAD*4);
var data = [
{name:'ABC', x: 0, y: 0, w: 4, l: 8},
{name:'DEFG', x: 4, y: 0, w: 6, l: 8},
{name:'HIJKLMNOP', x: 0, y: 8, w: 10, l: 2}
];
var x_scale = d3.scaleLinear()
.domain([0, MAX_X])
.range([0, MAX_X * SCALE]);
var y_scale = d3.scaleLinear()
.domain([0, MAX_Y])
.range([0, MAX_Y * SCALE]);
var top_axis = d3.axisTop()
.scale(x_scale)
.ticks(MAX_X);
var left_axis = d3.axisLeft()
.scale(y_scale)
.ticks(MAX_Y);
var canvas = d3.select('#' + ID)
.append('svg')
.attr('width', WIDTH)
.attr('height', HEIGHT)
.append('g') // <- in short, this stops transforming above elements.
.attr('transform', 'translate(' + PAD.toString() + ',' + PAD.toString() + ')')
.append('g')
.attr('transform', 'translate(' + PAD.toString() + ',0)')
.call(top_axis)
.append('g')
.attr('transform', 'translate(' + (-1*PAD.toString()) + ',' + PAD.toString() + ')')
.call(left_axis)
.append('g')
.attr('transform', 'translate(' + PAD.toString() + ',0)');
var rects = canvas.selectAll('rect') // returns an empty selection
.data(data)
.enter() // fills a placeholder for each unassigned data element
.append('g');
rects.append('rect') // fills a rect for each placeholder
.attr("style", "outline: medium solid #07689f;")
.attr('width', (subdata, index) => subdata.w * SCALE)
.attr('height', (subdata, index) => subdata.l * SCALE)
.attr("x", (subdata, index) => subdata.x * SCALE)
.attr("y", (subdata, index) => subdata.y * SCALE)
.attr('fill', 'red');
rects.append('text')
.attr("x", (subdata, index) => (subdata.x * SCALE) + (subdata.w * SCALE / 2))
.attr("y", (subdata, index) => (subdata.y * SCALE) + (subdata.l * SCALE / 2))
.attr("dominant-baseline", "middle")
.attr("text-anchor", "middle")
.style("font-size", "14px")
.text((subdata, index) => subdata.name);
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v6.min.js"></script>
</head>
<body>
<div id='title' class="big">Test</div>
<br>
<div id="test"></div>
<!--<script src="index.js"></script>-->
</body>
</html>
解决方案
该text
节点在那里,它只是从其fill: none
曾祖父g
节点继承而来。一行修复了它:
const ID = "test";
const SCALE = 20;
const PAD = 50;
const MAX_X = 10;
const MAX_Y = 10;
const WIDTH = (MAX_X*SCALE) + (PAD*4);
const HEIGHT = (MAX_Y*SCALE) + (PAD*4);
var data = [
{name:'ABC', x: 0, y: 0, w: 4, l: 8},
{name:'DEFG', x: 4, y: 0, w: 6, l: 8},
{name:'HIJKLMNOP', x: 0, y: 8, w: 10, l: 2}
];
var x_scale = d3.scaleLinear()
.domain([0, MAX_X])
.range([0, MAX_X * SCALE]);
var y_scale = d3.scaleLinear()
.domain([0, MAX_Y])
.range([0, MAX_Y * SCALE]);
var top_axis = d3.axisTop()
.scale(x_scale)
.ticks(MAX_X);
var left_axis = d3.axisLeft()
.scale(y_scale)
.ticks(MAX_Y);
var canvas = d3.select('#' + ID)
.append('svg')
.attr('width', WIDTH)
.attr('height', HEIGHT)
.append('g') // <- in short, this stops transforming above elements.
.attr('transform', 'translate(' + PAD.toString() + ',' + PAD.toString() + ')')
.append('g')
.attr('transform', 'translate(' + PAD.toString() + ',0)')
.call(top_axis)
.append('g')
.attr('transform', 'translate(' + (-1*PAD.toString()) + ',' + PAD.toString() + ')')
.call(left_axis)
.append('g')
.attr('transform', 'translate(' + PAD.toString() + ',0)');
var rects = canvas.selectAll('rect') // returns an empty selection
.data(data)
.enter() // fills a placeholder for each unassigned data element
.append('g');
rects.append('rect') // fills a rect for each placeholder
.attr("style", "outline: medium solid #07689f;")
.attr('width', (subdata, index) => subdata.w * SCALE)
.attr('height', (subdata, index) => subdata.l * SCALE)
.attr("x", (subdata, index) => subdata.x * SCALE)
.attr("y", (subdata, index) => subdata.y * SCALE)
.attr('fill', 'red');
rects.append('text')
.attr("x", (subdata, index) => (subdata.x * SCALE) + (subdata.w * SCALE / 2))
.attr("y", (subdata, index) => (subdata.y * SCALE) + (subdata.l * SCALE / 2))
.attr("dominant-baseline", "middle")
.attr("text-anchor", "middle")
.attr("fill", "black")
.style("font-size", "14px")
.text((subdata, index) => subdata.name);
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v6.min.js"></script>
</head>
<body>
<div id='title' class="big">Test</div>
<br>
<div id="test"></div>
<!--<script src="index.js"></script>-->
</body>
</html>
推荐阅读
- python - 为什么 0.24.2 版中没有关于 pandas.MultiIndex.map 的文档?它与 pandas.Index.map 有关吗?
- php - 如何使用 pregmatch 验证无字符 /.%\@?在输入字段中,仅 A-Za-z0-9./ 在另一个输入字段中
- flutter - Flutter Admob 与 ios WebView
- html - 具有动态高度的 Flex-wrap
- android - Moshi:将多个 JSON 属性放入一个类的一个字段中
- python - 用于 FTP 下载的 Python 进度条不起作用
- mysql - 子查询返回超过 1 个值。当子查询跟在 =、!=、<、<=、>、>= 之后或当子查询用作表达式时,这是不允许的
- r - 从 R 中 LaTex 格式的分位数回归中获取结果
- c# - 当允许多选时,参数“表达式”必须计算为 IEnumerable
- swift - 如果 `size` 不在任何子类或超类属性中,或者在它之前也没有使用 '_',它是如何被初始化并作为参数接受的?