Car 360º Viewer
You can create a viewer that can rotate 360 degrees using one axis.
-1452c6c2acf4aaab67092735ff35dc4c.png)
- JavaScript
- React
- Vue@2
- Vue@3
- Svelte
<div>
<p>You can create a viewer that can rotate 360 degrees using one axis.</p>
<div class="car_spot">
<div class="car_rotate">
<div class="img_cont" style="position:relative;z-index:10">
<img height="150" src="./../image/car360/beatle (1).png">
<img height="150" src="./../image/car360/beatle (2).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (3).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (4).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (5).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (6).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (7).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (8).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (9).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (10).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (11).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (12).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (13).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (14).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (15).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (16).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (17).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (18).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (19).png" style="display:none;">
<img height="150" src="./../image/car360/beatle (20).png" style="display:none">
<img height="150" src="./../image/car360/beatle (21).png" style="display:none">
<img height="150" src="./../image/car360/beatle (22).png" style="display:none">
<img height="150" src="./../image/car360/beatle (23).png" style="display:none">
<img height="150" src="./../image/car360/beatle (24).png" style="display:none">
<img height="150" src="./../image/car360/beatle (25).png" style="display:none">
<img height="150" src="./../image/car360/beatle (26).png" style="display:none">
<img height="150" src="./../image/car360/beatle (27).png" style="display:none">
<img height="150" src="./../image/car360/beatle (28).png" style="display:none">
<img height="150" src="./../image/car360/beatle (29).png" style="display:none">
<img height="150" src="./../image/car360/beatle (30).png" style="display:none">
<img height="150" src="./../image/car360/beatle (31).png" style="display:none">
<img height="150" src="./../image/car360/beatle (32).png" style="display:none">
<img height="150" src="./../image/car360/beatle (33).png" style="display:none">
<img height="150" src="./../image/car360/beatle (34).png" style="display:none">
<img height="150" src="./../image/car360/beatle (35).png" style="display:none">
<img height="150" src="./../image/car360/beatle (36).png" style="display:none">
</div>
<div class="ratate_bg"></div>
</div>
</div>
</div>
const images = Array.prototype.slice.call(document.querySelectorAll(
".car_rotate img"));
const imagesNum = images.length;
const ape = 360 / imagesNum; // angle per each
// 1. Initialize eg.Axes
const axes = new eg.Axes({
angle: {
range: [0, 360],
circular: true
}
}, {
deceleration: 0.01
});
// 2. attach event handler
axes.on("change", ({pos}) => {
const index = Math.min(Math.round(pos.angle % 360 / ape), imagesNum - 1);
images.map((v, i) => {
v.style.display = i === index ? "inline-block" : "none";
});
});
// 3. Initialize a inputType and connect it
axes.connect("angle", new eg.Axes.PanInput(".car_rotate"));
import React, { useEffect } from "react";
import { useAxes, PanInput } from "@egjs/react-axes";
import "../../css/demos/car360viewer.css";
const Car360viewer = () => {
const images = Array.from({length: 36}, (_, i) => i + 1);
const { connect, angle } = useAxes(
{
angle: {
range: [0, 360],
circular: true,
}
},
{
deceleration: 0.01,
},
);
useEffect(() => {
connect("angle", new PanInput(".car_rotate"));
}, []);
return (
<div>
<p>You can create a viewer that can rotate 360 degrees using one axis.</p>
<div className="car_spot">
<div className="car_rotate">
<div className="img_cont" style={{ position: "relative", zIndex: 10 }}>
{images.map((i) => (
<img
key={i}
src={ require(`@site/static/img/demos/car360/beatle (${i}).png`).default}
style={{ display: Math.floor((angle % 360) / 10 + 1) === i ? "inline-block" : "none" }}
/>
))}
</div>
<div className="ratate_bg"></div>
</div>
</div>
</div>
);
};
export default Car360viewer;
<template>
<div class="App">
<p>You can create a viewer that can rotate 360 degrees using one axis.</p>
<div class="car_spot">
<div class="car_rotate">
<div class="img_cont" :style="{position: 'relative', zIndex: 10}">
<img
v-for="i in images" height="150"
v-bind:key="i"
:src="`${require('../../../static/img/demos/car360/beatle (${i}).png')}`"
:style="{display: Math.floor((angle % 360) / 10 + 1) === i ? 'inline-block' : 'none'}"
>
</div>
<div class="ratate_bg"></div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted } from "@vue/composition-api";
import { useAxes, PanInput } from "@egjs/vue2-axes";
export default defineComponent({
name: "App",
setup() {
const images = Array.from({length: 36}, (_, i) => i + 1);
const { connect, angle } = useAxes(
{
angle: {
range: [0, 360],
circular: true,
}
},
{
deceleration: 0.01,
},
);
onMounted(() => {
connect("angle", new PanInput(".car_rotate"));
});
return {
images,
angle,
};
},
});
</script>
<template>
<div class="App">
<p>You can create a viewer that can rotate 360 degrees using one axis.</p>
<div class="car_spot">
<div class="car_rotate">
<div class="img_cont" :style="{position: 'relative', zIndex: 10}">
<img
v-for="i in images" height="150"
v-bind:key="i"
:src="`${require('../../../static/img/demos/car360/beatle (${i}).png')}`"
:style="{display: Math.floor((angle % 360) / 10 + 1) === i ? 'inline-block' : 'none'}"
>
</div>
<div class="ratate_bg"></div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted } from "vue";
import { useAxes, PanInput } from "@egjs/vue-axes";
export default defineComponent({
name: "App",
setup() {
const images = Array.from({length: 36}, (_, i) => i + 1);
const { connect, angle } = useAxes(
{
angle: {
range: [0, 360],
circular: true,
}
},
{
deceleration: 0.01,
},
);
onMounted(() => {
connect("angle", new PanInput(".car_rotate"));
});
return {
images,
angle,
};
},
});
</script>
<script>
import { onMount } from "svelte";
import { useAxes, PanInput } from "@egjs/svelte-axes";
const images = Array.from({length: 36}, (_, i) => i + 1);
const { connect, angle } = useAxes(
{
angle: {
range: [0, 360],
circular: true,
}
},
{
deceleration: 0.01,
},
);
onMount(() => {
connect("angle", new PanInput(".car_rotate"));
});
</script>
<div>
<p>You can create a viewer that can rotate 360 degrees using one axis.</p>
<div class="car_spot">
<div class="car_rotate">
<div class="img_cont" style="position: 'relative', zIndex: 10">
{#each images as i}
<img height="150" src="./../image/car360/beatle ({i}).png" style="display: {Math.floor(($angle % 360) / 10 + 1) === i ? 'inline-block' : 'none'}">
{/each}
</div>
<div class="ratate_bg"></div>
</div>
</div>
</div>
-96da20b895cb4903685dc921c6b5824a.png)
-0d282110dfefc117bd56b7144bb02421.png)
-49dbb694911fa24848fc97ddb123954d.png)
-0cd63c7fc1d509cf7121e0f5afdb4295.png)
-2fee9918af6d812ef8a1d6bbe9e3a7db.png)
-aa9dbec3d3c6e195ad2365d01f33fb62.png)
-c5da6db7342d038ca5a92ded329585bd.png)
-7c8a3d479c97818364309457d3d5388c.png)
-daf3c273db764c7742d2a8109bf4bdd6.png)
-20ec9c7ca6c436a00c9514837ffb094f.png)
-e3621df5f220562966b311b51864530c.png)
-aa3a1bccb1069167338bc47f6eda936f.png)
-11923ffba036d1d882bc015992d344bd.png)
-491c86d97e8b739678f7906b3e20e763.png)
-1f19297eb6b8883c96c248c05964ee65.png)
-0258dc2b69966d46cf39b158f10474a8.png)
-4e27b4c870e7af6132a367be325ef31e.png)
-f1d889a4e2d404b65083a3d15262dbc3.png)
-6624169ec2dd0633085f8f294c0350fb.png)
-a9f6cb726b6f3874000cd4c1142f15c6.png)
-371f2d6f61fc9d4247ba9b3a40b9386b.png)
-331a0ef7de185393e5fc313035fc3bde.png)
-ef399888547837dbe6e8ecc7d4f0649e.png)
-70e9c56cad28925f65c351cc436bdeda.png)
-aed665421ef4c54b9bcebbd99a3c2289.png)
-5d1ca4aa54b13b98780ab99abfa37270.png)
-c79a31b603d949b5e337d149f455fadf.png)
-5eab1575892279ba72ef1ce716e6a7de.png)
-87cd6c46b25cb971c4f09251057fddbc.png)
-849024f9de7d80f408a0a83e5729d8f8.png)
-d96bbcb4cbb515039d7ed7a015554047.png)
-6ada907724312b06a2d6bf65f23b2450.png)
-0c990459b78ed5a83579f0f7dd5c2cf1.png)
-7a2de46e7dcb0790a0d5256e34be7fe3.png)
-e3f2190eefe1464872139a1a214cadfd.png)