flipping+xstate+rxjs实现鼠标框选拖拽删除和缩放效果代码
代码语言:html
所属分类:拖放
代码描述:flipping+xstate+rxjs实现鼠标框选拖拽删除和缩放效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>鼠标框选</title>
<style>
*, *:before, *:after {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: #F2F5F7;
transform-style: preserve-3d;
perspective: 1000px;
perspective-origin: calc(var(--trash-x) * 1px) calc(var(--trash-y) * 1px);
}
.ui-week {
display: grid;
grid-template-columns: repeat(7, 1fr);
width: 70vw;
height: 15vw;
grid-column-gap: 1vw;
flex-direction: row;
justify-content: center;
align-items: center;
margin-bottom: 10vh;
}
[data-state=disposed] .ui-day[data-state=grabbed] > .ui-day-box,
[data-state=grabbing] .ui-day[data-state=grabbed] > .ui-day-box, .ui-day[data-state=selected] > .ui-day-box, [data-state=disposed] .ui-day:hover .ui-day-box {
color: #9153FF;
background: transparent;
}
[data-state=disposed] .ui-day[data-state=grabbed] > .ui-day-box > .ui-bg,
[data-state=grabbing] .ui-day[data-state=grabbed] > .ui-day-box > .ui-bg, .ui-day[data-state=selected] > .ui-day-box > .ui-bg, [data-state=disposed] .ui-day:hover .ui-day-box > .ui-bg {
border-color: #9153FF;
background-color: #F7E3FF;
}
.ui-day {
justify-self: stretch;
align-self: stretch;
background-color: #EAEDF4;
border-radius: 0.25rem;
grid-row: 1/2;
}
.ui-day:nth-child(1) {
grid-column: var(--start, 1)/var(--end, span 1);
}
.ui-day:nth-child(2) {
grid-column: var(--start, 2)/var(--end, span 1);
}
.ui-day:nth-child(3) {
grid-column: var(--start, 3)/var(--end, span 1);
}
.ui-day:nth-child(4) {
grid-column: var(--start, 4)/var(--end, span 1);
}
.ui-day:nth-child(5) {
grid-column: var(--start, 5)/var(--end, span 1);
}
.ui-day:nth-child(6) {
grid-column: var(--start, 6)/var(--end, span 1);
}
.ui-day:nth-child(7) {
grid-column: var(--start, 7)/var(--end, span 1);
}
.ui-day .ui-day-name {
color: #7960A7;
}
.ui-day .ui-day-name:before {
content: attr(data-flip-key);
}
.ui-day[data-state=selected] > .ui-day-box {
-webkit-animation: selected 0.6s cubic-bezier(0.5, 0, 0.5, 1);
animation: selected 0.6s cubic-bezier(0.5, 0, 0.5, 1);
}
@-webkit-keyframes selected {
50% {
transform: rotate(2deg);
}
}
@keyframes selected {
50% {
transform: rotate(2deg);
}
}
[data-state=dragging] .ui-day[data-state=selected] > .ui-day-box, [data-state=disposed] .ui-day[data-state=selected] > .ui-day-box {
z-index: 2;
transition-duration: 0s;
transform: translateX(calc((var(--drag-x2) - var(--drag-x1)) * 1px)) translateY(calc((var(--drag-y2) - var(--drag-y1)) * 1px + (3px - var(--yc) * 3px)));
}
[data-state=disposed] .ui-day[data-state=selected] > .ui-day-box {
transition-duration: 0.3s;
transform: translateX(calc((var(--drag-x2) - var(--drag-x1)) * 1px)) translateY(calc((var(--drag-y2) - var(--drag-y1)) * 1px)) translateZ(-1000px);
}
.ui-day-box {
display: flex;
justify-content: center;
align-items: center;
text-transform: uppercase;
font-weight: bold;
border-radius: inherit;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transition-duration: 0.3s;
z-index: 1;
pointer-events: none;
}
.ui-day-box > .ui-bg {
background-color: #fff;
border: 4px solid white;
border-radius: inherit;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transition-duration: 0.3s;
transition-property: border-color, background-color;
}
.ui-day-box > .ui-bg:before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 0.5rem 1.5rem rgba(145, 83, 255, 0.2);
z-index: -1;
}
[data-state=disposed] .ui-day[data-state=selected] > .ui-day-box,
[data-state=grabbing] .ui-day[data-state=selected] > .ui-day-box {
opacity: 0;
pointer-events: none;
}
[data-state=disposed] .ui-day-box,
[data-state=grabbing] .ui-day-box {
pointer-events: auto;
}
.ui-grab {
position: absolute;
top: 0;
height: 100%;
width: 1vw;
}
.ui-grab.-left {
left: 0;
}
.ui-grab.-right {
right: 0;
}
.ui-grab, [data-state=grabbing] {
cursor: ew-resize;
}
.ui-selection {
color: #7DDAFC;
background: rgba(125, 218, 252, 0.3);
border: 2px solid currentColor;
position: absolute;
left: calc(var(--mx1) * 1px);
top: calc(var(--my1) * 1px);
width: calc((var(--mx2) - var(--mx1)) * 1px);
height: calc((var(--my2) - var(--my1)) * 1px);
transition: opacity 0.3s ease-in-out;
pointer-events: none;
z-index: 3;
}
[data-state]:not([data-state=selecting]) .ui-selection {
opacity: 0;
}
.ui-alert {
color: #FF62A3;
text-transform: uppercase;
font-weight: bold;
font-size: 1rem;
white-space: nowrap;
text-align: center;
opacity: 0;
}
[data-state=disposed][data-prev-state=dragging] .ui-alert {
-webkit-animation: alert 1s cubic-bezier(0, 0.5, 0, 1) both;
animation: alert 1s cubic-bezier(0, 0.5, 0, 1) both;
}
@-webkit-keyframes alert {
from {
opacity: 0;
}
50% {
opacity: 1;
}
to {
transform: translateY(-200%);
opacity: 0;
}
}
@keyframes alert {
from {
opacity: 0;
}
50% {
opacity: 1;
}
to {
transform: translateY(-200%);
opacity: 0;
}
}
.ui-trash {
width: 5vw;
height: 6vw;
border: 2px solid #7960A7;
border-bottom: none;
border-top: none;
background-image: linear-gradient(to right, white, white 60%, #f6f4f9 61%, #f6f4f9);
opacity: 0;
transform: translateY(1vw);
z-index: 10;
}
.ui-trash, .ui-trash > * {
transition-property: opacity, transform;
transition-duration: 0.6s;
trasition-timing-function: cubic-bezier(0.5, 0, 0.5, 1);
}
[data-state=dragging] .ui-trash {
opacity: 1;
transform: none;
}
[data-state=dragging] .ui-trash:hover {
transform: rotate(-10deg);
}
[data-state=dragging] .ui-trash:hover > .ui-trash-lid {
transform: rotate(25deg);
}
[data-state=disposed] .ui-trash {
transition-duration: 1s;
opacity: 0;
}
.ui-trash:before, .ui-trash:after {
content: "";
position: absolute;
width: calc(100% + 4px);
left: -2px;
height: 1vw;
border: 2px solid #7960A7;
border-bottom-left-radius: 100% 100%;
border-bottom-right-radius: 100% 100%;
background-image: inherit;
}
.ui-trash:before .........完整代码请登录后点击上方下载按钮下载查看
网友评论0