政府与公共服务 · 新资源

DSFR 设计系统.

了解法国国家设计系统在其机构适用范围内的具体字体排印、网格和手风琴组件 API。在清晰、中立的教学示例中,对比相互关联与彼此独立的展开行为。

OpenDesign 指南8 个章节14 条参考条目原始应用指南
01

DSFR 设计系统界面预览

对比关联与独立的内容区段,使用可通过键盘操作的触发器,并提供清晰的展开状态反馈。

手风琴结构实验室打开完整示例
基于已记录的手风琴结构,由 HTML/CSS/JavaScript 构成的原创中性演绎。不使用任何官方 DSFR 资源或国家视觉识别。 · 实现参考
02

DSFR 设计系统设计参考

DSFR v1.15 官方文档及经核实的 @gouvfr/dsfr 1.15.3 软件包元数据。这些是官方参考值;中性预览展示交互结构,但不使用国家视觉识别。

官方排版

来源
名称 / 规则值 / 配置用途
Primary / supplementary familiesMarianne / Spectral机构字体;须遵守适用的使用条款。
Fallback familiesArial / Georgia文档中记录的替代字体。
Standard text16px / 24pxfr-text 正文字体样式。
Article text18px / 28pxfr-text--lg 编辑文字角色。
H1 mobile → desktop32/40px → 40/48px字号 / 行高;在 MD 断点处变化。

官方网格

来源
名称 / 规则值 / 配置用途
SM / MD / LG / XL576 / 768 / 992 / 1248px文档中记录的断点阈值。
XL content maximum1200px网格参考中的容器最大宽度。
Optional gutters16px small; 24px LG and above代码网格默认不启用间距槽。

间距

来源
名称 / 规则值 / 配置用途
Base progressionMultiples of 4px常用布局节奏。
Documented exceptions−6, −2, 2, 6px具体调整,而非新设任意比例尺。

手风琴组件规范

来源
名称 / 规则值 / 配置用途
fr-accordions-groupLinked by default打开一个会关闭另一个。
data-fr-group="false"Multiple panels may stay open明确的独立模式。
aria-controlsMatches panel id触发器与面板的关联。
fr-collapse--expandedRuntime expanded class由 DSFR JavaScript 管理。
03

DSFR 设计系统完整指南

实用指南,介绍如何为真实界面选择、应用和评审此系统。

DESIGN-dsfr.md

完整指导、实现起点和源代码链接。

下载指南

DSFR 设计系统的机构适用范围

国家视觉识别系统

DSFR 是法国国家设计系统。当前官方条款将 .gouv.fr 服务和国家移动应用列为其适用场景,并区分国家用户和运营方与外部组织。这是一项实质性的采用边界,不是可以通过隐藏标识而删去的脚注。

摘自本 OpenDesign 指南

符合条件的团队应遵循官方项目审批和实施流程。不相关的产品可以借鉴文档中说明的信息架构和无障碍设计思路,但不应使用法国国家视觉识别来呈现自身。本页的预览是原创的中性手风琴示例:不会加载 DSFR 的样式、字体或脚本。

阅读配套规范

DSFR 设计系统官方字体参考

Marianne 字体角色与备用字体

排版文档列出了 Marianne 和 Spectral,并分别以 Arial 和 Georgia 作为备用字体。标准正文为 16px/24px;文章正文为 18px/28px。H1 在移动端为 32px/40px,在桌面端为 40px/48px。这些数值描述的是官方系统,示例则采用自身的中性字体样式。

文字尺寸类不会取代语义化标题层级。页面标题应使用 h1,每个手风琴标题则应采用适当的标题层级。不要仅为获得更大的视觉样式而跳过文档大纲层级。

阅读配套规范

DSFR 设计系统网格与间距

明确规定响应式断点

网格参考定义了 SM 576px、MD 768px、LG 992px 和 XL 1248px 断点。最大内容宽度为 1200px。可选间距在较小尺寸下为 16px,从 LG 起为 24px。代码网格默认不设置间距槽;将 Figma 网格转换为标记时,这一点尤为重要。

间距以 4px 的倍数为基础,并记录了 −6px、−2px、2px 和 6px 这几个例外值。因此,间距类代表受控的系统,而不是随意创造偏移量的许可。中性预览采用独立的单列阅读布局,并未声称复现官方网格。

阅读配套规范

DSFR 设计系统手风琴组件结构

标题、触发器与受控面板

文档中的组件包含 section.fr-accordion、标题 heading.fr-accordion__title、按钮 button.fr-accordion__btn,以及其后的 div.fr-collapse。按钮的 aria-controls 必须与面板 id 一致;aria-expanded 用于表示面板的展开状态。标题层级应与所在页面的结构相符。

面板应包含段落和列表等合适的文本元素。原生 DSFR JavaScript 会管理展开类;符合条件的应用不应再添加独立的点击处理程序与组件发生冲突。中性预览则实现了自身明确的展开/收起状态,以供比较学习。

阅读配套规范

DSFR 设计系统:分组或独立

分组设置会改变交互行为

fr-accordions-group 默认采用联动模式:展开一个项目时,其他已展开的项目会关闭。设置 data-fr-group="false" 后,多个面板可以同时保持展开。示例同时展示两种模式,方便读者比较它们对交叉查阅信息的影响。

这一区别会影响准备说明。查阅文件清单的人可能需要同时打开地址面板。一次只展开一项的分组可以节省空间,但也会反复隐藏上下文。应根据任务选择模式,而不要把默认设置当作编辑规则。

无障碍页面的建议比运行时默认设置更进一步:默认推荐使用独立分组,因为联动分组可能带来可用性问题。因此,示例默认采用独立模式。

  • 独立模式便于同时比较两个部分。
  • 联动模式限制为一次只能展开一个部分。
  • 切换模式时,应确保 aria-expanded 状态始终前后一致。

阅读配套规范

DSFR 设计系统:哪些内容应保持可见

不要隐藏关键步骤

组件指南建议,对篇幅较长、非必读或仅与部分用户相关的内容使用手风琴组件。指南不建议隐藏所有用户都必须阅读的信息,不建议将手风琴用于很短的内容、嵌套复杂控件或放入模态框中。

因此,示例将用途说明和控件保持可见。只有可选的房间出入说明、设备清单和到达指引采用折叠形式。每个标题都对应一个明确的问题,展开后的内容使用简短段落和列表,而不是另设一套交互流程。

  1. 将主要说明放在手风琴组件之外。
  2. 按读者关心的问题划分辅助材料,而不是按任意长度拆分。
  3. 如果某个部分只有简短答案,请使用普通段落。

阅读配套规范

DSFR 设计系统:键盘操作与状态检查

先验证结构,再进行装饰

每个中性样式的预览触发控件都是真正的按钮,因此按 Enter 或空格键即可触发浏览器的按钮操作。脚本会同时更新 aria-expanded 和受控面板的 hidden 状态。面板关闭时,触发控件不会被移除,焦点也会留在刚刚激活的按钮上。

模式选择器便于即时比较独立模式和联动模式的行为。示例还会显示一行简短的状态信息,列出当前展开的面板;这是示例中的学习辅助信息,并非官方 DSFR 组件。在窄屏上,标题会自动换行,按钮点击区域仍保持全宽。

官方无障碍页面还记录了深色主题下悬停状态对比度不足的问题,以及屏幕阅读器和浏览器播报方面的具体限制。不要以为原样使用组件就能确保完全无障碍;部署时请针对相应版本和环境检查这些已知限制。

阅读配套规范

DSFR 设计系统:符合条件的项目集成

加载核心依赖和组件依赖

官方代码页面列出了核心和手风琴 CSS 依赖项,以及核心和手风琴模块脚本。加载后,运行时会自动增强文档中规定的标记结构。完成初始化后,可以通过公开的 API 调用 dsfr(element).collapse.disclose() 展开面板。

提供的安装入口适用于符合条件的机构项目。该内容已通过源码核验,但未在此中性预览中执行;此预览有意不依赖 DSFR 运行时。升级时,生产团队应一并维护官方资源目录结构、组件标记和当前使用条件。

阅读配套规范

DSFR 设计系统组件示例

官方手风琴结构

符合条件的项目标记结构,面板可独立展开。

html
<div class="fr-accordions-group" data-fr-group="false">
  <section class="fr-accordion">
    <h2 class="fr-accordion__title">
      <button type="button" class="fr-accordion__btn"
        aria-expanded="false" aria-controls="documents">
        Documents to prepare
      </button>
    </h2>
    <div id="documents" class="fr-collapse">
      <p>Put the actual supporting-document instructions here.</p>
    </div>
  </section>
</div>

代码参考

通过程序展开

官方运行时完成对目标面板的初始化后再调用。

javascript
const panel = document.getElementById('documents');
window.dsfr(panel).collapse.disclose();

代码参考

完整的独立示例

完整文档包含其布局、控件与初始化。解压所链接的示例归档,即可获得完全一致的相对 vendor 资源,然后通过 HTTP 提供服务。

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Accordion structure laboratory</title><style>*{box-sizing:border-box}body{margin:0;font:16px/1.6 Arial,sans-serif;color:#28251f;background:#faf9f6}main{max-width:54rem;margin:auto;padding:32px 24px}.notice{background:#eee9df;border-left:4px solid #6b573d;padding:16px}h1{font:700 32px/1.3 Georgia,serif;margin:24px 0}h2{font-size:18px;margin:0}.mode{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin:24px 0}select{font:inherit;padding:10px;background:white;border:1px solid #777}section{border-bottom:1px solid #aaa18f}.trigger{font:700 18px/1.5 Arial,sans-serif;border:0;background:transparent;color:inherit;display:flex;justify-content:space-between;gap:16px;text-align:start;padding:20px 8px;width:100%;cursor:pointer}.trigger::after{content:'+'}.trigger[aria-expanded=true]::after{content:'−'}.panel{padding:0 24px 24px}.panel p{margin-top:0}:focus-visible{outline:3px solid #6b573d;outline-offset:3px}#state{font-size:14px;background:#eee9df;padding:12px;margin-top:24px}small{display:block;margin-top:24px;color:#625a4e;font-size:14px}[hidden]{display:none!important}@media(max-width:600px){main{padding:24px 16px}h1{font-size:28px}.panel{padding-inline:8px}}</style><main><div class="notice">Neutral interaction study · No DSFR visual identity or assets</div><h1>Prepare for a community workshop</h1><p>The purpose and main instruction stay visible: arrive with your booking note. Optional supporting details can be opened below.</p><div class="mode"><label for="mode">Panel behaviour</label><select id="mode"><option value="independent">Independent: compare sections</option><option value="linked">Linked: one section at a time</option></select></div><div id="group"><section><h2><button type="button" class="trigger" aria-expanded="false" aria-controls="access">Room access</button></h2><div class="panel" id="access" hidden><p>The fictional workshop room is reached from the courtyard. The step-free entrance is on the same level as the activity room.</p><p>Ask the example welcome desk for assistance if the courtyard route is unavailable. These are demonstration instructions, not a real venue guide.</p></div></section><section><h2><button type="button" class="trigger" aria-expanded="false" aria-controls="equipment">Equipment to bring</button></h2><div class="panel" id="equipment" hidden><p>The example workshop uses simple paper materials. Bring the following if convenient:</p><ul><li>A notebook for your own observations.</li><li>A pencil or pen you can use comfortably.</li><li>Your fictional booking reference.</li></ul></div></section><section><h2><button type="button" class="trigger" aria-expanded="false" aria-controls="arrival">What happens on arrival</button></h2><div class="panel" id="arrival" hidden><p>The example facilitator explains the activity before participants choose a seat. No personal information is collected by this demonstration.</p><p>Keep this panel open with the equipment list to compare the two instructions in independent mode.</p></div></section></div><p id="state" role="status">Open sections: none</p><small>Original OpenDesign educational specimen. DSFR documentation informs the structural comparison; this is not a government service or native DSFR rendering.</small></main><script>const buttons=[...document.querySelectorAll('.trigger')],mode=document.querySelector('#mode');function set(b,open){b.setAttribute('aria-expanded',String(open));document.getElementById(b.getAttribute('aria-controls')).hidden=!open}function announce(){const names=buttons.filter(b=>b.getAttribute('aria-expanded')==='true').map(b=>b.textContent);document.querySelector('#state').textContent='Open sections: '+(names.join(', ')||'none')}buttons.forEach(b=>b.onclick=()=>{const open=b.getAttribute('aria-expanded')!=='true';if(open&&mode.value==='linked')buttons.forEach(x=>set(x,false));set(b,open);announce()});mode.onchange=()=>{if(mode.value==='linked'){let retained=false;buttons.forEach(b=>{if(b.getAttribute('aria-expanded')==='true'){if(retained)set(b,false);retained=true}})}announce()};</script></html>

代码参考

  • 从“来源”一节下载完整示例。其 README 给出了确切的本地启动命令。
  • 保持 vendor 路径相对于本文档;该归档包含此预览所使用的全部资源。
04

DSFR 设计系统 Agent 设置

实现起点

已通过源码核验的符合条件项目安装方式;中性预览不会执行该安装。请保留机构项目适用范围,并遵循当前官方条款。复制 dist 目录,以保留依赖资源的相对路径。Sources 中的完整工作示例 ZIP 还提供了预览所需的确切依赖项和完整文档。解压后,在该目录中运行 python3 -m http.server 8080,然后打开 http://localhost:8080/dsfr.html。请勿通过 file:// 打开基于模块的示例。

bash
# For a project within the documented DSFR institutional scope:
npm install @gouvfr/[email protected]
# Copy node_modules/@gouvfr/dsfr/dist to your public asset directory.
# In <head>:
# <link rel="stylesheet" href="/dsfr/core/core.min.css">
# <link rel="stylesheet" href="/dsfr/component/accordion/accordion.min.css">
# Before </body>:
# <script type="module" src="/dsfr/core/core.module.min.js"></script>
# <script type="module" src="/dsfr/component/accordion/accordion.module.min.js"></script>

适用于你项目的提示词

Agent 提示词
说明 DSFR 手风琴的结构和适用范围。符合条件的政府项目应使用 fr-accordion、fr-accordion__title、fr-accordion__btn 和 fr-collapse,并设置相互匹配的 id/aria-controls,加载核心资源和手风琴资源;需要同时展开多个部分进行比较时,设置 data-fr-group=false。若制作独立的教学预览,请使用原创的中性样式,并明确标注其为结构解读;不要加载政府机构标识字体,也不要宣称它是官方服务。
05

DSFR 设计系统:来源与适用范围

DSFR 有明确规定的机构使用范围。本页面是技术参考资料,其原创中性预览并非法国政府服务,也不是采用 DSFR 品牌标识的实现。