当前位置:首页 > VUE

vue实现标尺栏

2026-02-19 21:29:11VUE

实现标尺栏的基本思路

在Vue中实现标尺栏,通常需要结合HTML5的Canvas或SVG进行绘制,同时监听滚动事件以同步标尺与内容的移动。以下是两种常见实现方式。

基于Canvas的实现

创建一个Vue组件,使用Canvas绘制水平和垂直标尺。通过监听滚动事件更新标尺位置。

<template>
  <div class="ruler-container">
    <canvas ref="horizontalRuler" class="horizontal-ruler"></canvas>
    <canvas ref="verticalRuler" class="vertical-ruler"></canvas>
    <div class="content" @scroll="handleScroll">
      <!-- 你的内容区域 -->
    </div>
  </div>
</template>

<script>
export default {
  mounted() {
    this.drawRulers();
    window.addEventListener('resize', this.drawRulers);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.drawRulers);
  },
  methods: {
    drawRulers() {
      const hCanvas = this.$refs.horizontalRuler;
      const vCanvas = this.$refs.verticalRuler;

      // 设置Canvas尺寸
      hCanvas.width = hCanvas.offsetWidth;
      hCanvas.height = 20;
      vCanvas.width = 20;
      vCanvas.height = vCanvas.offsetHeight;

      // 绘制标尺
      this.drawHorizontalRuler(hCanvas);
      this.drawVerticalRuler(vCanvas);
    },
    drawHorizontalRuler(canvas) {
      const ctx = canvas.getContext('2d');
      ctx.clearRect(0, 0, canvas.width, canvas.height);

      // 绘制标尺刻度
      for (let i = 0; i < canvas.width; i += 10) {
        ctx.beginPath();
        ctx.moveTo(i, 0);
        ctx.lineTo(i, i % 50 === 0 ? 15 : 10);
        ctx.stroke();

        if (i % 100 === 0) {
          ctx.fillText(i, i + 2, 12);
        }
      }
    },
    drawVerticalRuler(canvas) {
      // 类似水平标尺的实现
    },
    handleScroll(e) {
      // 根据滚动位置更新标尺
    }
  }
}
</script>

<style>
.ruler-container {
  position: relative;
}
.horizontal-ruler {
  position: absolute;
  top: 0;
  left: 20px;
  width: calc(100% - 20px);
  height: 20px;
  border-bottom: 1px solid #ccc;
}
.vertical-ruler {
  position: absolute;
  top: 20px;
  left: 0;
  width: 20px;
  height: calc(100% - 20px);
  border-right: 1px solid #ccc;
}
.content {
  position: absolute;
  top: 20px;
  left: 20px;
  width: calc(100% - 20px);
  height: calc(100% - 20px);
  overflow: auto;
}
</style>

基于SVG的实现

使用SVG可以创建矢量标尺,缩放时不会失真。

<template>
  <div class="ruler-container">
    <svg class="horizontal-ruler" ref="horizontalRuler"></svg>
    <svg class="vertical-ruler" ref="verticalRuler"></svg>
    <div class="content" @scroll="handleScroll">
      <!-- 内容区域 -->
    </div>
  </div>
</template>

<script>
export default {
  mounted() {
    this.drawSVGRulers();
    window.addEventListener('resize', this.drawSVGRulers);
  },
  methods: {
    drawSVGRulers() {
      const hRuler = this.$refs.horizontalRuler;
      const vRuler = this.$refs.verticalRuler;

      // 清空并重新绘制
      hRuler.innerHTML = '';
      vRuler.innerHTML = '';

      // 创建水平标尺
      for (let i = 0; i < hRuler.clientWidth; i += 10) {
        const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
        line.setAttribute('x1', i);
        line.setAttribute('y1', 0);
        line.setAttribute('x2', i);
        line.setAttribute('y2', i % 50 === 0 ? 15 : 10);
        line.setAttribute('stroke', '#000');
        hRuler.appendChild(line);

        if (i % 100 === 0) {
          const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
          text.setAttribute('x', i + 2);
          text.setAttribute('y', 12);
          text.textContent = i;
          hRuler.appendChild(text);
        }
      }

      // 类似方式创建垂直标尺
    }
  }
}
</script>

使用第三方库

考虑使用现成的标尺库如vue-ruler-tool可以快速实现:

npm install vue-ruler-tool
<template>
  <ruler-tool
    :content-width="2000"
    :content-height="2000"
    :scale="1"
    :thick="20"
    :is-scale-reticle="true"
    :is-open-corner="true"
  >
    <!-- 你的内容 -->
  </ruler-tool>
</template>

<script>
import RulerTool from 'vue-ruler-tool';
export default {
  components: { RulerTool }
}
</script>

性能优化建议

对于动态更新的标尺,使用requestAnimationFrame优化绘制性能。避免在每次滚动事件中都重绘标尺,可以设置节流函数控制重绘频率。

let isDrawing = false;
function throttledDraw() {
  if (!isDrawing) {
    isDrawing = true;
    requestAnimationFrame(() => {
      drawRulers();
      isDrawing = false;
    });
  }
}

响应式设计考虑

使用CSS变量或Vue的响应式数据管理标尺样式,使其能适应不同主题或用户偏好设置。通过计算属性动态计算标尺刻度间隔,确保在不同缩放级别下都能清晰显示。

vue实现标尺栏

标签: 标尺vue
分享给朋友:

相关文章

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

ssh vue 实现

ssh vue 实现

使用SSH连接Vue项目部署的服务器 在Vue项目开发或部署过程中,可能需要通过SSH连接到远程服务器进行配置或维护。以下是实现SSH连接并部署Vue项目的关键步骤: 生成SSH密钥对 在本地终端…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transi…

vue 实现单选

vue 实现单选

使用 v-model 绑定单选值 在 Vue 中,可以通过 v-model 绑定单选按钮的值。定义一个响应式数据(如 selectedOption),并将其与单选按钮的 value 属性关联。…

vue实现试卷

vue实现试卷

Vue实现试卷系统的基本思路 使用Vue.js构建试卷系统需要结合组件化开发、状态管理和后端数据交互。核心功能包括题目展示、答题逻辑、计时器和提交答案。 核心功能模块划分 试卷组件结构 试卷容…