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