簡體   English   中英

在 Angular Material CDK Drag Drop 中,如何防止項目隨着元素移動而自動重新排列?

[英]In Angular Material CDK Drag Drop, How to Prevent Items from Automatically Rearranging as an Element Moves?

提前致謝。 這是問題:

我正在使用Angular Material CDK Drag Drop (版本:@angular/ckd:7.3.7)

文檔說“當元素移動時,項目會自動重新排列。

我的問題是:如何防止項目在元素移動時自動重新排列?

這是我不想要的動畫 gif 這是我制作的棋盤,您可以看到“項目(棋子)隨着元素(棋子)移動而自動重新排列”

這是我想要的動畫 gif 我想要的是物品(棋子)不會隨着元素(棋子)移動而重新排列。

這是一個帶有代碼的stackblitz

只需創建一個 empy cdkDragPlaceholder,好吧,您需要將 img 包含在 div 中

<div class="square"
     [ngClass]="{'white': square.row % 2 === square.col %2,
  'black': square.row % 2 !== square.col % 2}"
  cdkDropList
   ...>
  <div cdkDrag cdkDragBoundary=".board">
    <img *ngIf="square.piece"
       class="piece"
       src="{{square.piece.img()}}"
       />
       <!---this is a empty dragPlaceHolder-->
       <div *cdkDragPlaceholder></div>
   </div>
</div>

所以:

.cdk-drag-placeholder { display:none; } 

應該確保對象不會被虛擬插入到限制這種行為的 DOM 中。

我認為它不適用於動態列表,但顯然 .cdk-drag-placeholder { display:none; 確實有效。

如果它不起作用,則意味着您正在嘗試在組件上應用樣式,並且這些樣式已封裝在組件中以避免樣式泄漏。 新添加的 DOM 元素不會“看到”應用的樣式。 一個解決方案是放置 ViewEncapsulation.None 以便允許樣式從組件中泄漏並將 css 規則調整為類似的內容:

#my-special-list {
    & > .cdk-drag-placeholder {
        display: none !important;
    }
}

所以要確保它不會阻礙組件外部的樣式。

從 Angular 8 開始,可以通過添加cdkDropListSortingDisabled來禁用此行為

項目的移動是通過向元素添加內聯樣式來完成的transform: translate3d(Xpx, Ypx, Zpx); 規則。

您可以通過將元素設置為默認零值 add !important來覆蓋元素的 css 中的此內聯樣式規則。 執行此操作時,不會應用規則,行將保持原位。

/* This prevents cdk drag sorting from shuffling things around */
.piece {
  transform: translate3d(0px, 0px, 0px) !important;
}

我自己使用了這個技巧並且它有效。 我試圖讓它在你的 Stackblitz 中工作,但是代碼太多,需要太多時間才能弄清楚到底把它放在哪里。 如果需要,您應該提供一個“最小工作示例”而不是整個應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM