我正在做一个d3画笔类似于演示显示here。但是,我希望画笔包含一个<input>
元素,当画笔移动时<input>
应该随之移动。
这可能吗,也许是通过使用一个外来物体?
最佳答案
试试这个代码。
var bbox = gBrush.node().getBBox();
gBrush.select(".resize.e").append("foreignObject")
.attr("x", -bbox.width)
.attr("y", bbox.height)
.append("xhtml:body").append("xhtml:input").attr("size",4)
.attr("type", "text")
.html("Object in SVG");
var margin = {
top: 200,
right: 40,
bottom: 200,
left: 40
},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var x = d3.time.scale()
.domain([new Date(2013, 2, 1), new Date(2013, 2, 15) - 1])
.range([0, width]);
var brush = d3.svg.brush()
.x(x)
.extent([new Date(2013, 2, 2), new Date(2013, 2, 3)])
.on("brush", brushed);
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
svg.append("rect")
.attr("class", "grid-background")
.attr("width", width)
.attr("height", height);
svg.append("g")
.attr("class", "x grid")
.attr("transform", "translate(0," + height + ")")
.call(d3.svg.axis()
.scale(x)
.orient("bottom")
.ticks(d3.time.hours, 12)
.tickSize(-height)
.tickFormat(""))
.selectAll(".tick")
.classed("minor", function(d) {
return d.getHours();
});
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.svg.axis()
.scale(x)
.orient("bottom")
.ticks(d3.time.days)
.tickPadding(0))
.selectAll("text")
.attr("x", 6)
.style("text-anchor", null);
var gBrush = svg.append("g")
.attr("class", "brush")
.call(brush);
var bbox = gBrush.node().getBBox();
gBrush.select(".resize.e").append("foreignObject")
.attr("x", -bbox.width)
.attr("y", bbox.height)
.append("xhtml:body").append("xhtml:input").attr("size",4)
.attr("type", "text")
.html("Object in SVG");
gBrush.selectAll("rect")
.attr("height", height);
function brushed() {
var extent0 = brush.extent(),
extent1;
// if dragging, preserve the width of the extent
if (d3.event.mode === "move") {
var d0 = d3.time.day.round(extent0[0]),
d1 = d3.time.day.offset(d0, Math.round((extent0[1] - extent0[0]) / 864e5));
extent1 = [d0, d1];
}
// otherwise, if resizing, round both dates
else {
extent1 = extent0.map(d3.time.day.round);
// if empty when rounded, use floor & ceil instead
if (extent1[0] >= extent1[1]) {
extent1[0] = d3.time.day.floor(extent0[0]);
extent1[1] = d3.time.day.ceil(extent0[1]);
}
}
d3.select(this).call(brush.extent(extent1));
}
.axis text {
font: 11px sans-serif;
}
.axis path {
display: none;
}
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.grid-background {
fill: #ddd;
}
.grid line,
.grid path {
fill: none;
stroke: #fff;
shape-rendering: crispEdges;
}
.grid .minor.tick line {
stroke-opacity: .5;
}
.brush .extent {
stroke: #000;
fill-opacity: .125;
shape-rendering: crispEdges;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
关于html - d3:带有输入字段的画笔,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33208666/