JSFiddle - React, Tailwind, and code Playground
HTML
<svg class="chart"></svg>
CSS
.bar {
fill: steelblue;
}
.axis text {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
JavaScript
var data = [
{x: 2, y: 4},
{x: 5, y: 8},
{x: 8, y: 10}
];
var margin = {top: 20, right: 30, bottom: 30, left: 40},
w = 400 - margin.left - margin.right,
h = 300 - margin.top - margin.bottom;
var x = d3.scale.linear()
.domain([0, d3.max(data, function(d) { return d.x; })])
.range([0, w]);
var y = d3.scale.linear()
.domain([0, d3.max(data, function(d) { return d.y; })])
.range([h, 0]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
var zoom = d3.behavior.zoom()
.scaleExtent([1, 2])
.x(x)
.y(y)
.on("zoom", zoomed);
var chart = d3.select(".chart")
.attr("width", w + margin.left + margin.right)
.attr("height", h + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
.call(zoom);
var rect = chart.append("rect")
.attr("width", w)
.attr("height", h)
.style("fill", "none")
.style("pointer-events", "all");
chart.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + h + ")")
.call(xAxis);
chart.append("g")
.attr("class", "y axis")
.call(yAxis);
var bars = chart.append("g")
.attr("class", "chartobjects");
bars.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.x); })
.attr("y", function(d) { return y(d.y); })
.attr("height", function(d) { return h - y(d.y); })
.attr("width", 15);
function zoomed() {
var tx = Math.max(0, d3.event.translate[0]),
ty = Math.min(0, d3.event.translate[1]);
console.log(d3.event.translate[1]);
bars.attr("transform", "translate(" + [tx,ty] + ")scale(" + d3.event.scale + ")");
chart.select(".x.axis")
.call(xAxis);
chart.select(".y.axis")
.call(yAxis);
}