当前位置:首页 > VUE

vue 实现尺子

2026-01-13 02:26:56VUE

实现思路

在Vue中实现尺子功能,可以通过动态生成刻度线和数字标签,结合CSS样式和交互逻辑完成。核心是利用v-for循环渲染刻度线,并通过计算属性动态调整刻度间距和数值显示。

基础实现代码

以下是一个水平尺子的实现示例,包含刻度线和数字标签:

vue 实现尺子

<template>
  <div class="ruler-container">
    <div class="ruler" ref="ruler">
      <div 
        v-for="(tick, index) in ticks" 
        :key="index" 
        class="tick" 
        :style="{ left: `${tick.position}px`, height: `${tick.height}px` }"
      >
        <span v-if="tick.isMajor" class="tick-label">{{ tick.value }}</span>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      scale: 1, // 缩放比例
      startValue: 0, // 起始值
      endValue: 100, // 结束值
      majorInterval: 10, // 主刻度间隔
      minorInterval: 2 // 次刻度间隔
    }
  },
  computed: {
    ticks() {
      const ticks = [];
      const totalTicks = (this.endValue - this.startValue) / this.minorInterval;

      for (let i = 0; i <= totalTicks; i++) {
        const value = this.startValue + i * this.minorInterval;
        const isMajor = value % this.majorInterval === 0;

        ticks.push({
          value,
          position: i * this.minorInterval * 10 * this.scale,
          height: isMajor ? 30 : 15,
          isMajor
        });
      }

      return ticks;
    }
  }
}
</script>

<style scoped>
.ruler-container {
  overflow-x: auto;
  padding-top: 20px;
}

.ruler {
  position: relative;
  height: 40px;
  border-bottom: 1px solid #333;
}

.tick {
  position: absolute;
  bottom: 0;
  width: 1px;
  background-color: #333;
}

.tick-label {
  position: absolute;
  left: -10px;
  top: 100%;
  font-size: 12px;
}
</style>

垂直尺子实现

若需要垂直尺子,调整样式和计算逻辑:

vue 实现尺子

<template>
  <div class="vertical-ruler">
    <div 
      v-for="(tick, index) in ticks" 
      :key="index" 
      class="tick" 
      :style="{ top: `${tick.position}px`, width: `${tick.width}px` }"
    >
      <span v-if="tick.isMajor" class="tick-label">{{ tick.value }}</span>
    </div>
  </div>
</template>

<style scoped>
.vertical-ruler {
  position: relative;
  width: 40px;
  border-right: 1px solid #333;
}

.tick {
  position: absolute;
  right: 0;
  height: 1px;
  background-color: #333;
}

.tick-label {
  position: absolute;
  right: 100%;
  transform: translateY(-50%);
  font-size: 12px;
}
</style>

交互功能增强

添加拖动和缩放功能,需结合事件处理:

methods: {
  handleWheel(e) {
    e.preventDefault();
    this.scale += e.deltaY * -0.01;
    this.scale = Math.max(0.5, Math.min(2, this.scale));
  },
  startDrag(e) {
    this.dragStartX = e.clientX;
    this.dragStartScroll = this.$refs.ruler.scrollLeft;
    document.addEventListener('mousemove', this.onDrag);
    document.addEventListener('mouseup', this.stopDrag);
  },
  onDrag(e) {
    const dx = e.clientX - this.dragStartX;
    this.$refs.ruler.scrollLeft = this.dragStartScroll - dx;
  }
}

动态响应式调整

mounted中添加窗口大小监听:

mounted() {
  window.addEventListener('resize', this.calculateRulerLength);
},
beforeDestroy() {
  window.removeEventListener('resize', this.calculateRulerLength);
}

注意事项

  1. 刻度密度需根据容器宽度动态计算,避免渲染过多DOM节点
  2. 对于长尺子考虑使用虚拟滚动技术优化性能
  3. 触摸设备需额外添加触摸事件支持
  4. 数值显示格式可通过过滤器自定义

以上实现可根据实际需求调整刻度间隔、样式和交互行为。对于专业设计工具级别的尺子,可能需要结合Canvas或SVG实现更高性能的渲染。

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

相关文章

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Token…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身: &…

vue实现eventbus

vue实现eventbus

Vue 中实现 EventBus 在 Vue 中,EventBus 是一种跨组件通信的机制,尤其适用于非父子组件之间的数据传递。以下是实现 EventBus 的几种方法: 方法一:使用 Vue 实例…

vue实现计数

vue实现计数

Vue 实现计数功能 在 Vue 中实现计数功能可以通过多种方式完成,以下是几种常见的方法: 使用 Vue 数据绑定和事件监听 通过 Vue 的数据绑定和事件监听,可以轻松实现计数功能。以下是一个简…

vue实现word文档实现预览

vue实现word文档实现预览

在Vue中实现Word文档预览可以通过多种方式实现,以下是几种常见的方法: 使用mammoth.js库 mammoth.js是一个将Word文档(.docx)转换为HTML的JavaScript库,…

vue实现接口轮询

vue实现接口轮询

实现接口轮询的基本方法 在Vue中实现接口轮询通常通过setInterval或setTimeout结合异步请求完成。以下是一个基础实现示例: data() { return { poll…