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:nt.........完整代码请登录后点击上方下载按钮下载查看
网友评论0