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