SVG-контейнер в D3.js формируется как обычный элемент DOM, создаваемый и настраиваемый через механизм выборок (selections). Библиотека не абстрагирует SVG как отдельную сущность — она управляет им через стандартную модель DOM, расширяя её возможностями декларативной работы с данными.
Создание контейнера начинается с выбора родительского узла и
добавления в него элемента <svg>:
const svg = d3.select("body")
.append("svg");
На этом этапе создаётся пустой SVG-элемент без размеров и конфигурации. Он уже является полноценным контейнером, но визуально не отображается до тех пор, пока не заданы его геометрические параметры.
SVG в контексте браузера ведёт себя как отдельная система координат, встроенная в HTML-документ. Поэтому ключевой задачей становится определение размеров области рисования.
Наиболее прямой способ управления размером — использование атрибутов
width и height:
const svg = d3.select("body")
.append("svg")
.attr("width", 800)
.attr("height", 400);
Эти значения определяют физические размеры области SVG в пикселях. Все последующие графические элементы будут размещаться внутри этой области в пределах заданной системы координат.
Важно учитывать, что отсутствие размеров приводит к тому, что контейнер либо не отображается, либо имеет нулевую площадь.
Более гибкий подход заключается в использовании атрибута
viewBox. Он задаёт внутреннюю систему координат SVG и
позволяет отделить логическую сцену от физических размеров:
const svg = d3.select("body")
.append("svg")
.attr("viewBox", "0 0 800 400");
Строка 0 0 800 400 определяет:
При использовании viewBox SVG становится масштабируемым:
элементы автоматически адаптируются под размеры контейнера в CSS.
Комбинация viewBox с CSS-стилями позволяет добиться
адаптивной визуализации:
const svg = d3.select("body")
.append("svg")
.attr("viewBox", "0 0 800 400")
.style("width", "100%")
.style("height", "auto");
SVG использует декартову систему координат, где:
Это фундаментальное отличие от математической системы координат, где ось Y обычно направлена вверх. При построении графиков это требует явного учета при масштабировании значений.
SVG-элемент в D3.js часто выступает как корневой контейнер всей
визуализации. В него добавляются группы <g>, которые
служат логическими слоями:
const svg = d3.select("body")
.append("svg")
.attr("width", 800)
.attr("height", 400);
const layer = svg.append("g");
Группы позволяют:
При создании графиков часто используется схема «margin convention». Она отделяет внешние отступы от внутренней области рисования:
const margin = { top: 20, right: 20, bottom: 30, left: 40 };
const width = 800;
const height = 400;
const svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
const chart = svg.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`);
Здесь создаётся отдельная группа chart, смещённая внутрь
SVG-контейнера. Это позволяет строить график в выделенной области, не
конфликтующей с осями и подписями.
Размер рабочей области обычно вычисляется отдельно:
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
SVG поддерживает управление поведением масштабирования через
preserveAspectRatio:
const svg = d3.select("body")
.append("svg")
.attr("viewBox", "0 0 800 400")
.attr("preserveAspectRatio", "xMidYMid meet");
Основные режимы:
xMinYMin — выравнивание по левому верхнему краюxMidYMid — центрирование (наиболее распространённый
вариант)none — растяжение без сохранения пропорцийЭтот атрибут определяет, как логическая система координат вписывается в физический контейнер.
SVG-элемент можно стилизовать через CSS, что часто предпочтительнее inline-атрибутов:
d3.select("svg")
.style("background-color", "#f5f5f5");
Или при создании:
const svg = d3.select("body")
.append("svg")
.attr("class", "chart");
Далее стили задаются в CSS:
.chart {
background-color: #f5f5f5;
display: block;
}
CSS-управление особенно важно при адаптивных интерфейсах и сложных визуализациях.
После создания контейнера все графические примитивы добавляются внутрь него:
<rect> — прямоугольники<circle> — окружности<line> — линии<path> — сложные фигуры<text> — текстовые элементыПример добавления базовой фигуры:
svg.append("circle")
.attr("cx", 100)
.attr("cy", 100)
.attr("r", 50);
Каждый элемент наследует систему координат SVG-контейнера.
В одной странице может существовать несколько независимых SVG-сцен:
const svg1 = d3.select("#chart1")
.append("svg")
.attr("width", 400)
.attr("height", 200);
const svg2 = d3.select("#chart2")
.append("svg")
.attr("width", 400)
.attr("height", 200);
Каждый контейнер изолирован, имеет собственную систему координат и не влияет на другие визуализации.
Часто встречающиеся проблемы связаны с некорректной инициализацией:
width и height, приводящее к
невидимому контейнеруviewBox без CSS-размеровКорректная структура всегда начинается с явного создания контейнера и определения его координатной системы до добавления графики.
SVG-контейнер в D3.js выступает фундаментом всей графической сцены. Он определяет:
Все дальнейшие операции D3 — масштабирование, оси, линии, диаграммы — строятся поверх этого базового узла, который остаётся неизменной точкой отсчёта для всей визуализации.