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