Files
zkxw/mobile-ui/zkxw-mobile-oa-detail-header-stamp-demo.html
T
2026-08-13 14:31:57 +08:00

565 lines
19 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<title>mobile-oa-h5 · 详情头区去掉标题 + 打印印章 Demo</title>
<style>
:root {
--brand: #0a9f6d;
--brand-dark: #087f57;
--brand-soft: #e9f9f2;
--page-bg: #f5f6f8;
--text: #1f2a26;
--text-muted: #6b7b74;
--nav-bg: #ecfdf5;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", -apple-system, system-ui, sans-serif;
color: var(--text);
background:
radial-gradient(900px 420px at 8% -8%, rgba(10, 159, 109, 0.12), transparent 55%),
radial-gradient(700px 380px at 92% 0%, rgba(214, 163, 67, 0.1), transparent 50%),
linear-gradient(180deg, #f8fffc 0%, #f4f7fb 50%, #f7f8fa 100%);
line-height: 1.45;
}
.stage { max-width: 1280px; margin: 0 auto; padding: 28px 16px 56px; }
.hero h1 { margin: 0 0 8px; font-size: 22px; font-weight: 720; }
.hero p { margin: 0; color: #64748b; font-size: 14px; max-width: 820px; }
.hero .note {
margin-top: 12px; display: inline-block; padding: 8px 12px;
border-radius: 10px; background: #fff; border: 1px solid #e2e8f0;
font-size: 12px; color: #64748b;
}
.hero .note strong { color: #0f766e; }
.goals {
margin-top: 14px; padding: 12px 14px; border-radius: 12px;
background: #ecfdf5; border: 1px solid #a7f3d0;
font-size: 13px; color: #065f46;
}
.goals ul { margin: 6px 0 0; padding-left: 18px; }
.grid {
margin-top: 22px;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
align-items: start;
}
.card {
background: rgba(255,255,255,.94);
border: 1px solid #e2e8f0;
border-radius: 16px;
padding: 14px;
box-shadow: 0 10px 28px rgba(15,23,42,.05);
}
.card h2 {
margin: 0 0 4px;
font-size: 15px;
display: flex;
align-items: center;
gap: 8px;
}
.card .sub { margin: 0 0 12px; font-size: 12px; color: #64748b; }
.pill {
display: inline-block;
padding: 2px 8px;
border-radius: 999px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.02em;
}
.pill.now { background: #fff1f2; color: #be123c; border: 1px solid #fecdd3; }
.pill.rec { background: #ecfdf5; color: #047857; border: 1px solid #a7f3d0; }
.pill.alt { background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; }
/* phone frame */
.phone {
width: 100%;
max-width: 360px;
margin: 0 auto;
border-radius: 28px;
border: 1px solid #cbd5e1;
background: #0f172a;
padding: 10px;
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.12);
}
.phone__screen {
border-radius: 20px;
overflow: hidden;
background: var(--page-bg);
min-height: 520px;
display: flex;
flex-direction: column;
}
.nav {
display: flex;
align-items: center;
gap: 8px;
min-height: 48px;
padding: 10px 12px;
background: linear-gradient(180deg, #d1fae5 0%, var(--nav-bg) 100%);
border-bottom: 1px solid #bbf7d0;
}
.nav__back {
width: 28px; height: 28px; border-radius: 999px;
display: grid; place-items: center;
color: var(--brand-dark); font-weight: 700; font-size: 16px;
background: rgba(255,255,255,.55);
}
.nav__title {
flex: 1; min-width: 0;
font-size: 15px; font-weight: 700;
color: #064e3b;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.body {
position: relative;
flex: 1;
padding: 12px 12px 20px;
}
.body--stamp-pad {
padding-top: 8px;
}
/* current header: title + tag */
.hd {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
margin-bottom: 12px;
padding: 4px 2px;
}
.hd__title {
margin: 0;
font-size: 17px;
font-weight: 700;
line-height: 1.35;
color: #0f291e;
}
.tag {
flex-shrink: 0;
padding: 2px 8px;
border-radius: 6px;
font-size: 12px;
font-weight: 600;
color: #10b981;
background: #ecfdf5;
}
.dup-hint {
outline: 2px dashed #f43f5e;
outline-offset: 2px;
border-radius: 4px;
background: rgba(244, 63, 94, 0.06);
}
/* form fake */
.form {
background: #fff;
border: 1px solid #e8edf2;
border-radius: 12px;
overflow: hidden;
}
.form__row {
display: grid;
grid-template-columns: 88px 1fr;
border-bottom: 1px solid #f1f5f9;
min-height: 44px;
}
.form__row:last-child { border-bottom: 0; }
.form__k {
padding: 10px 12px;
font-size: 12px;
color: #64748b;
background: #fafbfc;
border-right: 1px solid #f1f5f9;
display: flex; align-items: center;
}
.form__v {
padding: 10px 12px;
font-size: 13px;
color: #0f172a;
display: flex; align-items: center;
}
.tl {
margin-top: 12px;
background: #fff;
border: 1px solid #e8edf2;
border-radius: 12px;
padding: 12px;
}
.tl h3 { margin: 0 0 8px; font-size: 13px; color: #334155; }
.tl p { margin: 0; font-size: 12px; color: #64748b; }
/* ===== 印章 v4(对齐 web-admin OaApprovalPrintSheet) ===== */
.stamp-host {
position: relative;
min-height: 0;
}
.oa-stamp {
--stamp: #3ec9a8;
position: absolute;
top: -2px;
right: 4px;
width: 96px;
height: 96px;
z-index: 5;
pointer-events: none;
transform: rotate(-18deg);
opacity: 0.88;
color: var(--stamp);
}
.oa-stamp.ok { --stamp: #3ec9a8; }
.oa-stamp.run { --stamp: #f0a020; }
.oa-stamp.rej { --stamp: #e85d5d; }
.oa-stamp.ret { --stamp: #e07070; }
.oa-stamp.can { --stamp: #9aa0a6; }
.oa-stamp .outer {
position: absolute;
inset: 0;
border-radius: 50%;
border: 4px solid currentColor;
box-sizing: border-box;
}
.oa-stamp .arc-top,
.oa-stamp .arc-bottom {
position: absolute;
left: 12px;
right: 12px;
border: 2px solid currentColor;
opacity: 0.95;
pointer-events: none;
}
.oa-stamp .arc-top {
top: 9px;
height: 28px;
border-bottom: none;
border-left-color: transparent;
border-right-color: transparent;
border-radius: 50% 50% 0 0 / 100% 100% 0 0;
}
.oa-stamp .arc-bottom {
bottom: 9px;
height: 28px;
border-top: none;
border-left-color: transparent;
border-right-color: transparent;
border-radius: 0 0 50% 50% / 0 0 100% 100%;
}
.oa-stamp .label-top {
position: absolute;
top: 18px;
left: 0; right: 0;
text-align: center;
font-size: 9px;
font-weight: 500;
letter-spacing: 1.5px;
line-height: 1;
color: currentColor;
opacity: 0.95;
}
.oa-stamp .label-bottom {
position: absolute;
bottom: 16px;
left: 0; right: 0;
text-align: center;
font-size: 8px;
font-weight: 500;
letter-spacing: 0.5px;
line-height: 1;
color: currentColor;
opacity: 0.9;
font-family: Arial, "Helvetica Neue", sans-serif;
}
.oa-stamp .main {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
font-weight: 800;
letter-spacing: 1px;
line-height: 1;
color: currentColor;
font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
-webkit-text-stroke: 0.3px currentColor;
}
.oa-stamp .main.chars-3 {
font-size: 20px;
letter-spacing: 0.5px;
}
/* A2: 略小印章浮在表单右上(已选 72px) */
.oa-stamp.sm {
width: 72px;
height: 72px;
top: 8px;
right: 8px;
}
.oa-stamp.sm .outer { border-width: 3px; }
.oa-stamp.sm .main { font-size: 17px; }
.oa-stamp.sm .main.chars-3 { font-size: 14px; }
.oa-stamp.sm .label-top { top: 13px; font-size: 7px; letter-spacing: 1px; }
.oa-stamp.sm .label-bottom { bottom: 12px; font-size: 6px; }
.oa-stamp.sm .arc-top { top: 7px; height: 20px; left: 8px; right: 8px; }
.oa-stamp.sm .arc-bottom { bottom: 7px; height: 20px; left: 8px; right: 8px; }
/* 对照:上一版 84px */
.oa-stamp.md {
width: 84px;
height: 84px;
top: 6px;
right: 8px;
}
.oa-stamp.md .main { font-size: 20px; }
.oa-stamp.md .main.chars-3 { font-size: 17px; }
.oa-stamp.md .label-top { top: 15px; font-size: 8px; }
.oa-stamp.md .label-bottom { bottom: 14px; font-size: 7px; }
.oa-stamp.md .arc-top { top: 8px; height: 24px; left: 10px; right: 10px; }
.oa-stamp.md .arc-bottom { bottom: 8px; height: 24px; left: 10px; right: 10px; }
.stamp-row {
margin-top: 18px;
display: flex;
flex-wrap: wrap;
gap: 16px;
justify-content: center;
padding: 16px;
background: #fff;
border: 1px dashed #cbd5e1;
border-radius: 14px;
}
.stamp-row .item {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
min-width: 110px;
}
.stamp-row .item span {
font-size: 11px;
color: #64748b;
}
.stamp-static {
position: relative;
width: 96px;
height: 96px;
}
.stamp-static .oa-stamp {
position: absolute;
top: 0; right: 0;
transform: rotate(-18deg);
}
.legend {
margin-top: 18px;
padding: 14px 16px;
border-radius: 14px;
background: rgba(255,255,255,.94);
border: 1px solid #e2e8f0;
font-size: 13px;
color: #475569;
}
.legend h2 { margin: 0 0 8px; font-size: 15px; color: var(--text); }
.legend ol { margin: 0; padding-left: 18px; }
.legend li { margin: 4px 0; }
.legend code {
font-size: 12px;
background: #f1f5f9;
padding: 1px 6px;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="stage">
<header class="hero">
<h1>OA 详情 · 去掉内容区流程标题 + 右上角打印印章</h1>
<p>
对比当前「标题 + 已完成 Tag」与目标态「顶栏已有标题,内容区不再重复标题;状态改为对齐 web 打印的钉钉风印章,叠在右上角」。
改动落点:<code>mobile-oa-h5/src/views/OaDetail.vue</code>(webview 内嵌页)。
</p>
<div class="note">本地打开本文件即可预览 · 文件:<strong>mobile-ui/zkxw-mobile-oa-detail-header-stamp-demo.html</strong></div>
<div class="goals">
<strong>目标</strong>
<ul>
<li>去掉内容区顶部流程名称(与顶栏标题重复)</li>
<li>「已完成」等状态 Tag → web 打印同款圆形印章,放在界面右上角</li>
<li>文案对齐打印:completed →「已通过」(非「已完成」)</li>
</ul>
</div>
</header>
<div class="grid">
<!-- 现状 -->
<section class="card">
<h2><span class="pill now">现状</span> 标题 + Tag</h2>
<p class="sub">顶栏与内容区标题重复(红框);状态为小胶囊 Tag。</p>
<div class="phone">
<div class="phone__screen">
<div class="nav">
<div class="nav__back">‹</div>
<div class="nav__title">差旅报销申请</div>
</div>
<div class="body">
<header class="hd">
<h1 class="hd__title dup-hint">差旅报销申请</h1>
<span class="tag">已完成</span>
</header>
<div class="form">
<div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
<div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
<div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
</div>
<div class="tl">
<h3>审批进度</h3>
<p>发起 → 部门负责人(已同意)→ 结束</p>
</div>
</div>
</div>
</div>
</section>
<!-- 选定:A 布局 + 略小印章 -->
<section class="card">
<h2><span class="pill rec">已选</span> A 布局 · 印章 72px</h2>
<p class="sub">去掉内容区标题;钉钉风印章叠在表单右上(相对 web 打印 118px / 上一版 84px 再小一档)。</p>
<div class="phone">
<div class="phone__screen">
<div class="nav">
<div class="nav__back">‹</div>
<div class="nav__title">差旅报销申请</div>
</div>
<div class="body body--stamp-pad">
<div class="stamp-host">
<div class="oa-stamp ok sm" aria-label="已通过">
<div class="outer"></div>
<div class="arc-top"></div>
<div class="arc-bottom"></div>
<div class="label-top">OA审批</div>
<div class="main">已通过</div>
<div class="label-bottom">approval</div>
</div>
<div class="form">
<div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
<div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
<div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
<div class="form__row"><div class="form__k">备注</div><div class="form__v">含市内交通</div></div>
</div>
</div>
<div class="tl">
<h3>审批进度</h3>
<p>发起 → 部门负责人(已同意)→ 结束</p>
</div>
</div>
</div>
</div>
</section>
<!-- 对照:大一号 -->
<section class="card">
<h2><span class="pill alt">对照</span> 若用 84px(未选)</h2>
<p class="sub">仅尺寸对照;落地用左侧 72px。</p>
<div class="phone">
<div class="phone__screen">
<div class="nav">
<div class="nav__back">‹</div>
<div class="nav__title">差旅报销申请</div>
</div>
<div class="body body--stamp-pad">
<div class="stamp-host">
<div class="oa-stamp ok md" aria-label="已通过">
<div class="outer"></div>
<div class="arc-top"></div>
<div class="arc-bottom"></div>
<div class="label-top">OA审批</div>
<div class="main">已通过</div>
<div class="label-bottom">approval</div>
</div>
<div class="form">
<div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
<div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
<div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
<div class="form__row"><div class="form__k">备注</div><div class="form__v">含市内交通</div></div>
</div>
</div>
<div class="tl">
<h3>审批进度</h3>
<p>发起 → 部门负责人(已同意)→ 结束</p>
</div>
</div>
</div>
</div>
</section>
</div>
<section class="legend">
<h2>各状态印章色(与 web 打印一致)</h2>
<div class="stamp-row">
<div class="item">
<div class="stamp-static">
<div class="oa-stamp ok">
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
<div class="label-top">OA审批</div><div class="main">已通过</div><div class="label-bottom">approval</div>
</div>
</div>
<span>completed / approved → ok</span>
</div>
<div class="item">
<div class="stamp-static">
<div class="oa-stamp run">
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
<div class="label-top">OA审批</div><div class="main">审批中</div><div class="label-bottom">approval</div>
</div>
</div>
<span>running / pending → run</span>
</div>
<div class="item">
<div class="stamp-static">
<div class="oa-stamp rej">
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
<div class="label-top">OA审批</div><div class="main">已拒绝</div><div class="label-bottom">approval</div>
</div>
</div>
<span>rejected → rej</span>
</div>
<div class="item">
<div class="stamp-static">
<div class="oa-stamp ret">
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
<div class="label-top">OA审批</div><div class="main">已打回</div><div class="label-bottom">approval</div>
</div>
</div>
<span>returned → ret</span>
</div>
<div class="item">
<div class="stamp-static">
<div class="oa-stamp can">
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
<div class="label-top">OA审批</div><div class="main">已撤销</div><div class="label-bottom">approval</div>
</div>
</div>
<span>cancelled → can</span>
</div>
</div>
</section>
<section class="legend">
<h2>当前共识</h2>
<ol>
<li>去掉内容区流程标题(顶栏已有)</li>
<li>状态改为 web 打印同款印章,叠在表单区域右上角</li>
<li>尺寸用 <strong>72px</strong>(A 布局 + 再小一档),文案用打印 <code>resolveStamp</code>(如 completed →「已通过」)</li>
</ol>
<p style="margin:10px 0 0">若 72px 仍偏大/偏小,直接说目标像素即可;否则回复「按此设计」我写 spec 并实现。</p>
</section>
</div>
</body>
</html>