原生js+css实现可视化地铁运营图多线路拖拽绘制编辑工具代码

代码语言:html

所属分类:其他

代码描述:原生js+css实现可视化地铁运营图多线路拖拽绘制编辑工具代码

代码标签: 原生 js css 可视化 地铁 运营图 多线路 拖拽 绘制 编辑 工具 代码

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

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>城市地铁运营图设计器(本地版)</title>
<style>
  :root{
    --bg:#f7f8fa;
    --panel:#ffffff;
    --line:#e5e7eb;
    --text:#111827;
    --muted:#6b7280;
    --primary:#2563eb;
    --danger:#ef4444;
    --ok:#16a34a;
    --grid:#eee;
    --grid-dark:#dfe3e6;
  }
  *{box-sizing:border-box}
  body{
    margin:0;
    font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC",sans-serif;
    color:var(--text);
    background:var(--bg);
    height:100vh;
    display:flex;
    flex-direction:column;
  }
  header{
    height:56px;
    display:flex;
    align-items:center;
    justify-content:space-between;
    padding:0 14px;
    background:var(--panel);
    border-bottom:1px solid var(--line);
    gap:10px;
  }
  header .brand{
    display:flex;
    align-items:center;
    gap:10px;
    font-weight:700;
  }
  header .brand .logo{
    width:28px;height:28px;border-radius:8px;background:linear-gradient(135deg,#0ea5e9,#6366f1);
    display:flex;align-items:center;justify-content:center;color:#fff;font-size:16px;box-shadow:0 2px 6px rgba(0,0,0,.15)
  }
  .toolbar{
    display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  }
  .toolbar .group{
    background:var(--panel);
    border:1px solid var(--line);
    border-radius:10px;
    padding:6px;
    display:flex;gap:6px;align-items:center;
  }
  .btn{
    height:32px; padding:0 10px; border:1px solid var(--line); background:#fff; border-radius:8px;
    display:inline-flex; align-items:center; gap:6px; cursor:pointer; font-size:14px;
  }
  .btn:hover{ background:#f3f4f6 }
  .btn.primary{ background:var(--primary); color:#fff; border-color:transparent }
  .btn.primary:hover{ filter:brightness(0.95) }
  .btn.danger{ background:#fff; color:var(--danger); border-color:#fecaca }
  .btn.icon{ padding:0 8px; width:auto; }
  .btn.small{ height:28px; font-size:13px }
  .btn.toggled{ outline:2px solid var(--primary); }
  select, input[type="text"], input[type="number"]{
    height:32px; border:1px solid var(--line); border-radius:8px; padding:0 10px; background:#fff; font-size:14px;
  }
  input[type="color"]{ width:36px; height:32px; padding:0; border:1px solid var(--line); border-radius:6px; background:#fff }
  #app{ flex:1; display:flex; min-height:0; }
  aside{
    width:320px; min-width:280px; max-width:360px;
    border-right:1px solid var(--line);
    background:var(--panel);
    padding:12px;
    display:flex; flex-direction:column; gap:12px; overflow:auto;
  }
  .card{
    border:1px solid var(--line);
    border-radius:12px; background:#fff; padding:12px;
  }
  .card h3{ margin:0 0 8px 0; font-size:14px; color:#374151; display:flex; align-items:center; gap:8px }
  .row{ display:flex; gap:8px; align-items:center; flex-wrap:wrap; margin:6px 0 }
  .row label{ font-size:12px; color:var(--muted) }
  .line-list{ display:flex; flex-direction:column; gap:6px; }
  .line-item{
    border:1px solid var(--line); border-radius:10px; padding:8px; display:flex; align-items:center; gap:8px; cursor:pointer; background:#fff;
  }
  .line-item .swatch{ width:14px; height:14px; border-radius:50%; border:1px solid #ddd }
  .line-item .name{ flex:1; white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
  .line-item.active{ outline:2px solid var(--primary) }
  .muted{ color:var(--muted); font-size:12px }
  .station-list{ display:flex; flex-direction:column; gap:6px; max-height:260px; overflow:auto; padding-right:4px }
  .station-item{
    border:1px solid var(--line); border-radius:10px; padding:8px; display:flex; align-items:center; gap:8px; background:#fff;
  }
  .station-item .dot{ width:10px; height:10px; border-radius:50%; border:2px solid #999; background:#fff }
  .station-item input{ flex:1; min-width:120px }
  .station-item .ops{ display:flex; gap:4px }
  .tip{ font-size:12px; color:var(--muted) }
  main{
    position:relative; flex:1; min-width:0; display:flex; flex-direction:column;
  }
  #canvasBar{
    height:44px; border-bottom:1px solid var(--line); background:#fff;
    display:flex; align-items:center; gap:8px; padding:0 12px;
  }
  #canvasWrap{
    position:relative; flex:1; overflow:hidden;
    background:
      linear-gradient(to right, var(--grid) 1px, transparent 1px) 0 0/20px 20px,
      linear-gradient(to bottom, var(--grid) 1px, transparent 1px) 0 0/20px 20px;
  }
  svg#stage{ width:100%; height:100%; display:block; }
  .hint{
    position:absolute; left:10px; bottom:10px; background:rgba(255,255,255,.9); backdrop-filter:saturate(180%) blur(8px);
    border:1px solid var(--line); border-radius:10px; padding:8px 10px; font-size:12px; color:#374151;
  }
  .badge{ padding:2px 6px; border-radius:999px; font-size:12px; background:#eef2ff; color:#4338ca; border:1px solid #c7d2fe }
  .status{ font-size:12px; color:var(--muted) }
  .sep{ height:16px; width:1px; background:var(--line); margin:0 6px }
</style>
</head>
<body>
  <header>
    <div class="brand">
      <div class="logo">🚇</div>
      <div>城市地铁运营图设计器</div>
      <span class="badge">本地存储</span>
    </div>
    <div class="toolbar">
      <div class="group" id="mapGroup">
        <select id="mapSelect" title="选择运营图"></select>
        <button class="btn icon" id="mapNew" title="新建运营图">➕ 新建</button>
        <button class="btn icon" id="mapDuplicate" title="复制运营图">📄 复制</button>
        <button class="btn icon" id="mapRename" title="重命名运营图">✏️ 重命名</button>
        <button class="btn icon" id="mapDelete" title="删除运营图">🗑️ 删除</button>
      </div>
      <div class="group">
        <button class="btn" id="exportBtn" title="导出JSON">⬇️ 导出</button>
        <button class="btn" id="importBtn" title=&qu.........完整代码请登录后点击上方下载按钮下载查看

网友评论0