pl-plan-pair-stack-variants.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  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. --primary: #10b981;
  10. --primary-dark: #059669;
  11. --primary-bg: #ecfdf5;
  12. --sky: #0284c7;
  13. --sky-border: #bae6fd;
  14. --sky-bg: #f0f9ff;
  15. --text: #1e293b;
  16. --muted: #64748b;
  17. --border: #e2e8f0;
  18. --panel: #fff;
  19. --page: #f8fafc;
  20. }
  21. * { box-sizing: border-box; }
  22. body {
  23. margin: 0;
  24. padding: 32px 24px 64px;
  25. font-family: Inter, "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
  26. font-size: 14px;
  27. line-height: 1.5;
  28. color: var(--text);
  29. background: var(--page);
  30. }
  31. h1 {
  32. margin: 0 0 8px;
  33. font-size: 22px;
  34. font-weight: 700;
  35. }
  36. .lead {
  37. margin: 0 0 28px;
  38. color: var(--muted);
  39. max-width: 720px;
  40. }
  41. .grid {
  42. display: grid;
  43. grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  44. gap: 20px;
  45. }
  46. .card {
  47. background: var(--panel);
  48. border: 1px solid var(--border);
  49. border-radius: 10px;
  50. overflow: hidden;
  51. box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
  52. }
  53. .card__head {
  54. display: flex;
  55. align-items: center;
  56. justify-content: space-between;
  57. gap: 12px;
  58. padding: 14px 16px;
  59. border-bottom: 1px solid var(--border);
  60. background: #fff;
  61. }
  62. .card__title {
  63. margin: 0;
  64. font-size: 15px;
  65. font-weight: 700;
  66. }
  67. .badge {
  68. flex-shrink: 0;
  69. padding: 2px 8px;
  70. border-radius: 999px;
  71. font-size: 11px;
  72. font-weight: 600;
  73. letter-spacing: 0.02em;
  74. }
  75. .badge--now {
  76. color: #92400e;
  77. background: #fef3c7;
  78. border: 1px solid #fcd34d;
  79. }
  80. .badge--rec {
  81. color: #065f46;
  82. background: #ecfdf5;
  83. border: 1px solid #a7f3d0;
  84. }
  85. .badge--alt {
  86. color: #334155;
  87. background: #f1f5f9;
  88. border: 1px solid #cbd5e1;
  89. }
  90. .card__body { padding: 16px; }
  91. .card__note {
  92. margin: 12px 0 0;
  93. font-size: 12px;
  94. color: var(--muted);
  95. }
  96. /* 模拟表格单元格 */
  97. .cell {
  98. padding: 10px 12px;
  99. border: 1px solid var(--border);
  100. border-radius: 8px;
  101. background: #fff;
  102. }
  103. .name { font-size: 13px; font-weight: 600; line-height: 1.45; word-break: break-word; }
  104. .sub { margin-top: 2px; font-size: 12px; line-height: 1.4; color: var(--muted); }
  105. /* ========== 0. 现状 ========== */
  106. .v0 { display: flex; flex-direction: column; gap: 6px; width: 100%; }
  107. .v0__row {
  108. display: flex; align-items: flex-start; gap: 6px;
  109. padding: 6px 8px; border-radius: 6px;
  110. }
  111. .v0__row--load { background: #ecfdf5; border: 1px solid #a7f3d0; }
  112. .v0__row--delivery { background: #f0f9ff; border: 1px solid #bae6fd; }
  113. .v0__label {
  114. flex-shrink: 0; margin-top: 1px; padding: 1px 6px; border-radius: 4px;
  115. font-size: 10px; font-weight: 700; line-height: 1.4;
  116. }
  117. .v0__label--load { color: #059669; background: #ecfdf5; border: 1px solid #a7f3d0; }
  118. .v0__label--delivery { color: #0284c7; background: #f0f9ff; border: 1px solid #bae6fd; }
  119. /* 共用:无底色 stack */
  120. .stack { display: flex; flex-direction: column; gap: 8px; width: 100%; }
  121. .row {
  122. display: flex; align-items: flex-start; gap: 8px;
  123. padding: 2px 0;
  124. }
  125. .body { flex: 1; min-width: 0; }
  126. /* ========== A. 左侧色条 ========== */
  127. .vA__row {
  128. display: flex; align-items: flex-start; gap: 10px;
  129. padding: 4px 0 4px 10px;
  130. border-left: 3px solid transparent;
  131. }
  132. .vA__row--load { border-left-color: #059669; }
  133. .vA__row--delivery { border-left-color: #0284c7; }
  134. .vA__label {
  135. flex-shrink: 0; width: 18px; margin-top: 1px;
  136. font-size: 12px; font-weight: 700; line-height: 1.4;
  137. }
  138. .vA__label--load { color: #059669; }
  139. .vA__label--delivery { color: #0284c7; }
  140. /* ========== B. 实心 Tag ========== */
  141. .vB__tag {
  142. flex-shrink: 0; margin-top: 1px;
  143. padding: 1px 7px; border-radius: 4px;
  144. font-size: 11px; font-weight: 700; line-height: 1.45; color: #fff;
  145. }
  146. .vB__tag--load { background: #059669; }
  147. .vB__tag--delivery { background: #0284c7; }
  148. .vB .row + .row {
  149. padding-top: 8px;
  150. border-top: 1px dashed var(--border);
  151. }
  152. /* ========== C. 描边 Tag(无行底) ========== */
  153. .vC__tag {
  154. flex-shrink: 0; margin-top: 1px;
  155. padding: 1px 6px; border-radius: 4px;
  156. font-size: 10px; font-weight: 700; line-height: 1.4;
  157. background: transparent;
  158. }
  159. .vC__tag--load { color: #059669; border: 1px solid #34d399; }
  160. .vC__tag--delivery { color: #0284c7; border: 1px solid #38bdf8; }
  161. .vC .row + .row {
  162. padding-top: 8px;
  163. border-top: 1px solid var(--border);
  164. }
  165. /* ========== D. 时间轴圆点 ========== */
  166. .vD { display: flex; flex-direction: column; gap: 0; width: 100%; }
  167. .vD__row {
  168. display: flex; align-items: flex-start; gap: 10px;
  169. position: relative;
  170. padding: 4px 0 12px;
  171. }
  172. .vD__row:last-child { padding-bottom: 4px; }
  173. .vD__rail {
  174. flex-shrink: 0;
  175. display: flex; flex-direction: column; align-items: center;
  176. width: 18px;
  177. }
  178. .vD__dot {
  179. width: 10px; height: 10px; border-radius: 50%;
  180. border: 2px solid; background: #fff; z-index: 1;
  181. }
  182. .vD__dot--load { border-color: #059669; background: #059669; }
  183. .vD__dot--delivery { border-color: #0284c7; background: #0284c7; }
  184. .vD__line {
  185. flex: 1; width: 2px; min-height: 8px;
  186. margin-top: 2px; background: #cbd5e1;
  187. }
  188. .vD__row:last-child .vD__line { display: none; }
  189. .vD__label {
  190. flex-shrink: 0; width: 16px; margin-top: -1px;
  191. font-size: 12px; font-weight: 700;
  192. }
  193. .vD__label--load { color: #059669; }
  194. .vD__label--delivery { color: #0284c7; }
  195. /* ========== E. 前缀文字 + 字重 ========== */
  196. .vE__prefix {
  197. flex-shrink: 0; width: 22px; margin-top: 1px;
  198. font-size: 12px; font-weight: 800; letter-spacing: 0.04em;
  199. }
  200. .vE__prefix--load { color: #059669; }
  201. .vE__prefix--delivery { color: #0284c7; }
  202. .vE .row + .row {
  203. padding-top: 8px;
  204. border-top: 1px dashed #e2e8f0;
  205. }
  206. /* ========== F. 图标字形 ========== */
  207. .vF__icon {
  208. flex-shrink: 0;
  209. display: inline-flex; align-items: center; justify-content: center;
  210. width: 20px; height: 20px; margin-top: 1px;
  211. border-radius: 50%;
  212. font-size: 11px; font-weight: 800; line-height: 1; color: #fff;
  213. }
  214. .vF__icon--load { background: #059669; }
  215. .vF__icon--delivery { background: #0284c7; }
  216. .vF .row + .row {
  217. padding-top: 8px;
  218. border-top: 1px solid var(--border);
  219. }
  220. /* ========== G. 上下分区条(极淡,非整行色块) ========== */
  221. .vG { display: flex; flex-direction: column; gap: 0; width: 100%; }
  222. .vG__row {
  223. display: flex; align-items: flex-start; gap: 8px;
  224. padding: 8px 0;
  225. }
  226. .vG__row + .vG__row { border-top: 1px dashed var(--border); }
  227. .vG__chip {
  228. flex-shrink: 0;
  229. display: inline-flex; align-items: center; justify-content: center;
  230. min-width: 20px; height: 20px; margin-top: 0;
  231. padding: 0 5px; border-radius: 4px;
  232. font-size: 11px; font-weight: 700; color: #fff;
  233. }
  234. .vG__chip--load { background: #059669; }
  235. .vG__chip--delivery { background: #0284c7; }
  236. .legend {
  237. margin-top: 28px;
  238. padding: 16px 18px;
  239. border-radius: 10px;
  240. background: #fff;
  241. border: 1px solid var(--border);
  242. max-width: 860px;
  243. }
  244. .legend h2 { margin: 0 0 8px; font-size: 14px; }
  245. .legend ul { margin: 0; padding-left: 18px; color: var(--muted); font-size: 13px; }
  246. .legend li { margin: 4px 0; }
  247. .legend strong { color: var(--text); font-weight: 600; }
  248. </style>
  249. </head>
  250. <body>
  251. <h1>运输计划列表 · 装 / 送 区分方案</h1>
  252. <p class="lead">
  253. 现状用整行浅绿 / 浅蓝底色区分。下面几种方案去掉(或弱化)行背景色块,改用色条、实心 Tag、时间轴、分割线等方式,更贴近 Fresh Mint 列表的清爽感。
  254. </p>
  255. <div class="grid">
  256. <!-- 0 -->
  257. <section class="card">
  258. <div class="card__head">
  259. <h2 class="card__title">0. 现状 · 行背景色块</h2>
  260. <span class="badge badge--now">当前</span>
  261. </div>
  262. <div class="card__body">
  263. <div class="cell">
  264. <div class="v0">
  265. <div class="v0__row v0__row--load">
  266. <span class="v0__label v0__label--load">装</span>
  267. <div class="body">
  268. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  269. <div class="sub">2026-09-16 08:30</div>
  270. </div>
  271. </div>
  272. <div class="v0__row v0__row--delivery">
  273. <span class="v0__label v0__label--delivery">送</span>
  274. <div class="body">
  275. <div class="name">武汉市东西湖区物流大道 88 号</div>
  276. <div class="sub">2026-09-16 16:00</div>
  277. </div>
  278. </div>
  279. </div>
  280. </div>
  281. <p class="card__note">整行填色 + 描边标签。信息量大时颜色偏重,与表格斑马纹叠加后更花。</p>
  282. </div>
  283. </section>
  284. <!-- A -->
  285. <section class="card">
  286. <div class="card__head">
  287. <h2 class="card__title">A. 左侧色条 + 文字色</h2>
  288. <span class="badge badge--rec">推荐</span>
  289. </div>
  290. <div class="card__body">
  291. <div class="cell">
  292. <div class="stack">
  293. <div class="vA__row vA__row--load">
  294. <span class="vA__label vA__label--load">装</span>
  295. <div class="body">
  296. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  297. <div class="sub">2026-09-16 08:30</div>
  298. </div>
  299. </div>
  300. <div class="vA__row vA__row--delivery">
  301. <span class="vA__label vA__label--delivery">送</span>
  302. <div class="body">
  303. <div class="name">武汉市东西湖区物流大道 88 号</div>
  304. <div class="sub">2026-09-16 16:00</div>
  305. </div>
  306. </div>
  307. </div>
  308. </div>
  309. <p class="card__note">无行底色;左侧 3px 色条扫视即可区分。改动小,密度与现状接近。</p>
  310. </div>
  311. </section>
  312. <!-- B -->
  313. <section class="card">
  314. <div class="card__head">
  315. <h2 class="card__title">B. 实心 Tag + 虚线分隔</h2>
  316. <span class="badge badge--rec">推荐</span>
  317. </div>
  318. <div class="card__body">
  319. <div class="cell">
  320. <div class="stack vB">
  321. <div class="row">
  322. <span class="vB__tag vB__tag--load">装</span>
  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="row">
  329. <span class="vB__tag vB__tag--delivery">送</span>
  330. <div class="body">
  331. <div class="name">武汉市东西湖区物流大道 88 号</div>
  332. <div class="sub">2026-09-16 16:00</div>
  333. </div>
  334. </div>
  335. </div>
  336. </div>
  337. <p class="card__note">对齐全局「状态 Tag 深色底白字」规范;标签本身就够辨识,行底可去掉。</p>
  338. </div>
  339. </section>
  340. <!-- C -->
  341. <section class="card">
  342. <div class="card__head">
  343. <h2 class="card__title">C. 描边 Tag · 无行底</h2>
  344. <span class="badge badge--alt">备选</span>
  345. </div>
  346. <div class="card__body">
  347. <div class="cell">
  348. <div class="stack vC">
  349. <div class="row">
  350. <span class="vC__tag vC__tag--load">装</span>
  351. <div class="body">
  352. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  353. <div class="sub">2026-09-16 08:30</div>
  354. </div>
  355. </div>
  356. <div class="row">
  357. <span class="vC__tag vC__tag--delivery">送</span>
  358. <div class="body">
  359. <div class="name">武汉市东西湖区物流大道 88 号</div>
  360. <div class="sub">2026-09-16 16:00</div>
  361. </div>
  362. </div>
  363. </div>
  364. </div>
  365. <p class="card__note">最接近现状标签样式,只去掉行背景。视觉最轻,但对比略弱。</p>
  366. </div>
  367. </section>
  368. <!-- D -->
  369. <section class="card">
  370. <div class="card__head">
  371. <h2 class="card__title">D. 时间轴圆点</h2>
  372. <span class="badge badge--alt">备选</span>
  373. </div>
  374. <div class="card__body">
  375. <div class="cell">
  376. <div class="vD">
  377. <div class="vD__row">
  378. <div class="vD__rail">
  379. <span class="vD__dot vD__dot--load"></span>
  380. <span class="vD__line"></span>
  381. </div>
  382. <span class="vD__label vD__label--load">装</span>
  383. <div class="body">
  384. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  385. <div class="sub">2026-09-16 08:30</div>
  386. </div>
  387. </div>
  388. <div class="vD__row">
  389. <div class="vD__rail">
  390. <span class="vD__dot vD__dot--delivery"></span>
  391. <span class="vD__line"></span>
  392. </div>
  393. <span class="vD__label vD__label--delivery">送</span>
  394. <div class="body">
  395. <div class="name">武汉市东西湖区物流大道 88 号</div>
  396. <div class="sub">2026-09-16 16:00</div>
  397. </div>
  398. </div>
  399. </div>
  400. </div>
  401. <p class="card__note">强调装→送顺序,适合地址/时间列。列宽略占,多列重复时可能偏重。</p>
  402. </div>
  403. </section>
  404. <!-- E -->
  405. <section class="card">
  406. <div class="card__head">
  407. <h2 class="card__title">E. 纯文字前缀</h2>
  408. <span class="badge badge--alt">备选</span>
  409. </div>
  410. <div class="card__body">
  411. <div class="cell">
  412. <div class="stack vE">
  413. <div class="row">
  414. <span class="vE__prefix vE__prefix--load">装</span>
  415. <div class="body">
  416. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  417. <div class="sub">2026-09-16 08:30</div>
  418. </div>
  419. </div>
  420. <div class="row">
  421. <span class="vE__prefix vE__prefix--delivery">送</span>
  422. <div class="body">
  423. <div class="name">武汉市东西湖区物流大道 88 号</div>
  424. <div class="sub">2026-09-16 16:00</div>
  425. </div>
  426. </div>
  427. </div>
  428. </div>
  429. <p class="card__note">最极简;靠字色 + 虚线分隔。实现成本最低,扫视辨识略弱于 A/B。</p>
  430. </div>
  431. </section>
  432. <!-- F -->
  433. <section class="card">
  434. <div class="card__head">
  435. <h2 class="card__title">F. 圆形色标</h2>
  436. <span class="badge badge--alt">备选</span>
  437. </div>
  438. <div class="card__body">
  439. <div class="cell">
  440. <div class="stack vF">
  441. <div class="row">
  442. <span class="vF__icon vF__icon--load">装</span>
  443. <div class="body">
  444. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  445. <div class="sub">2026-09-16 08:30</div>
  446. </div>
  447. </div>
  448. <div class="row">
  449. <span class="vF__icon vF__icon--delivery">送</span>
  450. <div class="body">
  451. <div class="name">武汉市东西湖区物流大道 88 号</div>
  452. <div class="sub">2026-09-16 16:00</div>
  453. </div>
  454. </div>
  455. </div>
  456. </div>
  457. <p class="card__note">标识更「点状」集中,正文区干净。圆角标与矩形 Tag 二选一即可,勿混用。</p>
  458. </div>
  459. </section>
  460. <!-- G -->
  461. <section class="card">
  462. <div class="card__head">
  463. <h2 class="card__title">G. 实心方标 + 虚线(折中)</h2>
  464. <span class="badge badge--alt">备选</span>
  465. </div>
  466. <div class="card__body">
  467. <div class="cell">
  468. <div class="vG">
  469. <div class="vG__row">
  470. <span class="vG__chip vG__chip--load">装</span>
  471. <div class="body">
  472. <div class="name">宜昌市西陵区某某化工园 A 区 12 号</div>
  473. <div class="sub">2026-09-16 08:30</div>
  474. </div>
  475. </div>
  476. <div class="vG__row">
  477. <span class="vG__chip vG__chip--delivery">送</span>
  478. <div class="body">
  479. <div class="name">武汉市东西湖区物流大道 88 号</div>
  480. <div class="sub">2026-09-16 16:00</div>
  481. </div>
  482. </div>
  483. </div>
  484. </div>
  485. <p class="card__note">与 B 接近,方标略扁;适合多列统一复用同一套 chip 样式。</p>
  486. </div>
  487. </section>
  488. </div>
  489. <div class="legend">
  490. <h2>选型建议</h2>
  491. <ul>
  492. <li><strong>A 左侧色条</strong>:改动最小、列表扫描友好,多列重复时也不吵。</li>
  493. <li><strong>B 实心 Tag</strong>:与 Element Tag 深色底规范一致,辨识度最高。</li>
  494. <li><strong>D 时间轴</strong>:仅建议用在「地址/时间」这类天然有顺序的列,不要每列都画轴。</li>
  495. <li>色语义保持现状:装 = 薄荷绿 <code>#059669</code>,送 = 天蓝 <code>#0284c7</code>。</li>
  496. </ul>
  497. </div>
  498. </body>
  499. </html>