js+css+svg实现立体分层3d ui设计稿手绘稿效果代码
代码语言:html
所属分类:其他
代码描述:js+css+svg实现立体分层3d ui设计稿手绘稿效果代码
代码标签: js css svg 立体 分层 3d ui 设计稿 手绘稿
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> @layer normalize, base, demo, structural, explode, shadows; @layer shadows { :root { --power: linear( 0 0%, 0.2688 9.91%, 0.3859 15%, 0.4917 20.19%, 0.5865 25.5%, 0.6705 30.93%, 0.7441 36.51%, 0.8075 42.26%, 0.8593 47.98%, 0.9022 53.93%, 0.9366 60.13%, 0.963 66.67%, 0.9812 73.4%, 0.9929 80.76%, 0.9986 88.89%, 1 100% ); } .shadow { transition: opacity 0.26s, transform 0.26s, scale 0.26s; } .shadow--main:has(+ .layer > .mover:hover), .mover:has(+ .layer > .mover:hover) > .shadow, .mover:has(+ .layer > .mover:hover) > .shadow-wrap .shadow { opacity: 0.2; div { scale: 0.94; } } .mover:hover > .shadow-wrap .shadow, .mover:hover > .shadow { opacity: 1; scale: 0.98; } } @layer explode { main { transform-style: preserve-3d; * { transform-style: preserve-3d; } } .shadow { scale: 0.999; overflow: hidden; } [data-exploded='false'] { .shadow { opacity: 1; transition: opacity 1s; div { transition: translate 1s, scale 0.26s; } } main { transform: translate3d(0, 0, 100vmin) rotateX(0deg) rotateY(0deg) rotateX(0deg); transition: transform 1s 1s var(--power); /* .shadow--main div, */ .mover > :is(.content, .shadow) { transition: transform 0.26s, opacity 1s; } .layer { translate: 0 0 0; transition: translate 1s var(--power); } } } [data-exploded='true'] { .mover > .shadow { opacity: 0.5; scale: 0.96; transition: opacity 1s 1s; } .mover > .shadow-wrap { opacity: 1; .shadow { opacity: 0.5; } } main { transform: translate3d(0, 0, 100vmin) rotateX(calc(var(--x1, 340) * 1deg)) rotateY(calc(var(--y1, 30) * 1deg)) rotateX(calc(var(--x2, 40) * 1deg)); transition: transform 1s var(--power); .mover > :is(.content, .shadow) { transition: transform 0.26s; } .shadow--main div, .shadow-wrap .shadow div, .mover > .shadow div { transition: translate 1s 1s, scale 0.26s; } .shadow--main div, .mover > .shadow div { translate: calc(var(--tx, 0.5) * 1rem) calc(var(--ty, -0.5) * 1rem); } .mover:hover > div { transform: translate3d(0, 0, 1rem); } .layer { translate: calc(var(--tx, 0.5) * 1rem) calc(var(--ty, -0.5) * 1rem) calc(var(--step, 4) * 1rem) ; transition: translate 1s 1s; transition-timing-function: var(--power); } } } } @layer structural { :root { --accent: light-dark(hsl(12 94% 60%), hsl(280 80% 80%)); --dialog-width: 140px; --dialog-height: 112px; --shadow: light-dark(hsl(0 0% 0% / 0.3), hsl(0 0% 0% / 0.7)); --heading-size: 44px; --count: 4; --content-size: calc( (var(--count) - 1) * 0.5rem + (var(--count) * 1.25rem) + 1.5rem + 2px ); } .layer { pointer-events: none; position: relative; } main, section.layer { grid-area: 1 / 1; display: grid; grid-template: auto / auto; } section.layer { width: clamp(300px, 50vw, 460px); } .shadow { grid-area: 2 / 1; z-index: 2; opacity: 0.2; pointer-events: none; } :root:has(dialog[open]) .shadow-wrap { display: block; opacity: 1; .shadow div { scale: 0.999; translate: 0 0; } } :root:has(dialog[open])[data-exploded='true'] .shadow-wrap { .shadow div { transition: translate 10s; translate: calc(var(--tx, 0.5) * 1rem) calc(var(--ty, -0.5) * 1rem); } } .shadow-wrap .shadow div { transition-property: transition, scale, transform, translate; transition-duration: 0.26s; transform-origin: 50% 0; scale: 0.9; translate: 0 -12px; } .shadow-wrap { display: none; transition-property: display, opacity, transition, scale, transform; transition-behavior: allow-discrete; transition-duration: 0.26s; opacity: 0; /* transform-origin: 50% 0; scale: 0.9; translate: 0 -12px; */ } @starting-style { :root:has(dialog[open]) .shadow-wrap { opacity: 0; } :root:has(dialog[open]) .shadow-wrap .shadow div { scale: 0.9; translate: 0 -12px; } } .shadow--dialog { width: 100%; height: 100%; position: relative; overflow: hidden; div { position: absolute; right: -1rem; right: 0; top: -2px; width: var(--dialog-width); height: var(--dialog-height); background: var(--shadow); border-radius: 6px; } } .shadow--main { position: relative; z-index: -1; div { background: var(--shadow); border-radius: 12px; position: absolute; inset: 0; translate: 0 0; } } .shadow--main { grid-area: 1 / 1; } .content--main { width: 100%; } .table--layer, .shadow--table, .content--main { grid-area: 1 / 1; display: grid; grid-template-rows: var(--heading-size) calc( var(--heading-size) + var(--content-size) ); padding: 1rem; padding-top: 0; } .shadow--status div, .shadow--table div { grid-area: 2 / 1; background: var(--shadow); border-radius: 6px; } .shadow--table, .table--layer { border: 1px solid #0000; } .layer--status, .shadow--status, .content--table { display: grid; grid-template-rows: var(--heading-size) 1fr; grid-area: 2 / 1; } .layer--dialog, .content--status { grid-area: 2 / 1; } .mover { pointer-events: all; grid-area: 1 / 1; display: grid; grid-template: auto / auto; > div { grid-area: 1 / 1; } } .mover--nested { grid-area: 2 / 1; } } @layer demo { .table-slot { background: color-mix(in hsl, canvas, canvasText 2%); border: 1px solid color-mix(in hsl, canvas, canvasText 30%); border-radius: 6px; } .content--main { background: color-mix(in hsl, canvas, canvasText 4%); border: 1px solid color-mix(in hsl, canvas, canvasText 30%); border-radius: 12px; font-size: 0.875rem; position: relative; font-family: monospace; } .content--table { overflow: hidden; } .table { width: 100%; height: 100%; overflow: hidden; table { translate: 0 2px; border-collapse: collapse; width: 100%; max-width: 100%; font-family: monospace; thead { background: color-mix(in hsl, canvas, canvasText 4%); font-weight: 600; } td:first-of-type > span { align-items: center; display: flex; gap: 0.5rem; svg { width: 16px; color: var(--accent); } } td { border: 1px solid color-mix(in hsl, canvas, canvasText 30%); padding: 0.2rem 0.5rem; position: relative; &:nth-of-type(3) { overflow: hidden; white-space: nowrap; max-width: 12ch; text-overflow: ellipsis; } &:first-of-type { border-left: 0; } &:last-of-type { border-right: 0; } } .true { color: hsl(140 80% 40%); } } } .content--table .heading { padding-inline: 0.75rem; } .heading { align-items: center; display: flex; gap: 0.5rem; font-family: monospace; margin: 0; font-weight: 600; position: relative; height: 100%; svg { width: 16px; } & > button { aspect-ratio: 1; background: #0000; border: 0; cursor: pointer; display: grid; place-items: center; position: absolute; right: 0.75rem; top: 50%; translate: 0 -50%; &:is(:focus-visible, :hover) { --opacity: 1; } &::after { content: ''; position: absolute; inset: 0; border-radius: 6px; background: hsl(0 0% 50% / 0.22); opacity: var(--opacity, 0); transition: opacity 0.24s; } } } .content__heading { padding: 0; } .table-slot, main { position: relative; } main { border-radius: 12px; text-transform: lowercase; } .table-slot::before, main::before { content: ''; position: absolute; inset: 0px; border-radius: inherit; border: 2px solid var(--accent); background: repeating-linear-gradient( -45deg, #0000 0 4px, var(--accent) 4px 5px ); z-index: -1; } .status { background: canvas; border-radius: 6px; height: 100%; border: 1px solid color-mix(in hsl, canvas, canvasText 30%); } .content--table { background: color-mix(in hsl, canvas, canvasText 2%); border: 1px solid color-mix(in hsl, canvas, canvasText 30%); border-radius: 6px; } dialog { transition-behavior: allow-discrete; transition-property: display, opacity, translate, scale, filter; transition-duration: 0.26s; opacity: 0; translate: 0 -12px; transform-origin: 50% 0; scale: 0.9; filter: blur(4px); &[open] { opacity: 1; scale: 1; translate: 0 0; filter: blur(0px); } } @starting-style { dialog[open] { filter: blur(4px); opacity: 0; scale: 0.9; translate: 0 -12px; } } dialog { /* display: block; */ margin: 0; position: absolute; left: unset; top: -2px; right: -1rem; right: 0; z-index: 99999; border-radius: 6px; background: canvasText; color: canvas; padding: 0.1rem; width: var(--dialog-width); height: var(--dialog-height); border: 0; hr { margin: 0; width: 100%; border-style: solid; border-color: color-mix(in hsl, canvas, canvasText 50%); margin-block: 0.1rem; width: calc(100% + 0.2rem); translate: -0.1rem 0; border-width: 1px; border-bottom: 0; } svg { width: 16px; } button { width: 100%; display: flex; gap: 0.5rem; align-items: center; padding: 0.5rem; border: 0; border-radius: calc(6px - 0.1rem); cursor: pointer; background: #0000; font-weight: 300; color: color-mix(in hsl, currentColor, #0000 20%); position: relative; &:is(:focus-visible, :hover) { background: hsl(0 0% 50% / 0.4); } } } .badge { align-items: center; background: color-mix(in hsl, var(--accent), #0000 90%); border: 1px solid var(--accent); border-radius: 6px; color: var(--accent); display: flex; font-size: 12px; font-weight: 300; gap: 0.35rem; line-height: 1; padding: 0.05rem 0.15rem; } dl { background: canvas; border-radius: 6px; height: var(--content-size); color: color-mix(in hsl, canvasText, canvas); display: grid; font-size: 0.875rem; grid-template-columns: 1fr auto; grid-auto-rows: 1.25rem; margin: 0; padding: 0.75rem; gap: 0.5rem 0; z-index: 2; overflow: hidden; svg { width: 16px; } dt { align-items: center; display: flex; gap: 0.5rem; } dd { font-weight: 400; color: canvasText; margin: 0; display: flex; align-items: center; justify-content: flex-end; } .prepaid { color: hsl(140 80% 40%); position: relative; &::after { content: ''; width: 6px; aspect-ratio: 1; border-radius: 50%; background: currentColor; position: absolute; left: 0; top: 50%; translate: -1ch -50%; } } } } @layer base .........完整代码请登录后点击上方下载按钮下载查看
网友评论0