B2B 网站前端开发
你把设计稿变成采购在办公室电脑和手机上都能在 2.5 秒内打开、能被 Google 和 AI 搜索完整读取、你们自己能在后台改内容的网站。判断一个前端实现好不好,不看代码多漂亮,看三件事:快不快、能不能被抓取、你们改内容时会不会把版式弄坏。
上游是设计(设计稿、组件规范、视觉系统、响应式规则)、文案(文案稿的结构决定 DOM 层级)、策划(技术清单,哪些动效要做、哪些刻意不做)。下游是后端(表单、CMS 字段、多语言、部署)、SEO(检查你的 DOM 和性能)、测试。
参考文件
| 文件 | 什么时候读 |
|---|---|
references/前端自查表.md | 交给测试之前逐条过一遍 |
P0 / P1 的条目自己修完再交,别留给测试。内容与可访问性语义的检查在 b2b-qa-tester/references/可用性与可访问性检查项.md,两份不重叠。
你在这个环节会提什么、意图是什么、怎么满足
你很少直接对前端提需求,多数经 PM 转来,或者在验收时冒出来:
| 你的原话 | 背后的意图 | 怎么满足 | 归因 |
|---|---|---|---|
| “网站打开有点慢” | 采购的第一印象,你自己也感觉到了 | 跑 PageSpeed:图片转 WebP 并压到 200KB 内、hero 图预加载、字体自托管且只留 3–4 个字重、延迟加载首屏外图片和第三方脚本、去掉未用的插件 CSS/JS | 技术:LCP < 2.5s;业务:慢 1 秒采购流失明显;目标市场网络差时更甚 |
| “手机上看排版乱了” | 你或老板在微信里打开 | 按设计的断点逐页检查;参数表加横向滚动和固定首列;Bento 退化为单列;按钮全宽;导航折叠但询盘按钮常驻 | 体验:移动占比高的市场手机就是主战场 |
| “我在后台改了一段文字,页面就变形了” | 你们要自己维护,但布局脆弱 | 内容区用固定的区块 / 字段(ACF 或区块编辑器的自定义区块),文字长度变化不影响栅格;给每个字段写字数提示 | 技术:可维护性;业务:后台改不了就每次都得动代码,网站很快没人敢碰 |
| “能不能加个炫一点的动画” | 想和模板站区分 | 只实现策划技术清单里的动效,用 CSS + Intersection Observer 或轻量 GSAP,尊重 prefers-reduced-motion;WebGL、粒子、页面过渡按清单默认不做 | 技术:动效脚本是性能杀手;业务:采购要快不要炫 |
| “Google 搜不到我们” | 上线后收录焦虑 | 前端能做的:语义化标签、每页一个 H1、标题和文字在真实 DOM 里而不是 canvas / 图片、图片 alt、结构化数据占位、robots 不误屏蔽、站点地图可生成 | SEO:可抓取性是前端的责任;业务:搜不到等于没建 |
| “要中英文 / 多语言切换” | 多市场 | 用 WPML / Polylang 或多站点,切换器放导航右上,hreflang 由后端 / SEO 配;未翻译页面回退到英文而不是 404 | 技术:多语言架构一旦选错后期迁移成本极高;SEO:hreflang 影响多国收录 |
| “参考 XX 站的那个筛选效果” | 想要按参数找产品 | 分类法 + 自定义字段做筛选维度,Ajax 无刷新更新列表,URL 带参数可分享可收录;结果为空时给引导 | 体验:采购按材质 / 规格找;SEO:筛选结果页可被抓取(注意 canonical) |
| “表单能不能少填几项” | 怕采购嫌麻烦 | 字段 5–7 个,必填只 Name / Email / Message,其余选填;型号从产品页带入;手机上输入框 16px 防缩放;提交按钮显示加载状态 | 体验:每多一个必填项转化下降;业务:低门槛先拿到联系方式,细节靠后续沟通 |
| “换个主题 / 换成 XX 模板” | 看到别的站好看 | 解释主题决定的是骨架,视觉由设计系统决定;换主题等于重做;如必须换,评估主题的性能与区块支持再定 | 技术:主题锁定内容结构和性能上限;业务:返工成本 |
实现流程
1. 技术选型(询盘站默认 WordPress)
- WordPress + 轻量主题(GeneratePress / Blocksy / Kadence / 自定义区块主题)+ ACF 或原生区块做自定义字段;避免 Elementor / WPBakery 这类页面构建器的大体积和锁定(如旧站已在用,评估后再决定)。
- 自定义区块或子主题。
- 静态或框架方案(Astro / Next.js)只在没有后台维护需求、且公司里有人能长期维护代码时用;否则 WordPress 对以后维护网站的同事更友好。
2. 搭建视觉系统
把设计的 token 写成 CSS 变量:颜色、字号阶梯、行高、间距、圆角、阴影、断点。所有组件只引用变量,方便后期换色换字。字体自托管 woff2、font-display: swap、预加载首屏字体、回退字体栈匹配宽度。
3. 组件实现顺序
导航(含 mega menu 和手机折叠、询盘按钮常驻)→ 按钮与表单控件 → 卡片(产品卡、案例卡)→ 参数表(斑马纹、tabular 数字、横向滚动、首列固定)→ Tabs / Accordion → Counter → Bento 网格 → CTA 区 → 页脚 → 粘性询盘条 / WhatsApp 浮标 → Logo 跑马灯 → 滚动渐入。先做全站复用的,再做单页的。
4. 页面模板
首页、分类页(含筛选)、产品详情页(图集、参数 Tabs、预填询盘)、About、OEM / 流程、行业页、认证页、FAQ(Schema 友好的结构)、博客列表与文章、Contact、thank-you 页、404。每个模板绑定对应的字段组,以后维护网站的同事在后台填字段而不是排版。
5. 性能与可抓取性检查(上线前必做)
- LCP < 2.5s、CLS < 0.1、INP < 200ms,移动端 PageSpeed ≥ 80
- 不设任何全屏 preloader。 首屏 HTML、文案、CTA 无条件立即渲染。实拆 31 个 Awwwards 获奖站,7 个因为加载门在实测中根本打不开(有的 57 个请求全部 200、console 无报错,仍卡在 54%)。真要等资源就写
Promise.race([资源就绪, 1.5s 超时])。详见b2b-ui-designer/references/获奖站实证.md - 不用虚拟滚动(Lenis 之类接管滚动的方案)。实测会让 GA 滚动深度上报假数据、锚点跳转与"返回上次位置"失效、程序化滚动打断动画。询盘站靠数据判断漏斗、靠锚点导航
- 询盘表单加蜜罐字段:
<input name="website">配position:absolute;left:-9999px;width:4px;height:4px;opacity:0+aria-hidden="true"+tabindex="-1",提交时非空即丢 - 图片:WebP / AVIF、
srcset、首屏预加载、其余懒加载、单图 ≤ 200KB、hero ≤ 400KB、产品载体场景段主图 ≤ 300KB 且排除在自动压缩之外(短边 ≥2000px 的产品图压到 200KB 会糊) - 字体:≤ 4 个文件、总量 ≤ 300KB
- 脚本:第三方脚本延迟、未用 CSS/JS 去除、动效库按需引入
- DOM:每页一个 H1、标题层级不跳级、文字在 DOM 里、图片 alt、链接有文字、按钮是
<button>、表单有 label - 可访问性:键盘可达、焦点可见、对比度达标、
prefers-reduced-motion生效 - robots / noindex 在测试站期间开启、上线时关闭(写进上线检查表,交给后端)
渲染级自查(上面查的是代码,这里查的是渲染出来的画面;参考 ux-ui-agent-skills / oil-ui):
- 每个模板出三档截图拼成一张:桌面 1440、手机 390、
prefers-reduced-motion: reduce,存_内部/06-站点记录/截图/,文件名「模板-日期」。拼图是给隔离评审和 QA 看的,不是自己看一眼就删 - 横向溢出:每档截图对应的页面跑一次
document.documentElement.scrollWidth > window.innerWidth,为真记 P1,自己修完再交 - 触控目标:规范写的是 44px,实测的底线是 24×24——任何可点元素渲染后小于 24×24 记 P1(参考 ux-ui-agent-skills,对应 WCAG 2.2 最低档);实测用
getBoundingClientRect(),不看设计稿 - hover / focus 态的对比度要实测,不只测默认态:按钮悬停变浅、链接聚焦变色之后,文字与底色仍要达标
:root之外不许出现裸 hex:所有颜色只引用 CSS 变量,grep 一遍#[0-9a-fA-F]{3,6}只允许出现在:root和深色模式的变量重定义里- 不用 emoji 当图标:图标一律走策划定的图标库(Lucide / Phosphor / Tabler),emoji 在各系统渲染不一致且无法换色
- 机器化部分跑
node scripts/check.mjs dist --shots:出三档截图、查横向溢出、扫裸 hex 与 emoji;人工只补它查不到的(hover / focus 对比度、拼图看版式) - 看图配额:三档截图自查只看自己截的图;一步总共不超过 20 张,超过配额的写「未逐张核,按元数据判」,不是错
隔离评审:G3 前(首页能在浏览器里渲染出来就做,不等全站完工),起一个不读源码、不读设计决策说明的子 agent,只给它首页三档截图和 b2b-site-diagnosis/references/公司分型速查与自查.md,让它按手册给首页打 1–10 分并列出可删的文字;分数与可删清单写进 _内部/06-站点记录/前端自查表.md 末尾。读过理由的人会替页面辩护,所以评审者必须是没读过理由的。没做隔离评审的,在自查表注明「未独立评审」,不许留空。
6. 动效实现规则
动效分两类,实现原则不同。
常规渐入类(只做策划技术清单里的项目):CSS 优先,JS 其次,库最后;进入视口触发一次不重复;时长 300–600ms。
产品载体场景段(G2 方向单里定了才有,全站最多一段):scrub 驱动、可逆、没有时长参数(状态由滚动位置决定);钉住用 CSS position: sticky,不要用 ScrollTrigger 的 pin;实现按 b2b-ui-designer/references/产品载体与场景段.md。手机端保留这一段但降强度:去掉 filter: blur()、旋转角度减半、载体图换低分辨率版;不要整段退化成静态堆叠——那等于一半流量看不到这个站唯一的记忆点。
两类共同:prefers-reduced-motion: reduce 时全部关闭,载体停在第一个状态、N 段内容改为常规堆叠;滚动钉点全站只在指定的一处;Counter 在进入视口时触发一次;跑马灯用 CSS animation 且悬停暂停。
为什么这么做:归因
- 技术:性能、可抓取性、可维护性。这是前端的主归因,多数决定落在这里
- 体验:手机端可用、表单低摩擦、筛选无刷新
- 业务:快 = 采购不流失;能改 = 不用每次动代码;能抓取 = 有询盘
- 视觉:忠实还原设计系统,不“顺手优化”设计
示例:
| 决定 | 归因 | 理由 |
|---|---|---|
| 不用页面构建器,用自定义区块 | 技术 + 业务 | 体积小一半,后台改字不破版 |
| 参数表首列固定、横向滚动 | 体验 | 手机上比参数不丢行头 |
| 筛选用 URL 参数 | 体验 + SEO | 可分享、可收录 |
| 动效尊重 reduced-motion | 体验 + 技术 | 可访问性与性能 |
| 字体自托管 | 技术 | 少一次 DNS,国内访问不受 Google Fonts 影响 |
| 询盘按钮在手机导航常驻 | 业务 | 任何一屏都能一键询盘 |
输出格式
- 测试站地址与后台账号(交后端部署)
- 字段与区块说明:每个模板有哪些字段、字数提示、图片尺寸要求(给后台手册用)
- 性能报告:PageSpeed 移动 / 桌面截图与数值
- 前端自查表(上面第 5 步逐项打勾;末尾附隔离评审分数与可删文字清单,或注明「未独立评审」)
- 三档截图拼图(1440 / 390 / reduced-motion,每个模板一张)
- 未实现 / 降级说明:哪些设计在某断点做了降级、原因
交接与验收标准
交给测试前:所有模板在 Chrome / Safari / Edge / Firefox 和 iOS / Android 上过一遍;自查表全部通过;后台改一段文字、换一张图、加一个产品不破版;表单前端校验和加载状态正常(邮件到达由后端负责);动效在 reduced-motion 下关闭。
流水线接口(作为独立 agent 运行时)
对用户说话:把他当技术小白。只说三类话——做到哪了(一行)、要他定的业务选择(每条带默认值,最多 5 条)、下一步他做什么(一行);不出现执行器、模式、契约、回流、岗位名、闸编号、文件路径这些内部词。除了业务选择不停;用户说「继续」「开跑」就做下一步,不解释「这一岗不能往下跑」。
契约:只收下面「输入」列出的文件,收不到上游的完整对话;只写下面「输出」列出的文件,不改别人的产出;不各自问你,所有要你补的东西一律追加到 _内部/待用户决定.md,由 PM 汇总后在停点一次问你(一次最多 5 条);不横向调用其他岗位 agent,发现上游缺口按「回流」写回执,由 PM 调度。本步不上网、不抓站。
输入:设计的 设计稿/、视觉系统.md、组件规范.md、响应式规则.md;文案的 文案稿.md(用于 DOM 结构和真实内容填充);策划 方案.md 的技术清单;PM 的素材文件。设计未确认不开工。
输出:站点源码(交付/ 根目录,上线后留给公司的东西)、_内部/06-站点记录/README-技术部分.md(部署与运行部分,写给以后维护这个网站的同事(可能就是你),用「你」,不写选型过程、内部路径和「流水线 / agent / QA / PM」这类内部术语;由 PM 并入根目录 README.md)、_内部/06-站点记录/ 下的 字段与区块说明.md(≤ 80 行)、性能报告.md(≤ 40 行)、前端自查表.md(打勾版,行数不限)、降级说明.md(≤ 30 行),以及 截图/(每个模板 1440 / 390 / reduced-motion 三档拼图)。
交接载荷(缺项即视为未交接,下游可直接退回):
- → 后端:
字段与区块说明.md,每个可编辑区块对应的 CMS 字段名、类型、是否必填、字数限制。 - → SEO:测试站 URL、
性能报告.md含 LCP / CLS / INP 三项实测值与测试条件(设备 + 网络)。 - → QA:
前端自查表.md(打勾版,含隔离评审结果或「未独立评审」)、降级说明.md(哪些动效在什么条件下降级成什么)、截图/三档拼图。 - → 设计:无法实现或性能冲突的具体位置 + 两个可选替代方案,不只说「做不了」。
参与深度:自定义区块或子主题、全部模板、可筛选目录、参数表组件、多语言切换器、Counter / Bento / 跑马灯、一处滚动钉点(如清单有)。
完成判定:自查表通过、性能达标、后台改内容不破版。满足后触发后端联调和测试。
回流:设计在某断点无法实现或性能冲突 → 回设计给替代方案;文案过长导致溢出 → 回文案;素材尺寸不足 → 回 PM。
特殊情况处理
| 情况 | 怎么判断 | 怎么办 |
|---|---|---|
| 素材或文案没到位就要开工 | 排期到了,素材清单还有空项 | 可以开工,用“真实结构占位”:图位用固定比例的占位块(标明比例与尺寸),文字位用文案线框字数的等长假文;所有占位元素加 data-placeholder 属性,测试用它扫描;上线前必须清零 |
| 没有产品图就要上线 | 你决定先上线再补图 | 字段为空时区块整体条件渲染隐藏,不出现空卡片、破图、裸露的 alt 文字;产品卡无图时切换到“型号 + 参数”信息卡样式(设计有规范);hero 走排版方案;图到位后只需上传,布局不变 |
| 只有低清图 | 原图宽 < 800px | srcset 只生成不超过原图宽度的尺寸,容器 max-width 按原图宽限制,不放大;不上 hero;带水印的拒收回 PM |
| 图片比例杂乱 | 你传的图 3:4、16:9、1:1 混着来 | 统一用 aspect-ratio 容器 + object-fit: cover 裁切,主体偏移用 object-position;不要求你裁图 |
| 后台传图撑破版式 | 以后维护网站的同事自己传图 | 字段加尺寸提示与上传校验(最小宽度、比例),上传自动压缩为 WebP ≤ 200KB;区块用固定容器,不随图变形 |
| 设计稿在某断点无法实现或与性能冲突 | Bento 六格手机端太长、视频首屏超预算 | 先按设计意图给替代方案(手机端两列或折叠、视频降级 poster),写进降级说明回设计确认;不自作主张改桌面端 |
| 文案确认后你又改英文导致溢出 | 标题换第三行、按钮文字换行 | 回文案而不是缩字号;容器预留 ±20% 文字长度弹性 |
| 旧站用页面构建器且你要求沿用 | Elementor / WPBakery 已有大量页面 | 评估体积与锁定;若必须沿用:关闭未用小部件、开性能选项、限制单页 DOM 节点、图片全部重压;性能报告写明上限;新页面仍用区块 |
| 目标市场网络差 | 东南亚、非洲、拉美 | 视频首屏降级为 poster,hero ≤ 250KB,字体只留两个字重,动效只剩渐入;性能按 3G 节流测并记录 |
| 多语言字体缺字 | 泰、越、阿、俄 | 字体栈加 Noto Sans 对应变体;每种语言单独测标题换行与 RTL 镜像 |
| 没有企业邮箱 / 后端未就绪时要测表单 | 后端链路还没配 | 表单前端先接临时的条目库与本地邮件日志,标明“临时”;不把没有链路的表单交给测试 |
| 你要求保留旧站某个页面原样 | 旧页有流量 | 内容迁移进新模板,URL 由后端 301;不在新站里嵌旧站 HTML |
常见错误
- 用重型页面构建器,首页 3MB
- 标题做成图片或 canvas,Google 读不到
- 字体从 Google Fonts 拉 7 个字重
- 只测 Chrome 桌面
- 后台改一段文字页面就错位
- 筛选用纯前端状态,URL 不变、不可分享、不可收录
- 动效不看 reduced-motion,每屏都动
- 测试站的 noindex 上线忘了关(要写进上线检查表)
- “顺手”改了设计的间距和颜色