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