千家信息网

Angular+rxjs如何实现拖拽功能

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"Angular+rxjs如何实现拖拽功能"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Angular+rxjs如何实现拖拽功能"文章能帮助大
千家信息网最后更新 2026年11月02日Angular+rxjs如何实现拖拽功能

这篇文章主要介绍"Angular+rxjs如何实现拖拽功能"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Angular+rxjs如何实现拖拽功能"文章能帮助大家解决问题。

页面中 video 标签,当滚动高度超过其位置之后,将其设置为可在可视区域自由拖拽。

一个不错的 Idea,如果你使用 Angular 的 @angular/cdk/drag-drop 可以轻松实现,但是我们这里不使用工具。

好吧,我们来分析下实现的思路:

  • 页面滚动高度大于视频所在的位置:那么就是视频的 bottom 值相对可视窗口的值要小于0,我们需要设定一个包裹 video 标签的 div 方便计算,其高度是原设定 video 的高度。即元素脱离原文档布局

  • video 元素可以拖拽,那么其定位需要被改变为 fixed

  • video 元素在可视区内自由拖动,那么需要对其 top, left 值进行限定

所以我们设定下面的 demo 布局:

有下面这些预定的样式:

html, body {  height: 6000px;  background-color: #fff;}
#anchor {  height: 360px;  width: 100%;  background-color: #F0F0F0;}.video {  width: 640px;  height: 360px;  margin: 0 auto;  background-color: black;    &.video-fixed {     position: fixed;    top: 10px;    left: 10px;    width: 320px;    height: 150px;    cursor: all-scroll;    .masker {         display: none;      }    &:hover {      .masker {        display: block;        position: absolute;        width: 100%;        height: 100%;        background-color: rgba(0, 0, 0, 0.8);        z-index: 2;      }    }  }}

这里还引入了 rxjs 来操作。

元素脱离原文档布局

刚才已经分析了 video 元素脱离文档的临界调节了:

video 的外 div,即 #anchor 元素的相对视图的 bottom < 0。所以我们有:

@ViewChild('anchor', { static: false })public anchor!: ElementRef;@ViewChild('video', { static: false })public video!: ElementRef;public scroll!: any;ngAfterViewInit(): void {  this.scroll = fromEvent(document, 'scroll');  this.scrollFn();}// 页面滚动public scrollFn() {  this.scroll    .pipe(      debounceTime(50), // 防抖      map(() => this.anchor.nativeElement.getBoundindClientRect().bottom < 0)    )    .subscribe((flag: boolean) => {      // 添加和移除样式      if(flag) {        this.video.nativeElement.classList.add('video-fixed');      } else {        this.video.nativeElement.classList.remove('video-fixed');      }    })}

先获取 anchor 元素对象,监听页面对象 document 滚动(我们这里加入了防抖函数优化),当 bottom < 0 的时候,将相关的样式 video-fixed 添加给 video 。

元素拖拽

接下来就是实现 video 元素的拖拽。这里我们要监听 video 元素的三个事件,分别是鼠标按下 mousedown,鼠标移动 mousemove 和鼠标抬起 mouseup。

// demo.component.tspublic mouseDown!: any;public mouseUp!: any;public mouseMove!: any;ngAfterViewInit(): void {  this.mouseDown = fromEvent(this.video.nativeElement, 'mousedown'); // 目标元素按下,即 video  this.mouseMove = fromEvent(document, 'mousemove'); // 元素在文档内移动  this.mouseUp = fromEvent(document, 'mouseup'); // 鼠标抬起    this.moveFn()}// 目标元素移动public moveFn() {  this.mouseDown    .pipe(      filter(() => this.video.nativeElement.classList.contains('video-fixed')),      map(() => this.mouseMove.pipe(        throttleTime(50), // 节流        takeUntil(this.mouseUp)      )),      // concatAll 顺序接受上游抛出的各个数据流作为它的数据, 若前面的数据流不能同步的完结,它会暂存后续数据流,当前数据流完成后它才会订阅后一个暂存的数据流      concatAll(),      withLatestFrom(this.mouseDown, (move:any, down:any) => {        return {          x: this.validValue(move.clientX - down.offsetX, window.innerWidth - this.video.nativeElement.offsetWidth, 0),          y: this.validValue(move.clientY - down.offsetY, window.innerHeight - this.video.nativeElement.offsetHeight, 0)        }      })    )    .subscribe((position: {      x: number,      y: number    }) => {      this.video.nativeElement.style.top = position.y + 'px';      this.video.nativeElement.style.left = position.x + 'px';    })}// 校验边界值public validValue = (value:number, max:number, min: number) => {  return Math.min(Math.max(value, min), max)}

我们监听目标元素(filter 函数)被鼠标按下,然后鼠标可以在 document 范围内移动(这里用节流函数优化了下),直到监听到鼠标抬起。在移动的过程中,计算目标元素的相对可视窗口左侧和顶部的距离,将值赋予到 left 和 top。

这里的计算 move.clientX - down.offsetX, window.innerWidth - this.video.nativeElement.offsetWidth,相关的概念也许你不是很清楚,不过没关系,上面的内容,理解思路即可。

关于"Angular+rxjs如何实现拖拽功能"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

元素 鼠标 数据 数据流 移动 文档 目标 页面 高度 功能 函数 布局 样式 知识 监听 自由 位置 内容 对象 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 山东特亿宝互联网科技有限公司 金融科技创新监管互联网金融 互联网医疗科技 智网互联网科技 汇久创客互联网科技 碳银互联网科技有限公司 长亮科技 互联网金融 华中科技有哪些互联网大佬 江阴互联网智能科技产品进口 996高科技互联网公司 华夏恒生科技与互联网科技 互联网科技大赛获奖感言 互联网时代的科技公司 沐思想互联网科技有限公司 互联网相关科技技术 卡尔迅互联网科技有限公司 萌小萌互联网科技河南有限公司 科技和互联网行业的特点 安徽九吞吴互联网科技有限公司 互联网科技行业发展 科技互联网公司装修 互联网科技未来 中正互联网科技招聘 哈尔滨秒房互联网科技有限公司 受益于互联网科技的高速发展 消费医药和互联网科技 深圳育鹏互联网科技有限公司招聘 互联网科技包装股份有限公司上市 互联网的科技体现在哪里
0