block by renecnielsen f5a8e1174df721ac5f79

Clock II

Full Screen

hello world

forked from syntagmatic‘s block: Clock II

index.html

<!DOCTYPE html>
<meta charset="utf-8">
<style>
body {
  background: #eee;
  margin: auto;
  position: relative;
}

text {
  text-anchor: middle;
  alignment-baseline: middle;
  fill: #444;
}

.hour line {
  stroke: #888;
}

.hour.hand {
  line-width: 3px;
}

.minute line {
  stroke: #888;
}
</style>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script>
d3.timer(tick);

function hands() {
  var now = new Date();
  var milliseconds = now.getMilliseconds();
  var seconds = now.getSeconds() + milliseconds / 1000;
  var minutes = now.getMinutes() + seconds / 60;
  var hours = ((now.getHours() + 24) % 12 || 0) + minutes / 60;
  return [
    {field: "hours", color: "#444", length: 90, strokeWidth: 9, index: .555, spacing: 0.1, value: hours / 12},
    {field: "minutes", color: "#444", length: 145, strokeWidth: 6, index: .597, spacing: 0.115, value: minutes / 60},
    {field: "seconds", color: "#2ac", length: 160, strokeWidth: 3, index: .6348, spacing: 0.015, value: seconds / 60}
  ];
}

var width = 960,
    height = 500,
    radius = 94;

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

// minute hands
var minutedomain = d3.range(60);
var minuteangle = d3.scale.linear()
  .domain([0,60])
  .range([180,-180])

var minutemarks = svg.selectAll(".minute.axis")
    .data(minutedomain)
  .enter().append("g")
    .attr("class", "minute")
    .attr("transform", function(d) { return "rotate(" + -minuteangle(d) + ")"; })

minutemarks
  .append("line")
  .attr("stroke-linecap", "round")
  .attr("x1", 155)
  .attr("x2", 165)
  .attr("y1", 0)
  .attr("y2", 0);

// hour hands
var hourdomain = d3.range(12);
var hourangle = d3.scale.linear()
  .domain([0,12])
  .range([180,-180])

var hourmarks = svg.selectAll(".hour.axis")
    .data(hourdomain)
  .enter().append("g")
    .attr("class", "hour")
    .attr("transform", function(d) { return "rotate(" + -hourangle(d) + ")"; })

hourmarks
  .append("line")
  .attr("stroke-linecap", "round")
  .attr("stroke-width", 3)
  .attr("x1", 150)
  .attr("x2", 170)
  .attr("y1", 0)
  .attr("y2", 0);

var field = svg.selectAll("g.field")
    .data(hands)
  .enter().append("g")
  .attr("class", "field");

field.append("line")
  .attr("class", function(d) { return d.field + " hand"; })
  .attr("stroke-width", function(d) { return d.strokeWidth; })
  .attr("stroke-linecap", "round")
  .attr("x1", function(d) { return d.strokeWidth/2; })
  .attr("x2", function(d) { return d.length; })
  .attr("y1", 0)
  .attr("y2", 0);

var counter = 0;
function tick() {
  if (counter++ % 3 != 0) return;    // ease up on cpu

  field.data(hands)
    .select("line")
      .attr("transform", function(d) { return "rotate(" + (360*d.value-90)+ ")" })
      .style("stroke", function(d) { return d.color; });
}
</script>