Built with blockbuilder.org
forked from tomshanley's block: fresh block
license: mit |
Built with blockbuilder.org
forked from tomshanley's block: fresh block
<!DOCTYPE html> | |
<head> | |
<meta charset="utf-8"> | |
<script src="https://d3js.org/d3.v5.min.js"></script> | |
<style> | |
line { | |
stroke: black; | |
shape-rendering: crispEdges; | |
} | |
text { | |
text-anchor: middle; | |
} | |
</style> | |
</head> | |
<div id='chart'></div> | |
<form-group> | |
<label for="from">From:</label> | |
<input type="number" min="0" max="360" step="1" value="40" id="from"> | |
<label for="to">To:</label> | |
<input type="number" min="0" max="360" step="1" value="50" id="to"> | |
<button id="change-button" onclick="updateAxis()">Update</button> | |
</form-group> | |
<body> | |
<script> | |
console.clear() | |
let ticks1 = [ 1, 2, 3, 4, 5, 6, 7] | |
let width = 500 | |
let margin = 50 | |
let fromInput = d3.select("#from"); | |
let toInput = d3.select("#to"); | |
let format = d3.format(",.0f") | |
let xScale = d3.scaleLinear() | |
.domain(d3.extent(ticks1)) | |
.range([0, width]) | |
let xAxis = d3.axisBottom(xScale) | |
.tickValues(ticks1) | |
.tickFormat(format) | |
var svg = d3.select("#chart").append("svg") | |
.attr("width", width + margin + margin) | |
.attr("height", margin + margin) | |
let axes = svg.append("g") | |
.attr("transform", "translate(" + margin + ", " + margin + ")") | |
let domain = axes.append("line") | |
.attr("x1", 0) | |
.attr("x2", width) | |
.attr("y1", 0) | |
.attr("y2", 0) | |
let xAxisG = axes.append("g") | |
.attr("transform", axisTranslate(ticks1)) | |
let ticks = xAxisG.selectAll(".tick") | |
.data(ticks1, d => d) | |
.enter() | |
.append("g") | |
.attr("class", "tick") | |
.attr("transform", tickTranslate) | |
ticks.append("line") | |
.attr("x1", 0) | |
.attr("x2", 0) | |
.attr("y1", -15) | |
.attr("y2", -19) | |
ticks.append("text") | |
.text(d => d) | |
function updateAxis(){ | |
let currentTicks = ticks1 | |
let fromNumber = fromInput.property("value") | |
let toNumber = toInput.property("value") | |
if (fromNumber > toNumber) { | |
let holder = toNumber | |
toNumber = fromNumber | |
fromNumber = holder | |
} | |
let newTicks = [fromNumber, toNumber] | |
// increase the number of ticks | |
let extentAllTicks = d3.extent(currentTicks.concat(newTicks)) | |
let intermediateTicks = d3.range(extentAllTicks[0], extentAllTicks[1] + 1) | |
ticks = xAxisG.selectAll(".tick") | |
.data(intermediateTicks, d => d) | |
.join("g") | |
.attr("class", "tick") | |
.attr("transform", tickTranslate) | |
ticks.append("text") | |
.text(d => d) | |
ticks.append("line") | |
.attr("x1", 0) | |
.attr("x2", 0) | |
.attr("y1", -15) | |
.attr("y2", -19) | |
xScale | |
.domain(newTicks) | |
.range([0, width]) | |
ticks.transition() | |
.duration(5000) | |
.attr("transform", tickTranslate) | |
ticks.selectAll('text, line') | |
.transition() | |
.duration(7000) | |
.style("opacity", function(d){ | |
return (d >= newTicks[0] && d <= newTicks[1]) ? 1 : 0 | |
}) | |
} | |
function tickTranslate(d){ | |
return "translate(" + xScale(d) + ", 15)" | |
} | |
function axisTranslate(data){ | |
return "translate(" + xScale(data[0]) + ",0)" | |
} | |
</script> | |
</body> |