gsap+css实现带炫光翻转鼠标交互卡片效果代码

代码语言:html

所属分类:悬停

代码描述:gsap+css实现带炫光翻转鼠标交互卡片效果代码

代码标签: 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