竞赛PPT HTML设计系统_秋叶职场

SKILL前端设计
前端设计 未标注权限 许可证不明确
安装这个技能

秋叶PPT出品的国创赛/教创赛PPT HTML页面设计系统。当用户需要创建竞赛PPT的HTML预览页面时触发。 提供统一的设计规范:红白配色、左上角竖线标题、1600×900画布(16:9)、卡片式内容布局。 适用于痛点页、技术方案页、商业模式页等核心页面。

一句话选型结论

按资料字段整理

竞赛PPT HTML设计系统_秋叶职场是前端设计类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类前端设计 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_c774f8e9/qiuye-ppt-design-system
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

前端设计
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_c774f8e9仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791726994
正文体量25.1 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
出页面与组件

按描述生成页面结构和组件草稿。

调整样式与布局

改间距、配色与响应式布局。

生成设计说明

把设计稿整理成开发能接的说明。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在前端设计场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
竞赛PPT HTML设计系统_秋叶职场当前 未标注权限 未标注 未标注 未标注 有
前端设计 只读 GitHub 仓库 882.3 万 Codex、Claude、Cursor 有
Vercel 组合模式 联网访问 GitHub 仓库 385.9 万 Codex、Claude、Cursor 有
Vercel React native skills 前端 只读 GitHub 仓库 246.9 万 Codex、Claude、Cursor 有
adapt 搜索 浏览器控制 GitHub 仓库 202.7 万 Codex、Claude、Cursor 有
使用我的浏览器 浏览器控制 GitHub 仓库 184.8 万 Codex、Claude、Cursor 有

SKILL.md 全文

25.1 KB
模型实际读到的说明书原文,来自技能仓库

qiuye-PPT Skill · PPT HTML 设计系统

<span style="display:inline-block;background:linear-gradient(135deg,#C41E3A,#8B0A1A);color:white;padding:6px 16px;border-radius:20px;font-size:13px;font-weight:600;">秋叶PPT出品</span>

用途

为高校竞赛(国创赛、教创赛等)PPT核心页面生成高质量的HTML预览文件,用于设计确认和视觉参考。

触发条件

当用户要求:
- 创建/生成/制作 PPT HTML 页面
- 设计竞赛PPT的某个页面(痛点页、技术方案页等)
- 将PPT内容做成HTML预览
- 需要PPT设计规范或模板

核心设计原则(不可更改)

1. 画布规格

⚠️ 本skill唯一的画布规格:1600px × 900px(16:9)

  • HTML 网页显示尺寸:1600px × 900px(严格16:9)
  • PNG 导出尺寸:3200px × 1800px(通过 device_scale_factor=2 实现 2x 渲染)
  • 背景色:#FAFAFA(米白色)
  • 外层body背景:#E5E1DD(浅灰米色,衬托画布)
  • body padding:40px 0
  • slide-container:width: 1600px; height: 900px; margin: 0 auto 40px auto
  • 全屏缩放公式:scale = window.innerWidth / 1600(以宽度为准,高度不够时上下黑边)

2. 标题区(左上角)

格式:竖线 + 大标题(1600×900 画布标准)

  • 标题栏高度:100px,padding: 0 80px,display: flex; align-items: center
  • 竖线:8px宽,高度52px,红色渐变 linear-gradient(180deg, #C41E3A 0%, #8B0A1A 100%),圆角4px
  • 大标题:衬线体 Noto Serif SC,字重700,字号46px,颜色 #C41E3A,字间距1.5px,white-space: nowrap,margin-left: 24px
  • 标题下方分隔线:渐变线 linear-gradient(90deg, rgba(196,30,58,0.25) 0%, rgba(196,30,58,0.05) 100%),left: 80px; right: 80px; height: 1px
  • 页码:右上角,top: 38px; right: 80px,14px,rgba(26,26,26,0.22),字间距2px

3. 字体规范(1600×900 画布标准)

类型 字体 字重 字号 示例
页面大标题(内容页) Noto Serif SC 700 46px 标题区主标题
封面大标题框 Noto Serif SC 900 96px 封面主标题(仅封面使用)
封面副标题 Noto Serif SC 600 40px 封面副标题
卡片内小标题 Noto Serif SC 700 28px value-card内标题
正文/内容 Noto Sans SC 400-500 18px 主要内容文字
mini-card正文 Noto Sans SC 400 15-16px 子信息卡片内容
数据高亮数字 Noto Serif SC 900 32px 突出展示的关键数据
小字标注/脚注 Noto Sans SC 500 13-14px 数据标签、说明文字
question-tag Noto Sans SC 500 14px 药丸形标签

核心原则:衬线体用于标题和强调(占20%面积),无衬线体用于正文(占80%面积)。

4. 配色方案(严禁跑偏)

用途 色值
主红色 #C41E3A
深红色 #8B0A1A
浅红色 #E8B4BC
背景白 #FAFAFA
文字黑 #1A1A1A
文字黑带透明度 rgba(26,26,26,0.78)(正文)/ rgba(26,26,26,0.72)(内容)/ rgba(26,26,26,0.55)(标签)/ rgba(26,26,26,0.48)(脚注)/ rgba(26,26,26,0.38)(页码)/ rgba(26,26,26,0.22)(浅灰)

⚠️ 配色铁律:仅使用红色系 + 黑白灰。严禁蓝色、紫色、绿色等其他颜色。

❌ 明确禁止的色值(QA 必查):
- #F5F3F0、#F5F5F5、#EEEEEE → 改用 #FAFAFA
- #ffffff、#fff → 改用 #FAFAFA
- rgba(0,0,0,x) → 改用 rgba(26,26,26,x) / #1A1A1A
- rgba(255,255,255,x) → 改用 rgba(250,250,250,x)

5. 布局系统

通用约束(所有页面遵守):
- 必须包含 deco-circle×2 + footer-dots
- safe-area:position: relative; z-index: 10; height: 100%; padding: 124px 92px 52px 92px; overflow: hidden
- 嵌套 grid 子元素:min-height: 0; min-width: 0; overflow: hidden
- grid 子元素间距:gap: 14-16px

底部元素按需判断:
- 总结判断型内容 → 用 summary-bar
- 信息陈列型内容 → 不加底部元素,让内容自然结束
- 封面/过渡页 → 绝对不加底部元素

6. 卡片组件

/* 主体卡片(value-card):顶部3px红色装饰条 + 内发光顶边 */
.value-card {
  background: white;
  border-radius: 20px;
  border: 1px solid rgba(196,30,58,0.065);
  box-shadow: 0 1px 3px rgba(0,0,0,0.03), 0 8px 32px rgba(0,0,0,0.045),
              inset 0 1px 0 rgba(255,255,255,0.85);
  position: relative;
  overflow: hidden;
  min-width: 0;
  height: 100%;
}
.value-card::before {
  content: &#x27;&#x27;;
  position: absolute;
  top: 0; left: 0; right: 0; height: 3px;
  background: linear-gradient(90deg, #C41E3A 0%, #E8B4BC 100%);
  opacity: 0.55;
}

/* 引言卡片(intro-card):玻璃态半透明 */
.intro-card {
  background: rgba(255,255,255,0.72);
  backdrop-filter: blur(6px);
  border-radius: 20px;
  border: 1px solid rgba(196,30,58,0.06);
  box-shadow: 0 8px 32px rgba(0,0,0,0.035);
  overflow: hidden;
}

/* 迷你卡片(mini-card):纯白底+细阴影 */
.mini-card {
  background: white;
  border: 1px solid rgba(196,30,58,0.08);
  border-radius: 14px;
  box-shadow: 0 2px 12px rgba(0,0,0,0.04);
}

/* 总结横幅(summary-bar) */
.summary-bar {
  background: linear-gradient(135deg, #C41E3A 0%, #8B0A1A 100%);
  border-radius: 18px;
  min-height: 112px;
  position: relative;
  overflow: hidden;
  box-shadow: 0 10px 30px rgba(196,30,58,0.18);
}
.summary-bar::before {
  content: &#x27;&#x27;;
  position: absolute;
  top: 0; left: 0; width: 4px; height: 100%;
  background: linear-gradient(180deg, #fff 0%, rgba(255,255,255,0.25) 100%);
  opacity: 0.42;
}

/* 底部注释栏(footer-note) */
.footer-note {
  background: white;
  border-radius: 14px;
  border: 1px solid rgba(196,30,58,0.08);
  box-shadow: 0 2px 12px rgba(0,0,0,0.03);
  padding: 14px 20px;
  display: flex; align-items: center; gap: 12px;
  position: relative; overflow: hidden;
}
.footer-note::before {
  content: &#x27;&#x27;;
  position: absolute; top: 0; left: 0; width: 4px; height: 100%;
  background: linear-gradient(180deg, #C41E3A 0%, #E8B4BC 100%);
}

6b. 文字溢出防护(不可违反,最高优先级)

/* 溢出防护 */
.intro-card, .value-card, .mini-card, .summary-bar {
  overflow-wrap: break-word;
  word-break: break-word;
}
.intro-card p, .value-card p, .mini-card div, .summary-bar p {
  overflow-wrap: break-word;
  word-break: break-word;
  max-width: 100%;
}
/* 嵌套 grid 子元素 */
.safe-area [style*=&quot;display: grid&quot;] &gt; * {
  min-height: 0;
  min-width: 0;
  overflow: hidden;
}

7. 编号徽章

.number-badge {
  width: 50px; height: 50px; border-radius: 14px;
  background: linear-gradient(135deg, #C41E3A 0%, #8B0A1A 100%);
  display: flex; align-items: center; justify-content: center;
  color: white; font-family: &#x27;Noto Serif SC&#x27;, serif;
  font-size: 21px; font-weight: 700;
  box-shadow: 0 4px 20px rgba(196,30,58,0.25);
  flex-shrink: 0;
}

编号徽章内容规则:
- ✅ 允许:数字序号(1, 2, 3)、线性 SVG 图标
- ❌ 严禁:单个中文字符(如"正""写""验""法""分"等),必须替换为数字或图标
- 图标:白色描边 SVG(stroke=&quot;white&quot; stroke-width=&quot;2.5&quot;),26×26px 在 50×50 容器内居中

8. 背景纹理

.bg-texture {
  position: absolute; inset: 0;
  background:
    radial-gradient(ellipse 80% 60% at 16% 82%, rgba(196,30,58,0.035) 0%, transparent 70%),
    radial-gradient(ellipse 60% 50% at 88% 18%, rgba(196,30,58,0.045) 0%, transparent 62%),
    linear-gradient(180deg, #FAFAFA 0%, rgba(196,30,58,0.015) 100%);
  z-index: 0;
}
.bg-texture::before {
  content: &#x27;&#x27;; position: absolute; inset: 0;
  background-image:
    linear-gradient(rgba(196,30,58,0.012) 1px, transparent 1px),
    linear-gradient(90deg, rgba(196,30,58,0.012) 1px, transparent 1px);
  background-size: 60px 60px;
}

9. 装饰元素

  • 圆形边框装饰(deco-circle):每页两个
  • 右上大圆:width: 380px; height: 380px; top: -140px; right: -95px
  • 左下小圆:width: 260px; height: 260px; bottom: -70px; left: -58px
  • 样式:border: 1px solid rgba(196,30,58,0.06),绝对定位
  • 底部圆点(footer-dots):position: absolute; right: 40px; bottom: 22px,四个圆点(w-2.5 h-2.5 rounded-full),渐变透明度(opacity 0.2/0.3/0.4/1.0)

10. 标签与徽章

/* 问题标签(question-tag):药丸形,带红点 */
.question-tag {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 7px 15px;
  background: linear-gradient(135deg, rgba(196,30,58,0.08) 0%, rgba(196,30,58,0.02) 100%);
  border: 1px solid rgba(196,30,58,0.1); border-radius: 100px;
  font-size: 14px; font-weight: 500; color: #C41E3A;
  letter-spacing: 0.4px; white-space: nowrap;
}
.dot { width: 6px; height: 6px; border-radius: 50%; background: #C41E3A; flex-shrink: 0; }

/* 数据高亮样式 */
.data-highlight {
  font-size: 32px; font-weight: 900; color: #C41E3A;
  font-family: &#x27;Noto Serif SC&#x27;, serif; line-height: 1.2;
}
.data-label {
  font-size: 13px; color: rgba(26,26,26,0.55);
  font-weight: 500; margin-top: 4px;
}
.data-card {
  background: white; border-radius: 16px;
  border: 1px solid rgba(196,30,58,0.08);
  box-shadow: 0 2px 12px rgba(0,0,0,0.04);
  padding: 20px; display: flex; align-items: center; gap: 16px;
  transition: transform 0.2s, box-shadow 0.2s;
}
.data-card:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(196,30,58,0.1); }
.data-icon {
  width: 52px; height: 52px; border-radius: 14px;
  background: linear-gradient(135deg, rgba(196,30,58,0.08) 0%, rgba(196,30,58,0.02) 100%);
  border: 1px solid rgba(196,30,58,0.1);
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}

11. 动画规范

@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(24px); }
  to { opacity: 1; transform: translateY(0); }
}
.animate-in {
  animation: fadeInUp 0.7s cubic-bezier(0.4,0,0.2,1) forwards;
  opacity: 0;
}
.delay-1 { animation-delay: 0.08s; }
.delay-2 { animation-delay: 0.18s; }
.delay-3 { animation-delay: 0.28s; }
.delay-4 { animation-delay: 0.38s; }
.delay-5 { animation-delay: 0.48s; }

12. 封面设计规范

封面是唯一使用特殊样式的页面,使用深红渐变背景 + 全屏装饰元素:

/* 封面 slide-container 背景 */
.slide-container {
  /* 普通页面用:background: #FAFAFA */
  /* 封面页用:background: linear-gradient(135deg, #C41E3A 0%, #8B0A1A 50%, #6B0A12 100%); */
}

封面元素(从上到下):
1. 网格背景(白色半透明线条网格,opacity: 0.08)
2. 对角线装饰(两组斜线,opacity: 0.06)
3. 外框线:两层(外层40px偏移/内层52px偏移,白色半透明)
4. 四角装饰:各40×40px,L型白色边框,3px宽
5. 圆形装饰:4个(右上2个、左下2个,白色半透明边框)
6. safe-area:居中 flex 布局,内容从上到下:
- 顶部装饰线(横线+菱形图标)
- 主标题框:双层边框,内含96px主标题
- 副标题:40px衬线体
- 分隔线(横线+菱形)
- 数据标签行:3个白色边框标签(数据+图标)
- 底部标语:上下边框线,内含18px标语文字

全屏播放功能(必须包含)

核心原则(不可违反):
1. 禁止使用 cloneNode()(最高优先级)
2. 以宽度为准缩放:scale = window.innerWidth / 1600
3. 通过 DOM 移动(非克隆)实现翻页

全屏播放 JavaScript(v2 完整版,对标参考文件)

// ==================== 全屏播放控制器 v2 ====================
(function() {
  var slides = document.querySelectorAll(&#x27;.slide-container&#x27;);
  var totalSlides = slides.length;
  var currentIndex = -1;
  var isFullscreen = false;
  var savedParent = null;
  var savedNext = null;

  // 动态创建全屏舞台和控制栏
  var stage = document.createElement(&#x27;div&#x27;);
  stage.id = &#x27;fullscreen-stage&#x27;;
  document.body.appendChild(stage);

  var bar = document.createElement(&#x27;div&#x27;);
  bar.id = &#x27;playback-bar&#x27;;
  bar.innerHTML = &#x27;&lt;button id=&quot;btn-all&quot; title=&quot;从头播放 (F)&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2.5&quot;&gt;&lt;polygon points=&quot;5 3 19 12 5 21 5 3&quot;/&gt;&lt;/svg&gt;&lt;span&gt;从头&lt;/span&gt;&lt;/button&gt;&lt;button id=&quot;btn-curr&quot; title=&quot;从当前页播 (S)&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2.5&quot;&gt;&lt;line x1=&quot;12&quot; y1=&quot;5&quot; x2=&quot;12&quot; y2=&quot;19&quot;/&gt;&lt;polygon points=&quot;12 19 20 12 12 5&quot;/&gt;&lt;/svg&gt;&lt;span&gt;当前&lt;/span&gt;&lt;/button&gt;&lt;div class=&quot;bar-div&quot;&gt;&lt;/div&gt;&lt;button id=&quot;btn-prev&quot; title=&quot;上一页 (←)&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2.5&quot;&gt;&lt;polyline points=&quot;15 18 9 12 15 6&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;button id=&quot;btn-next&quot; title=&quot;下一页 (→)&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2.5&quot;&gt;&lt;polyline points=&quot;9 18 15 12 9 6&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;div class=&quot;bar-div&quot;&gt;&lt;/div&gt;&lt;button id=&quot;btn-exit&quot; title=&quot;退出 (ESC)&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2.5&quot;&gt;&lt;line x1=&quot;18&quot; y1=&quot;6&quot; x2=&quot;6&quot; y2=&quot;18&quot;/&gt;&lt;line x1=&quot;6&quot; y1=&quot;6&quot; x2=&quot;18&quot; y2=&quot;18&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;div class=&quot;bar-page&quot;&gt;0 / 0&lt;/div&gt;&#x27;;
  document.body.appendChild(bar);

  // 注入样式
  var css = document.createElement(&#x27;style&#x27;);
  css.textContent = &#x27;#playback-bar{position:fixed;left:16px;top:50%;transform:translateY(-50%);z-index:9998;display:flex;flex-direction:column;gap:6px;align-items:center;background:rgba(255,255,255,0.93);backdrop-filter:blur(14px);padding:12px 8px;border-radius:16px;box-shadow:0 8px 28px rgba(0,0,0,0.1);border:1px solid rgba(0,0,0,0.05)}#playback-bar button{display:flex;flex-direction:column;align-items:center;gap:3px;background:none;border:none;cursor:pointer;padding:7px;border-radius:10px;color:#C41E3A;font-size:10px;font-weight:600;transition:all 0.2s;width:50px;font-family:\&#x27;Noto Sans SC\&#x27;,sans-serif}#playback-bar button:hover{background:rgba(196,30,58,0.08)}#playback-bar button:disabled{opacity:0.28;cursor:not-allowed}.bar-div{width:34px;height:1px;background:rgba(0,0,0,0.07);margin:3px 0}.bar-page{font-size:10px;color:rgba(0,0,0,0.38);margin-top:3px;font-weight:500}#fullscreen-stage{display:none;position:fixed;inset:0;z-index:9997;background:#0a0a0a;overflow:hidden}#fullscreen-stage .slide-container{position:fixed;left:50%;top:50%;margin:0!important;transform-origin:center center}body.fs-mode{overflow:hidden}body.fs-mode&gt;*:not(#fullscreen-stage):not(#playback-bar):not(script):not(style){display:none!important}body.fs-mode #fullscreen-stage{display:block!important}body.fs-mode #playback-bar{display:none!important}&#x27;;
  document.head.appendChild(css);

  function updateUI() {
    document.querySelector(&#x27;.bar-page&#x27;).textContent = (currentIndex + 1) + &#x27; / &#x27; + totalSlides;
    document.getElementById(&#x27;btn-prev&#x27;).disabled = currentIndex === 0;
    document.getElementById(&#x27;btn-next&#x27;).disabled = currentIndex === totalSlides - 1;
  }

  function resizeEcharts(slide) {
    var containers = slide.querySelectorAll(&#x27;[id^=&quot;chart-&quot;]&#x27;);
    for (var i = 0; i &lt; containers.length; i++) {
      try {
        var instance = echarts.getInstanceByDom(containers[i]);
        if (instance) instance.resize();
      } catch(e) {}
    }
  }

  function resizeStage() {
    if (!isFullscreen) return;
    var slideEl = stage.querySelector(&#x27;.slide-container&#x27;);
    if (!slideEl) return;
    // 以宽度为准,确保16:9比例
    var scale = window.innerWidth / 1600;
    slideEl.style.transform = &#x27;translate(-50%, -50%) scale(&#x27; + scale + &#x27;)&#x27;;
  }

  function moveSlideIn(idx) {
    if (currentIndex === idx) return;
    moveSlideOut();
    currentIndex = idx;
    var slide = slides[currentIndex];
    savedParent = slide.parentNode;
    savedNext = slide.nextSibling;
    stage.appendChild(slide);
    slide.style.display = &#x27;&#x27;;
    setTimeout(function() { resizeEcharts(slide); }, 100);
    setTimeout(function() { resizeEcharts(slide); }, 300);
    updateUI();
    resizeStage();
  }

  function moveSlideOut() {
    if (currentIndex &lt; 0 || currentIndex &gt;= totalSlides) return;
    var slide = slides[currentIndex];
    if (!stage.contains(slide)) return;
    slide.style.transform = &#x27;&#x27;;
    slide.style.left = &#x27;&#x27;;
    slide.style.top = &#x27;&#x27;;
    if (savedNext &amp;&amp; savedNext.parentNode === savedParent) {
      savedParent.insertBefore(slide, savedNext);
    } else {
      savedParent.appendChild(slide);
    }
    currentIndex = -1;
  }

  function enter(idx) {
    if (isFullscreen) return;
    isFullscreen = true;
    document.body.classList.add(&#x27;fs-mode&#x27;);
    moveSlideIn(Math.max(0, Math.min(idx, totalSlides - 1)));
  }

  function exit() {
    if (!isFullscreen) return;
    isFullscreen = false;
    document.body.classList.remove(&#x27;fs-mode&#x27;);
    moveSlideOut();
    stage.style.display = &#x27;none&#x27;;
    currentIndex = -1;
    updateUI();
  }

  function next() { if (currentIndex &lt; totalSlides - 1) moveSlideIn(currentIndex + 1); }
  function prev() { if (currentIndex &gt; 0) moveSlideIn(currentIndex - 1); }

  document.getElementById(&#x27;btn-all&#x27;).addEventListener(&#x27;click&#x27;, function() { enter(0); });
  document.getElementById(&#x27;btn-curr&#x27;).addEventListener(&#x27;click&#x27;, function() {
    var best = 0, bestDist = Infinity;
    for (var i = 0; i &lt; slides.length; i++) {
      var d = Math.abs(slides[i].getBoundingClientRect().top);
      if (d &lt; bestDist) { bestDist = d; best = i; }
    }
    enter(best);
  });
  document.getElementById(&#x27;btn-prev&#x27;).addEventListener(&#x27;click&#x27;, prev);
  document.getElementById(&#x27;btn-next&#x27;).addEventListener(&#x27;click&#x27;, next);
  document.getElementById(&#x27;btn-exit&#x27;).addEventListener(&#x27;click&#x27;, exit);

  document.addEventListener(&#x27;keydown&#x27;, function(e) {
    if (!isFullscreen) {
      if (e.key === &#x27;f&#x27; || e.key === &#x27;F&#x27;) { e.preventDefault(); enter(0); }
      else if (e.key === &#x27;s&#x27; || e.key === &#x27;S&#x27;) { e.preventDefault(); document.getElementById(&#x27;btn-curr&#x27;).click(); }
      return;
    }
    switch(e.key) {
      case &#x27; &#x27;: case &#x27;ArrowRight&#x27;: case &#x27;ArrowDown&#x27;: e.preventDefault(); next(); break;
      case &#x27;ArrowLeft&#x27;: case &#x27;ArrowUp&#x27;: e.preventDefault(); prev(); break;
      case &#x27;Escape&#x27;: exit(); break;
    }
  });

  stage.addEventListener(&#x27;click&#x27;, function(e) { next(); });

  window.addEventListener(&#x27;resize&#x27;, function() {
    resizeStage();
    if (isFullscreen &amp;&amp; currentIndex &gt;= 0) {
      setTimeout(function() { resizeEcharts(slides[currentIndex]); }, 200);
    }
  });

  updateUI();
})();

操作方式

操作 触发方式
从头播放 按 F 键 或 点击"从头"按钮
从当前页播放 按 S 键 或 点击"当前"按钮
下一页 按 → / 空格 / 鼠标任意点击
上一页 按 ← 键
退出全屏 按 ESC 键

4K PNG导出规范

核心策略

  • HTML 画布:1600×900
  • PNG 导出:3200×1800(device_scale_factor=2)
  • 缩放公式:scale = window.innerWidth / 1600

技术实现

# device_scale_factor=2 让 Chromium 以 2x 分辨率渲染
context = await browser.new_context(
    viewport={&#x27;width&#x27;: 1600, &#x27;height&#x27;: 900},
    device_scale_factor=2
)
page = await context.new_page()
await page.goto(&#x27;file:///...&#x27;)
await page.wait_for_timeout(3000)

# 隐藏全屏播放控制栏
await page.evaluate(&quot;&quot;&quot;
    const bar = document.getElementById(&#x27;playback-bar&#x27;);
    if (bar) bar.style.display = &#x27;none&#x27;;
&quot;&quot;&quot;)
await page.wait_for_timeout(200)

# 截图每个 slide
slides = await page.query_selector_all(&#x27;.slide-container&#x27;)
for i, slide in enumerate(slides):
    await slide.screenshot(
        path=f&#x27;D:/.../第{i+1}页_4K.png&#x27;,
        type=&#x27;png&#x27;
    )

截图脚本模板

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        viewport_hd = {&#x27;width&#x27;: 1600, &#x27;height&#x27;: 900}

        context = await browser.new_context(viewport=viewport_hd, device_scale_factor=2)
        page = await context.new_page()
        await page.goto(&#x27;file:///D:/workbuddy_workspace/ppt-html-test/你的文件.html&#x27;)
        await page.wait_for_timeout(3000)

        # 隐藏播放栏
        await page.evaluate(&quot;&quot;&quot;
            const bar = document.getElementById(&#x27;playback-bar&#x27;);
            if (bar) bar.style.display = &#x27;none&#x27;;
        &quot;&quot;&quot;)

        slides = await page.query_selector_all(&#x27;.slide-container&#x27;)
        for i, slide in enumerate(slides):
            await slide.screenshot(
                path=f&#x27;D:/workbuddy_workspace/ppt-html-test/第{i+1}页_4K.png&#x27;,
                type=&#x27;png&#x27;
            )
            print(f&quot;截图成功: 第{i+1}页_4K.png (3200x1800)&quot;)

        await context.close()
        await browser.close()

asyncio.run(main())

HTML模板结构(通用基础)

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;zh-CN&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;PPT标题&lt;/title&gt;
  &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot;&gt;
  &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&amp;family=Noto+Serif+SC:wght@400;600;700;900&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;
  &lt;style&gt;
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body { background: #E5E1DD; padding: 40px 0; font-family: &#x27;Noto Sans SC&#x27;, sans-serif; }
    .slide-container { width: 1600px; height: 900px; position: relative; overflow: hidden; background: #FAFAFA; margin: 0 auto 40px auto; box-shadow: 0 20px 60px rgba(0,0,0,0.12), 0 4px 12px rgba(0,0,0,0.06); }
    /* (其余CSS见本skill各节定义) */
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;!-- 每页一个 slide-container,内容见设计方案 --&gt;
  &lt;div class=&quot;slide-container&quot;&gt;
    &lt;div class=&quot;bg-texture&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;deco-circle&quot; style=&quot;width:380px;height:380px;top:-140px;right:-95px;&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;deco-circle&quot; style=&quot;width:260px;height:260px;bottom:-70px;left:-58px;&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;slide-header&quot;&gt;
      &lt;div class=&quot;header-line&quot;&gt;&lt;/div&gt;
      &lt;div class=&quot;header-title&quot;&gt;页面标题&lt;/div&gt;
      &lt;div class=&quot;header-divider&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;page-num&quot;&gt;01 / 08&lt;/div&gt;
    &lt;div class=&quot;safe-area&quot;&gt;
      &lt;!-- 内容区 --&gt;
    &lt;/div&gt;
    &lt;div class=&quot;footer-dots&quot;&gt;
      &lt;div class=&quot;w-2.5 h-2.5 rounded-full&quot; style=&quot;background:rgba(196,30,58,0.2);&quot;&gt;&lt;/div&gt;
      &lt;div class=&quot;w-2.5 h-2.5 rounded-full&quot; style=&quot;background:rgba(196,30,58,0.3);&quot;&gt;&lt;/div&gt;
      &lt;div class=&quot;w-2.5 h-2.5 rounded-full&quot; style=&quot;background:rgba(196,30,58,0.4);&quot;&gt;&lt;/div&gt;
      &lt;div class=&quot;w-2.5 h-2.5 rounded-full&quot; style=&quot;background:#C41E3A;&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;!-- 更多 slide-container... --&gt;
  &lt;!-- 全屏JS(见上方完整实现) --&gt;
&lt;/body&gt;
&lt;/html&gt;

设计流程

每次生成前必须先输出设计方案,格式如下:

### P[N]:[页标题]

**1. 内容逻辑类型**(方法论讲解 / 信息陈列 / 递进叙事 / 对比论证 / 数据拆解 / 封面 / 过渡页)

**2. 布局结构**
- safe-area grid 骨架
- 主体区域划分:几栏?什么比例?
- 内容在主体内的组织方式

**3. 组件选择**
- 标题区、引言区、主体卡片、子信息(mini-card)、编号徽章、标签
- 底部:是否需要 summary-bar?理由?

**4. 字数评估**
- 预估总字数(1600×900 画布,18px正文)
- 排版策略:少字量(20-100字)/中字量(100-300字)/饱满字量(400-500字)/超量(&gt;500字删减)

**5. 视觉节奏**
- 内容密度、留白策略、字号层次

QA 检查机制

交付前必须检查:
- [ ] 文字完整可见(无溢出/遮挡)
- [ ] 字号:正文18px、标题46px(内容页)/ 96px(封面)
- [ ] 配色仅使用红+黑白灰
- [ ] 无单字徽章
- [ ] 每页含deco-circle×2 + footer-dots
- [ ] value-card有顶部红色装饰条

文件输出规范

  • 输出路径:d:/workbuddy_workspace/ppt-html-test/
  • 命名格式:[主题]_[关键词].html
  • 一套PPT = 一个HTML文件 = 多个.slide-container(严禁拆成单页文件)
  • 预览方式:使用 preview_url 工具展示

参考案例

🎯 核心参考(对标此文件质量):
追觅科技深度分析_10页_图表版.html — 本skill的gold standard,所有数值、规范、全屏JS均以此文件为准。

常见问题

5 问
答案由本站依据条目字段整理
竞赛PPT HTML设计系统_秋叶职场怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_c774f8e9/qiuye-ppt-design-system。安装方式为未标注。装完刷新技能列表或重开客户端。

竞赛PPT HTML设计系统_秋叶职场支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

竞赛PPT HTML设计系统_秋叶职场权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

竞赛PPT HTML设计系统_秋叶职场收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

竞赛PPT HTML设计系统_秋叶职场用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。