久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

淺析Angular+rxjs怎么實現拖拽功能?

Angular+rxjs怎么實現拖拽功能?下面本篇文章給大家介紹一下Angular 結合 rxjs 實現拖拽的方法,希望對大家有所幫助!

淺析Angular+rxjs怎么實現拖拽功能?

在之前的文章,我們學習了 Angular 中自定義 Video 操作,沒有度過的讀者可先了解。

現在有這么一個需求,你會怎么實現呢?

頁面中 video 標簽,當滾動高度超過其位置之后,將其設置為可在可視區域自由拖拽。

一個不錯的 Idea,如果你使用 Angular@angular/cdk/drag-drop 可以輕松實現,但是我們這里不使用工具。【相關教程推薦:《angular教程》】

好吧,我們來分析下實現的思路:

  • 頁面滾動高度大于視頻所在的位置:那么就是視頻的 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.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 范圍內移動(這里用節流函數優化了下),直到監聽到鼠標抬起。在移動的過程中,計算目標元素的相對可視窗口左側和頂部的距離,將值賦予到 lefttop

這里的計算 move.clientX - down.offsetX, window.innerWidth - this.video.nativeElement.offsetWidth,相關的概念也許你不是很清楚,不過沒關系,上面的內容,理解思路即可。相關的知識點會在接下來的文章介紹。

最后,我們得到的效果如下

淺析Angular+rxjs怎么實現拖拽功能?

【完】

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
亚洲制服少妇| 免费久久久久久久久| 久久影院一区| 欧美日中文字幕| 国产免费av一区二区三区| 婷婷综合网站| 国产精品美女久久久浪潮软件| 欧美色图国产精品| 亚洲欧美高清| 日本综合精品一区| 91亚洲精品视频在线观看| 欧美一区二区三区久久精品| 欧美天堂一区| 日韩不卡一区| 欧美精品一区二区久久| 亚洲一区欧美二区| 亚洲一区二区三区四区电影| 国产乱码精品一区二区亚洲| 综合日韩av| 日韩在线短视频| 在线成人直播| 欧美久久久网站| 日韩免费高清| 亚欧洲精品视频在线观看| 精品一区二区三区中文字幕在线| 天堂日韩电影| 欧美一区精品| 久久精品99久久无色码中文字幕| 亚洲精品美女91| 欧美天堂视频| 婷婷综合福利| 香蕉久久精品| 久久婷婷国产| 蜜臀91精品一区二区三区| 国产日韩视频在线| 婷婷成人基地| 黄色网一区二区| 亚洲精品乱码| 日韩在线综合| 丝袜美腿一区| 欧美精品激情| 久久国产三级精品| 国产精品嫩草99av在线| 久久久免费人体| 日韩精品欧美成人高清一区二区| 99久久婷婷| 国产suv精品一区| 日本午夜精品久久久久| 美女精品网站| 久久国产免费| 国产精品久久久久久久免费观看| 日韩动漫一区| 蜜臀久久99精品久久久久宅男| 欧美国产91| 亚洲作爱视频| 不卡视频在线| 欧美亚洲激情| 国产综合视频| 99热免费精品| 99在线观看免费视频精品观看| 久久久五月天| 亚洲成a人片| 日韩精品首页| 激情欧美一区二区三区| 国产精品久久久久久久免费观看| 国产精品久久久久久久久久齐齐 | 亚洲大全视频| 国产一区欧美| 国产亚洲在线观看| 国产免费成人| 亚洲精品动态| 国产欧美一区二区色老头| 国产亚洲一区二区三区啪| 国产精品中文字幕制服诱惑| 亚洲一区黄色| 日本成人手机在线| 国产精品宾馆| 日韩av一级| 免费不卡中文字幕在线| 蜜桃视频一区二区三区在线观看 | 欧美偷窥清纯综合图区| 国产福利一区二区三区在线播放| 免费在线欧美黄色| 国产91一区| 日韩和欧美一区二区三区| 欧美激情一区| 女人av一区| 午夜国产精品视频免费体验区| 亚洲人妖在线| 国产videos久久| 99xxxx成人网| 国产精品s色| 国产视频久久| 久久影院一区二区三区| 午夜欧美在线| 国产日韩在线观看视频| 在线日韩av| 久久99蜜桃| 综合激情视频| 久草免费在线视频| 亚洲一区av| 日韩av首页| 欧美一区网站| 三级在线看中文字幕完整版| 免费成人在线视频观看| 国产videos久久| 日本成人在线一区| 激情91久久| 成人看片网站| 激情综合婷婷| 国产精品大片免费观看| 亚洲日本国产| 免费日韩av| 欧美精品羞羞答答| 久久精品国语| 欧美国产小视频| 麻豆传媒一区二区三区| 视频一区视频二区中文字幕| 91亚洲国产| 国产成年精品| 国产aⅴ精品一区二区三区久久| 日本不卡一区二区三区| 日韩精品一二区| 久久都是精品| 亚洲视频播放| 亚洲影院天堂中文av色| 蜜臀精品一区二区三区在线观看 | 日韩欧美国产精品综合嫩v| 日本成人手机在线| 一本一道久久a久久| 国产婷婷精品| 一区二区三区四区精品视频| 亚洲免费激情| 久久国产精品毛片| 日本一区二区三区视频在线看| 亚洲精品一级| 国产精品一区二区三区av麻| 国产精品蜜月aⅴ在线| 美女视频黄 久久| 国产欧洲在线| 亚洲天堂免费电影| 亚洲一区日韩在线| 蜜臀久久99精品久久久画质超高清| 石原莉奈在线亚洲二区| 91亚洲精品视频在线观看 | 久久精品三级| 日韩不卡一区| 色网在线免费观看| 99re国产精品| 欧美一区91| 日韩欧美一区二区三区在线观看| 欧美日韩一区二区三区视频播放| 国产视频一区免费看| 日韩在线视频一区二区三区| 国产精品流白浆在线观看| 亚洲天堂免费电影| 亚洲人亚洲人色久| 欧美日韩精品免费观看视完整| 亚洲在线一区| 国产不卡精品在线| 天堂成人免费av电影一区| 国产精品亲子伦av一区二区三区| 久久精品二区三区| 久久激五月天综合精品| 日本精品不卡| 91精品国产自产在线丝袜啪| 亚洲一区资源| 日韩成人一级| 欧美大黑bbbbbbbbb在线| 久久精品av麻豆的观看方式| 国产一区二区三区自拍| 国内精品亚洲| 欧美精品三级在线| 国产模特精品视频久久久久| 久久只有精品| 国产精品丝袜在线播放| 国产亚洲在线观看| 久久久久美女| 日韩一区自拍| 91麻豆国产自产在线观看亚洲| 日本v片在线高清不卡在线观看| 午夜欧美精品| 日本欧美不卡| 美女免费视频一区| 中文字幕av亚洲精品一部二部 | 免费欧美一区| 神马久久午夜| 国产不卡精品在线| 国产精品久久久久久久久久妞妞 | 涩涩涩久久久成人精品| 亚洲深夜av| 亚洲一区亚洲| 精品在线91| 久久久蜜桃一区二区人| 中文字幕成在线观看| 亚洲va中文在线播放免费| 午夜av成人| 亚洲国产成人精品女人| 亚洲少妇在线| 亚洲区第一页|