oa-start-title-footer-demo.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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. --brand: #16a34a;
  10. --brand-dark: #15803d;
  11. --brand-soft: #f0fdf4;
  12. --bg: #f5f8f7;
  13. --surface: #fff;
  14. --ink: #1f2a26;
  15. --muted: #6b7b74;
  16. --border: #dcebe4;
  17. --danger: #d14343;
  18. }
  19. * { box-sizing: border-box; }
  20. body {
  21. margin: 0;
  22. font-family: "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", system-ui, sans-serif;
  23. color: var(--ink);
  24. background:
  25. radial-gradient(900px 480px at 0% -10%, #dcfce7 0%, transparent 50%),
  26. radial-gradient(700px 400px at 100% 0%, #e8f5ee 0%, transparent 45%),
  27. var(--bg);
  28. line-height: 1.45;
  29. }
  30. .wrap { max-width: 1180px; margin: 0 auto; padding: 24px 18px 80px; }
  31. h1 { margin: 0 0 8px; font-size: 22px; letter-spacing: -0.02em; }
  32. .sub { margin: 0; color: var(--muted); font-size: 14px; max-width: 720px; }
  33. .note {
  34. margin: 14px 0 22px;
  35. padding: 10px 12px;
  36. border-radius: 10px;
  37. background: #fff;
  38. border: 1px solid #e2e8e5;
  39. font-size: 13px;
  40. color: var(--muted);
  41. }
  42. h2 {
  43. margin: 28px 0 12px;
  44. font-size: 16px;
  45. font-weight: 700;
  46. }
  47. .hint { margin: 0 0 14px; font-size: 13px; color: var(--muted); }
  48. .phones {
  49. display: grid;
  50. grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  51. gap: 18px;
  52. }
  53. .phone-card {
  54. background: #fff;
  55. border: 1px solid #e2e8e5;
  56. border-radius: 16px;
  57. padding: 14px;
  58. cursor: pointer;
  59. transition: border-color .15s, box-shadow .15s;
  60. }
  61. .phone-card:hover {
  62. border-color: #86efac;
  63. box-shadow: 0 8px 28px rgba(21, 128, 61, 0.1);
  64. }
  65. .phone-card.selected {
  66. border-color: var(--brand);
  67. box-shadow: 0 0 0 2px rgba(22, 163, 74, 0.25);
  68. }
  69. .phone-card .label {
  70. display: flex;
  71. align-items: center;
  72. gap: 8px;
  73. margin-bottom: 10px;
  74. font-size: 13px;
  75. font-weight: 600;
  76. }
  77. .badge {
  78. display: inline-flex;
  79. align-items: center;
  80. justify-content: center;
  81. width: 22px;
  82. height: 22px;
  83. border-radius: 50%;
  84. background: var(--brand-soft);
  85. color: var(--brand-dark);
  86. font-size: 12px;
  87. font-weight: 700;
  88. }
  89. .phone-card .desc {
  90. margin: 0 0 12px;
  91. font-size: 12px;
  92. color: var(--muted);
  93. min-height: 34px;
  94. }
  95. .phone {
  96. width: 100%;
  97. max-width: 320px;
  98. margin: 0 auto;
  99. border-radius: 18px;
  100. overflow: hidden;
  101. border: 1px solid #cbd5d1;
  102. background: var(--bg);
  103. box-shadow: 0 10px 30px rgba(31, 42, 38, 0.08);
  104. }
  105. .nav {
  106. display: flex;
  107. align-items: center;
  108. justify-content: space-between;
  109. height: 44px;
  110. padding: 0 10px;
  111. color: #fff;
  112. background: var(--brand);
  113. font-size: 15px;
  114. font-weight: 600;
  115. }
  116. .nav .back { opacity: 0.9; font-weight: 400; font-size: 18px; width: 36px; }
  117. .nav .title {
  118. flex: 1;
  119. text-align: center;
  120. white-space: nowrap;
  121. overflow: hidden;
  122. text-overflow: ellipsis;
  123. padding: 0 4px;
  124. }
  125. .nav .right { width: 36px; }
  126. .inner-hd {
  127. padding: 12px 14px;
  128. font-weight: 700;
  129. color: #fff;
  130. background: linear-gradient(135deg, var(--brand), var(--brand-dark));
  131. font-size: 15px;
  132. }
  133. .inner-hd.gone {
  134. display: none;
  135. }
  136. .body {
  137. padding: 12px;
  138. min-height: 220px;
  139. }
  140. .field {
  141. background: #fff;
  142. border-radius: 12px;
  143. border: 1px solid var(--border);
  144. padding: 12px 14px;
  145. margin-bottom: 10px;
  146. }
  147. .field .k { font-size: 12px; color: var(--muted); margin-bottom: 4px; }
  148. .field .v { font-size: 14px; color: #94a3b8; }
  149. .ft {
  150. display: flex;
  151. gap: 8px;
  152. padding: 10px 12px 14px;
  153. background: #fff;
  154. border-top: 1px solid var(--border);
  155. }
  156. .btn {
  157. flex: 1;
  158. height: 40px;
  159. border-radius: 10px;
  160. border: 1px solid var(--border);
  161. background: #fff;
  162. color: var(--ink);
  163. font-size: 14px;
  164. font-weight: 500;
  165. display: flex;
  166. align-items: center;
  167. justify-content: center;
  168. gap: 4px;
  169. cursor: default;
  170. }
  171. .btn-primary {
  172. background: var(--brand);
  173. border-color: var(--brand);
  174. color: #fff;
  175. font-weight: 600;
  176. }
  177. /* A: 等宽三键,主色提交,描边次要 */
  178. .style-a .btn-ghost {
  179. background: #fff;
  180. border-color: var(--border);
  181. color: var(--muted);
  182. }
  183. .style-a .btn-soft {
  184. background: var(--brand-soft);
  185. border-color: #bbf7d0;
  186. color: var(--brand-dark);
  187. font-weight: 600;
  188. }
  189. /* B: 取消弱化,暂存描边,提交加宽主按钮 */
  190. .style-b .ft { gap: 10px; }
  191. .style-b .btn-cancel {
  192. flex: 0 0 64px;
  193. background: transparent;
  194. border-color: transparent;
  195. color: var(--muted);
  196. }
  197. .style-b .btn-draft {
  198. flex: 1;
  199. background: #fff;
  200. border: 1.5px solid var(--brand);
  201. color: var(--brand-dark);
  202. font-weight: 600;
  203. }
  204. .style-b .btn-submit {
  205. flex: 1.35;
  206. background: linear-gradient(135deg, var(--brand), var(--brand-dark));
  207. border: none;
  208. color: #fff;
  209. font-weight: 700;
  210. box-shadow: 0 6px 14px rgba(22, 163, 74, 0.28);
  211. }
  212. /* C: 圆角胶囊 + 图标感文字层次 */
  213. .style-c .ft {
  214. gap: 8px;
  215. padding: 12px 12px 16px;
  216. background: linear-gradient(180deg, rgba(255,255,255,0.92), #fff);
  217. }
  218. .style-c .btn {
  219. height: 44px;
  220. border-radius: 999px;
  221. font-size: 14px;
  222. }
  223. .style-c .btn-cancel {
  224. background: #f5f8f7;
  225. border-color: transparent;
  226. color: var(--muted);
  227. }
  228. .style-c .btn-draft {
  229. background: #fff;
  230. border: 1.5px solid #86efac;
  231. color: var(--brand-dark);
  232. font-weight: 600;
  233. }
  234. .style-c .btn-submit {
  235. background: linear-gradient(135deg, #22c55e, var(--brand-dark));
  236. border: none;
  237. color: #fff;
  238. font-weight: 700;
  239. box-shadow: 0 8px 18px rgba(22, 163, 74, 0.32);
  240. }
  241. .legend {
  242. margin-top: 18px;
  243. padding: 12px 14px;
  244. border-radius: 12px;
  245. background: #fff;
  246. border: 1px solid #e2e8e5;
  247. font-size: 13px;
  248. color: var(--muted);
  249. }
  250. .legend strong { color: var(--ink); }
  251. .pick {
  252. position: sticky;
  253. bottom: 12px;
  254. margin-top: 20px;
  255. padding: 12px 14px;
  256. border-radius: 12px;
  257. background: #fff;
  258. border: 1px solid var(--brand);
  259. box-shadow: 0 8px 24px rgba(21, 128, 61, 0.12);
  260. font-size: 14px;
  261. }
  262. .pick em { font-style: normal; color: var(--brand-dark); font-weight: 700; }
  263. </style>
  264. </head>
  265. <body>
  266. <div class="wrap">
  267. <h1>填写审批 · 标题与底栏按钮</h1>
  268. <p class="sub">顶部栏显示流程名称(如「入库单」),去掉页面内重复绿条标题;底部「取消 / 暂存草稿 / 提交」三套样式可选。</p>
  269. <p class="note">示例流程:入库单。点击下方某一方案卡片即可选中(也可在对话里直接回复 A / B / C)。</p>
  270. <h2>1. 标题结构(已定方向)</h2>
  271. <p class="hint">左侧为现状,右侧为调整后:导航栏标题 = 流程名;去掉界面内「入库单」绿条。</p>
  272. <div class="phones">
  273. <div class="phone-card" style="cursor: default;">
  274. <div class="label"><span class="badge">旧</span> 现状</div>
  275. <p class="desc">导航「填写审批」+ 页内再显示「入库单」,标题重复。</p>
  276. <div class="phone">
  277. <div class="nav">
  278. <span class="back">‹</span>
  279. <span class="title">填写审批</span>
  280. <span class="right"></span>
  281. </div>
  282. <div class="inner-hd">入库单</div>
  283. <div class="body">
  284. <div class="field"><div class="k">仓库</div><div class="v">请选择</div></div>
  285. <div class="field"><div class="k">备注</div><div class="v">选填</div></div>
  286. </div>
  287. <div class="ft">
  288. <div class="btn">取消</div>
  289. <div class="btn">暂存草稿</div>
  290. <div class="btn btn-primary">提交</div>
  291. </div>
  292. </div>
  293. </div>
  294. <div class="phone-card" style="cursor: default;">
  295. <div class="label"><span class="badge">新</span> 调整后</div>
  296. <p class="desc">导航直接显示「入库单」;页内绿条标题移除,表单上移。</p>
  297. <div class="phone">
  298. <div class="nav">
  299. <span class="back">‹</span>
  300. <span class="title">入库单</span>
  301. <span class="right"></span>
  302. </div>
  303. <div class="body">
  304. <div class="field"><div class="k">仓库</div><div class="v">请选择</div></div>
  305. <div class="field"><div class="k">备注</div><div class="v">选填</div></div>
  306. </div>
  307. <div class="ft style-b">
  308. <div class="btn btn-cancel">取消</div>
  309. <div class="btn btn-draft">暂存草稿</div>
  310. <div class="btn btn-submit">提交</div>
  311. </div>
  312. </div>
  313. </div>
  314. </div>
  315. <h2>2. 底部按钮样式(请选一)</h2>
  316. <p class="hint">三套均基于品牌绿 #16a34a;主行动「提交」视觉权重最高。</p>
  317. <div class="phones" id="choices">
  318. <div class="phone-card" data-choice="a" onclick="pick(this)">
  319. <div class="label"><span class="badge">A</span> 等宽三键 · 浅绿暂存</div>
  320. <p class="desc">取消中性描边;暂存浅绿底;提交实心主色。三键等宽,最稳妥。</p>
  321. <div class="phone style-a">
  322. <div class="nav">
  323. <span class="back">‹</span>
  324. <span class="title">入库单</span>
  325. <span class="right"></span>
  326. </div>
  327. <div class="body">
  328. <div class="field"><div class="k">仓库</div><div class="v">请选择</div></div>
  329. <div class="field"><div class="k">备注</div><div class="v">选填</div></div>
  330. </div>
  331. <div class="ft">
  332. <div class="btn btn-ghost">取消</div>
  333. <div class="btn btn-soft">暂存草稿</div>
  334. <div class="btn btn-primary">提交</div>
  335. </div>
  336. </div>
  337. </div>
  338. <div class="phone-card" data-choice="b" onclick="pick(this)">
  339. <div class="label"><span class="badge">B</span> 取消弱化 · 提交加宽(推荐)</div>
  340. <p class="desc">取消缩成文字按钮;暂存品牌描边;提交加宽渐变,主次更清晰。</p>
  341. <div class="phone style-b">
  342. <div class="nav">
  343. <span class="back">‹</span>
  344. <span class="title">入库单</span>
  345. <span class="right"></span>
  346. </div>
  347. <div class="body">
  348. <div class="field"><div class="k">仓库</div><div class="v">请选择</div></div>
  349. <div class="field"><div class="k">备注</div><div class="v">选填</div></div>
  350. </div>
  351. <div class="ft">
  352. <div class="btn btn-cancel">取消</div>
  353. <div class="btn btn-draft">暂存草稿</div>
  354. <div class="btn btn-submit">提交</div>
  355. </div>
  356. </div>
  357. </div>
  358. <div class="phone-card" data-choice="c" onclick="pick(this)">
  359. <div class="label"><span class="badge">C</span> 胶囊圆角 · 更高底栏</div>
  360. <p class="desc">全圆角胶囊;底栏略高、触达更友好;风格更「C 端」一些。</p>
  361. <div class="phone style-c">
  362. <div class="nav">
  363. <span class="back">‹</span>
  364. <span class="title">入库单</span>
  365. <span class="right"></span>
  366. </div>
  367. <div class="body">
  368. <div class="field"><div class="k">仓库</div><div class="v">请选择</div></div>
  369. <div class="field"><div class="k">备注</div><div class="v">选填</div></div>
  370. </div>
  371. <div class="ft">
  372. <div class="btn btn-cancel">取消</div>
  373. <div class="btn btn-draft">暂存草稿</div>
  374. <div class="btn btn-submit">提交</div>
  375. </div>
  376. </div>
  377. </div>
  378. </div>
  379. <div class="legend">
  380. <strong>实现要点(选定后):</strong>
  381. uni-app 顶栏用流程名(query 传 <code>appName</code> 或 webview 内加载后同步);
  382. <code>OaStart.vue</code> 去掉 <code>.oa-start__hd</code>;
  383. 底栏按所选样式改 Vant 按钮 class / SCSS。
  384. </div>
  385. <div class="pick" id="pickBar">当前未选择 — 请点击上方 A / B / C</div>
  386. </div>
  387. <script>
  388. function pick(el) {
  389. document.querySelectorAll('.phone-card[data-choice]').forEach(function (n) {
  390. n.classList.remove('selected')
  391. })
  392. el.classList.add('selected')
  393. var map = { a: 'A · 等宽三键', b: 'B · 取消弱化 + 提交加宽(推荐)', c: 'C · 胶囊圆角' }
  394. var c = el.getAttribute('data-choice')
  395. document.getElementById('pickBar').innerHTML =
  396. '已选:<em>' + map[c] + '</em> — 在对话里回复该字母即可继续'
  397. if (typeof toggleSelect === 'function') {
  398. try { toggleSelect(el) } catch (e) {}
  399. }
  400. }
  401. </script>
  402. </body>
  403. </html>