js浏览器调用openai的api实现文本描述生成元素可视化拖拽编辑的海报效果代码

代码语言:html

所属分类:其他

代码描述:js浏览器调用openai的api实现文本描述生成元素可视化拖拽编辑的海报效果代码

代码标签: js 浏览器 调用 openai api 文本 描述 生成 元素 可视化 拖拽 编辑 海报

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1" />
  <title>H5 海报 AI 设计器</title>
  <style>
    :root{
      --primary:#2563eb;
      --accent:#60a5fa;
      --bg:#eff6ff;
      --text:#0f172a;
      --panel:#ffffff;
      --border:#e5e7eb;
      --muted:#6b7280;
      --shadow: 0 6px 24px rgba(0,0,0,.08);
      --radius: 12px;
    }
    *{box-sizing:border-box}
    html,body{height:100%}
    body{
      margin:0; font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
      "Noto Sans CJK SC","PingFang SC","Microsoft YaHei", Arial, sans-serif;
      color:#111827; background: #f7f7fb;
    }
    .app{display:flex; height:100vh; gap:12px; padding:12px}
    .sidebar{
      width:340px; min-width:300px; max-width:420px; background:var(--panel);
      border:1px solid var(--border); border-radius: var(--radius); padding:14px; overflow:auto;
      box-shadow: var(--shadow);
    }
    .sidebar h1{font-size:18px;margin:0 0 12px 0}
    .group{border:1px solid var(--border); border-radius:10px; padding:12px; margin-bottom:12px; background:#fff}
    .group h3{font-size:14px; margin:0 0 8px 0; color:#374151}
    label{display:block; font-size:12px; color:#374151; margin:8px 0 4px}
    input[type="text"], input[type="number"], input[type="password"], select, textarea{
      width:100%; padding:8px 10px; border:1px solid var(--border); border-radius:8px; outline:none;
      font-size:13px; background:#fff;
    }
    textarea{min-height:90px; resize:vertical}
    .row{display:flex; gap:8px}
    .row > div{flex:1}
    .btn{display:inline-flex; align-items:center; justify-content:center; gap:6px; padding:8px 12px;
      border:1px solid var(--border); border-radius:10px; cursor:pointer; user-select:none; background:#fff;
      transition:.2s; font-size:13px;
    }
    .btn:hover{transform:translateY(-1px); box-shadow: var(--shadow)}
    .btn.primary{background: var(--primary); border-color: transparent; color:#fff}
    .btn.ghost{background:#fff}
    .btn.warn{background:#fee2e2; border-color:#fecaca; color:#991b1b}
    .btn-row{display:flex; gap:8px; flex-wrap:wrap}
    .muted{color:var(--muted); font-size:12px}
    .palette{display:grid; grid-template-columns: repeat(3,1fr); gap:8px}
    .chip{
      padding:8px 10px; border:1px solid var(--border); border-radius:999px; cursor:pointer; text-align:center;
      font-size:12px; background:#fff; user-select:none;
    }
    .chip.active{border-color: var(--primary); color:var(--primary); background:#f0f7ff}
    .main{
      flex:1; display:flex; gap:12px; min-width:320px; min-height: 0; /* 允许子项正确滚动 */
    }
    .stage{
      flex:1; display:flex; align-items:flex-start; justify-content:center; position:relative; overflow:auto;
      background:linear-gradient(180deg,#f6f7ff,#fbfbff);
      border:1px dashed #e8ebf3; border-radius:12px; padding:16px;
      min-height: 0; /* 关键:配合 overflow 在 flex 布局下可滚动 */
      scroll-behavior: smooth; /* 平滑滚动 */
    }
    .poster-wrap{
      position:relative; background: var(--bg);
      border-radius: 18px; overflow:hidden; border:1px solid #e4e7ee;
      box-shadow: 0 10px 40px rgba(30,41,59,.12);
      transform-origin: top left;
    }
    .poster{
      position:relative; width:1080px; height:1920px; overflow:hidden; background: var(--bg);
    }
    .grid-overlay{
      position:absolute; inset:0; pointer-events:none;
      background-image:
        linear-gradient(to right, rgba(0,0,0,.04) 1px, transparent 1px),
        linear-gradient(to bottom, rgba(0,0,0,.04) 1px, transparent 1px);
      background-size: 40px 40px, 40px 40px;
      opacity:.4; display:none;
    }
    .grid-overlay.show{display:block}
    .element{
      position:absolute; cursor:move; user-select:none; transition:outline-color .15s;
    }
    .element.selected{outline:2px dashed rgba(37,99,235,.8); outline-offset:2px}
    .text-el{
      color: var(--text); line-height:1.25; letter-spacing:.2px;
      text-shadow: none; padding:2px 4px;
    }
    .img-el{display:block; object-fit:cover; border-radius: 12px; box-shadow: 0 4px 18px rgba(0,0,0,.08)}
    .badge{
      display:inline-block; padding:3px 8px; border-radius:999px; font-size:11px; background:#eef2ff; color:#3730a3;
      border:1px solid #dbe3ff;
    }
    /* Style Panel */
    .style-panel{
      width:300px; background:#fff; border:1px solid var(--border); border-radius: var(--radius);
      box-shadow: var(--shadow); padding:12px; height:100%; overflow:auto;
    }
    .style-panel h3{font-size:14px; margin:0 0 8px 0; color:#374151}
    .row-inline{display:flex; gap:8px; align-items:center}
    .row-inline input[type="number"]{width:90px}
    .pill{padding:4px 8px; border:1px solid var(--border); border-radius:8px; font-size:12px}
    .panel-section{border-top:1px dashed #e5e7eb; padding-top:10px; margin-top:10px}
    .tag{font-size:11px; color:#6b7280; background:#f3f4f6; padding:2px 6px; border-radius:6px; border:1px solid #e5e7eb}
    .hidden{display:none}
    .small{font-size:12px}
    .kbd{font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size:11px; background:#f3f4f6; border:1px solid #e5e7eb; border-radius:6px; padding:2px 6px}
    .footer-note{font-size:11px; color:#6b7280; margin-top:6px}
  </style>
</head>
<body>
  <div class="app">
    <aside class="sidebar">
      <h1>🎨 H5 海报 AI 设计器</h1>

      <div class="group">
        <h3>海报描述</h3>
        <textarea id="desc" placeholder="示例:夏日新品促销,清新风格,强调 7 折优惠,主色系绿色,加入二维码引导关注。"></textarea>
        <div class="btn-row" style="margin-top:8px">
          <button id="btnAddTitle" class="btn">+ 添加标题</button>
          <button id="btnAddBody" class="btn">+ 添加正文</button>
          <button id="btnAddImage" class="btn">+ 添加图片</button>
        </div>
      </div>

      <div class="group">
        <h3>色系与尺寸</h3>
        <div class="palette" id="palette">
          <div class="chip active" data-key="冷静蓝">冷静蓝</div>
          <div class="chip" data-key="活力红">活力红</div>
          <div class="chip" data-key="清新绿">清新绿</div>
          <div class="chip" data-key="商务灰">商务灰</div>
          <div class="chip" data-key="浪漫紫">浪漫紫</div>
          <div class="chip" data-key="自定义">自定义</div>
        </div>
        <div id="customColors" class="row panel-section hidden">
          <div>
            <label>主色</label>
            <input type="color" id="cPrimary" value="#2563eb"/>
          </div>
          <div>
            <label>强调</label>
            <input type="color" id="cAccent" value="#60a5fa"/>
          </div>
          <div>
            <label>背景</label>
            <input type="color" id="cBg" value="#eff6ff"/>
          </div>
        </div>

        <div class="row panel-section">
          <div>
            <label>宽度(px)</label>
            <input type="number" id="w" value="1080" min="320" step="10"/>
          </div>
          <div>
            <label>高度(px)</label>
            <input type="number" id="h" value="1920" min="320" step="10"/>
          </div>
        </div>
        <div class="row-inline" style="margin-top:8px">
          <input type="checkbox" id="gridToggle" />
          <label for="gridToggle" style="margin:0">显示网格</label>
          <span class="tag">预览缩放</span>
          <input type="range" id="zoom" min="30" max="100" value="60" />
          <span id="zoomLabel" class="small">60%</span>
        </div>
     .........完整代码请登录后点击上方下载按钮下载查看

网友评论0