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>
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A1 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
honkun61 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19912 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net