gsap实现可修改添加购物车路径曲线参数的动画效果代码

代码语言:html

所属分类:动画

代码描述:gsap实现可修改添加购物车路径曲线参数的动画效果代码

代码标签: gsap 修改 添加 购物车 路径 曲线 参数动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  

  <meta
      name="viewport"
      content="width=device-width, initial-scale=1, user-scalable=0, maximum-scale=1.0"
    />

    <link rel="stylesheet" href="./style.css" />
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Gloria+Hallelujah&display=swap" rel="stylesheet">
  
  
  
<style>
@import url('https://unpkg.com/normalize.css') layer(normalize);

@layer normalize, base, prototype, trackpad, sticky-surface, debug;

@layer arrows {
  .arrow {
    font-family: 'Gloria Hallelujah', cursive;
    font-size: 0.875rem;
    position: fixed;
    opacity: 0.8;
    transition: opacity 0.26s ease-out;
    pointer-events: none;

    span {
      white-space: nowrap;
    }
  }
  .arrow--config {
    bottom: 140px;
    right: 120px;
    translate: -50% 0;
    width: 60px;

    svg {
      top: calc(100% + 20px);
      position: absolute;
      rotate: 30deg;
      scale: 1 -1;
      left: 50%;
      width: 60px;
    }
  }
  .arrow--cart {
    top: 100px;
    right: 60px;
    translate: 0 0;
    width: 60px;

    svg {
      bottom: calc(100% + 10px);
      position: absolute;
      left: 75%;
      width: 40px;
      rotate: -10deg;
    }
  }
  .arrow--product {
    top: 50%;
    left: 50%;
    translate: -50% -50%;
    transform: translate(-180%, 120px);
    width: 60px;

    svg {
      bottom: calc(100% + 10px);
      position: absolute;
      left: 75%;
      width: 60px;
    }
  }
}

@layer debug {
  [data-visualize='true'] {
    .motion-path {
      opacity: 1;
    }
  }
  .motion-path {
    position: fixed;
    z-index: 999999999;
    overflow: visible !important;
    /* right: max(var(--cart-x, 0px), var(--product-x, 0px)); */
    top: min(var(--cart-y, 0px), var(--product-y, 0px));
    /* bottom: var(--product-y, 0px); */
    left: min(var(--cart-x, 0px), var(--product-x, 0px));
    transform: scale(var(--scale-x, 1), var(--scale-y, 1));
    pointer-events: none;
    width: var(--distance-x, 200px);
    height: var(--distance-y, 200px);
    opacity: 0;
    transition: opacity 0.26s ease-out;

    circle {
      fill: currentColor;
      stroke: canvas;
      display: none;
    }

    path {
      stroke-width: 1;
      stroke-linecap: round;
      stroke-dasharray: 2 2;
      stroke: red;
    }
  }
}

@layer trackpad {
  .trackpad-controls {
    position: absolute;
    display: grid;
    gap: 0.5rem 1rem;
    grid-template-columns: auto 1fr;
    align-content: center;
    place-items: center;
    bottom: 0%;
    left: 10%;
    right: 10%;
    accent-color: canvasText;
    transition-property: translate, scale;
    transition-duration: 0.2s;
    transition-timing-function: ease-out;
    scale: 0.8;
    transform-origin: 50% 0;
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;

    input {
      width: 100%;
    }

    label {
      font-size: 0.75rem;
    }
  }
  .trackpad-holder {
    display: inline-block;
    position: relative;
    width: 160px;
    aspect-ratio: 1;
  }
  .bezier-controls {
    position: relative;
    height: 160px;
    width: 160px;
  }
  .bezier-control {
    padding: 0;
    border: 0;
    color-scheme: dark;
  }
  .bezier-control legend {
    color: var(--lbl-fg);
    padding-left: 6px;
    margin-bottom: 0.5rem;
  }
  .implant {
    margin-top: 0.5rem;
  }
  .trackpad {
    position: absolute;
    height: 100%;
    width: 100%;
    border: 1px solid color-mix(in lch, canvasText, #0000 75%);
    border-radius: 4px;
    cursor: crosshair;
    background-color: canvas;
    transition: background-color 0.2s;
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;
    touch-action: none;
    z-index: 10;
    container-type: size;
    background-image: repeating-radial-gradient(circle at center, red 1px, transparent 1px, transparent 2px);
    background-size: 4px 4px;

    &::before {
      content: '';
      position: absolute;
      inset: 0;
      background-color: color-mix(in lch, canvasText, #0000 98%);
    }
  }
  
  .trackpad:hover::before {
    background: color-mix(in lch, canvasText, #0000 95%);
  }
  
  .trackpad:active::before {
    background: color-mix(in lch, canvasText, #0000 93%);
  }

  /* SVG styling */
  .bezier-svg {
    width: 160px;
    aspect-ratio: 1;
    /* background: color-mix(in lch, canvasText, #0000 95%); */
    border-radius: 4px;
    border: 1px solid color-mix(in lch, canvasText, #0000 90%);
    overflow: hidden;
    position: absolute;
    bottom: 0;
    left: 0;
    z-index: 10;
    pointer-events: none;
  }

  .grid-line {
    stroke: var(--in-fg);
    stroke-width: 0.5;
    stroke-dasharray: 2 2;
    opacity: 0;
  }

  .control-line {
    stroke: color-mix(in lch, var(--in-fg), #0000 50%);
    stroke-width: 1;
    stroke-dasharray: 3 3;
    transition: all 0.2s;
  }

  .axis-line {
    stroke: color-mix(in lch, canvasText, #0000 50%);
    stroke-width: 0.5;
  }

  .bezier-curve {
    fill: none;
    stroke: var(--in-fg);
    stroke-width: 1.2;
    stroke-linecap: round;
  }


  .anchor-point {
    fill: color-mix(in lch, canvasText, #0000 50%);
    stroke: none;
    opacity: 0;
  }
  
  /* Trackpad markers */
  .trackpad-marker {
    position: absolute;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--in-fg);
    border: 2px solid var(--in-bg);
    translate: calc(var(--marker-x, 50) * 1cqi) calc(var(--marker-y, 50) * 1cqh);
    transform: translate(-50%, -50%);
    opacity: 0.8;
    z-index: 3;
  }
  .trackpad-marker::after {
    content: '';
    position: absolute;
    inset: -6px;
    border: 2px solid var(--in-fg);
    border-radius: 50%;
    transition: scale 0.12s ease-out;
    scale: 0;
  }

  .trackpad-marker[data-active]::after,
  .trackpad-marker[data-hover]::after {
    scale: 1;
  }

  .trackpad:hover .trackpad-marker {
    opacity: 1;
  }

  .trackpad.pointer-lock-active .trackpad-marker[data-active] {
    box-shadow: 0 0 0 6px color-mix(in lch, currentColor, #0000 80%);
  }

  /* Pointer lock active state */
  .trackpad.pointer-lock-active {
    outline: 2px dashed color-mix(in lch, canvasText, #0000 50%);
    outline-offset: 2px;
  }
}

div.tp-dfwv {
  width: 256px;
  top: unset;
  bottom: 8px;
  position: fixed;
  z-index: 999999999;
  max-height: calc(100vh - 100px);
  overflow: auto;

  .tp-v-disabled {
    margin-top: 0.25rem;
  }
}

@layer prototype {
  .cart {
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;
    padding: 0;
    position: fixed;
    top: 1rem;
    right: 1rem;
    cursor: pointer;
    width: 42px;
    aspect-ratio: 1;
    background: #0000;
    border: 0;
    z-index: 999999;
    
    svg {
      width: 24px;
    }
  }

  .container {
    resize: both;
    overflow: hidden;
    display: grid;
    place-items: center;
    container-type: size;
    min-width: 58px;
    min-height: 58px;
    width: 100px;
    height: 100px;
    padding: 0.5rem;
  }
  .item-details__product {
    position: relative;
    max-height: 100%;
    max-width: 100%;
    min-width: 44px;
    padding: 0.25rem;
    min-height: 44px;
    display: grid;
    place-items: center;
    background: light-dark(hsl(0 0% 90% / 0.7), hsl(0 0% 20% / 0.9));
    border-radius: 6px;
    aspect-ratio: 1;

    img {
      max-height: 100%;
      max-width: 100%;
      width: 100%;
      aspect-ratio: 1;
    }
  }

  :root {
    --speed: .8s;
    --x-timing: cubic-bezier(.59,-0.75,.91,.5);
    --y-timing: cubic-bezier(.15,.57,.9,1.05);
    --scale-timing: cubic-bezier(.85,.06,.97,1.01);
    --color-timing: cubic-bezier(.05,1.02,.97,1.01);
  }

  .cart-item {
    --delay: 0.1s;
    position: fixed;
    inset: 0;
    /* outline: 2px dashed hotpink; */
    display: grid;
    place-items: center;
    -webkit-animation-name: cart-x, cart-y;
            animation-name: cart-x, cart-y;
    -webkit-animation-duration: var(--speed), var(--speed);
            animation-duration: var(--speed), var(--speed);
    -webkit-animation-delay: var(--delay), var(--delay);
            animation-delay: var(--delay), var(--delay);
    -webkit-animation-timing-function: var(--x-timing), var(--y-timing);
            animation-timing-function: var(--x-timing), var(--y-timing);
    -webkit-animation-fill-mode: both, both;
            animation-fill-mode: both, both;
    animation-composition: accumulate;
    left: var(--left);
    top: var(--top);
    width: var(--width);
    height: var(--height);
    z-index: 99999999999;
    pointer-events: none;
    
    img {
      width: 100%;
      aspect-ratio: 1;
      -o-object-fit: cover;
         object-fit: cover;
      /* backdrop-filter: blur(6px) saturate(1.3) brightness(2.75); */
      -webkit-animation-name: cart-scale, cart-color;
              animation-name: cart-scale, cart-color;
      -webkit-animation-duration: var(--speed), var(--speed);
              animation-duration: var(--speed), var(--speed);
      -webkit-animation-delay: var(--delay), var(--delay);
              animation-delay: var(--delay), var(--delay);
      -webkit-animation-timing-function: var(--scale-timing), var(--color-timing);
              animation-timing-function: var(--scale-timing), var(--color-timing);
      -webkit-animation-fill-mode: both, both;
              animation-fill-mode: both, both;
    }
  }
  @-webkit-keyframes cart-color {
    to {
      background: light-dark(hsl(0 0% 80% / 0.8), hsl(0 0% 90% / 0.8));
      /* background: light-dark(hsl(0 0% 12% / 0.7), hsl(210 10% 90% / 0.7)); */
    }
  }
  @keyframes cart-color {
    to {
      background: light-dark(hsl(0 0% 80% / 0.8), hsl(0 0% 90% / 0.8));
      /* background: light-dark(hsl(0 0% 12% / 0.7), hsl(210 10% 90% / 0.7)); */
    }
  }
  @-webkit-keyframes cart-scale {
    to {
      width: 24px;
      border-radius: 50%;
    }
  }
  @keyframes cart-scale {
    to {
      width: 24px;
      border-radius: 50%;
    }
  }
  @-webkit-keyframes cart-x {
    to {
      translate: var(--x) 0;
    }
  }
  @keyframes cart-x {
    to {
      translate: var(--x) 0;
    }
  }
  /* @keyframes cart-y {
    to {
      transform: translateY(var(--y));
    }
  } */
  @-webkit-keyframes cart-y {
    to {
      translate: 0 var(--y);
    }
  }
  @keyframes cart-y {
    to {
      translate: 0 var(--y);
    }
  }
}

@layer sticky-surface {
  sticky-surface {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 9999999;
    will-change: transform;
    pointer-events: none;
    display: grid;
    transition: transform 0.26s ease-out;
    transition: transform 0.26s cubic-bezier(.55,0,.67,1);
    justify-content: center;
  }

  sticky-surface[start-hidden] {
    translate: 0 100%;
  }
  
  sticky-surface[aria-hidden=true] {
    transform: translat.........完整代码请登录后点击上方下载按钮下载查看

网友评论0