Angular material 7拖放时如何自定义CSS,拖动预览和拖动占位符?

新手上路,请多包涵

我找到了一些关于如何使用 .cdk-drag-preview.cdk-drag-placeholder 类的基本示例,当没有嵌套元素时,它们似乎可以完成这项工作。

基本上,我有一个动作列表,每个动作都以复杂的 mat-card 格式表示。该部分实际上是作为另一个组件完成的,但为了这个示例,我将尽可能使其尽可能基本。

我的例子类似于这个结构:

 <style>
    .my_action { border: 2px solid red; }
</style>

<div class="drop_area" cdkDropList>
    <div *ngFor="let action of actions"
        (cdkDragStarted)="dragStart($event, action)"
        (cdkDragMoved)="dragMoved($event, action)"
        (cdkDragEnded)="dragEnded($event, action)" cdkDrag>

        <mat-card class="my_action">
            {{ action.name }}
        </mat-card>

    </div>
</div>

在角度分量

dragStart(e, action) {
    // initialize start X coord
    this.startX = 0;

    // initialize start Y coord
    this.startY = 0;
}

dragMoved(e, action) {
    // record new position
    this.endX = e.pointerPosition.x;
    this.endY = e.pointerPosition.y;

    // logic to set startX and startY
    // TRYING TO CHANGE CARD BORDER COLOR IF this.endX - this.startX > some number
}

我希望能够做到以下几点:

  • 将卡片向左拖动时将其边框颜色更改为蓝色,向右拖动时将其边框颜色更改为绿色
  • 相应地更改拖动占位符的边框颜色。

The issue of using .cdk-drag-preview and .cdk-drag-placeholder seems to apply to the draggable div (parent of mat-card );然而,我正在尝试更改其孩子的边框颜色。

提前致谢 :)

附录

我最重要的挑战是更改拖动占位符中的边框颜色。我正在尝试更改占位符的边框颜色和左边距以指示用户操作已向左或向右移动,代表列表中的不同级别。

原文由 Brian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 767
2 个回答

像下面这样的东西会实现你的目标吗?

初始化 nativeElement x 和 y

 dragStart(e, action) {
    const rect = e.source.element.nativeElement.getBoundingClientRect();

    // initialize start X coord
    this.startX = rect.x;
    // initialize start Y coord
    this.startY = rect.y;
  }

比较 X 偏移并使用 rendere2nativeElement --- 上设置样式

dragMoved(e, action) {
    // record new position
    this.currentX = e.event.clientX;
    this.currentY = e.event.clientY;
    // logic to set startX and startY
    // TRYING TO CHANGE CARD BORDER COLOR IF this.endX - this.startX > some number
    if(this.startX < this.currentX){
      this._renderer.setStyle(e.source.element.nativeElement, 'border-style', 'solid');
      this._renderer.setStyle(e.source.element.nativeElement, 'border-color', 'green');
    }
    else if (this.startX > this.currentX){
      this._renderer.setStyle(e.source.element.nativeElement, 'border-style', 'solid');
      this._renderer.setStyle(e.source.element.nativeElement, 'border-color', 'blue');
    }
  }

修订:

要在拖动时更改颜色,请执行以下操作。

在视图中获取对 #cdkDropList 的引用。

 @ViewChild('cdkDropList') _dropList:any;

*ngFor

 *ngFor="let action of actions; let i = index"

将索引传递给函数

(cdkDragMoved)="dragMoved($event, action, i)"

接收索引并伸入 cdkDropList 的子项中以设置样式。

 dragMoved(e, action, i) {
    // record new position
    this.currentX = e.event.clientX;
    this.currentY = e.event.clientY;
    // logic to set startX and startY
    // TRYING TO CHANGE CARD BORDER COLOR IF this.endX - this.startX > some number
    if(this.startX < this.currentX){
      this._renderer.setStyle(this._dropList.nativeElement.children[i], 'border-style', 'solid');
      this._renderer.setStyle(this._dropList.nativeElement.children[i], 'border-color', 'green');
    }
    else if (this.startX > this.currentX){
      this._renderer.setStyle(this._dropList.nativeElement.children[i], 'border-style', 'solid');
       this._renderer.setStyle(this._dropList.nativeElement.children[i], 'border-color', 'blue');
    }
  }

堆栈闪电战

https://stackblitz.com/edit/angular-hdskvc?embed=1&file=app/cdk-drag-drop-overview-example.ts

原文由 Marshal 发布,翻译遵循 CC BY-SA 4.0 许可协议

当拾取 cdkDrag 元素时,它将创建一个在拖动时可见的预览元素。这将是原始元素的克隆。克隆的元素将删除其 id 属性并添加类 .cdk-drag-preview。

请谨慎使用 cdkDragMoved,因为此事件将针对用户拖动的每个像素触发。

 <div cdkDropList class="example-list">
    <div class="example-box" *ngFor="let action of actions" cdkDrag
        (cdkDragStarted)="dragStart($event)"
        (cdkDragMoved)="dragMoved($event)">
        {{ action.name }}
    </div>
</div>


 export class CustomComponent {
    cloned: any;

    actions = [
        { name: "one" },
        { name: "two" },
        { name: "three" }
    ];

    constructor(private _renderer: Renderer2) { }

    dragStart(event) {
        this.cloned = document.getElementsByClassName("cdk-drag-preview")[0];
    }

    dragMoved(event) {
        this._renderer.removeClass(this.cloned, "red");
        this._renderer.removeClass(this.cloned, "green");

        const distance: { x: number, y: number } = event.distance;
        this._renderer.addClass(this.cloned, (distance.x > 0) ? "green" : "red");
    }
}

原文由 Cristian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题