vue3,使用v-draggable拖动时卡顿的问题

在使用v-draggable实现拖拽功能时,发现一个问题,如果我拖拽的div里面是文字时,拖拽时就很流畅(如下图左);但是我div里面使用img 时,拖拽的时候就会很发现很明显的卡顿(如下图右)。

原因去网上搜了下,发现比较符合的就是一下几点:

1、图片加载性能问题

  • <img> 加载未优化(如大尺寸图片、未压缩、未使用懒加载)。

  • 浏览器需要额外计算图片的 布局(Layout)和渲染(Paint),导致拖动时帧率下降(FPS 降低)。

2、浏览器重绘(Repaint)开销

  • 图片比文本更复杂,拖动时浏览器需要 频繁重绘(Repaint)。
  • 如果图片是 非矢量图(如 PNG/JPG),重绘成本更高。

解决方案:

pointer-events: none:让鼠标事件穿透图片,直接由外层的 div 处理拖动,减少事件计算。

完整代码:

javascript 复制代码
<template>
  <div class="box">
    <!-- 左图,文字 -->
    <div
      v-draggable="{
        bounds: 'body',
      }"
      class="draggable-class"
    >
      拖动
    </div>
    <!-- 右图,图片 -->
    <div
      v-draggable="{
        bounds: 'body',
      }"
      class="draggable-two"
    >
      <img
        :src="图片地址"
        alt="图片"
      />
    </div>
  </div>
</template>

<style lang="scss" scoped>
.box {
  width: 100%;
  height: 100%;
  background-color: #fff;

  .draggable-class {
    position: fixed;
    left: 48px;
    top: 100px;
    width: 50px;
    height: 50px;
    line-height: 50px;
    border-radius: 50%;
    font-weight: bold;
    background: #333;
    color: #fff;
    text-align: center;
    border-radius: 100%;
    box-shadow: 0 2px 4px 0 rgba(255, 133, 0, 25%);
  }

  .draggable-two {
    position: fixed;
    left: 200px;
    top: 100px;
    width: 50px;
    height: 50px;
    line-height: 50px;
    border-radius: 50%;
    img {
      width: 100%;
      height: 100%;
      pointer-events: none;
    }
  }
}
</style>
相关推荐
Csvn1 分钟前
Monorepo
前端
Csvn4 分钟前
流水线
前端
Csvn13 分钟前
微前端架构
前端
Linux-lucky2 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
风骏时光牛马4 小时前
生成一个移动端标题,只需要一个标题,不需要其他的任何文本。
前端
IT_陈寒4 小时前
Redis雪崩把我坑惨了,这是5年经验的教训
前端·人工智能·后端
SameX5 小时前
HarmonyOS ArkUI List 的侧滑删除 用 ListItem 的 swipeAction + endIcon 的做法
前端
usdoc文档预览7 小时前
USDOC系列之PPT文件在线编辑-VUE前端实现在线浏览器在线编辑PPT文档
前端·vue.js·编辑器·office365·ppt在线编辑·office文件在线编辑·文件在线编辑
Java小卷7 小时前
面向 schema 编程,轻松搞定 Element 虚拟化表格复杂应用场景
vue.js·低代码·element
用户2705077725247 小时前
Agent 调工具卡住?3 种超时与取消策略实测对比
前端