angular 拖拽,angular可视化拖拽

  angular 拖拽,angular可视化拖拽

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

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

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

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

  一个不错的想法,如果你使用有角的的@角度/CDK/落差可以轻松实现,但是我们这里不使用工具。【相关教程推荐: 《angular教程》 】

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

  页面滚动高度大于视频所在的位置:那么就是视频的底部值相对可视窗口的值要小于0,我们需要设定一个包裹录像标签的差异方便计算,其高度是原设定录像的高度。即元素脱离原文档布局录像元素可以拖拽,那么其定位需要被改变为固定视频元素在可视区内自由拖动,那么需要对其顶部,左侧值进行限定所以我们设定下面的演示布局:

  div id=锚 #锚

  div class= video id= video #视频

  div class=masker/div

  视频宽度=100% 高度=100% 控件海报=assets/poster.png

  源src=./资产/演示。 MP4 type= video/MP4 /

  您的浏览器不支持。

  /视频

  /div

  /div有下面这些预定的样式:

  !-样式。scss -

  !-这部分需要放在全局样式中-

  html,正文{

  高度:6000像素

  背景色:# fff

  }!-演示组件-scss-

  #锚{

  高度:360像素

  宽度:100%;

  背景色:# F0F0F0

  }。视频{

  宽度:640像素

  高度:360像素

  边距:0自动;

  背景色:黑色;

  !-视频已修复布局的样式,默认布局中是没有的-。视频-固定{

  位置:固定;

  top:10px;

  左:10px

  宽度:320像素

  高度:150像素

  光标:全滚动;面具人

  显示:无;

  }

  :悬停{。面具人

  显示:块;

  位置:绝对;

  宽度:100%;

  身高:100%;

  背景色:rgba(0,0,0,0.8);

  z指数:2;

  }

  }

  }

  }这里还引入了rxjs来操作。

  元素脱离原文档布局

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

  video的外div,即#锚元素的相对视图的底部0 .所以我们有:

  @ViewChild(anchor ,{ static: false })

  公众主播!ElementRef

  @ViewChild(video ,{ static: false })

  公开视频!ElementRef

  公共卷轴!任何;

  ngafterviewit():void {

  this.scroll=fromEvent(document, scroll );

  这个。滚动fn();

  }

  //页面滚动

  公共scrollFn() {

  这。卷轴。管道(

  去抖时间(50),//防抖

  地图(()=这个。锚。原生元素。getboundindclientrect().底部0)

  )。subscribe((flag: boolean)={

  //添加和移除样式

  如果(标志){

  这个。视频。原生元素。班级名单。添加(视频-固定);

  }否则{

  这个。视频。原生元素。班级名单。移除(“视频-固定”);

  }

  })

  }

  先获取锚元素对象,监听页面对象文件滚动(我们这里加入了防抖函数优化),当底部0的时候,将相关的样式视频-固定添加给视频。

  元素拖拽

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

  //demo.component.ts

  公共鼠标按下!任何;

  公共鼠标!任何;

  公共鼠标移动!任何;

  ngafterviewit():void {

  这个。mousedown=from event(this。视频。本机元素,“mousedown”);//目标元素按下,即录像

  这个。mousemove=from event(文档, mousemove );//元素在文档内移动

  这个。mouseup=from event(文档, mouseup );//鼠标抬起

  this.moveFn()

  }

  //目标元素移动

  公共移动Fn() {

  this.mouseDown。管道(

  过滤器(()=这个。视频。原生元素。班级名单。包含(视频-固定),

  map(()=this.mouseMove.pipe(

  ThrottleTime(50),//节流

  takeUntil(this.mouseUp)

  )),

  //concatAll按顺序接受从上游抛出的每个数据流作为其数据。如果前一个数据流不能同步完成,它会临时存储后续数据流,只有当前数据流完成后,它才会订阅最后一个临时存储的数据流。

  concatAll(),

  withLatestFrom(this.mouseDown,(move:any,down:any)={

  返回{

  x:this . valid value(move . clientx-down . offsetx,window . inner width-this . video . native element . offsetwidth,0),

  y:this . valid value(move . clienty-down . offsety,window . inner height-this . video . native element . offset height,0)

  }

  })

  )。订阅((职位:{

  x:数字,

  y:数字

  })={

  this . video . native element . style . top=position . y px ;

  this . video . native element . style . left=position . x px ;

  })

  }

  //检查边界值

  public validValue=(value:number,max:number,min: number)={

  返回Math.min(Math.max(value,min),max)

  }我们监测到目标元素(过滤函数)被鼠标按下,然后鼠标可以在document范围内移动(这里是节流函数优化),直到鼠标抬起。在移动的过程中,计算目标元素的可见窗口的左侧和顶部之间的距离,并将值赋给left和top。

  这里的计算是move.clientx-down.offsetx,window . inner width-this . video . native element . offsetwidth相关概念你可能不是很清楚,但没关系。了解以上内容即可。相关知识点会在后面的文章中介绍。

  最后,我们得到以下结果。

  [结束]

  有关编程的更多信息,请访问:编程视频!Angular rxjs就是这么实现拖拽功能的。更多详情请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: