• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 浅析Angular+rxjs怎么实现拖拽功能?

浅析Angular+rxjs怎么实现拖拽功能?

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了Angular+rxjs,Angular拖拽功能等相关知识,希望对您有所帮助

Angular+rxjs怎么实现拖拽功能?下面本篇文章给大家介绍一下Angular 结合 rxjs 实现拖拽的方法,希望对大家有所帮助!


浅析Angular+rxjs怎么实现拖拽功能?


在之前的文章,我们学习了 Angular 中自定义 Video 操作,没有度过的读者可先了解。

现在有这么一个需求,你会怎么实现呢?

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

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

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

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

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

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

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

<div id="anchor" #anchor>  <div class="video" id="video" #video>    <div class="masker"></div>    <video width="100%" height="100%" controls poster="assets/poster.png">      <source src="../assets/demo.mp4" type="video/mp4" />      Your browser does not support.    </video>  </div></div>

有下面这些预定的样式:

<!-- styles.scss --><!-- 这部分需要放在全局样式中 -->html, body {  height: 6000px;  background-color: #fff;}
<!-- demo.component.scss --> #anchor {  height: 360px;  width: 100%;  background-color: #F0F0F0;} .video {  width: 640px;  height: 360px;  margin: 0 auto;  background-color: black;  <!-- video fixed 布局的样式,默认布局中是没有的 -->  &.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');      }    })}


浅析Angular+rxjs怎么实现拖拽功能?


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


元素拖拽

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

// demo.component.ts public 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.va
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅析Angular+rxjs怎么实现拖拽功能?

相关文章

  • PHP如何将数组下标去掉
  • PhotoShop CS6 3D功能制作3D立体文字效果教程
  • 关于vue-cli4+laravel8使用JWT登录及token验证
  • 最新消息!WordPress 5.8开始将不再支持IE11浏览器
  • PHP中preg_match函数使用详解(附代码实例)
  • dede 安全设置集合!dede站长必看!
  • 柒比贰主题网格风格四缩略图对齐样式代码
  • 详解在TP中怎么引入ThinkWechat.php并打印日志
  • 详解如何提升WordPress打开前后台的速度
  • PS绘制苹果APP应用金属相机图标

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 简单的提高seo排名的方法:依靠数量庞大的反向
    • 微信小程序选择图片和放大预览图片功能
    • 如何优化css expression性能
    • 浅谈conda安装nodejs版本过低问题的解决方法
    • 如何解决php md5生成16位出现乱码问题
    • PHP读取文件的两种方式:file_get_contents和fread(附代码实例)
    • 避坑!Laravel数据库迁移功能的一个坑
    • 浅谈小程序中页面间传值的2种方法
    • Photoshop制作苹果语音助理Siri图标动画教程
    • 屏蔽无用的WordPress默认小工具

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有