pl-plan-pair-stack-no-label.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1" />
  6. <title>运输计划 · 无「装/送」文字区分 Demo</title>
  7. <style>
  8. :root {
  9. --load: #059669;
  10. --delivery: #0284c7;
  11. --text: #1e293b;
  12. --muted: #64748b;
  13. --border: #e2e8f0;
  14. --page: #f8fafc;
  15. }
  16. * { box-sizing: border-box; }
  17. body {
  18. margin: 0;
  19. padding: 32px 24px 64px;
  20. font-family: Inter, "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
  21. font-size: 14px;
  22. line-height: 1.5;
  23. color: var(--text);
  24. background: var(--page);
  25. }
  26. h1 { margin: 0 0 8px; font-size: 22px; font-weight: 700; }
  27. .lead { margin: 0 0 12px; color: var(--muted); max-width: 760px; }
  28. .hint {
  29. margin: 0 0 28px;
  30. padding: 10px 14px;
  31. max-width: 760px;
  32. border-radius: 8px;
  33. background: #ecfdf5;
  34. border: 1px solid #a7f3d0;
  35. font-size: 13px;
  36. color: #065f46;
  37. }
  38. .grid {
  39. display: grid;
  40. grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  41. gap: 20px;
  42. }
  43. .card {
  44. background: #fff;
  45. border: 1px solid var(--border);
  46. border-radius: 10px;
  47. overflow: hidden;
  48. }
  49. .card__head {
  50. display: flex; align-items: center; justify-content: space-between; gap: 12px;
  51. padding: 14px 16px; border-bottom: 1px solid var(--border);
  52. }
  53. .card__title { margin: 0; font-size: 15px; font-weight: 700; }
  54. .badge {
  55. flex-shrink: 0; padding: 2px 8px; border-radius: 999px;
  56. font-size: 11px; font-weight: 600;
  57. }
  58. .badge--rec { color: #065f46; background: #ecfdf5; border: 1px solid #a7f3d0; }
  59. .badge--alt { color: #334155; background: #f1f5f9; border: 1px solid #cbd5e1; }
  60. .card__body { padding: 16px; }
  61. .card__note { margin: 12px 0 0; font-size: 12px; color: var(--muted); }
  62. .cell {
  63. padding: 10px 12px;
  64. border: 1px solid var(--border);
  65. border-radius: 8px;
  66. background: #fff;
  67. }
  68. .name { font-size: 13px; font-weight: 600; line-height: 1.45; word-break: break-word; }
  69. .sub { margin-top: 2px; font-size: 12px; line-height: 1.4; color: var(--muted); }
  70. .body { flex: 1; min-width: 0; }
  71. /* 图例:列头可放小图例 */
  72. .col-legend {
  73. display: flex; gap: 12px; margin-bottom: 8px;
  74. font-size: 11px; color: var(--muted);
  75. }
  76. .col-legend span { display: inline-flex; align-items: center; gap: 5px; }
  77. .col-legend i {
  78. display: inline-block; width: 10px; height: 10px; border-radius: 2px;
  79. }
  80. .col-legend i.load { background: var(--load); }
  81. .col-legend i.delivery { background: var(--delivery); }
  82. /* N1 左侧色条 */
  83. .n1 { display: flex; flex-direction: column; gap: 0; }
  84. .n1__row {
  85. display: flex; align-items: flex-start;
  86. padding: 4px 0 4px 10px;
  87. border-left: 3px solid transparent;
  88. }
  89. .n1__row--load { border-left-color: var(--load); }
  90. .n1__row--delivery { border-left-color: var(--delivery); }
  91. .n1__row + .n1__row {
  92. margin-top: 8px; padding-top: 8px;
  93. border-top: 1px dashed var(--border);
  94. }
  95. /* N2 时间轴 */
  96. .n2 { display: flex; flex-direction: column; }
  97. .n2__row {
  98. display: flex; align-items: flex-start; gap: 10px;
  99. padding: 2px 0 10px;
  100. }
  101. .n2__row:last-child { padding-bottom: 2px; }
  102. .n2__rail {
  103. flex-shrink: 0; display: flex; flex-direction: column; align-items: center; width: 12px;
  104. }
  105. .n2__dot {
  106. width: 10px; height: 10px; border-radius: 50%; z-index: 1;
  107. }
  108. .n2__dot--load { background: var(--load); }
  109. .n2__dot--delivery { background: var(--delivery); }
  110. .n2__line {
  111. flex: 1; width: 2px; min-height: 12px; margin-top: 2px; background: #cbd5e1;
  112. }
  113. .n2__row:last-child .n2__line { display: none; }
  114. /* N3 箭头图标 */
  115. .n3 { display: flex; flex-direction: column; gap: 0; }
  116. .n3__row {
  117. display: flex; align-items: flex-start; gap: 8px;
  118. padding: 2px 0;
  119. }
  120. .n3__row + .n3__row {
  121. margin-top: 8px; padding-top: 8px;
  122. border-top: 1px dashed var(--border);
  123. }
  124. .n3__icon {
  125. flex-shrink: 0;
  126. display: inline-flex; align-items: center; justify-content: center;
  127. width: 18px; height: 18px; margin-top: 1px;
  128. color: #fff; border-radius: 4px;
  129. }
  130. .n3__icon--load { background: var(--load); }
  131. .n3__icon--delivery { background: var(--delivery); }
  132. .n3__icon svg { width: 12px; height: 12px; display: block; }
  133. /* N4 仅顺序 + 极淡色点 */
  134. .n4 { display: flex; flex-direction: column; gap: 0; }
  135. .n4__row {
  136. display: flex; align-items: flex-start; gap: 8px;
  137. padding: 2px 0;
  138. }
  139. .n4__row + .n4__row {
  140. margin-top: 8px; padding-top: 8px;
  141. border-top: 1px dashed var(--border);
  142. }
  143. .n4__dot {
  144. flex-shrink: 0; width: 6px; height: 6px; margin-top: 6px;
  145. border-radius: 50%;
  146. }
  147. .n4__dot--load { background: var(--load); }
  148. .n4__dot--delivery { background: var(--delivery); }
  149. /* N5 流程箭头夹在中间 */
  150. .n5 { display: flex; flex-direction: column; gap: 4px; }
  151. .n5__row {
  152. display: flex; align-items: flex-start;
  153. padding: 4px 0 4px 10px;
  154. border-left: 3px solid transparent;
  155. }
  156. .n5__row--load { border-left-color: var(--load); }
  157. .n5__row--delivery { border-left-color: var(--delivery); }
  158. .n5__flow {
  159. display: flex; align-items: center; justify-content: flex-start;
  160. padding: 0 0 0 2px;
  161. color: #94a3b8; font-size: 11px; line-height: 1;
  162. }
  163. .n5__flow svg { width: 14px; height: 14px; }
  164. .legend {
  165. margin-top: 28px; padding: 16px 18px; max-width: 860px;
  166. border-radius: 10px; background: #fff; border: 1px solid var(--border);
  167. }
  168. .legend h2 { margin: 0 0 8px; font-size: 14px; }
  169. .legend ul { margin: 0; padding-left: 18px; color: var(--muted); font-size: 13px; }
  170. .legend li { margin: 4px 0; }
  171. .legend strong { color: var(--text); }
  172. </style>
  173. </head>
  174. <body>
  175. <h1>无「装 / 送」文字 · 如何表达装货与送货</h1>
  176. <p class="lead">
  177. 约定不变:<strong>上行 = 装货</strong>,<strong>下行 = 送货</strong>。色语义:绿 = 装、蓝 = 送。单元格内不再出现「装」「送」二字,靠色条 / 时间轴 / 图标 / 圆点表达。
  178. </p>
  179. <p class="hint">
  180. 建议:列头旁加一行小图例「■ 装货 ■ 送货」,新用户也能懂。下方 N1 / N2 已示范图例。
  181. </p>
  182. <div class="grid">
  183. <!-- N1 -->
  184. <section class="card">
  185. <div class="card__head">
  186. <h2 class="card__title">N1. 左侧色条</h2>
  187. <span class="badge badge--rec">推荐</span>
  188. </div>
  189. <div class="card__body">
  190. <div class="col-legend">
  191. <span><i class="load"></i>装货</span>
  192. <span><i class="delivery"></i>送货</span>
  193. </div>
  194. <div class="cell">
  195. <div class="n1">
  196. <div class="n1__row n1__row--load">
  197. <div class="body">
  198. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  199. <div class="sub">2026-09-16 08:30</div>
  200. </div>
  201. </div>
  202. <div class="n1__row n1__row--delivery">
  203. <div class="body">
  204. <div class="name">武汉市东西湖区物流大道 88 号</div>
  205. <div class="sub">2026-09-16 16:00</div>
  206. </div>
  207. </div>
  208. </div>
  209. </div>
  210. <p class="card__note">无标签字;扫视靠左边线颜色。与当前结构最接近,只隐藏 label。</p>
  211. </div>
  212. </section>
  213. <!-- N2 -->
  214. <section class="card">
  215. <div class="card__head">
  216. <h2 class="card__title">N2. 时间轴圆点</h2>
  217. <span class="badge badge--rec">推荐</span>
  218. </div>
  219. <div class="card__body">
  220. <div class="col-legend">
  221. <span><i class="load"></i>装货</span>
  222. <span><i class="delivery"></i>送货</span>
  223. </div>
  224. <div class="cell">
  225. <div class="n2">
  226. <div class="n2__row">
  227. <div class="n2__rail">
  228. <span class="n2__dot n2__dot--load"></span>
  229. <span class="n2__line"></span>
  230. </div>
  231. <div class="body">
  232. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  233. <div class="sub">2026-09-16 08:30</div>
  234. </div>
  235. </div>
  236. <div class="n2__row">
  237. <div class="n2__rail">
  238. <span class="n2__dot n2__dot--delivery"></span>
  239. <span class="n2__line"></span>
  240. </div>
  241. <div class="body">
  242. <div class="name">武汉市东西湖区物流大道 88 号</div>
  243. <div class="sub">2026-09-16 16:00</div>
  244. </div>
  245. </div>
  246. </div>
  247. </div>
  248. <p class="card__note">绿→蓝连线天然表达「先装后送」流程,地址/时间列尤其合适。</p>
  249. </div>
  250. </section>
  251. <!-- N3 -->
  252. <section class="card">
  253. <div class="card__head">
  254. <h2 class="card__title">N3. 入/出箭头图标</h2>
  255. <span class="badge badge--alt">备选</span>
  256. </div>
  257. <div class="card__body">
  258. <div class="cell">
  259. <div class="n3">
  260. <div class="n3__row">
  261. <span class="n3__icon n3__icon--load" title="装货" aria-label="装货">
  262. <!-- download-into = 装入 -->
  263. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v12"/><path d="m7 10 5 5 5-5"/><path d="M5 21h14"/></svg>
  264. </span>
  265. <div class="body">
  266. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  267. <div class="sub">2026-09-16 08:30</div>
  268. </div>
  269. </div>
  270. <div class="n3__row">
  271. <span class="n3__icon n3__icon--delivery" title="送货" aria-label="送货">
  272. <!-- upload-out = 送出 -->
  273. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21V9"/><path d="m7 14 5-5 5 5"/><path d="M5 3h14"/></svg>
  274. </span>
  275. <div class="body">
  276. <div class="name">武汉市东西湖区物流大道 88 号</div>
  277. <div class="sub">2026-09-16 16:00</div>
  278. </div>
  279. </div>
  280. </div>
  281. </div>
  282. <p class="card__note">↓ 装入 / ↑ 送出。无汉字但有语义;需统一全列表图标含义。</p>
  283. </div>
  284. </section>
  285. <!-- N4 -->
  286. <section class="card">
  287. <div class="card__head">
  288. <h2 class="card__title">N4. 色点前缀</h2>
  289. <span class="badge badge--alt">备选</span>
  290. </div>
  291. <div class="card__body">
  292. <div class="cell">
  293. <div class="n4">
  294. <div class="n4__row">
  295. <span class="n4__dot n4__dot--load" title="装货"></span>
  296. <div class="body">
  297. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  298. <div class="sub">2026-09-16 08:30</div>
  299. </div>
  300. </div>
  301. <div class="n4__row">
  302. <span class="n4__dot n4__dot--delivery" title="送货"></span>
  303. <div class="body">
  304. <div class="name">武汉市东西湖区物流大道 88 号</div>
  305. <div class="sub">2026-09-16 16:00</div>
  306. </div>
  307. </div>
  308. </div>
  309. </div>
  310. <p class="card__note">最省空间;辨识弱于色条/时间轴,适合列很多、信息极密时。</p>
  311. </div>
  312. </section>
  313. <!-- N5 -->
  314. <section class="card">
  315. <div class="card__head">
  316. <h2 class="card__title">N5. 色条 + 中间流向箭头</h2>
  317. <span class="badge badge--alt">备选</span>
  318. </div>
  319. <div class="card__body">
  320. <div class="cell">
  321. <div class="n5">
  322. <div class="n5__row n5__row--load">
  323. <div class="body">
  324. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  325. <div class="sub">2026-09-16 08:30</div>
  326. </div>
  327. </div>
  328. <div class="n5__flow" aria-hidden="true">
  329. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14"/><path d="m19 12-7 7-7-7"/></svg>
  330. </div>
  331. <div class="n5__row n5__row--delivery">
  332. <div class="body">
  333. <div class="name">武汉市东西湖区物流大道 88 号</div>
  334. <div class="sub">2026-09-16 16:00</div>
  335. </div>
  336. </div>
  337. </div>
  338. </div>
  339. <p class="card__note">中间 ↓ 强化「从装到送」;略占高度,多列重复时可能略吵。</p>
  340. </div>
  341. </section>
  342. </div>
  343. <div class="legend">
  344. <h2>怎么选</h2>
  345. <ul>
  346. <li><strong>N1 色条</strong>:改动最小(隐藏文字即可),适合所有配对列统一样式。</li>
  347. <li><strong>N2 时间轴</strong>:流程感最强,优先用在地址/时间这类「有先后」的列。</li>
  348. <li><strong>N3 图标</strong>:语义明确但要培训/图例,避免与别的操作图标混淆。</li>
  349. <li>无论哪种,列头或工具栏旁加「绿=装 / 蓝=送」小图例,可弥补去掉汉字后的学习成本。</li>
  350. </ul>
  351. </div>
  352. </body>
  353. </html>