美文网首页
ionic4-指令实现ion-fab悬浮按钮的拖拽

ionic4-指令实现ion-fab悬浮按钮的拖拽

作者: 愤怒的阿昆达 | 来源:发表于2019-12-04 14:51 被阅读0次

ionic4-指令实现ion-fab悬浮按钮的拖拽

效果:
ion-fab拖拽效果图.gif
使用:
  <ion-fab style="width: 56px;height: 56px;" absolute-drag startRight="0" startTop="0" vertical="top" color="light" horizontal="end" slot="fixed">

    <ion-fab-button color="light" size="small">
      <ion-icon name="menu"></ion-icon>
    </ion-fab-button>

    <ion-fab-list>
      <ion-fab-button color="light" size="small" (click)="presentPopover1($event)">
        <ion-icon name="search" style="color:#3880ff"></ion-icon>
      </ion-fab-button>
      <ion-fab-button color="light" size="small" (click)="screenTrans()">
        <ion-icon name="phone-landscape" style="color:#3880ff"></ion-icon>
      </ion-fab-button>
    </ion-fab-list>

  </ion-fab>

在ion-fab加上:absolute-drag startRight="0" startTop="0"

实现:

1.新建指令:

ionic g directive directive/absoluteDrag

2.指令文件位置、代码为:


image.png
import { Directive, Input, ElementRef, Renderer2 } from '@angular/core';
import {DomController} from '@ionic/angular';
@Directive({
  selector: '[absolute-drag]'
})
export class AbsoluteDragDirective {

  @Input('startTop') startTop: any;
  @Input('startRight') startRight: any;
  @Input('startBottom') startBottom: any;
  @Input('startLeft') startLeft: any;

  constructor(public element: ElementRef, public renderer2: Renderer2, public domCtrl: DomController) {

  }

  ngAfterViewInit() {

    this.renderer2.setStyle(this.element.nativeElement, 'position', 'absolute');
    if(this.startTop)this.renderer2.setStyle(this.element.nativeElement, 'top', this.startTop + 'px');
    if(this.startRight)this.renderer2.setStyle(this.element.nativeElement, 'right', this.startRight + 'px');
    if(this.startBottom)this.renderer2.setStyle(this.element.nativeElement, 'bottom', this.startBottom + 'px');
    if(this.startLeft)this.renderer2.setStyle(this.element.nativeElement, 'left', this.startLeft + 'px');

    let hammer = new window['Hammer'](this.element.nativeElement);
    hammer.get('pan').set({ direction: window['Hammer'].DIRECTION_ALL });

    hammer.on('pan', (ev) => {
      this.handlePan(ev);
    });

  }

  handlePan(ev){
    let fabWidth = 56,fabHeight = 56;
    let newLeft = ev.center.x;
    let newTop = ev.center.y;
    let clientWidth = document.body.clientWidth;
    let clientHeight = document.body.clientHeight;
    this.domCtrl.write(() => {
      if(newTop <= 0){
        this.renderer2.setStyle(this.element.nativeElement, 'top', '0px');
      }else if(newTop >= clientHeight-fabHeight){
        this.renderer2.setStyle(this.element.nativeElement, 'bottom', '0px');
      }else{
        this.renderer2.setStyle(this.element.nativeElement, 'top', newTop+ 'px');
      }
      if(newLeft <= 0){
        this.renderer2.setStyle(this.element.nativeElement, 'left', '0px');
      }else if(newLeft >= clientWidth-fabWidth){
        this.renderer2.setStyle(this.element.nativeElement, 'right',  '0px');
      }else{
        this.renderer2.setStyle(this.element.nativeElement, 'left', newLeft+ 'px');
      }
    });
  }

}

3.引用及声明指令:

import { AbsoluteDragDirective } from './directive/absolute-drag.directive';
  declarations: [
    AppComponent,
    AbsoluteDragDirective
  ],

参考:ionic3入门——ion-fab悬浮按钮的拖拽,ionic指令:https://www.jianshu.com/p/017456bdad0b
注:ionic3和ionic4略有不同,稍有修改。

相关文章

网友评论

      本文标题:ionic4-指令实现ion-fab悬浮按钮的拖拽

      本文链接:https://www.haomeiwen.com/subject/ckclgctx.html