camera.js实现一个css绘制的三维物体360选择缩放效果代码
代码语言:html
所属分类:三维
代码描述:camera.js实现一个css绘制的三维物体360选择缩放效果代码
代码标签: camera.js css 三维 物体 360 缩放
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> :root { --unit: 1vmin; --zoom: 100; --available-screen-min: 665; --px: calc(var(--zoom) * (var(--unit) / var(--available-screen-min))); --auto-rotate-duration: 10s; --auto-rotate-timing-func: ease; --auto-rotate-direction: forwards; --fallback-fonts: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, Ubuntu, sans-serif, "Apple Color Emoji", "Twemoji Mozilla", "Segoe UI Emoji", "Segoe UI Symbol"; } *, *::before, *::after { padding: 0; margin: 0; box-sizing: border-box; -webkit-text-size-adjust: none; -moz-text-size-adjust: none; text-size-adjust: none; } *::before, *::after { display: block; } body { touch-action: none; } html { cursor: -webkit-grab; cursor: grab; } html:active { cursor: -webkit-grabbing; cursor: grabbing; } html, body { position: absolute; left: 0; top: 0; width: 100%; height: 100%; scrollbar-width: thin; font-size: 0; overflow: hidden; /* to make touch gestures work correctly */ } html::before { content: ""; position: fixed; left: 0; top: 0; width: 100vw; height: 100vh; background-image: radial-gradient(circle at 50% 50%, #fff, #f8f8f8); background-size: 100vw 100vh; background-repeat: no-repeat; } [data-camera] { --scene-size: 500; --scale: 100; --perspective: 1200; --cameraZ: 0; --cameraY: 0; --translateX: 0; --translateY: 0; --translateZ: 0; } [data-camera] { position: absolute; left: 0; top: 0; width: 100vw; height: 100vh; --fmt-s: calc(var(--scale, 100) / 100); transform: scale(var(--fmt-s)); display: grid; place-items: center; overflow: visible; transition: transform ease 500ms; will-change: transform; } [data-scene] { position: relative; left: 0; top: 0; width: calc(var(--scene-size) * var(--px)); height: calc(var(--scene-size) * var(--px)); background-color: rgba(0, 0, 0, 0.1); transform: perspective(calc(var(--perspective, 1000) * 1px)) rotateX(calc(var(--cameraY, 0) * 1deg)) rotateZ(calc(var(--cameraZ, 0) * 1deg)) translate3d(calc(var(--translateX, 0) * var(--px)), calc(var(--translateY, 0) * var(--px) * -1), calc(var(--translateZ, 0) * var(--px) * -1)); --max-rotation: calc((360 + var(--cameraZ)) * 1deg); transform-origin: 50% 50%; } [data-camera][data-dragging] { transition: none; } @-webkit-keyframes rotateCamera { to { transform: perspective(calc(var(--perspective, 1000) * 1px)) rotateX(calc(var(--cameraY, 0) * 1deg)) rotateZ(var(--max-rotation)) translate3d(calc(var(--translateX, 0) * var(--px)), calc(var(--translateY, 0) * var(--px) * -1), calc(var(--translateZ, 0) * var(--px) * -1)); } } @keyframes rotateCamera { to { transform: perspective(calc(var(--perspective, 1000) * 1px)) rotateX(calc(var(--cameraY, 0) * 1deg)) rotateZ(var(--max-rotation)) translate3d(calc(var(--translateX, 0) * var(--px)), calc(var(--translateY, 0) * var(--px) * -1), calc(var(--translateZ, 0) * var(--px) * -1)); } } [data-scene], [data-camera], [data-3d] { transform-style: preserve-3d; } [data-hidden], .class-hidden { display: none; } :root { --broadness: 400; --thickness: 100; --corner-radius: 0.26; --inner-circle-radius: 0.2; --inner-circle-width-props: 0.98; --inner-circle-height-props: 0.98; --corner-circle-width-props: 1.15; --color-background: hsl(219.5, 100%, 57.8%); --color-shade: rgba(0, 0, 0, 0.07); --shade-step: 0.02; --shade-x-left: 0.1; --shade-x-right: 0; --shade-y-left: 0.29; --shade-y-right: 0; --inner-shade-opacity: 0.5; --inner-shade-start: 0.2; --shadow-color: rgba(0, 0, 0, 0.3); --corner-circle-diameter: calc(var(--broadness) * var(--corner-radius) * 2); --inner-circle-diameter: calc( var(--inner-circle-radius) * var(--broadness) * var(--px) * var(--inner-circle-width-props) ); --calc-broadness: calc(var(--broadness) * var(--px)); --calc-corner-radius: calc(var(--corner-radius) * 100%); } .hn-3d { position: absolute; width: var(--calc-broadness); height: var(--calc-broadness); left: 50%; top: 50%; transform: translate(-50%, -50%); transform-style: preserve-3d; } .hn-3d .custom-cylinder, .hn-3d .custom-cube { position: absolute; } [data-camera] { --cameraY: 31; --cameraZ: 233; } body { filter: drop-shadow(0 calc(55 * var(--px)) calc(16 * var(--px)) var(--shadow-color)); } [data-scene] { background-color: #fff0; } [data-3d], [data-3d]::before, [data-3d]::after, [data-3d] div, [data-3d] div::before, [data-3d] div::after { transform-style: preserve-3d; box-shadow: var(--need-edge-fix, 0 0 0 1px rgba(0, 0, 0, 0.01)); } @media (prefers-color-scheme: dark) { :root { --color-background: #fff; } html::before { background-image: radial-gradient(circle at center, #000, #111); } body { --shadow-color: rgba(255, 255, 255, 0.1); } } @supports not (-moz-appearance: none) { :root { --need-edge-fix: none; --inner-circle-height-props: 1; } } .custom-cylinder { --diameter: var(--corner-circle-diameter); --color-side: var(--color-background); --calc-theta: calc(360 / var(--n)); --calc-diameter: calc(var(--diameter) * var(--px)); --calc-radius: calc(var(--calc-diameter) * 0.5); --calc-depth: calc(var(--thickness) * var(--px) * var(--fix-height-props, 1)); width: var(--calc-diameter); height: var(--calc-diameter); } .custom-cylinder:nth-child(1) { left: 0; bottom: 0; --shade-start: -0.08; } .custom-cylinder:nth-child(2) { left: 0; top: 0; --start: 1; --shade-start: 0.1; } .custom-cylinder:nth-child(3) { right: 0; top: 0; --start: 2; --shade-start: 0.3; } .custom-cylinder:nth-child(4) { right: 0; bottom: 0; --start: 3; --shade-start: 0.1; } .custom-cylinder:nth-child(5) { left: 50%; top: 50%; transform: translate(-50%, -50%); transform: translate(-50%, -50%) rotate(-145deg); --fix-height-props: var(--inner-circle-height-props); --diameter: calc(var(--broadness) * var(--inner-circle-radius) * 2); } .custom-cylinder:nth-child(5) div { --shade-binary: calc(var(--j) - (var(--binary) * (2 * var(--k)))); --shades: clamp( 0, (var(--shade-binary) / var(--n)) * var(--inner-shade-opacity), 1 ); --shade: rgba(0, 0, 0, calc(var(--shades) + var(--inner-shade-start))); } .custom-cylinder div { --beta: calc(var(--shift) * 1deg); --angle: calc(var(--calc-theta) * var(--i) * 1deg); --perpendicular: calc(var(--calc-radius) * var(--perpend)); --calc-edge: calc( var(--calc-diameter) * var(--edge) * var(--corner-circle-width-props, 1) ); --start-from: calc(var(--start, 0) * 90deg); --shade-algo: calc(var(--shade-start) + (var(--shade-step) * var(--i))); --color-shade: rgba(0, 0, 0, var(--shade-algo)); position: absolute; left: 50%; top: 50%; width: var(--calc-edge); height: var(--calc-depth); transform: translate(-50%, -50%) rotateZ(var(--start-from)) rotateZ(var(--beta)) rotateZ(var(--angle)) translateX(var(--perpendicular)) rotateX(90deg) rotateY(90deg); transform-origin: center; background-color: var(--color-side); background-image: linear-gradient(var(--shade, var(--color-shade)) 0 0); } .custom-cube { --base-width: var(--broadness); --side-width: var(--broadness); --crop-size: calc(var(--calc-corner-radius) * 2); left: 50%; top: 50%; transform: translate(-50%, -50%); --calc-base-width: calc(var(--base-width) * var(--px)); --calc-side-width: calc(var(--side-width) * var(--px)); --calc-height: calc(var(--thickness) * var(--px)); --circle-mask: radial-gradient( #fff0 var(--inner-circle-diameter), #fff calc(var(--inner-circle-diameter) + 1px) ); --half-variable: var(--calc-height); width: var(--calc-base-width); height: var(--calc-side-width); } .custom-cube::before, .custom-cube::after { background-color: var(--color-background); background-image: radial-gradient(circle at center, transparent, rgba(0, 0, 0, 0.2)); mask-image: var(--circle-mask); -webkit-mask-image: var(--circle-mask); } .custom-cube::before, .custom-cube::after, .custom-cube div::before, .custom-cube div::after { --calc-sgn-half: calc(var(--half-variable) * 0.5 * var(--sgn)); content: ""; position: absolute; left: 0; top: 0; width: 100%; height: 100%; transform: translateZ(var(--calc-sgn-half)); } .custom.........完整代码请登录后点击上方下载按钮下载查看
网友评论0