UNPKG

@egjs/view3d

Version:

Fast & Customizable glTF 3D model viewer, packed with full of features!

773 lines (665 loc) 13.3 kB
.view3d-wrapper { position: relative; touch-action: pan-y; } .view3d-wrapper:-webkit-full-screen { width: 100vw; height: 100vh; padding: 0; } .view3d-wrapper:fullscreen { width: 100vw; height: 100vh; padding: 0; } .view3d-canvas { position: absolute; left: 0; top: 0; width: 100%; height: 100%; -webkit-user-select: none; -moz-user-select: none; user-select: none; -webkit-user-drag: none; } .view3d-canvas.ctx-lost { text-indent: 0.001px; } .view3d-square, .view3d-1by1 { padding-top: 100%; } .view3d-5by4 { padding-top: 80%; } .view3d-4by3 { padding-top: 75%; } .view3d-3by2 { padding-top: 66.6666%; } .view3d-5by3 { padding-top: 60%; } .view3d-16by9 { padding-top: 56.25%; } .view3d-2by1 { padding-top: 50%; } .view3d-3by1 { padding-top: 33.3333%; } .view3d-4by5 { padding-top: 125%; } .view3d-3by4 { padding-top: 133.3333%; } .view3d-2by3 { padding-top: 150%; } .view3d-3by5 { padding-top: 166.6666%; } .view3d-9by16 { padding-top: 177.7777%; } .view3d-1by2 { padding-top: 200%; } .view3d-1by3 { padding-top: 300%; } .view3d-poster { position: absolute; width: 100%; height: 100%; top: 0; left: 0; filter: blur(1em); -o-object-fit: cover; object-fit: cover; } .noblur .view3d-poster { filter: none; } .view3d-annotation-wrapper { width: 100%; height: 100%; position: absolute; top: 0; left: 0; pointer-events: none; overflow: hidden; counter-reset: annotation-index; } .view3d-annotation { pointer-events: all; position: absolute; -webkit-user-select: none; -moz-user-select: none; user-select: none; opacity: 0; cursor: pointer; } .view3d-annotation.default { width: 25px; height: 25px; background-color: rgba(255, 255, 255, 0.8); border-radius: 100%; color: black; display: flex; font-size: 16px; font-weight: bold; box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.3); transition: opacity 0.5s; justify-content: center; align-items: center; counter-increment: annotation-index; } .view3d-annotation.default::before { content: counter(annotation-index); } .view3d-annotation.default .view3d-annotation-tooltip { left: 35px; top: 12px; } .view3d-annotation.default.flip-y .view3d-annotation-tooltip { top: auto; bottom: 12px; } .view3d-annotation.default.flip-x .view3d-annotation-tooltip { left: auto; right: 35px; } .view3d-annotation > * { visibility: hidden; } .view3d-annotation.hidden { display: none; pointer-events: none; } .view3d-annotation.selected { opacity: 1 !important; z-index: 9999 !important; } .view3d-annotation.selected > * { visibility: visible; } .view3d-annotation-tooltip { position: absolute; width: -moz-max-content; width: max-content; cursor: auto; -webkit-user-select: text; -moz-user-select: text; user-select: text; } .view3d-annotation-tooltip.default { padding: 10px; border-radius: 10px; background-color: rgba(0, 0, 0, 0.3); color: white; } .view3d-ar-overlay { display: flex; width: 100%; height: 100%; position: relative; } .view3d-ar-button { display: flex; position: absolute; right: 10px; bottom: 10px; fill: rgba(0, 0, 0, 0.7); border-radius: 9999px; padding: 12px; border: 1px #dbdbdb solid; background-color: white; } .view3d-ar-button::before { display: block; width: 32px; height: 32px; } .view3d-ar-button:disabled { cursor: not-allowed; pointer-events: all; opacity: 0.5; box-shadow: none; } .view3d-ar-button .view3d-tooltip { visibility: hidden; background-color: black; color: #fff; text-align: center; padding: 12px; border-radius: 6px; position: absolute; bottom: 100%; right: 0%; z-index: 1; white-space: nowrap; font-size: 1rem; font-weight: 700; line-height: 1.5; } .view3d-ar-button .view3d-tooltip::after { content: " "; position: absolute; top: 100%; right: 23px; margin-left: -5px; border-width: 5px; border-style: solid; border-color: black transparent transparent transparent; } .view3d-ar-button:hover .view3d-tooltip { visibility: visible; } .view3d-ar-root { position: absolute; top: 0; left: 0; pointer-events: none; width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; } .view3d-ar-close { display: flex; position: absolute; top: 10px; left: 10px; pointer-events: all; cursor: pointer; } .view3d-ar-detection { position: relative; pointer-events: none; display: none; } .view3d-ar-detection.visible { display: flex; } .view3d-ar-detection-icon { display: flex; align-items: center; justify-content: center; perspective: 1000px; transform-style: preserve-3d; } .view3d-ar-phone { width: 100px; height: 180px; border: 8px solid white; border-radius: 10px; animation: view3d-detection-find 6s ease-in-out infinite; position: absolute; } .view3d-ar-phone::before, .view3d-ar-phone::after { position: absolute; left: 0; border-bottom: 8px solid white; content: ""; width: 100%; } .view3d-ar-phone::before { top: 10px; } .view3d-ar-phone::after { bottom: 20px; } .view3d-ar-cube { width: 30px; height: 30px; position: absolute; transform-style: preserve-3d; transform: rotateX(-30deg) rotateY(45deg); animation: view3d-cube-spin 10s linear infinite; } .view3d-ar-cube-face { width: 30px; height: 30px; background-color: white; position: absolute; left: 0; top: 0; box-sizing: border-box; transform-style: preserve-3d; -webkit-backface-visibility: hidden; backface-visibility: hidden; } .view3d-ar-cube-face:nth-child(1) { transform: translateY(-16px) rotateX(90deg); } .view3d-ar-cube-face:nth-child(2) { transform: translateZ(16px); } .view3d-ar-cube-face:nth-child(3) { transform: translateX(16px) rotateY(90deg); } .view3d-ar-cube-face:nth-child(4) { transform: translateX(-16px) rotateY(-90deg); } .view3d-ar-cube-face:nth-child(5) { transform: translateZ(-16px) rotateY(180deg); } .view3d-ar-plane { position: absolute; width: 200px; height: 300px; border: 10px solid white; transform-style: preserve-3d; transform: translateY(10px) rotateX(75deg) translateY(-40px); } .view3d-ar-detection-toast { position: fixed; color: #ffffff; width: calc(100vw - 20px); left: 10px; bottom: 10px; padding: 16px; border-radius: 10px; background-color: rgba(0, 0, 0, 0.7); text-align: center; } @keyframes view3d-cube-spin { 0% { transform: rotateX(-30deg) rotateY(45deg); } 50% { transform: rotateX(-30deg) rotateY(225deg); } 100% { transform: rotateX(-30deg) rotateY(405deg); } } @keyframes view3d-detection-find { 0% { transform: translate3d(0, 0, 0); } 12.5% { transform: translate3d(30px, 0, 0); } 25% { transform: translate3d(0, 0, 0); } 37.5% { transform: translate3d(-30px, 0, 0); } 50% { transform: translate3d(0, 0, 0); } 62.5% { transform: translate3d(0, 30px, 0); } 75% { transform: translate3d(0, 0, 0); } 87.5% { transform: translate3d(0, -30px, 0); } 100% { transform: translate3d(0, 0, 0); } } .view3d-lb-overlay { display: flex; position: absolute; width: 100%; height: 100%; justify-content: center; align-items: center; top: 0; left: 0; flex-direction: column; } .view3d-lb-overlay.type-top, .view3d-lb-overlay.is-top { height: auto; background-color: transparent !important; } .view3d-lb-overlay.type-top .view3d-lb-label, .view3d-lb-overlay.is-top .view3d-lb-label { display: none; } .view3d-lb-overlay.type-top .view3d-lb-base, .view3d-lb-overlay.is-top .view3d-lb-base { width: 100%; margin-left: 0%; border-radius: 0px; } .view3d-lb-wrapper { position: relative; width: 100%; } .view3d-lb-base { margin-left: auto; margin-right: auto; border-radius: 9999px; overflow: hidden; position: relative; margin-bottom: 5px; } .view3d-lb-base.type-spinner, .view3d-lb-base.is-spinner { height: 0; background-color: transparent; transition: all 500ms; } .view3d-lb-base.type-spinner .view3d-lb-filler, .view3d-lb-base.is-spinner .view3d-lb-filler { background-color: transparent; border-style: solid; width: 100%; box-sizing: border-box; animation: view3d-lb-spin 1.2s linear infinite; } .view3d-lb-filler { position: absolute; top: 0; left: 0; border-radius: 9999px; width: 0; height: 100%; } .view3d-lb-label { text-align: center; } @keyframes view3d-lb-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } :root { --view3d-cb-primary: #ffffff; --view3d-cb-bg: rgba(0, 0, 0, 0.3); --view3d-cb-track: rgba(230, 230, 230, 0.4); --view3d-cb-thumb-bg: rgba(30, 30, 30, 0.4); --view3d-cb-thumb-text: rgba(255, 255, 255, 0.8); } .view3d-control-bar { position: absolute; padding: 8px 12px 8px 12px; left: 0; bottom: 0; display: flex; opacity: 0; width: 100%; box-sizing: border-box; flex-direction: column; -webkit-user-select: none; -moz-user-select: none; user-select: none; -webkit-user-drag: none; font-size: 16px; transition: opacity 300ms; } .view3d-control-bar.visible { opacity: 1; } @media (max-width: 996px) { .view3d-control-bar { opacity: 1 !important; } } .view3d-controls-background { width: 100%; height: 100%; position: absolute; left: 0; bottom: 0; background: var(--view3d-cb-bg); } .view3d-top-controls { margin-bottom: 8px; } .view3d-top-controls:empty { margin-bottom: 0px; } .view3d-top-controls > .view3d-progress-bar { margin-top: 8px; } .view3d-side-controls { display: flex; flex-direction: row; height: 32px; position: relative; } .view3d-left-controls { display: flex; flex: 1; white-space: nowrap; text-overflow: ellipsis; align-items: center; } .view3d-left-controls:not(:only-child) { margin-right: 8px; } .view3d-left-controls > *:not(:last-child) { margin-right: 8px; } .view3d-right-controls > *:not(:last-child) { margin-right: 8px; } .view3d-control-item { display: inline-block; background-color: transparent; cursor: pointer; border: 0; padding: 0; margin: 0; height: 100%; position: relative; border-radius: 16px; fill: var(--view3d-cb-primary); } .view3d-control-item > svg { width: 24px; height: 24px; margin: 4px; } .view3d-control-item.disabled { display: none; } .view3d-control-item:not(:first-child) { margin-left: 1em; } .view3d-control-item:hover { background-color: rgba(0, 0, 0, 0.3); } .view3d-progress-bar { flex: 1; width: 100%; height: 13px; position: relative; cursor: pointer; pointer-events: all; } .view3d-progress-track { width: 100%; height: 3px; position: absolute; top: 5px; left: 0; background-color: var(--view3d-cb-track); } .view3d-progress-filler { position: absolute; left: 0; top: 0; width: 0; height: 100%; background-color: var(--view3d-cb-primary); } .view3d-progress-thumb { width: 13px; height: 13px; position: absolute; top: -5px; left: -6.5px; border-radius: 50%; background-color: var(--view3d-cb-primary); box-sizing: border-box; } .view3d-progress-thumb::before { content: attr(data-time); opacity: 0; transition: opacity .2s ease-in-out; font-size: 12px; display: inline-block; position: absolute; top: -48px; left: 50%; transform: translateX(-50%); background-color: var(--view3d-cb-thumb-bg); padding: 4px 8px; border-radius: 5px; color: var(--view3d-cb-thumb-text); box-sizing: border-box; } .view3d-progress-thumb.visible::before { opacity: 1; } .view3d-animation-name { display: inline-flex; align-items: center; height: 100%; color: var(--view3d-cb-primary); padding-left: 12px; padding-right: 24px; position: relative; } .view3d-animation-name::after { content: ""; display: inline-block; width: 0; height: 0; border: 4px solid transparent; border-top: 4px solid var(--view3d-cb-primary); position: absolute; top: 50%; right: 12px; } .view3d-animation-list { position: absolute; left: 0; bottom: calc(100% + 5px); background-color: rgba(0, 0, 0, 0.3); padding: 0.5em; display: none; border-radius: 5px; } .view3d-animation-list.visible { display: block; } .view3d-animation-item { height: 100%; color: var(--view3d-cb-primary); padding: 0 1em; position: relative; border-radius: 5px; } .view3d-animation-item.selected { font-weight: bold; } .view3d-animation-item.selected::before { position: absolute; left: 6px; top: calc(50% - 2px); content: ""; width: 4px; height: 4px; border-radius: 50%; background-color: var(--view3d-cb-primary); } .view3d-animation-item:hover { background-color: rgba(255, 255, 255, 0.3); } .view3d-gizmo { position: absolute; top: 10px; right: 10px; width: 120px; height: 120px; padding: 0; margin: 0; overflow: hidden; pointer-events: none; } .view3d-gizmo > canvas { width: 100%; height: 100%; } .view3d-gizmo .view3d-gizmo-axis { position: absolute; width: 20px; height: 20px; pointer-events: all; cursor: pointer; transform: translate(-50%, -50%); }