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