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

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麻豆视频福利视频| 人人妻人人澡人人爽人人老司机| 日本人妻中文字幕在线一区| 一区二区蜜桃在线观看 | 国产免费成人午夜免费视频| 欧美一区二区高清不卡| 麻豆精品国产一区二区91| 日本一区二区精美视频| 欧美日韩一区二区三区四区在线观看 | 99久久免费精品老色| 亚洲一区二区视频在线观看免费| 人妻中字幕出轨中文字幕| 日本东京热不卡一区二区| 日本又色又爽又黄的观看| 日韩精品视频一二三区| 人妻少妇系列一区二区| 成人国产视频免费观看| 婷婷丁香六月激情综合| 91黑丝国产在线播放| 日本免费一区二区三区手机在线| 日本韩国一级黄色免费| 精品人妻一区两区三区| 欧美一级特黄大片做受农村| 亚洲人午夜射精精品日韩| 日本成人午夜电影网站| 岛国大片日韩在线观看| 天天日夜夜操人人干人人插 | 麻豆黄片在线免费观看| 日本亚洲一级中文字幕| 国产精品—色哟哟视频| 亚洲综合色一区二区三区四区| 精品一区二区三区女同| 亚洲国产精品自拍视频| 国产亚洲精品热视频在线观看 | 日韩免费毛片在线观看| 中文有码人妻字幕在线| 久久精品视频视频视频| 亚洲精品免费一区二区三区| 麻豆视传媒短视频网站免费| 五月天丁香婷婷一区二区| 久久精品视频就在久久|