gsap+css实现带炫光翻转鼠标交互卡片效果代码
代码语言:html
所属分类:悬停
代码描述:gsap+css实现带炫光翻转鼠标交互卡片效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> /* @import 'normalize.css' layer(normalize); */ @import url('https://unpkg.com/normalize.css') layer(normalize); @import url('https://fonts.googleapis.com/css2?family=Sora:wght@100..800&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Gloria+Hallelujah&display=swap'); @layer normalize, base, demo, parallax, explode; @layer explode { *, *::before, *::after { transform-style: preserve-3d; } :has([data-active=true]) .arrow { opacity: 0.8; } .arrow { display: inline-block; opacity: 0; position: absolute; font-size: 0.875rem; font-family: 'Gloria Hallelujah', cursive; transition: opacity 0.26s ease-out; &.arrow--debug { top: 50%; left: 50%; rotate: 10deg; translate: calc(-40% + var(--card-width) * -1) 0; width: 80px; z-index: 99999; @media (max-width: 580px) { translate: -50% calc(var(--card-width) * 7 / 5 * 0.5); } span { display: inline-block; rotate: -24deg; translate: 30% 100%; @media (max-width: 580px) { translate: 80% 160%; } } svg { rotate: 10deg; scale: 1 -1; translate: 120% 20%; rotate: -25deg; left: 0%; width: 80%; @media (max-width: 580px) { rotate: 190deg; top: unset; bottom: 100%; translate: 0 0; } } } } .minimap { position: fixed; width: 60px; aspect-ratio: 5/7; background: hsl(0 0% 50%); top: 50%; left: 50%; translate: calc(var(--card-width) * 1) -50%; border-radius: 6px; cursor: pointer; border: var(--border-color) 4px solid; z-index: 999999; transform: translate3d(0, 0, 100vmin); pointer-events: none; visibility: hidden; .minimap__stats { position: absolute; top: calc(100% + 0.5rem); left: 0; right: 0; display: flex; flex-direction: column; opacity: 0.7; font-family: monospace; span { white-space: nowrap; } } &::after { content: 'trackpad'; position: absolute; top: 50%; left: 100%; font-family: 'Sora', sans-serif; transform: translate(-50%, -50%) rotate(-90deg) translateY(100%); font-size: 0.875rem; pointer-events: none; opacity: 0.35; } } [data-explode='true'] { .minimap { pointer-events: all; visibility: visible; } .arrow { opacity: 0; } .card { pointer-events: none; transition: transform 0.2s 0.2s; transform: rotateX(-24deg) rotateY(32deg) rotateX(90deg); .spotlight, .watermark, .pattern { mix-blend-mode: unset; } .watermark, .pattern, .debug, .img, .spotlight::after, .card__frame, .spotlight { transition-property: transform, opacity; transition-duration: 0.2s; transition-delay: 0.4s; transform: translate3d(0, 0, calc(var(--index) * 80px)); } .card__front .debug { --index: -2; } .card__front .img { --index: -3; } .card__front .pattern { --index: -1; } .card__front .watermark { --index: 0; } .card__front .card__frame { --index: 1; } .card__front .spotlight { --index: 2; } .debug { visibility: visible; } .debug, .spotlight::after { opacity: 1; } } } } @layer parallax { :root { --pointer-x: 0; --pointer-y: 0; --parallax-img-x: 5%; --parallax-img-y: 5%; --rotate-x: 25deg; --rotate-y: -20deg; } .card[data-active='true'] { display: block; transition: transform 0.2s; } [data-explode='false'] { .card[data-active='true']:hover { transition: transform 0s; transform: rotateX(calc(var(--pointer-y) * var(--rotate-x))) rotateY(calc(var(--pointer-x) * var(--rotate-y))); -webkit-animation: set backwards 0.2s; animation: set backwards 0.2s; } } [data-explode='false'] .card[data-active='true']:hover, [data-explode='true']:has(.minimap:hover) { .card__front img { transition: transform 0s; translate: calc(var(--pointer-x) * var(--parallax-img-x)) calc(var(--pointer-y) * var(--parallax-img-y)); -webkit-animation: set-img backwards 0.2s; animation: set-img backwards 0.2s; } } @-webkit-keyframes set { 0% { transform: rotateX(0deg) rotateY(0deg); } } @keyframes set { 0% { transform: rotateX(0deg) rotateY(0deg); } } @-webkit-keyframes set-img { 0% { translate: 0 0; } } @keyframes set-img { 0% { translate: 0 0; } } .card:not(:hover) img { transition: translate 0.2s; } :is(.refraction, .spotlight::before) { opacity: 0; transition: opacity 0.2s ease-out; } /* .debug is only visible on explode */ [data-explode='true']:has(.minimap:hover) .refraction, [data-explode='true']:has(.minimap:hover) .spotlight::before, .card[data-active='true']:hover :not(.debug) .refraction, .card[data-active='true']:hover .spotlight::before { opacity: 1; } [data-explode='true']:has(.minimap:hover) :is(.debug:not(.debug--clipped) .refraction) { opacity: 0.2; } } @layer demo { :root { --border-color: hsl(0 0% 25%); --card-width: 260px; } .scene { perspective: 1000px; position: fixed; inset: 0; transform: translate3d(0, 0, 100vmin); } .card { --ratio-x: 0; --ratio-y: 0; --border: 8cqi; aspect-ratio: 5 / 7; width: var(--card-width); container-type: inline-size; touch-action: none; background: #0000; color: hsl(0 0% 10%); font-family: 'Sora', sans-serif; perspective: 1600px; position: fixed; top: 50%; left: 50%; translate: -50% -50%; img, *::after, *::before { will-change: translate, scale, filter; } button { position: absolute; z-index: 100; inset: 0; cursor: pointer; -webkit-tap-highlight-color: #0000; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; opacity: 0; } *:not(button) { pointer-events: none; } .debug, .img, .pattern, .spotlight, .watermark, .card__rear, .card__content, .card__emboss, .glare-container, .card__front { position: absolute; inset: 0; border-radius: var(--border); } .debug { .........完整代码请登录后点击上方下载按钮下载查看
网友评论0