text()
方法可为SVG元素添加文本内容,支持静态字符串或数据绑定的动态更新,通过设置坐标、字体、颜色等属性控制文本位置与样式,结合数据驱动特性实现图表标签、注释等交互式文本渲染,支持自定义格式与动态响应。
通过selection.append('text')
创建文本对象时,需配置四类核心属性:
d3.select("svg") .append("text") .attr("x", 50) // 水平坐标 .attr("y", 30) // 垂直坐标 .style("fill", "#2c3e50") // 字体颜色 .text("数据标签"); // 文本内容
坐标系统以 SVG 画布左上角为原点,建议通过transform
属性实现整体定位,避免逐元素微调。
通过数据联结(Data Join)实现文本动态生成:
const data = ["北京", "上海", "广州"]; const texts = d3.select("svg") .selectAll("text") .data(data) .join("text") .attr("x", (d,i) => i*100 + 20) .attr("y", 60) .text(d => d);
通过.join()
方法自动处理元素更新周期,配合key
函数可优化数据匹配效率:
.data(data, d => d.id) // 通过唯一标识符精确绑定
多行文本方案
使用tspan
元素构建段落结构:
d3.select("text") .append("tspan") .attr("x", 0) .attr("dy", "1.2em") .text("第二行内容");
自适应居中定位
结合text-anchor
与动态计算:
.attr("text-anchor", "middle") .attr("x", svgWidth/2)
字体渲染优化
通过 CSS 类统一样式:
.chart-label { font-family: 'Segoe UI'; font-size: 14px; letter-spacing: 0.5px; }
悬停提示系统
创建隐藏文本层实现 Tooltip:
const tooltip = d3.select("body") .append("div") .style("opacity", 0); d3.select("rect") .on("mouseover", (e,d) => { tooltip.transition() .style("opacity", 0.9) .text(d.value); });
动态更新机制
配合过渡动画提升用户体验:
texts.transition() .duration(500) .attr("y", newPosition);
批量操作原则
优先使用 group 元素管理同类文本:
const labelGroup = svg.append("g") .attr("class", "labels"); labelGroup.selectAll("text") .data(data) .join("text") // 统一配置项
渲染层级控制
通过style("pointer-events", "none")
禁用非交互文本的事件响应,可提升复杂图表的操作流畅度。
通过 D3.js 的文本控制系统,开发者可实现从基础标注到复杂交互的全场景需求,建议结合具体业务场景测试不同字体渲染方案,并优先使用 CSS 样式表维护视觉一致性,实际开发时可参考 D3 官方文档 获取最新 API 规范。
引用说明:本文代码示例参考自 D3.js 官方示例库,样式规范借鉴自 Data Visualization Society 设计指南。