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