vue3实现可视化场景动画制作编辑生成json代码
代码语言:html
所属分类:其他
代码描述:vue3实现可视化场景动画制作编辑生成json代码
代码标签: vue3 可视化 场景 动画 制作 编辑 生成 json 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue 3 Animation Scene Editor</title>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vue3.0.5.js"></script>
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 0; background-color: #f4f4f4; display: flex; height: 100vh; }
.sidebar { width: 250px; background-color: #e9e9e9; padding: 15px; overflow-y: auto; border-right: 1px solid #ccc; }
.main-content { flex-grow: 1; display: flex; flex-direction: column; }
.editor-area { flex-grow: 1; padding: 15px; display: flex; gap: 15px; overflow: hidden;}
.properties-panel { width: 350px; background-color: #f0f0f0; padding: 15px; overflow-y: auto; border-left: 1px solid #ccc; }
.preview-area { flex-grow: 1; background-color: #fff; border: 1px solid #ccc; position: relative; overflow: auto; }
.json-output-area { height: 200px; background-color: #333; color: #fff; padding: 10px; overflow-y: auto; font-family: monospace; }
.json-output-area pre { white-space: pre-wrap; word-wrap: break-word; }
.list-item { padding: 8px; margin-bottom: 5px; background-color: #fff; border: 1px solid #ddd; cursor: pointer; border-radius: 3px; }
.list-item.selected { background-color: #d4e6ff; border-color: #a8c7f0; }
.list-item:hover { background-color: #f0f0f0; }
button { padding: 8px 12px; margin-top: 5px; margin-right: 5px; background-color: #007bff; color: white; border: none; border-radius: 3px; cursor: pointer; }
button:hover { background-color: #0056b3; }
button.danger { background-color: #dc3545; }
button.danger:hover { background-color: #c82333; }
h3, h4 { margin-top: 0; margin-bottom: 10px; color: #333; }
.form-group { margin-bottom: 15px; }
.form-group label { display: block; margin-bottom: 5px; font-weight: bold; }
.form-group input[type="text"],
.form-group input[type="number"],
.form-group select,
.form-group textarea {
width: calc(100% - 12px);
padding: 6px;
border: 1px solid #ccc;
border-radius: 3px;
box-sizing: border-box;
}
.preview-element {
position: absolute;
border: 1px dashed #aaa;
padding: 5px;
font-size: 12px;
background-color: rgba(0, 123, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
text-align: center;
box-sizing: border-box;
}
.preview-element.selected {
border-color: #007bff !important;
border-width: 2px !important;
z-index: 10; /* Bring selected to front */
}
.preview-element img, .preview-element svg { max-width: 100%; max-height: 100%; object-fit: contain; }
.inline-inputs label { margin-right: 5px;}
.inline-inputs input { width: 60px !important; margin-right: 10px;}
</style>
</head>
<body>
<div id="app" style="display: flex; width: 100%; height: 100%;">
<!-- Sidebar for Scenes & Global Settings -->
<div class="sidebar">
<h3>Global Settings</h3>
<div class="form-group">
<label for="canvasWidth">Canvas Width:</label>
<input type="number" id="canvasWidth" v-model.number="config.canvas.width">
</div>
<div class="form-group">
<label for="canvasHeight">Canvas Height:</label>
<input type="number" id="canvasHeight" v-model.number="config.canvas.height">
</div>
<div class="form-group">
<label for="canvasBgColor">Default BG Color:</label>
<input type="text" id="canvasBgColor" v-model="config.canvas.backgroundColor">
</div>
<h3>Preload Assets</h3>
<div v-for="(asset, index) in config.preloadAssets" :key="'asset-'+index" class="form-group">
<input type="text" placeholder="Asset ID" v-model="asset.id" style="margin-bottom: 3px;">
<textarea placeholder="Asset Source (URL or SVG string)" v-model="asset.src" rows="2"></textarea>
<button class="danger" @click="removePreloadAsset(index)">Remove Asset</button>
</div>
<button @click="addPreloadAsset">Add Preload Asset</button>
<hr>
<h3>Scenes</h3>
<div v-for="(scene, index) in config.scenes"
:key="scene._uid"
class="list-item"
:class="{ selected: selectedSceneIndex === index }"
@click="selectScene(index)">
{{ scene.id || 'Scene ' + (index + 1) }}
<button class="danger" @click.stop="removeScene(index)" style="float:right; padding: 2px 5px; font-size:10px;">X</button>
</div>
<button @click="addScene">Add Scene</button>
</div>
<!-- Main Editing Area -->
<div class="main-content">
<div class="editor-area">
<!-- Preview Area -->
<div class="preview-area" :style="previewStyle">
<template v-if="selectedScene">
<div
v-for="(element, elIndex) in selectedScene.elements"
:key="element._uid"
class="preview-element"
:style="getElementPreviewStyle(element)"
@click="selectElement(elIndex)"
:class="{ selected: selectedElementIndex === elIndex }">
<template v-if="element.type === 'text'">{{ element.content }}</template>
<template v-else-if="element.type === 'image' && element.src">
<img :src="element.src" :alt="element.id || 'image'">
</template>
<template v-else-if="element.type === &.........完整代码请登录后点击上方下载按钮下载查看
网友评论0