- 前端
【免费下载链接】impress.js
It's a presentation framework based on the power of CSS3 transforms and transitions in modern browsers and inspired by the idea behind prezi.com.
导读
impressConsole 是 impress.js 官方默认插件之一,专为现场演讲场景设计:演讲者在演示过程中按下P键,即可弹出一个独立的“演讲者控制台”窗口,实时查看当前幻灯片画面、下一张幻灯片预览、当前步骤的演讲备注,以及前后导航、计时器等辅助工具。读完本文,你将掌握如何在 impress.js 演示中为 step 添加备注、通过 CSS 隐藏备注、配置控制台自动弹出与自定义样式,并从源码层面理解控制台的同步机制、快捷键体系与事件 API。
本文以 impressConsole 官方文档 为骨架,结合插件实现源码与示例演示深入展开。
一、插件能力总览
根据 src/plugins/impressConsole/README.md,按下P键后弹出的演讲者控制台窗口具备四大核心能力:
- 当前幻灯片视图(View of current slide):左侧主区域通过 iframe 实时加载当前处于
active状态的 step; - 下一张幻灯片预览(Preview of next slide):主视图下方以缩小比例显示下一个 step 的预览画面;
- 演讲备注(Speaker notes):右侧面板展示当前 step 内
<div class="notes">元素的内容; - 导航(Navigation):底部提供上一张/下一张按钮,并支持键盘翻页。
从 插件源码 可以看到,控制台窗口本身是一个由consoleTemplate字符串生成的完整 HTML 文档,包含#slideView(当前页 iframe)、#preView(预览 iframe)、#notes(备注面板)、#prev/#next(导航)、#clock(时钟)、#timer(计时器)与#status(状态指示)等元素。窗口标题会自动设为Speaker Console (原演示标题)(见 impressConsole.js#L438)。
二、为 step 添加演讲备注
2.1 备注标记写法
官方文档给出的用法非常简洁:在任意 step 内部添加一个class="notes"的 div 即可:
<div class="notes">Speaker notes text...</div>完整示例(可参考 src/plugins/README.md 中的 Sample HTML):
<div id="impress"> <div class="step">var newNotes = document.querySelector( '.active' ).querySelector( '.notes' ); if ( newNotes ) { newNotes = newNotes.innerHTML; } else { newNotes = lang.noNotes; // 无备注时的占位提示 } consoleWindow.document.getElementById( 'notes' ).innerHTML = newNotes;若 step 中没有备注元素,面板会显示国际化提示语(如英文No notes for this step、中文当前帧没有备注)。备注面板在进入新 step 时还会执行notes.scrollTop = 0将滚动位置重置到顶部。
2.3 用 CSS 隐藏备注
控制台窗口展示备注,但演示画面本身不应显示它们。官方文档提供的示例 CSS 如下:
/* Hide notes from the actual presentation. This will not affect the visibility of notes in the impress console window. */ .notes { display: none; }这段规则同样收录在仓库自带的 css/impress-common.css#L16-L23 中,注释明确指出:display: none只影响演示页面本体,不会影响控制台窗口内备注的显示——因为备注是直接以innerHTML注入控制台窗口的#notes面板(见 impressConsole.js#L172-L178),与控制台文档的样式环境相互独立。
三、打开控制台的方式
3.1 快捷键 P(默认方式)
插件在初始化时通过registerKeyEvent( [ 80 ], open, window )注册了键码80(即键盘字母P)来打开控制台(见 impressConsole.js#L568)。同时它还会向帮助面板注册一个条目——{ command: 'P', text: 'Presenter console', row: 10 }(见 impressConsole.js#L616-L618),因此按下H打开 help 弹窗时能看到这一快捷键提示。
3.2 自动弹出(data-console-autolaunch)
如需演示一加载就自动打开控制台,可在根元素上设置:
<div id="impress">.impress-enabled #impress-console-button { pointer-events: auto }四、控制台内的操作与快捷键
控制台打开后,焦点位于控制台窗口内,此时支持以下键盘操作(注册逻辑见 impressConsole.js#L452-L464):
| 按键 | 键码 | 作用 |
|---|---|---|
PgUp/←/↑ | 33 / 37 / 38 | 上一张(调用impress().prev()) |
PgDn/→/↓ | 34 / 39 / 40 | 下一张(调用impress().next()) |
Space | 32 | 备注未滚动到底时向下翻备注;滚到底则跳到下一张 |
R | 82 | 重置计时器 |
按键处理有两个细节(见 impressConsole.js#L317-L338):按下时会先preventDefault()阻止默认行为,且只有在未按下Ctrl/Alt/Shift/Meta组合键时才生效。Space键的备注翻页逻辑在 spaceHandler:若scrollTopMax - scrollTop > 20则按clientHeight * 0.8向下滚动一屏,否则交给impress().next()前进。
此外,控制台底部还有可点击的Prev / Next链接按钮,其onclick直接调用impress().prev()/impress().next()(见 impressConsole.js#L93-L97),#timer区域也支持点击重置计时(onclick="timerReset()")。
五、内置时钟与计时器
控制台内置了实时时钟和演讲计时器,由clockTick每 1000ms 执行一次刷新(setInterval,见 impressConsole.js#L447-L450):
- 时钟:显示
HH:MM:SS,若语言对象设置useAMPM: true则切换为 12 小时制并追加AM/PM(当前内置的 en / de / zh-CN 语言均未启用 12 小时制,见 impressConsole.js#L28-L70); - 计时器:从控制台打开(或点击
R/ 点击计时器区域)的时刻开始累计,格式为00m 00s。
语言本地化方面,插件会根据navigator.language选择de、zh-CN(含zh-cn)或默认en的文案对象,覆盖备注占位、按钮文字、加载/就绪/移动中状态等。控制台打开时还会额外把consoleWindow.impress = window.impress注入,保证控制台内嵌链接可以调用演示页的 API。
六、预览区与窗口的自适应布局
控制台窗口并非固定大小,而是根据主窗口宽高比动态计算 iframe 尺寸(resize函数,见 impressConsole.js#L485-L534)。核心逻辑如下:
- 以主窗口
innerHeight / innerWidth计算演示的宽高比ratio; - 主视图
#slideView占据可用宽度并按ratio计算高度; - 预览
#preView默认取主视图的0.7倍(preViewDefaultFactor),并在空间不足时收缩,最小不低于0.5倍(preViewMinimumFactor),两者间距preViewGap = 4像素; - 若预览高度仍放不下,则打破比例约束,优先保证预览可见。
主窗口与控制台窗口各自的resize事件都会触发重新计算(见 impressConsole.js#L477-L479)。默认的内联样式(cssStyleStr)还定义了左右分栏:左半屏放视图(#views),右半屏放备注(#notes),底部为控制条;#preView默认带opacity: 0.7的半透明效果,#status在切换时显示红色Moving(移动中)、就绪时显示绿色Ready(就绪)。
七、样式定制与配置项
7.1 自定义控制台样式
默认情况下控制台使用源码内联的cssStyleStr样式。如需完全自定义,插件在_init中按优先级读取以下来源(见 impressConsole.js#L536-L551):
- 调用
init(cssConsole, cssIframe)时传入的参数; - 根元素
div#impress上的data-console-css属性(控制台窗口样式); data-console-css-iframe属性(两个 iframe 内部的样式)。
<div id="impress" >.impress-console.preView .impress-progress, .impress-console.preView .impress-progressbar, .impress-console.preView #impress-toolbar, .impress-console.preView #impress-help { display: none; } .impress-console.slideView #impress-help { display: none; }7.2 通过事件注册自定义快捷键
插件还暴露了impress:console:registerKeyEvent事件,允许第三方代码在控制台窗口内注册自定义按键:
root.dispatchEvent( new CustomEvent( 'impress:console:registerKeyEvent', { detail: { keyCodes: [ 72 ], // 键码列表 handler: function() { /* 自定义逻辑 */ }, window: undefined // 不传则默认绑定到控制台窗口 } } ) );对应实现见 impressConsole.js#L592-L601。
八、自动初始化与历史 API 说明
impressConsole 是一个标准的init 插件:当核心的impress().init()派发impress:init事件时,插件会自动完成初始化(见 impressConsole.js#L610-L619):
document.addEventListener( 'impress:init', function( event ) { impressConsole( event.target.id )._init(); triggerEvent( document, 'impress:help:add', { command: 'P', text: 'Presenter console', row: 10 } ); } );因此,只要使用仓库提供的 js/impress.js(核心与全部默认插件的拼接产物),无需任何额外<script>或手动初始化代码,P键功能即开箱即用。老版本中需要显式调用impressConsole().init(),该方式现已标记为deprecated,调用时会输出提示日志:impressConsole().init() is deprecated. impressConsole is now initialized automatically when you call impress().init().(见 impressConsole.js#L577-L585)。
插件对象本身挂载在window.impressConsole(rootId),支持传入根元素 id(默认impress),同一 id 的实例会被缓存复用(allConsoles,见 impressConsole.js#L112-L127),返回对象包含init、open、clockTick、registerKeyEvent、_init等方法(见 impressConsole.js#L604-L606)。
九、已知限制与浏览器兼容提示
源码注释与实现中透露了几个值得注意的边界情况:
- 弹窗拦截:非用户手势触发的
window.open()可能被浏览器拦截,插件为此准备了全屏点击按钮降级方案(见第三节); - iframe 事件注入限制:
triggerEventInView注释明确指出,Chrome 在file://URL 下不允许createEvent,因此向 iframe 派发子步骤事件(impress:substep:show/impress:substep:hide)在 Chrome 的本地文件场景下不可用,仅在 Firefox 或 Chrome 的http://环境下正常(见 impressConsole.js#L259-L267); - Firefox 滚动偏移:代码通过
clockTick首次运行时对两个 iframe 执行scrollTo(0, 0),以修正 Firefox 下 iframe 加载后滚动位置错乱的问题(见 impressConsole.js#L308-L314); - 重复设置 iframe src 的闪烁:仅在 src 发生变化时才赋值,规避 Firefox 下的闪烁问题(见 impressConsole.js#L186-L193);
- 子步骤(substep)同步:插件监听
impress:substep:stepleaveaborted、impress:substep:show、impress:substep:hide,将子步骤的显隐事件转发到主视图 iframe,保证控制台中的画面与演示页同步(见 impressConsole.js#L237-L257)。
十、结语:一条完整的接入清单
要在你的 impress.js 演示中启用演讲者控制台,最小配置只需三步:
- 引入 js/impress.js(已包含 impressConsole 插件);
- 在每个 step 内添加
<div class="notes">...</div>撰写演讲备注; - 在样式表中加入
.notes { display: none; }(可直接复制 css/impress-common.css 中对应片段)隐藏备注。
按需进阶配置包括:data-console-autolaunch="true"自动弹出、data-console-css/data-console-css-iframe自定义样式、impress:console:open与impress:console:registerKeyEvent事件扩展。至此,演讲者即可在控制台窗口中边看当前页与下一页预览、边读备注、边用键盘与计时器掌控全场节奏。
- 前端
【免费下载链接】impress.js
It's a presentation framework based on the power of CSS3 transforms and transitions in modern browsers and inspired by the idea behind prezi.com.
相关推荐
guizang-ppt-skill 演讲者模式与演讲备注契约:从叙事规划到现场控制的完整实现
guizang ppt skill 演讲者模式与演讲备注契约:从叙事规划到现场控制的完整实现 导读 本文完整讲解 guizang ppt skill 项目中的"
AI 技能mdx-deck 演示者模式(Presenter Mode)与演讲者备注(Speaker Notes)完全指南
mdx deck 演示者模式(Presenter Mode)与演讲者备注(Speaker Notes)完全指南 mdx deck 是基于 React + MDX
开发工具前端后端技术演讲指南:gh_mirrors/vag/vagas招聘者关注的演讲主题
后端技术演讲指南:gh_mirrors/vag/vagas招聘者关注的演讲主题 你是否在准备后端技术演讲时感到迷茫,不知道该选择什么主题才能吸引招聘者的目光?本
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考