作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Angular2 应用程序中有一个 Bootstrap 模式弹出窗口。我希望它是可拖动的。如果有人可以帮助我解决此问题,那将非常有帮助。
<div class="modal modal-sm fade fade in" [class]="modalWorkPhone" id="myModal" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="panel-heading" style="background-color:#2e90bd">
</div>
</div>
</div>
</div>
最佳答案
以下指令代码适用于 Angular 6+ 和 ng-bootstrap 中的模态窗口图书馆。
您必须使该指令对您的 View 模块可见,并且所有模态都将变为可拖动而无需任何更改,因为该指令绑定(bind)到 .modal-header
类(class):
import { Directive, ElementRef, Renderer2, AfterViewInit, Input, OnDestroy } from '@angular/core';
import { fromEvent, Subscription } from 'rxjs';
import { mergeMap, takeUntil, tap } from 'rxjs/operators';
interface Point {x: number, y: number};
@Directive({
selector: '.modal-header'
})
export class DragModalDirective implements AfterViewInit, OnDestroy {
constructor (
private el: ElementRef,
private renderer: Renderer2,
) {}
subscription: Subscription;
start: Point;
offset: Point = {x: 0, y: 0};
ngAfterViewInit() {
setTimeout(() => {
this.makeItDraggable();
});
}
private makeItDraggable() {
const modalDialogElement = this.el.nativeElement.closest(".modal-dialog");
if (!modalDialogElement) {
console.error('DragModalDirective cannot find the parent element with class modal-dialog')
return;
}
this.renderer.setStyle(this.el.nativeElement, 'user-select', 'none');
this.renderer.setStyle(this.el.nativeElement, 'cursor', 'move');
this.renderer.setStyle(modalDialogElement, 'transition', 'none');
const down$ = fromEvent(this.el.nativeElement, 'mousedown')
const move$ = fromEvent(document, 'mousemove');
const up$ = fromEvent(document, 'mouseup')
const drag$ = down$.pipe(
tap(($event: MouseEvent) => {
this.start = {
x: $event.clientX - this.offset.x,
y: $event.clientY - this.offset.y
};
}),
mergeMap(down => move$.pipe(
takeUntil(up$)
))
);
this.subscription = drag$.subscribe(($event: MouseEvent) => {
this.offset = {
x: $event.clientX - this.start.x,
y: $event.clientY - this.start.y
}
this.renderer.setStyle(modalDialogElement, 'transform', `translate(${this.offset.x}px, ${this.offset.y}px)`);
})
}
ngOnDestroy() {
if (this.subscription)
this.subscription.unsubscribe();
}
}
关于twitter-bootstrap - 如何使 Bootstrap 模态弹出窗口在 Angular2 中可移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45281473/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!