欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Angular+rxjs如何實現(xiàn)拖拽功能

這篇文章主要介紹“Angular+rxjs如何實現(xiàn)拖拽功能”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Angular+rxjs如何實現(xiàn)拖拽功能”文章能幫助大家解決問題。

成都創(chuàng)新互聯(lián)公司是一家朝氣蓬勃的網站建設公司。公司專注于為企業(yè)提供信息化建設解決方案。從事網站開發(fā),網站制作,網站設計,網站模板,微信公眾號開發(fā),軟件開發(fā),微信小程序,10年建站對成都服務器租用等多個方面,擁有豐富的網站維護經驗。

Angular+rxjs如何實現(xiàn)拖拽功能

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

一個不錯的 Idea,如果你使用 Angular@angular/cdk/drag-drop 可以輕松實現(xiàn),但是我們這里不使用工具。

好吧,我們來分析下實現(xiàn)的思路:

  • 頁面滾動高度大于視頻所在的位置:那么就是視頻的 bottom 值相對可視窗口的值要小于0,我們需要設定一個包裹 video 標簽的 div 方便計算,其高度是原設定 video 的高度。即元素脫離原文檔布局

  • video 元素可以拖拽,那么其定位需要被改變?yōu)?fixed

  • video 元素在可視區(qū)內自由拖動,那么需要對其 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 元素脫離文檔的臨界調節(jié)了:

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 元素對象,監(jiān)聽頁面對象 document 滾動(我們這里加入了防抖函數優(yōu)化),當 bottom < 0 的時候,將相關的樣式 video-fixed 添加給 video 。

元素拖拽

接下來就是實現(xiàn) video 元素的拖拽。這里我們要監(jiān)聽 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), // 節(jié)流
        takeUntil(this.mouseUp)
      )),
      // concatAll 順序接受上游拋出的各個數據流作為它的數據, 若前面的數據流不能同步的完結,它會暫存后續(xù)數據流,當前數據流完成后它才會訂閱后一個暫存的數據流
      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)
}

我們監(jiān)聽目標元素(filter 函數)被鼠標按下,然后鼠標可以在 document 范圍內移動(這里用節(jié)流函數優(yōu)化了下),直到監(jiān)聽到鼠標抬起。在移動的過程中,計算目標元素的相對可視窗口左側和頂部的距離,將值賦予到 lefttop。

這里的計算 move.clientX - down.offsetX, window.innerWidth - this.video.nativeElement.offsetWidth,相關的概念也許你不是很清楚,不過沒關系,上面的內容,理解思路即可。

關于“Angular+rxjs如何實現(xiàn)拖拽功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

當前題目:Angular+rxjs如何實現(xiàn)拖拽功能
當前鏈接:http://aaarwkj.com/article0/jjgcoo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化品牌網站建設、網站設計、網站內鏈、網站設計公司關鍵詞優(yōu)化

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網站建設網站維護公司
亚洲免费一级黄色录像片| 亚洲日本韩国美女二区| 欧美色精品人妻视频在线| 欧美一区二区欧美精品 | 精品国产一区=区三区乱码| 日韩在线中文字幕精品| 国产视频一区二区三区网| 欧美黄片网站免费观看| 蜜桃精品国产一区二区三区| 黄色欧美在线观看免费| 青青草国产精品一区二区| 91薄丝激情在线播放| av资源天堂第一区第二区第三区| 女性裸体无遮挡啪啪网站| 国产亚洲精品视频中文字幕| 亚洲人妻不卡一区二区| 亚洲精品熟女国产中文| 日韩夫妻性生活免费视频| 加勒比在线观看欧美一区| 高清白嫩学生自拍视频| 蜜桃成人一区二区三区| 国产女主播高清在线视频| 日韩日韩毛片日韩毛片 | 极品丝袜美腿一区二区| 中文字幕乱码熟女人妻视频| 国产精品视频不卡免费看| 久久久亚洲精品中文字幕蜜桃| 最新国产精品欧美激情| 亚洲va在线va天堂va在线| 亚洲精品日韩一区二区| 九九视频666免费| 免费国产成人在线视频 | 国产精品一区二区三区欧美| 亚洲成人免费电影观看| 欧美成人精品三级一二| 天堂av一区二区三区| 亚欧乱色熟女一区二区三区| 久久综合色爱综合欧美| 日韩中文字幕乱码卡一| 日本韩国亚洲三级在线| 亚洲一区二区三区免费观看视频|