js实现三维数据方块效果代码
代码语言:html
所属分类:三维
代码描述:js实现三维数据方块效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;700&display=swap" rel="stylesheet">
<style>
html,
body {
width: 100%;
height: 100%;
margin: 0;
background: #2e3440;
transform: translateZ(0);
font-family: Nunito, Arial, sans-serif;
}
#stage {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
cursor: -webkit-grab;
cursor: grab;
}
#stage:active {
cursor: -webkit-grabbing;
cursor: grabbing;
}
#checkbox {
display: none;
visibility: hidden;
opacity: 0;
}
#checkbox:checked + .toggle {
background: #5e81ac;
}
#checkbox:checked + .toggle:before {
content: "Show Active Bits";
}
#checkbox:not(:checked) + .toggle {
background: #b48ead;
}
#checkbox:not(:checked) + .toggle:before {
content: "Show Inactive Bits";
}
.toggle {
position: fixed;
top: 16px;
left: 16px;
padding: 8px 16px;
border-radius: 99999px;
color: #fff;
font-weight: bold;
cursor: pointer;
}
.container {
position: relative;
transform-style: preserve-3d;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
will-change: transform;
}
.box {
position: absolute;
transform-style: preserve-3d;
}
.box:nth-child(0) .face {
opacity: 0.75;
}
.box .face {
position: absolute;
display: flex;
align-items: center;
justify-content: center;
transform-origin: center center;
border: 2px solid currentColor;
background: #d8dee9;
color: #434c5e;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
outline: 1px transparent;
font-weight: bold;
font-size: 1.25rem;
/* Front & Back */
/* Left & Right */
/* Top & Bottom */
}
.box .face.empty {
opacity: 0;
}
.box .face.horizontal-line {
background: #8fbcbb;
}
.box .face.vertical-line {
background: #88c0d0;
}
.box .face.cube {
background: #bf616a;
}
.box .face:nth-child(1) {
transform: translateZ(calc(var(--scale) * 0.5px));
}
.box .face:nth-child(2) {
transform: translateZ(calc(var(--scale) * -0.5px)) rotateY(180deg);
}
.box .face:nth-child(3) {
transform: rotateY(-90deg) translateZ(calc(var(--scale) * 0.5px));
}
.box .face:nth-child(4) {
transform: rotateY(-90deg) translateZ(calc(var(--scale) * -0.5px)) rotateY(180deg);
}
.box .face:nth-child(5) {
transform: rotateX(-90deg) translateZ(calc(var(--scale) * 0.5px));
}
.box .face:nth-child(6) {
transform: rotateX(-90deg) translateZ(calc(var(--scale) * -0.5px)) rotateY(180deg);
}
</style>
</head>
<body >
<input type="checkbox" id="checkbox"/>
<label class="toggle" for="checkbox"></label>
<div id="stage"></div>
<script >
"use strict";
const size = 8;
// Generate input with:
// Array.from({ length: 8 * 8 * 8 }, () => Math.random() > 0.5 ? 0 : 1).join("")
const input = "00100000100000100001000100010001100000010110110000010001001111100110000000000011001100000011000000011100101010000111000010000000011000000010101101000000000100001010010001010000100001010000010001001000110001100000001100100011000000001000000010100000010101001000010001000100110110110100110010100000000000000001000000001001010101100000010101000101000110100000000011000110101011100010110100000001010000101111001000000100010000010001010100000001100010011001001000100110010101001011000000001001011000010010001000110000";
class Shape {
constructor(data, size) {
this.data = data;
this.size = size;
}
toPoints() {
const output = [];
for (let i = 0, x = 0, y = 0, z = 0; i < this.data.length; i++, x++) {
if (i !== 0 && i % this.size === 0) {
x = 0;
y += 1;
}
if (y !== 0 && y % this.size === 0) {
y = 0;
z += 1;
}
output.push({ x, y, z, value: this.data[i] });
}
return output;
}
toPoints3d() {
const output = [];
const points = this.toPoints();
for (const point of points) {
if (output.length < point.y + 1) {
output.push([]);
.........完整代码请登录后点击上方下载按钮下载查看
















网友评论0