canvas画时钟小案例

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

</head>

<style>

* {

margin: 0;

padding: 0;

}

#clock {

width: 400px;

height: 400px;

margin: 100px auto;

background-color: darkgrey;

border-radius: 20px;

}

</style>

<body>

<div id="clock">

<canvas id="can" width="400px" height="400px"></canvas>

</div>

</body>

<script>

var cans = can.getContext("2d");

// 定义基础变量

var w = h = 400;//时钟宽高

var x = y = 200;//时钟中心坐标

var r = 180;//时钟半径

var r_hour = 60;//时针长度

var r_minute = 120;//分针长度

var r_second = 140;//秒针长度

var r_text = 140;//定义表盘文字的半径

var r_square = 165;//刻度

var r_circle = 10;//表盘小圆点

var deg = 2 * Math.PI;//定义基本的圆周

// 平移中心点

cans.translate(w / 2, h / 2);

// 初始化执行一次

function clock() {

// 画圆盘

drawCircle(0, 0, r, '#fff')

// 获取当前时间

var date = new Date()

var h = date.getHours() * (deg / 12) - deg / 4;//[0,23]

var m = date.getMinutes() * (deg / 60) - deg / 4;//[0,59]

var s = date.getSeconds() * (deg / 60) - deg / 4;//[0,59]

// 画时钟的表针

drawLine(0, 0, r_hour * Math.cos(h), r_hour * Math.sin(h), '#000', 10);

drawLine(0, 0, r_minute * Math.cos(m), r_minute * Math.sin(m), '#000', 5);

drawLine(0, 0, r_second * Math.cos(s), r_second * Math.sin(s), '#f00', 2);

// 画刻度

for (var i = 1; i <=60; i++) {

var θ = ((Math.PI * 2) / 60) * i - Math.PI / 2;

var x1 = r * Math.cos(θ);

var y1 = r * Math.sin(θ);

/*

判断是否为整点

*/

if (i % 5 == 0) {

var x2 = r_square * Math.cos(θ);

var y2 = r_square * Math.sin(θ);

drawLine(x1, y1, x2, y2, '#f00', 3)

} else {

var x2 = (r_square + 3) * Math.cos(θ);

var y2 = (r_square + 3) * Math.sin(θ);

drawLine(x1, y1, x2, y2, '#aaa', 2)

}

}

// 画表钉

drawCircle(0, 0, r_circle, '#000')

// 画数字

for (var i = 1; i <= 12; i++) {

// 计算圆周坐标

// x = x + r*cos(θ)

// y = y + r*sin(θ)

var θ = ((Math.PI * 2) / 12) * i - Math.PI / 2;

var x = r_text * Math.cos(θ);

var y = r_text * Math.sin(θ);

drawText(i, x, y);

}

}

clock()

setInterval(() => {

clock()

}, 1000);

// 画直线的方法

function drawLine(x1, y1, x2, y2, color, width) {

cans.beginPath();

cans.moveTo(x1, y1);

cans.lineTo(x2, y2);

cans.strokeStyle = color;

cans.lineWidth = width;

cans.lineCap = 'round';//让指针头变圆

cans.stroke();

cans.closePath();

}

// 画文字的方法

function drawText(text, x, y) {

cans.font = 'bold 26px 微软雅黑';

cans.textAlign = "center";

cans.textBaseline = "middle";

cans.fillStyle = '#000';

cans.fillText(text, x, y);

}

// 画圆的方法

function drawCircle(x, y, r, color) {

cans.beginPath();

cans.arc(x, y, r, 0, Math.PI * 2);

cans.fillStyle = color || '#000';

cans.fill();

}

</script>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Canvas 是 HTML5 中的一个绘图 API,用于在网页上绘制图形和动态内容。在 canvas 上绘制图片并调整字体大小以适应,主要涉及到元素的尺寸计算和样式设置。以下是实现图片和文本适配的一般步骤: 1. 图片大小适配: - 获取图片的实际宽度和高度(`img.width` 和 `img.height`)。 - 计算 canvas 的尺寸,可以根据需要的比例缩放,例如,如果希望图片占据 canvas 的80%,可以将 canvas 的宽度设置为图片宽度的0.8倍。 - 将图片绘制到 canvas 上,使用 `drawImage()` 方法。 2. 字体大小适配: - 首先,你需要确定一个基础的字体大小,例如 16px 或 20px,这将是你的最小字号。 - 计算一个基于图片尺寸的字体比例。例如,如果你的 canvas 是图片宽度的0.8倍,字体大小可能是图片高度的0.75倍。 - 使用 CSS 来设置 canvas 内的文字样式,比如 `font-size`,动态计算这个值。 ```javascript let baseFontSize = 16; // 基础字号 let fontSizeRatio = 0.75; // 字体大小与图片高度的比例 // 假设 img 变量已经包含了图片元素 let canvasWidth = img.width * 0.8; let canvasHeight = img.height; let calculatedFontSize = baseFontSize * fontSizeRatio; let canvasContext = canvas.getContext('2d'); // 绘制图片 canvasContext.drawImage(img, 0, 0, canvasWidth, canvasHeight); // 设置文字样式 canvasContext.font = `${calculatedFontSize}px Arial`; // 假设字体是 Arial ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值