原生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