react+gsap实现小熊滑板静止视觉差异效果代码
代码语言:html
所属分类:视觉差异
代码描述:react+gsap实现小熊滑板静止视觉差异效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/tailwind.2.2.7.css"> <style> *, *:after, *:before { box-sizing: border-box; transform-style: preserve-3d; } body { background: #233143; min-height: 100vh; display: grid; place-items: center; overflow: hidden; } img { height: 100%; -o-object-fit: cover; object-fit: cover; width: 100%; } .parallax-container { height: 50vmin; width: 50vmin; perspective: 50vmin; transform: translate3d(0, 0, 50vmin); } .parallax { transform: rotateX(calc((var(--rx, 0) * var(--range-y, 0)) * 1deg)) rotateY(calc((var(--ry, 0) * var(--range-x, 0)) * 1deg)) rotate(calc((var(--r, 0) * var(--range-x, 0)) * 1deg)); } .parallax-item { left: calc(var(--x, 50) * 1%); top: calc(var(--y, 50) * 1%); height: calc(var(--height, auto) * 1%); width: calc(var(--width, auto) * 1%); transform: translate(-50%, -50%) translate3d(calc((var(--mx, 0) * var(--range-x, 0)) * 1%), calc((var(--my, 0) * var(--range-y, 0)) * 1%), calc(var(--mz, 0) * 1vmin)) rotateX(calc((var(--rx, 0) * var(--range-y, 0)) * 1deg)) rotateY(calc((var(--ry, 0) * var(--range-x, 0)) * 1deg)) rotate(calc((var(--r, 0) * var(--range-x, 0)) * 1deg)); } </style> </head> <body> <div id="app"></div> <script type="module"> import React from 'https://cdn.skypack.dev/react'; import T from 'https://cdn.skypack.dev/prop-types'; import gsap from 'https://cdn.skypack.dev/gsap'; import { render } from 'https://cdn.skypack.dev/react-dom'; /** * All movements and rotations are based on a decimal scale. * 0 - 1 for movement will be 0% - 100% translation * 0 - 1 for rotation will be 0deg to 360deg rotation * * Position is based on relative position to the container in percentage. * Z Positioning is a number and the coefficient is defined in the styles. */ const DEFAULT_CONFIG = { // Starting positions for X and Y positionX: 50, positionY: 50, positionZ: 0, // Range of movement in decimal where 1 === 100. Use negative for opposite directions. // Range of movement in decimal where 1 === 100. Use negative for opposite directions. rotate: 0, rotateX: 0, rotateY: 0, moveX: 0, moveY: 0 }; // Range mapping utility const mapRange = (inputLower, inputUpper, outputLower, outputUpper) => { const INPUT_RANGE = inputUpper - inputLower; const OUTPUT_RANGE = outputUpper - outputLower; return (value) => outputLower + ((value - inputLower) / INPUT_RANGE * OUTPUT_RANGE || 0); }; const ParallaxContainer = ({ config, children }) => { const containerRef = React.useRef(null); React.useEffect(() => { // Function that updates a CSS coefficient for moving things. // Base the center point on the center of the container. // Then define a width each side. Default to window width/height. const UPDATE = ({ x, y }) => { // We are going to normalize -100 to 100 with a range and then use CSS coefficient for updates // Can base the range on the position of the container and a distance from it based on screen size. // Get the dimensions of the parentNode as the parallax moves and changes dimensions. const containerBounds = containerRef.current.parentNode.getBoundingClientRect(); const centerX = containerBounds.left + containerBounds.width / 2; const centerY = containerBounds.top + containerBounds.height / 2; const startX = config.coefficientX ? centerX - config.coefficientX * window.innerWidth : 0; const endX = config.coefficientX ? centerX + config.coefficientX * window.innerWidth : window.innerWidth; const startY = config.coefficientY ? centerY - config.coefficientY * window.innerHeight : 0; const endY = config.coefficientY ? cente.........完整代码请登录后点击上方下载按钮下载查看
网友评论0