前端Vue3+TS实现视频放大缩小,放大后实现视频的拖动+拖动边框限制

这篇具有很好参考价值的文章主要介绍了前端Vue3+TS实现视频放大缩小,放大后实现视频的拖动+拖动边框限制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近实现了一个新的需求,大体内容是要对所播放的视频做一个放大缩小的处理,同时在视频放大的同时要实现视频的一个拖拽,拖拽的同时,要对视频拖动的范围作出一个限制,下面来看看我的一个实现的思路。

技术栈:Vue3.2 + TS文章来源地址https://www.toymoban.com/news/detail-823735.html

1.放大缩小采用的形式是什么?
/1.肯定不能单纯的采用px放大,这样会出现视频放大的时候位置发生变动
/2.采用scale放大,这样每次放大都是视频的中心点
2.拖动实现
/1.当鼠标按下和视频已经放大之后,才允许用户拖动
/2.同时需要对视频拖动的范围作出限制
/3.按钮抬起的时候,需要把拖动取消掉,同时拖动限制离开范围也需要把按钮给取消掉
3.实现
//页面结构
//给外层div绑定mouseleave,给视频绑定鼠标抬起,按下,移动相关事件,同时视频放大之后,绑定动态的class
<div class="videoBox" @mouseleave="endDrag">
   <video
     ref="videoRef"
     id="customVideo"
     class="video-js vjs-big-play-centered"
     @mouseup="endDrag" 
     @mousedown="dragging" 
     @mousemove="handleDrag"
     :class="{'videoPoint': scale > 1}" 
     :style="{ width: '100%', height: '100%' }">
    </video>
</div>
//点击事件
//点击事件绑定一个就可以,同时传递不同的参数,来进行控制
<a-tooltip content="放大">
  <a-button :style="{ color: 'red' }" @click="scaleUp(1)">
    放大
  </a-button>
</a-tooltip>
<a-tooltip content="缩小">
  <a-button :style="{ color: 'red' }" @click="scaleUp(-1)">
    缩小
  </a-button>
</a-tooltip>
<a-tooltip content="还原">
  <a-button :style="{ color: 'red' }" @click="scaleUp(0)">
    还原
  </a-button>
</a-tooltip>
//业务逻辑实现
// 1.视频放大缩小逻辑实现
// 视频放大,缩小,还原
const scale = ref(1) //控制视频放大缩小倍数
const videoRef = ref(null)//定义ref,拿到video标签相关的属性
const scaleUp = (flag) => {
  // 根据flag的值,对视频进行放大缩小和还原的处理
  switch (flag) {
    case 1:
      if (scale.value.toFixed(2) >= 2.5) {//js的精度误差,所以加了一个toFixed保留两位小数
        return
      }
      scale.value += 0.1
      videoRef.value.style.transform = `scale(${scale.value})`;
      break;
    case -1:
      if (scale.value.toFixed(2) <= 0.1) {
        return
      }
      scale.value -= 0.1
      videoRef.value.style.transform = `scale(${scale.value})`;
      break;
    default:
      resetPosition()
  }
}
//还原:还原他的缩放倍数,还原拖动位置
const resetPosition = () => {
  videoRef.value.style.transform = `scale(1)`;
  scale.value = 1
  videoPosition.x = 0;
  videoPosition.y = 0;
  videoRef.value.style.left = '0px';
  videoRef.value.style.top = '0px';
}
2.视频拖动
这一块是比较困难的,需要把详细的思路理清楚
//定义鼠标的起始点击位置
const dragStartX = ref(0)
const dragStartY = ref(0)
//控制鼠标是否按下
const isClick = ref(false)
//控制视频位置的变化
const videoPosition = reactive({
  x:0,
  y:0
})
// 判断是否可以拖动 满足放大和按下,才可拖动,使用计算属性控制
const isDragging = computed(() => {
  return scale.value > 1 && isClick.value ? true :false
});
//鼠标按下
const dragging = (e) => {
  isClick.value = true
  dragStartX.value = e.clientX - videoPosition.x;
  dragStartY.value = e.clientY - videoPosition.y;
  window.addEventListener('mouseup', endDrag);
}
let containerRect = null
const handleDrag = (e) => {
  if (isClick.value) {
    const {w,h} = getVideoSize()
    videoPosition.x = e.clientX - dragStartX.value;
    videoPosition.y = e.clientY - dragStartY.value;
    // 限制取极值
    videoPosition.x = Math.min(Math.max(-w, videoPosition.x), w);
    videoPosition.y = Math.min(Math.max(-h, videoPosition.y), h);
  }
  // 满足点击和放大,才进行拖动
  if (isDragging.value) {
    videoRef.value.style.left = `${videoPosition.x}px`;
    videoRef.value.style.top = `${videoPosition.y}px`;
  }
}

const getVideoSize = () => {
  containerRect = videoRef.value.getBoundingClientRect()
  const { width, height } = containerRect
  const w = width / 3
  const h = height  / 2
  console.log(width);
  return {w,h}
}

//取消拖动
const endDrag = () => {
  isClick.value = false
  window.removeEventListener('mouseup', endDrag);
};

到了这里,关于前端Vue3+TS实现视频放大缩小,放大后实现视频的拖动+拖动边框限制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 图片放大缩小、拖拽功能(自定义指令)

    效果 自定义 拖拽指令 vDrag.js 参考来源 https://github.com/sunzsh 使用 自定义 拖拽指令 写法二 (带传参及回调写法) vDrag.js 使用 自定义 缩放指令 vWheelScale.js 根据项目需要 我指令加了 动态参数 及 回调函数 不需要自行修改 使用 自定义 缩放指令 写法二(带传参及回调写法)

    2024年02月01日
    浏览(34)
  • element ui dialog可拉伸放大缩小和拖动

    鼠标放到对话框头部可以拖动对话框、双击头部可以放大对话框 鼠标放到对话框左右两侧可以拖动对话框宽度、放到下边可以拖动对话框高度、放到右下角高度宽度可以同时缩放 或者单独写一个js将Vue.directive(\\\'dialogDrag\\\', { ………… } )中的代码放入其中如:     这样就可以,

    2024年02月15日
    浏览(26)
  • 【[Qt]基于QGraphicsView的图像显示控件,支持放大、缩小、鼠标拖动】

    ImageViewer.h文件 ImageViewer.cpp 文件 具体使用代码如下 1、初始化类对象,并加入界面布局中 2、打开图像,并加载到控件中 3、从控件中卸载图片 源码链接:https://download.csdn.net/download/xiaohuihuihuige/87239431 百度云: 链接:https://pan.baidu.com/s/1W-KUlIKUFAktUKFin63N0g 提取码:4g8a

    2024年02月11日
    浏览(38)
  • uniapp图片放大缩小预览,并支持图片拖动附效果图

    效果图: 放大缩小和拖动是根据 movable-area 组件来实现的,小程序和uniapp都支持这个组件。 movable-area | 微信开放文档 微信开发者平台文档 https://developers.weixin.qq.com/miniprogram/dev/component/movable-area.html 实现思路: 默认显示默认大小的图片,点击图片执行yulan事件从而显示放大缩

    2024年02月11日
    浏览(26)
  • Unity打包窗口化放大、缩小、拖拽功能、无边框设置 C#

    Unity无边框设置、窗口化放大、缩小、拖拽 提示:PC端打包,测试尽量在打包后测试。 编辑器下测试会有意想不到的后果呦~~ [DllImport(\\\"user32.dll\\\")] 。 代码如下: 代码如下:注释详细,不懂就问哈 代码整体已贴出,功能亲测可用,欢迎学习交流。点赞+收藏+关注哦~

    2024年02月16日
    浏览(37)
  • 【vue3】js + css 实现 视频框选放大:局部细节放大、放大镜效果

    实现鼠标框选区域放大显示。 需求1:放大 按住鼠标左键不放 ——》向右侧拖动,框选出需要放大的区域后 ——》松开鼠标 ——》框选区域放大显示 需求2:还原 按住鼠标左键不放 ——》向左侧拖动,框选出随意大小的区域后 ——》松开鼠标 ——》视图显示大小还原 需求

    2024年02月03日
    浏览(41)
  • Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能

    前言 其实想要实现功能很简单,就是在一张图片上监听鼠标滑轮滚动的事件,然后根据上滚还是下滚实现图片的缩放。 效果: 注:该配图使用《漫画|有趣的了解一下赋值、深浅拷贝》文章图片,不存在侵权问题。 实现思路 在js中,onmousewheel是鼠标滑轮滚动事件,可以通过

    2024年02月01日
    浏览(37)
  • vue实现 图片拖拽及鼠标滚轮放大缩小

    效果: 代码实现

    2024年02月14日
    浏览(51)
  • 使用ExcelJS实现excel的前端导出功能(Vue3+TS)

    ExcelJS :读取,操作并写入电子表格数据和样式到 XLSX 和 JSON 文件。一个 Excel 电子表格文件逆向工程项目。 github中文文档:https://github.com/exceljs/exceljs/blob/master/README_zh.md  封装excel.ts工具文件 表格页面调用excel工具文件 

    2024年02月14日
    浏览(39)
  • 前端开发小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,实现 Pinia 的持久化,优化Pinia(仓库统一管理)

    ts 中使用 pinia 和 Vue3 基本一致,唯一的不同点在于,需要根据接口文档给 state 标注类型,也要给 actions 标注类型; 以下都是 组合式API 的写法, 选项式API 的写法大家可以去官网看看; Pinia; 持久化插件 - pinia-plugin-persistedstate; 目标文件: src/types/user.d.ts (这里以 user.d.t

    2024年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包