当前位置: 首页 > 工具软件 > cdk-clj > 使用案例 >

angular cdk Overlay

罗昊明
2023-12-01

HTML

   <div  (click)="showOverlayPanelConnectTemplate()" #connectTemplateOrigin >{{title}}</div>
    <ng-template  cdkConnectedOverlay
    nzConnectedOverlay #overlayConnectTemplate>
    </ng-template>
@NgModule({
    imports: [
    ...
        PortalModule,
        OverlayModule,
  ...
    ],
})
 constructor(
    public overlay: Overlay,
    public viewContainerRef: ViewContainerRef
  ) {
    super(ChangeDetectorRef, elementRef);
  }
 @Input() title:string="查看";
  //水平方向对齐方式 'left'|'right',默认左对齐  根据需求后续可以追加'center'模式
  @Input() algin="left";
  @ViewChild('connectTemplateOrigin') _overlayConnectTemplateOrigin:ElementRef;
  @ViewChild('overlayConnectTemplate') _overlayOriginTemplateDirective: TemplateRef<any>;
  @Input() offsetX: number=0;
  @Input() offsetY: number=0;
  origin={left:[{ originX: 'start', originY: 'bottom' },{ originX: 'start', originY: 'top' }],right:[{ originX: 'end', originY: 'bottom' },{ originX: 'end', originY: 'top' }]};
  overlayP={left:[{ overlayX: 'start', overlayY: 'top' },{ overlayX: 'start', overlayY: 'bottom' }],right:[{ overlayX: 'end', overlayY: 'top' },{ overlayX: 'end', overlayY: 'bottom' }]};
/*
   *@e:鼠标事件
   *@dom:动态悬浮组件
   *@triggrHei:点击元素高度
   */
  ShowFlow(e, dom, triggrHei) {
    let height = document.body.scrollHeight;
    let topHei = e.clientY - e.offsetY + triggrHei;
  /*   let str = dom.style.display == "none" ? "block" : "none";
    if (str == "block"&&this.isSingle) {
      let NodeList= document.querySelectorAll(".show-work-flow.swf-active") as NodeListOf<HTMLElement>;
      NodeList.forEach(function(el) {
            el.style.display = "none";
        });
    }  */
    // dom.style.display = str;
    dom.classList.toggle("swf-active");
    let X=e.clientX - e.offsetX,Y;
    if (height - topHei < dom.clientHeight) {
      // dom.style.top = -dom.clientHeight + "px";
      Y=e.clientY - e.offsetY-dom.clientHeight;
    }else{
      Y=e.clientY - e.offsetY+14;
    }
    dom.style.top=Y+"px";
    dom.style.left=X+"px";
    document.body.appendChild(dom);
    // this.showOverlayGlobalPanelPosition(dom,X,Y);
  }
    /**
     * overlay 在整个屏幕位置,自己控制位置
     */
    showOverlayGlobalPanelPosition(dom,X,Y) {
      const config = new OverlayConfig();
      config.positionStrategy = this.overlay.position()
          .global()
          .left(`${X}px`)
          .top(`${Y}px`);
      config.hasBackdrop = true;
      const overlayRef = this.overlay.create(config);
      overlayRef.backdropClick().subscribe(() => {
          overlayRef.dispose();
      });
      overlayRef.attach(new ComponentPortal(dom));
  }
   /**
     * overlay connect origin 显示,依附ng-template
     */
    showOverlayPanelConnectTemplate() {
      const strategy = this.overlay.position()
      .connectedTo(this._overlayConnectTemplateOrigin, this.origin[this.algin][0], this.overlayP[this.algin][0])
            .withFallbackPosition(this.origin[this.algin][1],  this.overlayP[this.algin][1],this.offsetX,this.offsetY);
      // strategy.withLockedPosition(true);
      const config = new OverlayConfig({positionStrategy: strategy});
      config.hasBackdrop = true;
      // config.scrollStrategy = this.overlay.scrollStrategies.reposition();// 更随滑动的策略
      const overlayRef = this.overlay.create(config);
      overlayRef.backdropClick().subscribe(() => {
          overlayRef.dispose();
      });
      overlayRef.attach(new TemplatePortal(this._overlayOriginTemplateDirective, this.viewContainerRef));
  }

  .cdk-overlay-backdrop {
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    -webkit-tap-highlight-color: transparent;
    -webkit-transition: opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
    transition: opacity 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
    opacity: 0;
    position: absolute;
    pointer-events: auto;
    z-index: 1000;
  }
  
  .cdk-overlay-pane {
    position: absolute;
    pointer-events: auto;
    z-index: 1000;
  }
.cdk-overlay-container {
    pointer-events: none;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    position: fixed;
    z-index: 1000;
    }
 类似资料:

相关阅读

相关文章

相关问答