jquery+canvas画日历
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>canvas日历</title> <link rel="stylesheet" type="text/css" href="./jquery.datetimepicker.min.css" /> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script src="./jquery.datetimepicker.full.min.js"></script> </head> <style type="text/css"> html, body { margin: 0 0; padding: 0 0; width: 100%; height: 100%; } </style> <body> <div style="padding:20px;"> <div> <div style="font-weight: bold;margin-bottom:5px;">Choose Your Anniversary</div> <input id="datetimepicker" type="text"> </div> <canvas id="cav" width="360" height="360"></canvas> </div> </body> <script type="text/javascript"> var newDate = '' $('#datetimepicker').datetimepicker({ timepicker: false, theme: 'dark', format: 'Y-m-d', lang: 'en' }); $('#datetimepicker').on('change', function (event) { console.log('input', $(this).val()) if (!newDate) { newDate = $(this).val() canvasCalendar($(this).val()) } else { if ($(this).val() != newDate) { canvasCalendar($(this).val()) } } }) function initcalender () { newDate = new Date().getFullYear() + '-' + new Date().getMonth() + 1 + '-' + new Date().getDate() $('#datetimepicker').val(newDate) canvasCalendar(newDate) } var canvas = document.getElementById("cav"); var ctx = canvas.getContext("2d"); var date = '' var year = '' var mouth = '' var today = '' var week = '' var cardSize = 40; initcalender() function canvasCalendar (val) { if (canvas && canvas.width) { canvas.width = canvas.width } date = new Date(val); year = date.getYear(); mouth = date.getMonth(); today = date.getDate(); week = date.getDay(); var array_three = [4, 6, 9, 11]; var array_threeone = [1, 3, 5, 7, 8, 10, 12]; var array_week = ['', "S", "M", "T", "W", "T", "F", "S"] var firstDraw;//1号绘制位置 var wIdx = today % 7; if (week >= wIdx) { firstDraw = week - wIdx + 1; } else { firstDraw = week - wIdx + 8; } var dayIndex = 1; var countDay = 30; if (array_three.indexOf(mouth) > -1) { countDay = 30; } else if (array_threeone.indexOf(mouth) > -1) { countDay = 31; } else { countDay = 28;//未考虑瑞年情况 } var row = 7;//6; if (7 - firstDraw + 7 * 4 < countDay) {//确定表格行数,防止日期绘制不全 row = 8;//7; } for (var i = 1; i < row + 1; i++) {//开始绘制日期数 for (var j = 1; j < 8; j++) { if (i == 1) {//绘制年月位置 drawMonYear(); continue; } if (i == 2) {//表格第一行绘制星期 drawDate(array_week[j], i, j); continue; } if (i == 3 && j < firstDraw) {//确定1号绘制位置 continue; } if (dayIndex > countDay) {//只绘制月份的天数 break; } drawDate(dayIndex++, i, j); } } } /*绘制年月*/ function drawMonYear () { var mouth = date.getMonth(); ctx.textAlign = "center"; ctx.font = 'bold 20px serif'; ctx.fillStyle = 'black'; var monArr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'] ctx.fillText(monArr[mouth], 2.5 * cardSize + cardSize / 2, 1 * cardSize + cardSize / 3 * 2); ctx.font = ' 18px Open Sans,Arial,Helvetica,sans-serif'; ctx.fillText(date.getFullYear(), 5.3 * cardSize + cardSize / 2, 1 * cardSize + cardSize / 3 * 2); } /*绘制背景表格*/ function drawbg (ctx) { for (var i = 0; i < row; i++) { for (var j = 0; j < 7; j++) { ctx.strokeRect(j * cardSize, i * cardSize, cardSize, cardSize); } } } /*绘制确定日期*/ function drawDate (txt, i, j) { if (txt == today) { drawHeartbg(j, i); } ctx.textAlign = "center"; if (i == 1) { ctx.font = 'bold 18px serif'; } else { ctx.font = 'bold 14px Open Sans,Arial,Helvetica,sans-serif'; } ctx.strokeStyle = 'black'; ctx.fillText(txt, j * cardSize + cardSize / 2, i * cardSize + cardSize / 3 * 2); } /*绘制标志今天的背景图爱心*/ function drawHeartbg (i, j) { ctx.save(); var percision = 100; var vertices = new Array();//存放爱心坐标数组 for (var ii = 0; ii < percision; ii++) { var t = Math.PI * 2 * (ii / percision - 0.5); var tx = 12 * Math.sin(t) - 4 * Math.sin(3 * t); var ty = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t); vertices.push({ x: tx, y: -ty }); } ctx.beginPath(); ctx.translate(i * cardSize + cardSize / 2, j * cardSize + cardSize / 2); //ctx.rotate(Math.PI); ctx.scale(1.2, 1.2); //缩放 vertices.forEach(element => { ctx.lineTo(element.x, element.y); //绘制轮廓 }); ctx.stroke() ctx.restore(); } </script> </html>