当前位置:首页 > JavaScript

js实现尺子

2026-03-14 18:18:37JavaScript

使用Canvas实现动态尺子

在JavaScript中,通过Canvas可以绘制一个可交互的尺子。以下是一个基础实现示例:

const canvas = document.getElementById('rulerCanvas');
const ctx = canvas.getContext('2d');
const scale = window.devicePixelRatio || 1;
const width = 800;
const height = 60;

canvas.style.width = `${width}px`;
canvas.style.height = `${height}px`;
canvas.width = width * scale;
canvas.height = height * scale;
ctx.scale(scale, scale);

function drawRuler() {
  ctx.clearRect(0, 0, width, height);
  ctx.strokeStyle = '#333';
  ctx.lineWidth = 1;

  // 绘制主刻度
  for (let i = 0; i < width; i += 50) {
    ctx.beginPath();
    ctx.moveTo(i, 0);
    ctx.lineTo(i, 30);
    ctx.stroke();
    ctx.fillText(i, i - 10, 45);
  }

  // 绘制次刻度
  for (let i = 0; i < width; i += 10) {
    if (i % 50 !== 0) {
      ctx.beginPath();
      ctx.moveTo(i, 0);
      ctx.lineTo(i, 20);
      ctx.stroke();
    }
  }
}

drawRuler();

实现可拖拽尺子

添加鼠标事件处理实现拖拽功能:

let isDragging = false;
let startX = 0;
let offsetX = 0;

canvas.addEventListener('mousedown', (e) => {
  isDragging = true;
  startX = e.clientX;
});

window.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  offsetX += e.clientX - startX;
  startX = e.clientX;
  drawRuler();
});

window.addEventListener('mouseup', () => {
  isDragging = false;
});

function drawRuler() {
  ctx.clearRect(0, 0, width, height);
  ctx.save();
  ctx.translate(offsetX % 50, 0);

  // 绘制刻度逻辑...
  ctx.restore();
}

添加垂直刻度线

在水平尺基础上添加垂直指示线:

let currentPosition = 0;

function drawVerticalLine(pos) {
  ctx.strokeStyle = 'red';
  ctx.lineWidth = 2;
  ctx.beginPath();
  ctx.moveTo(pos, 0);
  ctx.lineTo(pos, height);
  ctx.stroke();
}

canvas.addEventListener('click', (e) => {
  const rect = canvas.getBoundingClientRect();
  currentPosition = e.clientX - rect.left;
  drawRuler();
  drawVerticalLine(currentPosition);
});

响应式尺子实现

使用CSS和JavaScript使尺子适应不同屏幕尺寸:

function resizeRuler() {
  const container = document.getElementById('rulerContainer');
  width = container.clientWidth;

  canvas.style.width = `${width}px`;
  canvas.width = width * scale;
  drawRuler();
}

window.addEventListener('resize', resizeRuler);

添加单位切换功能

实现厘米/英寸单位切换:

js实现尺子

let unit = 'cm';
const cmToInchRatio = 0.393701;

function toggleUnit() {
  unit = unit === 'cm' ? 'inch' : 'cm';
  drawRuler();
}

function drawRuler() {
  // ...
  for (let i = 0; i < width; i += 50) {
    const value = unit === 'cm' ? i : (i * cmToInchRatio).toFixed(1);
    ctx.fillText(value, i - 10, 45);
  }
  // ...
}

这些代码片段展示了如何创建一个基础的Canvas尺子,并逐步添加拖拽、垂直指示线、响应式和单位切换等高级功能。可以根据实际需求调整刻度间隔、样式和交互行为。

标签: 尺子js
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…