Creates a calendar similar to Github's contribution calendar. Uses moment.js with a bit of CSS & JavaScript to tie it together.
A Pen by James Barnett on CodePen.
Creates a calendar similar to Github's contribution calendar. Uses moment.js with a bit of CSS & JavaScript to tie it together.
A Pen by James Barnett on CodePen.
<div class = "activity-chart"> | |
<h1>Daily Activity Chart</h1> | |
<ol class = "days-of-week"> | |
<li>M</li> | |
<li>W</li> | |
<li>F</li> | |
</ol> | |
<div id = "month" class = "month"></div> | |
<div id = "days" class = "days"></div> | |
</div> |
$(document).ready(function() { | |
/*** draw months ***/ | |
var month = moment(); | |
var outputMonth = "<ol class = 'month'>"; | |
for (i = 0; i <= 12; i++) { | |
var durationMonth = moment.duration({'months' : 1}); | |
outputMonth += "<li>"; | |
outputMonth += moment(month).format("MMM"); | |
outputMonth += "</li>"; | |
console.log(moment(month).format("MMM YY")); | |
month = moment(month).subtract(durationMonth); | |
} | |
outputMonth += "</ol>"; | |
var output = "<ol><div class = 'week'>"; | |
var day = moment(); | |
/*** day of week ***/ | |
var dayOfWeekOffset = 0; | |
/* Find the day of the week the month starting on | |
so we can calculate the offset for days of the week to line up correctly */ | |
var startOfMonth = moment().startOf('month'); | |
dayOfWeekOffset = 7 - (parseInt(moment(startOfMonth).format("d"),10)); | |
/* draw offset */ | |
for (i = 0; i < (dayOfWeekOffset); i++) { output += "<li class = 'offset'></li>"; } | |
/*** draw calendar ***/ | |
//console.log(moment(day).format("MM-DD-YY")); | |
for (i = 365; i >= 0; i--) { | |
//console.log(moment(day).format("MM-DD-YY")); | |
output += "<li>"; | |
output += '<span class = "tooltip">' + moment(day).format("MM-DD-YY") + '</span>'; | |
output += "</li>"; | |
var duration = moment.duration({'days' : 1}); | |
day = moment(day).subtract(duration); | |
} | |
output += "</div></ol>"; | |
document.getElementById("month").innerHTML = outputMonth; | |
document.getElementById("days").innerHTML = output; | |
}); |
ol, li { padding: 0; margin: 0; list-style: none;} | |
h1 { | |
font-size: 1.5em; | |
margin: 70px 175px; | |
} | |
.activity-chart, h1 {color: #525252;} | |
.days li { background: #ebebeb; } | |
.activity-chart { | |
width: 725px; | |
padding-left: 110px; /* center in container */ | |
margin: 50px; | |
position: relative; | |
/*outline: solid; | |
height: 200px;*/ | |
} | |
/*** day of week heading ***/ | |
.days-of-week { | |
width: 15px; | |
position: absolute; | |
left: 25px; | |
top: 80px; | |
} | |
.days-of-week { font-size: 0.7em; } | |
.days-of-week li:nth-child(2) { | |
margin: 13px 0; | |
} | |
/*** month headings ***/ | |
.month ol { | |
position: absolute; | |
top: 40px; | |
left: 25px; | |
} | |
.month li { | |
float: right; | |
margin-left: 35px; | |
font-size: 0.75em; | |
} | |
/*** draw days ***/ | |
.days { | |
font-size: 0.75em; | |
margin-top: 15px; | |
float: right; /* needed to float onto screen */ | |
} | |
/* offset so days of the week line up | |
over-specified to win specificity battle */ | |
.activity-chart .offset:hover { outline: none; } | |
.activity-chart .offset { background: white; } | |
/* create vertical weeks */ | |
.week { | |
width: 108px; | |
transform: rotate(90deg); | |
} | |
.days li { | |
width: 12px; | |
height: 12px; | |
float: right; /* order days starting at the bottom right */ | |
margin: 1px 1.5px; | |
} | |
/*** tooltips ***/ | |
.days li .tooltip { display: none; } | |
.days li:hover | |
{ | |
outline: 1px solid; | |
position: relative; | |
z-index: 3; | |
} | |
.days li:hover .tooltip { | |
transform: rotate(-90deg); | |
display: block; | |
position: absolute; | |
top: -10px; | |
left: -85px; | |
min-width: 75px; | |
padding: 5px 20px; | |
text-align: center; | |
background-color: #333; | |
color: #f1f1f1; | |
} | |
/*** little triangle on the tooltip ***/ | |
.tooltip:before { | |
content: ""; | |
position: absolute; | |
width: 0; | |
height: 0; | |
bottom: -7px; | |
right: 51px; | |
border-left: 9px solid transparent; | |
border-right: 9px solid transparent; | |
border-top: 9px solid #333; | |
} |