gpt4 book ai didi

angular - 使用 Angular CDK DRAG 丢失拖动元素上的旋转位置

转载 作者:行者123 更新时间:2023-12-04 08:03:21 24 4
gpt4 key购买 nike

我尝试使用范围 slider 旋转一个元素,但每次拖动该元素时,它都会在拖动时丢失旋转值,并且还会更改框的位置并将其放置在开头。我附加了一个指向我在 stackblitz 中创建的简单测试项目的链接,以便我可以重新创建我遇到的问题。

stackblitz drag and rotate example

有人可以指导我解决问题吗?

我将代码放在这里,以防有人无法正常工作测试项目的链接:

app.module.ts

import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { FormsModule } from "@angular/forms";

import { DragDropModule } from "@angular/cdk/drag-drop";

import { AppComponent } from "./app.component";
import { HelloComponent } from "./hello.component";

@NgModule({
imports: [BrowserModule, FormsModule, DragDropModule],
declarations: [AppComponent, HelloComponent],
bootstrap: [AppComponent]
})
export class AppModule {}

app.component.ts

import { Component, Renderer2 } from "@angular/core";

@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
rotateValue = 0;
dragPosition = { x: 0, y: 0 };

constructor(private renderer: Renderer2) {}

setRotate(value: string) {
this.rotateValue = Number(value);
this.renderer.setStyle(
document.querySelector(".example-box"),
"transform",
`rotate(${this.rotateValue}deg)`
);
}
}

app.component.html

<h1 class="text-center m-3">Drag And Drop Project</h1>
<hr>

<div class="row m-5">

<div class="col-sm-7">
<div class="example-boundary">
<div class="example-box" cdkDragBoundary=".example-boundary" cdkDrag>
I can only be dragged within the dotted container
</div>
</div>
</div>

<div class="col-sm-5">
<h4>SETTINGS</h4>
<ul class="list-group mb-3">
<li class="list-group-item d-flex justify-content-between lh-condensed">
<div>
<h6 class="my-0">Rotate the box</h6>
<input #rotation
type="range"
class="custom-range my-2"
min="-150" max="150"
[(ngModel)]="rotateValue"
[value]='rotateValue'
(change)="setRotate(rotation.value)"
>
</div>
<span id="grados" class="text-muted">{{rotateValue}}º</span>
</li>

</ul>
</div>
</div>

app.component.css

.example-box {
width: 140px;
height: 140px;
border: solid 1px #ccc;
color: rgba(0, 0, 0, 0.87);
cursor: move;
display: inline-flex;
justify-content: center;
align-items: center;
text-align: center;
background: #fff;
border-radius: 4px;
margin-right: 25px;
position: relative;
z-index: 1;
box-sizing: border-box;
padding: 10px;
transition: box-shadow 200ms cubic-bezier(0, 0, 0.2, 1);
box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),
0 1px 5px 0 rgba(0, 0, 0, 0.12);
}

.example-box:active {
box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);
}

.example-boundary {
width: 300px;
height: 500px;
max-width: 100%;
border: dotted #ccc 2px;
}

提前非常感谢

最佳答案

您遇到的问题是,Cdk Drag 是使用 CSS transform 规则实现的,与您的自定义旋转完全相同。因此,当应用于完全相同的 HTML 元素时,两者基本上是不兼容的。最后一个操作(拖动或旋转)会覆盖另一个操作。

IMO 最简单的解决方法是将旋转的元素包装在可拖动包装器内。

这里是更新的 StackBlitz: https://stackblitz.com/edit/angular-ivy-ynzavj

编辑回顾:

在模板中,我用可拖动的元素包裹可旋转的 div(我还使用 [ngStyle] 并完全避免直接 DOM 操作,这本身不是问题,但没有必要) :

<div class="example-boundary">
<div class="box-draggable-wrapper" cdkDragBoundary=".example-boundary" cdkDrag>
<div class="example-box" [ngStyle]="{'transform':'rotate(' + rotateValue + 'deg)'}" >
I can only be dragged within the dotted container
</div>
</div>
</div>

只需为 box-draggable-wrapper 编写一些 CSS:

.box-draggable-wrapper {
width: 140px;
height: 140px;
display: block;
border: none;
}

组件被清除:

import { Component } from "@angular/core";

@Component({
selector: "my-app",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
rotateValue = 0;
dragPosition = { x: 0, y: 0 };

constructor() {}

setRotate(value: string) {
this.rotateValue = +value;
}
}

关于angular - 使用 Angular CDK DRAG 丢失拖动元素上的旋转位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66333225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com