《了不起的Markdown》第五章

第五章 轻快、省力地写幻灯片——reveal.js

5.1 你好,reveal.js

  reveal.js是一个使用HTML和Markdown快速创建和演示幻灯片的工具,它提供了很多实用的功能,也提供了很多第三方插件来增强效果。

reveal.js的主要功能:

  1. 可创建水平和垂直幻灯片,支持幻灯片链接,可在幻灯片之间跳转。
  2. 可使用Markdown和HTML编写内容,也支持引用独立的Markdown文件。
  3. 可使用颜色、图片、视频、网页做为背景。
  4. 可添加演讲者注释,支持一键打开。
  5. 可配置幻灯片的主题和过渡动画,有多种方案可供选择。
  6. 可在手机或平板电脑上打开和演示幻灯片。
  7. 可打印和导出PDF格式的文档。
  8. 可以安装很多实用的插件来增强幻灯片的功能和演示效果。
  9. 自由度大,可灵活定制(如果你熟悉前端开发知识的话)。
  10. 支持很多快捷键的使用,操作非常方便。

5.2 快速开始

1. 搭建reveal.js使用环境

  使用reveal.js必须先安装Node.js和Git

2. 下载reveal.js

3. 查看示例

  打开reveal.js文件夹,在根目录中找到index.html,然后使用VS Code打开。

<div class="reveal">
    <div class="slides">
        <!-- 每一页幻灯片都使用<section>标签包裹 -->
        <section>Slide 1</section><!-- 第一页 -->
        <section>Slide 2</section><!-- 第二页 -->
    </div>
</div>

  从这段代码可以看出,在HTML中,幻灯片标记的层次结构是.reveal >.slides > section。关于section,我们可以理解为分页标签,每一张幻灯片都是使用<section>标签包裹的。双击index.html可在浏览器中打开幻灯片。

4. 创建我们的第一个幻灯片

  复制index.html并重命名为first.html,使用VS Code打开,修改核心代码。

<div class="reveal">
    <div class="slides">
        <!-- 第一页 -->
        <section>如何使用reveal.js创建和演示幻灯片</section>
        <!-- 第二页 -->
        <section>第一步:下载reveal.js项目构建创作环境</section>
        <!-- 第三页 -->
        <section>第二步:熟悉语法规则在进行内容创作</section>
        <!-- 第四页 -->
        <section>第三步:启动本地服务进行幻灯片演示</section>
    </div>
</div>

  保存后双击first.html在浏览器中打开幻灯片,至此,第一个简单的幻灯片就创建好了。
  当然,这个幻灯片是比较简单的,因为我们还没有学习在reveal.js中创建幻灯片的语法和规则,待熟悉reveal.js的语法规则后,就可以随心所欲地创作幻灯片了。

5.3 使用指南

  前面搭建的是最基本的环境配置,进行一些基础操作是没有问题的,但有些功能需要从本地Web服务器运行,如演讲者备注、引用外部Markdown文件、修改后自动刷新等,如果还是使用前面的环境就行不通了。为了能够进行完整的演示,还要对项目环境进行完整的配置。

5.3.1 搭建完整的项目环境

1. 在终端处切换到项目根目录下

  使用VS Code打开reveal.js项目,在左边项目列表的空白处,单击鼠标右键,在弹出的菜单中选择【在终端中打开】,终端会切换到项目根目录下。

2. 安装reveal.js项目中依赖的模块

  在终端处运行npm install,如果安装模块失败,请使用cnpm install来安装。

3,运行命令,启动Web服务

npm start

  如果启动正常,则终端处会输出如下内容。

Image00261.jpg

  然后浏览器会自动打开http://localhost:8000,默认打开的是index.html页面。如果想打开first.html,则需要手动输入http://localhost:8000/first.html

  注意: 如果启动Web服务时报错,请确认是否已成功安装了项目所依赖的模块。如果端口被占用,可以在运行时指定端口。

npm start -- --port=7000

  Web服务启动成功之后又运行了一个watch任务,这个watch任务会监控项目中的文件;如果有文件被修改,在保存之后服务会自动重启,页面也会自动刷新,这样我们就能看到页面最新修改后的效果了。
  至此,完整的reveal.js创作环境就搭建好了

5.3.2 快速了解reveal.js

1. 创建并编写幻灯片

  在reveal.js项目中创建HTML文件,然后在HTML文件中编写幻灯片。

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="css/reveal.css">
    <!-- 在这里修改幻灯片 -->
    <link rel="stylesheet" href="css/theme/black.css">
</head>
<body>
    <div class="reveal">
        <div class="slides">
            <!-- 每一页幻灯片都使用<section>标签包裹 -->
            <section>Slide 1</section><!-- 第一页 -->
            <section>Slide 2</section><!-- 第二页 -->
        </div>
    </div>
    <script src="js/reveal.js"></script>
    <script>
        // 在这里修改幻灯片配置
        Reveal.initialize({});
    </script>
</body>
</html>

各部分的用途:

  1. 在<head>中设置幻灯片的主题。
  2. 在<section>中编写幻灯片的内容。
  3. 在Reveal.initialize({});中添加reveal.js的依赖和配置。

2. 演示幻灯片

  简单的幻灯片可以通过使用鼠标双击HTML文件在浏览器中打开进行演示。但如果涉及演讲者备注或引用外部的Markdown文件,则需要使用Web服务器运行。本地运行命令为npm start,如果想要部署到服务器上则需要使用Nginx。

3. 幻灯片的类型

  reveal.js中的幻灯片分为两种类型:水平幻灯片和垂直幻灯片。顾名思义,水平幻灯片是左右翻页的幻灯片,垂直幻灯片则是上下翻页的幻灯片;垂直幻灯片通常嵌套在水平幻灯片中使用。

  • 示例代码
<!-- 最外层是水平幻灯片 -->
<section>
    <!-- 嵌套的垂直幻灯片1 -->
    <section data-markdown>
        <textarea data-template>
            ## 第一页
        </textarea>
    </section>
    <!-- 嵌套的垂直幻灯片2 -->
    <section data-markdown>
        <textarea data-template>
            ## 第二页
        </textarea>
    </section>
</section>

4. 使用Markdown编写幻灯片

  reveal.js使用Markdown编写幻灯片有两种方式。

  1. 在HTML文件中直接使用Markdown编写。
  2. 在HTML文件中引用外部的Markdown文件。

  如果在HTML文件中直接使用Markdown编写,则需要给<section>标签添加data-markdown属性,并且内容要使用<textareadata-template>包裹。

    <section data-markdown>
        <textarea data-template>
            ## 居中对齐
            | 序号  | 姓名  | 年龄  |
            | :---: | :---: | :---: |
            |   1   | 张三  |  31   |
            |   2   | 李四  |  30   |
            |   3   | 王五  |  29   |
        </textarea>
    </section>

  如果在HTML文件中引用外部的Markdown文件,则需要指定分页的匹配规则。

<!-- 引用外部文件的Markdown文件 -->
    <section data-markdown="fileName.md"
    data-spearator="^\n\n\n"
    data-spearator-vertical="^\n\n"
    data-spearator-notes="^Note:"
    data-charset="utf-8">
    </section>

5.添加reveal.js的依赖和配置

  在Reveal.initialize({});中进行对reveal.js的配置,如开启历史记录、显示页面、设置全局转场效果等。

<script>
  Reveal.initialize({
    history: true,          // 开启历史记录
    slideNumber:true,       // 显示页码
    transition:'convex',    // 转场效果
    // 配置依赖库
    dependencies:[{
        src: 'plugin/markdown/marked.js'
    },{
        src: 'plugin/markdown/markdown.js'
    },{
        src: 'plugin/notes/notes.js',
        async: true
    },{
        src: 'plugin/highlight/highlight.js',
        async: true,
        callbcak: function () {
            hljs.initHighlightingOnLoad();
        }
    },{
        src: 'plugin/zoom-js/zoom.js',
        async: true
    }]
  });
</script>

  reveal.js不依赖任何第三方脚本,但有一些可选的库供用户自由选择,这些库按依赖顺序进行加载,如上述代码所示。

关于配置依赖的库的语法解读如下:

  1. src:指定要加载的脚本的路径。
  2. async:[可选],如果脚本要在reveal.js启动后加载,则设为true,默认为false。
  3. callback:[可选],指定脚本加载后要执行的函数。

6. 示例:编写幻灯片的封面

  为了能够更直观地展示reveal.js幻灯片的编写规则,我们分别使用HTML和Markdown实现效果相同的幻灯片。

  • 为幻灯片写封面(HTML版)
  1. 复制index.html,并重命名为revealjs.html,用VS Code打开。
  2. 先不管代码的其他部分(后面都会讲到),先找到<div class="slides">,在<section></section>中添加幻灯片的内容
<div class="reveal">
    <div class="slides">
        <!-- HTML实现效果 -->
        <section>
            <h1>大道至简</h1>
            <h3>使用reveal.js创建幻灯片</h3>
            <p>作者XXX</p>
        </section>
    </div>
</div>

注意代码的层级结构,使用<section>标签包裹的是一张幻灯片的内容。

小提示: 为了让大家更容易理解后面的内容,在这里先明确几个HTML中的概念。

  1. 元素:元素指的是从开始标签到结束标签中间的所有代码。
  2. 标签:标签是由<>包裹的关键词,通常是成对出现的,如<section>和</section>。
  3. 属性:标签中的属性提供了HTML元素的更多信息,通常在元素的开始标签中以键/值对的形式出现,如<section data-state="customevent">
  • 为幻灯片写个封面(Markdown版)
<!-- 引用外部文件的Markdown文件 -->
    <section data-markdown>
        <textarea data-template>
            # 大道至简
            ### 使用reveal.js创建幻灯片
            作者XXX
        </textarea>
    </section>

注意: 使用Markdown时需要在<section>标签中添加data-markdown属性,Markdown的内容要包裹在<textarea data-template>之中。

小提示: reveal.js通过marked.js解析Markdown,在使用Markdown之前请确保添加了下面的依赖。

Reveal.initialize({
    dependencies:[{
        src: 'plugin/markdown/marked.js'
    },{
        src: 'plugin/markdown/markdown.js'
    },
    ]
});

  上面分别使用HTML和Markdown编写了效果相同的幻灯片,能够明显感受到Markdown更为简洁。需要注意的是,在使用Markdown时,要给<section>标签添加data-markdown属性,并且Markdown内容要使用<textarea data-template>进行包裹。

5.3.3 常用格式

  reveal.js使用marked.js来解析Markdown,并支持CommonMark和GitHub Flavored Markdown。不过,有些效果还是需要使用HTML或引入其他资源来实现的,如任务列表、视频、字体颜色、下画线和Emoji等。

1.标题

标题、普通文本和更小的文本的示例代码:

<!-- 标题 md -->
<section data-markdown>
    <textarea data-template>
        # 一级标题
        ## 二级标题
        ### 三级标题
        #### 四级标题
        普通文本
        <small>更小的文本</small>
    </textarea>
</section>

小提示:

  1. 本示例只演示了一到四级标题,因为四、五、六级标题区别不大,这里就不演示五、六级标题了。
  2. 由于Markdown不支持小号字体的标记,因此小号字体(更小的文本)使用<small>标签来实现。
  3. 我们经常会在Markdown中使用HTML标签以实现更丰富的显示效果,如改变字体颜色、设置图片显示大小和位置等。

2. 引用

行内引用和区块引用的示例代码:

<!-- 引用 md -->
<section data-markdown>
    <textarea data-template>
        <q>Markdown真了不起</q>

        > 区块引用使用 > 标记
        > > 引用嵌套使用
    </textarea>
</section>

  由于Markdown不支持行内引用标记,因此行内引用使用<q>标签实现。

3. 表格

<!-- 表格 md -->
<section data-markdown>
    <textarea data-template>
        | 序号 | 姓名 | 年龄 |
        | ---- | ---- | ---- |
        | 1    | 张三 | 31   |
        | 2    | 李四 | 30   |
        | 3    | 王五 | 29   |
    </textarea>
</section>
<!-- 表格居中对齐 md -->
<section data-markdown>
    <textarea data-template>
        | 序号  | 姓名  | 年龄  |
        | :---: | :---: | :---: |
        |   1   | 张三  |  31   |
        |   2   | 李四  |  30   |
        |   3   | 王五  |  29   |
    </textarea>
</section>

4. 列表

<!-- 无序列表 md -->
<section data-markdown>
    <textarea data-template>
        任务进度
        - 第一阶段
        - 第二阶段
        - 第三阶段
    </textarea>
</section>
<!-- 有序列表 md -->
<section data-markdown>
    <textarea data-template>
        任务进度
        1. 第一阶段
        2. 第二阶段
        3. 第三阶段
    </textarea>
</section>
<!-- 任务列表 md -->
<section data-markdown>
    <textarea data-template>
        ## 任务列表
        <input type="checkbox" style="zoom: 200%;" checked> 第一阶段
        <input type="checkbox" style="zoom: 200%;"> 第二阶段
        <input type="checkbox" style="zoom: 200%;"> 第三阶段
    </textarea>
</section>

  注意: 由于reveal.js中的Markdown不支持任务列表,因此任务列表需要使用HTML来实现,在本例中设置了复选框的大小。

5. 代码

插入代码的示例:

<!-- 插入代码 md -->
<section data-markdown>
    <textarea data-template>
        ```python
        # python代码
        def fun():
            pass
        ```

        ```js
        # javascript代码
        function getName(){
            return null
        }
        ```
    </textarea>
</section>

  请注意,插入的代码中如果有特殊符号 < 和 >,需要使用<和>来代替,否则它们会被浏览器误认为标签。

6. 文本格式

<!-- 插入代码 md -->
<section data-markdown>
    <textarea data-template>
        使用Markdown实现**加粗**、*斜体*、~~删除线~~、<u>下划线</u>、很简单
        还可以<font color="red">改变颜色</font>
    </textarea>
</section>

7. Emoji

  在reveal.js中无法直接使用Emoji,如果想使用,则需要在head中引用一个CSS文件。

<link href="https://afeld.geithub.io/emoji-css/emoji.css" rel="stylesheet">
<!-- Emoji md -->
<section data-markdown>
    <textarea data-template>
        ## Emoji
        <i class="em em-construction_worker"></i>
        <i class="em em-dog"></i>
        <i class="em em-dancers"></i>
    </textarea>
</section>

  Emoji的选择很简单,打开https://afeld.github.io/emoji-css/,复制所中意的图片的代码,然后粘贴一下就可以了.

8. 图片

<!-- 图片 md -->
<section data-markdown>
    <textarea data-template>
        ![插入图片](../img/00022.gif)
    </textarea>
</section>

  在Markdown中,没有设置图片大小的标记,如果想设置图片的大小,需要使用HTML标签来实现。

<!-- 图片 md -->
<section data-markdown>
    <textarea data-template>
        <!-- 设置图片大小 -->
        <img width="200" height="200" data-src="../img/00022.gif" alt="插入图片">
    </textarea>
</section>

9.视频和音频

插入视频和音频的示例代码:

<!-- 视频 md -->
<section data-markdown>
    <textarea data-template>
        ## 视频
        <video width="400" height="350" controls="controls">
            <source src="视频文件路径" type="video/mp4">
        </video>
    </textarea>
</section>
<!-- 音频 md -->
<section data-markdown>
    <textarea data-template>
        ## 音频
        <audio src="音频文件路径" controls="controls"></audio>
    </textarea>
</section>

  插入视频通过<video>标签来实现,使用width和height属性可设置视频的大小。插入音频通过<audio>标签来实现,使用controls属性可以显示播放控件。

5.3.4 幻灯片的嵌套、链接和注释

1. 幻灯片嵌套

  reveal.js中的幻灯片有水平幻灯片和垂直幻灯片两种,垂直幻灯片通常嵌套在水平幻灯片中使用。幻灯片最外层是水平幻灯片,使用<section>标签包裹,嵌套的每一张垂直幻灯片也要使用<section>标签包裹

<!-- 最外层水平幻灯片-->
<section>
    <!-- 嵌套的垂直幻灯片1 -->
    <section data-markdown>
        <textarea data-template>
            ## 垂直幻灯片1 
        </textarea>
    </section>
    <!-- 嵌套的垂直幻灯片2 -->
    <section data-markdown>
        <textarea data-template>
            ## 垂直幻灯片2 
        </textarea>
    </section>
</section>

  如果你开启了页码显示功能,幻灯片的右下角会显示页码,假如当前水平幻灯片是第5页,那垂直幻灯片就会显示5.1、5.2、5.3。
  如果你开启了历史记录功能,那么浏览器地址窗口也会这样显示。

2. 链接幻灯片

  当进行幻灯片演示时,如果想要回到之前讲过的某一页或提前查看后面的某一页,就需要用到幻灯片链接功能了。
  本质上,使用reveal.js编写的幻灯片就是一个网页,因此想要在幻灯片之间跳转,只需要添加链接就可以了。

    <!-- 创建链接 -->
<section data-markdown>
    <textarea data-template>
        去[第三页](#/3)
        去[第二页第二节](#/2/2)
        新打开一个页面再跳转到<a href="#/3" target="_blank">第三页</a>
    </textarea>
</section>

如果想打开一个新页面,而不是直接跳转:

<a href="#/3" target="_blank">另打开一个页面,再跳转到第三页</a>

3.演讲者注释

  在演讲者注释界面上,可以查看当前幻灯片的注释,也可以预览下一页幻灯片的内容。由于演讲者注释是嵌到幻灯片里面的,因此要在对应的幻灯片页面里编写注释内容。

  如果使用Markdown编写,则注释内容默认以 Note+: 开头

<!-- 演讲者注释md -->
<section data-markdown>
    <textarea data-template>
        ## 按<font color="red">**S**</font>键可以打开演讲者注释
        使用Markdown编写,则注释内容默认以 Note+: 开头
        <!-- 演讲者注释 -->
        Note+:
        在演讲者注释界面上,可以查看当前幻灯片的注释,也可以预览下一页幻灯片的内容。
    </textarea>
</section>

5.3.5 幻灯片显示

1. 背景

  幻灯片可以使用不同的颜色作为背景,也可以使用图片或视频作为背景。

a. 背景颜色
<!-- 背景颜色 -->
<section data-markdown>
    <textarea data-template>
        ## 指定背景颜色
        ```html
        &lt;section data-background="#F34D4E"&gt;
        ```
    </textarea>
</section>

  请注意,在插入的代码中如果有特殊符号 < 和 >,则需要使用<和>代替,否则它们会被浏览器误认为是标签而导致渲染错误。

b. 图片背景

  将图片设置为幻灯片背景,需要在<section>标签中使用data-background属性进行设置。

<!-- 图片背景 -->
<section data-background="图片背景文件路径">
    <textarea data-template>
        ## 指定背景图片
        ```html
        &lt;section data-background="path/image.png"&gt;
        ```
    </textarea>
</section>

  在默认情况下,图片会被拉伸填满整个页面,这有可能会导致图片失真,为了避免这种情况,可以使用 data-background-size 属性设置图片的大小,也可以使用data-background-repeat="repeat"平铺图片。

<!-- 图片背景 -->
<section data-background="图片背景路径/文件名" data-markdown data-background-repeat="repeat" data-background-size="100px">
    <textarea data-template>
        <!-- 通过CSS添加背景图片 -->
        <div style="background-color: rgba(0,0,0,0.603); color:#fff; padding: 15px">
            ## 平铺图片
        </div>
        ```html
        <!-- 平铺图片图片背景,并指定图片的大小 -->
        &lt;section data-background="path/image.png" data-markdown data-background-repeat="repeat" data-background-size="100px"&gt;
        ```
    </textarea>
</section>

  也可以使用GIF动态图作为幻灯片的背景。

c. 视频背景

  将视频设置为幻灯片的背景,需要在<section>标签中使用data-background-video属性进行设置。

<!-- 图片背景 -->
<section data-background-video="图片背景路径/文件名" data-markdown>
    <textarea data-template>
        <!-- 通过CSS添加背景颜色 -->
        <div style="background-color: rgba(0,0,0,0.603); color:#fff; padding: 15px">
            <h2>视频背景</h2>
        </div>
    </textarea>
</section>

  由于视频背景可能会导致幻灯片的内容看不清,上述示例通过<div>标签为部分内容添加了样式,并指定了背景颜色和文字颜色。

d. 网页背景

  将网页设置为幻灯片的背景,需要在<section>标签中使用data-background-iframe属性进行设置,

<!-- 图片背景 -->
<section data-background-iframe="https://www.baidu.com" data-background-interactive data-markdown>
    <textarea data-template>
        ## 网页作为幻灯片的背景
    </textarea>
</section>

  由于网页位于幻灯片下的背景图层中,在默认情况下,我们无法与其交互,如果想要与网页进行交互,需要使用data-background-interactive属性进行设置。

2. 主题

  reveal.js提供了11种主题供选择。

序号 主题 CSS文件地址
1 black(默认) css/theme/black.css
2 white css/theme/white.css
3 league css/theme/league.css
4 sky css/theme/sky.css
5 beige css/theme/beige.css
6 simple css/theme/simple.css
7 serif css/theme/serif.css
8 blood css/theme/blood.css
9 night css/theme/night.css
10 moon css/theme/moon.css
11 solarized css/theme/solarized.css

在head中找到引用主题的样式文件可以替换主题。

<link rel="stylesheet" href="css/theme/black.css">

  默认主题是black,如果想使用其他的主题,只要替换black.css就可以了。

3. 开启历史记录

  由于在每次保存修改后,Web服务都会自动重启,页面也会随之刷新,这就导致刷新后的页面总是会跳转到首页。假如我们当前编辑的是第10页的内容,保存后浏览器会自动跳转到首页,但如果我们想要看修改后的效果,就需要再翻到第10页才能看到,这样极为不便。
  开启幻灯片的历史记录功能,让它记住我们当前所在的页面。开启方法为在revealjs.html代码底部找到Reveal.initialize({});,添加history:true开启历史记录。

Reveal.initialize({
    history: true,          // 开启历史记录
    dependencies:[{
        ......
    }]
});

  保存后,在浏览器中可观察到网址显示的格式为:.html#/页码。

小提示: 熟悉HTML的同学应该知道,历史记录正是利用锚点来进行页面定位的。

4. 显示页码

  在默认情况下,幻灯片是不显示页码的,如果想在幻灯片上显示页码,需要在Reveal.initialize({});中进行配置。页码显示在幻灯片的右下角。从页码上能很容易区分出垂直幻灯片和水平幻灯片。

slideNumber: true,          // 显示页码

5. 显示进度条

  进度条默认是显示的,如果不想显示进度条,需要在Reveal.initialize({});中配置。

progress: false,          // false是不显示进度,要显示就设为true

5.3.6 演示效果

1. 分段演示

  我们在演示幻灯片时,可能会想要把一页幻灯片上的内容分段显示出来。

<section data-markdown>
    <textarea data-template>
        ## 分段演示
        <span class="fragment">分段演示</span>
        <span class="fragment">就是</span>
        逐步            <!-- .element: class="fragment" -->
        显示内容        <!-- .element: class="fragment" -->
        它有很多动画效果 <!-- .element: class="fragment" -->
    </textarea>
</section>

  上面的代码使用了两种方式来添加元素的属性,一种是标准方法,使用HTML标签为元素添加属性 class="fragment";另一种是专门为 Markdown 设计的通过HTML注释为元素添加属性的方法,这两种方法可以混合使用,也可以单独使用。
  分段演示提供了多种动画效果。

<section data-markdown>
    <textarea data-template>
        ## 分段演示效果
        <p class="fragment grow">变大</p>
        <p class="fragment shrink">缩小</p>
        <p class="fragment fade-out">淡出</p>
        <p class="fragment fade-right">向右淡入</p>
        <p class="fragment fade-left">向左淡入</p>
        <p class="fragment fade-up">向上淡入</p>
        <p class="fragment fade-down">向下淡入</p>
        <p class="fragment fade-in-then-out">淡入然后淡出</p>
        <p class="fragment">也可以改变文字颜色</p>
        <p class="fragment">例如:
            变<span class="fragment highlight-red">红</span>
            变<span class="fragment highlight-green">绿</span>
            变<span class="fragment highlight-blue">蓝</span>
            变<span class="fragment highlight-current-red">蓝</span>
            再还原
        </p>
    </textarea>
</section>

2. 演示顺序

  分段演示是可以控制显示顺序的,这需要为元素添加data-fragment-index属性。

<section data-markdown>
    <textarea data-template>
        ## 分段内容顺序演示
        <!-- 使用注释为元素添加属性 -->
        2   <!-- .element: class="fragment" data-fragment-index="2" -->
        1   <!-- .element: class="fragment" data-fragment-index="1" -->
        <!-- 使用HTML标签为元素添加属性 -->
        <p>
            <span class="fragment" data-fragment-index="4">4</span>
        </p>
        <p>
            <span class="fragment" data-fragment-index="3">3</span>
        </p>
    </textarea>
</section>

3. 转场动画

  转场动画是指切换幻灯片时的过渡效果,可以单独设置某页幻灯片的转场动画,也可以设置全局的转场动画。设置单个幻灯片的转场动画,需要给<section>标签添加data-transition属性,属性的值就是转场动画的效果。

<section data-transition="zoom">
    <h2>放大</h2>
</section>

reveal.js提供的转场动画效果有如下几种:

转场动画可选值 转场效果
convex 凸进凸出
concave 凹进凹出
zoom 缩放
slide 移入移出
fade 淡入淡出

  如果不想对每一页都单独设置转场动画,可以设置全局动画效果,此时,需要在Reveal.initialize({});中添加如下代码。

transition: 'convex',    // 转场效果

注意: 页面设置的优先级高于全局设置,因此即使设置了全局动画效果,如果还想对某页幻灯片进行其他设置也是可以的。

4. 背景过渡动画

  可以通过在<section>标签中添加data-background-transition属性为每一页幻灯片设置不同的背景过渡动画,动画效果的选项跟前面讲的转场动画一样,

<section data-markdown data-transition="slide" data-background="#F34D4E" data-background-transition="convex">
    <textarea data-template>
        ## 背景转变
        <small>通过配置<font color="#fa0">**data-background-transition**</font>属性</small>
        ```html
        &lt;section data-background-transition="convex"&gt;
        ```
    </textarea>
</section>

注意: 如果设置了背景过渡动画,内容的过渡就默认变成了滑入效果。

5. 自动演示

  如果想让幻灯片自动演示,只需要设置自动演示的间隔时间就可以了。

Reveal.configure({
    autoSlide: 5000
})

  配置完成后,自动演示功能就被启用了,幻灯片的左下角将会显示一个控件,用户可以通过单击控件或按键盘上的A键来暂停或恢复自动演示。

可对单个幻灯片和片段单独设置自动演示时间:

<section data-autoslide="3000">
    <p>3s之后自动播放下面的片段</p>
    <p class="fragment" data-autoslide="8000">8s之后自动播放下一个的片段</p>
    <p class="fragment" >3s之后自动播放下一页</p>
</section>

6. 循环演示

  在默认情况下,幻灯片演示到最后一页就停止了,如果我们想要在最后一页翻页之后再从第1页开始演示,应该如何设置呢?这需要在Reveal.initialize({});中添加如下代码。

loop: true,   // 循环演示,true为循环,false为不循环

7. 局部放大

  如果想在演示幻灯片时,对某些内容进行突出或细致地讲解,使用局部放大效果将会非常棒。使用前需要在Reveal.initialize({});中添加依赖。

Reveal.initialize({
    dependencies:[{
        src: 'plugin/zoom-js/zoom.js',
        async: true
    }]
});

  然后通过按下Alt键并单击鼠标进行局部放大或恢复。

8. 休眠

  如果在演示时需要休息一会,只需要按B键或.键即可让幻灯片休眠或恢复。

9. 全屏

  按F键可进入全屏状态,按Esc键可退出全屏。

10. 概览

  按Esc或O键可查看幻灯片的概览

11. 帮助和快捷键

常用的快捷键如下:

动作
N,空格 下一张幻灯片
P 上一张幻灯片
←,H 向左
→,L 向右
↑,K 向上
↓,J 向下
Home 首页
End 尾页
B,. 停止
F 全屏
Esc,O 幻灯片概览
S 演讲者注释界面
打开帮助界面
Alt + 鼠标单击 局部放大/恢复(需要添加依赖的插件)

5.3.7 引用外部的Markdown文件

  前面讲到的都是在HTML代码中使用Markdown来编写幻灯片,这样做的好处是所有内容自上而下,一气呵成,有一种整体感,使用到HTML的地方也会进行自动补全和语法检查。不好的地方就是HTML与Markdown交叉使用,如果不熟悉HTML,就会觉得比较乱,而且一旦格式化代码会导致Markdown编写的内容全乱掉,且失去语法高亮和语法检查的效果。
  不过,好用的工具从来都会提供多种选择,reveal.js允许我们引用外部的Markdown文件。这样可以让HTML文件跟Markdown文件分离,在HTML文件中专注于幻灯片的配置,而在Markdown文件中专注于内容的编写,语法检查和语法高亮也都可以使用起来。另外,我们还可以同时引用多个Markdown文件,内容分类也会很方便。
  外部的Markdown文件是在<section>中指定的,我们需要在HTML中添加<section>,然后在<section>的属性中指定加载和解析Markdown文件的规则。

1.配置解析规则

在<section>标签中添加属性

<section data-markdown="外部文件.md" 
        data-separator="^\n\n\n" 
        data-separator-vertical="^\n\n" 
        data-separator-notes="^Notes:" 
        data-charset="utf-8">

</section>
  • 配置说明
作用 属性 说明
Markdown文件路径 data-markdown="外部文件 . md" 外部Markdown文件路径
水平幻灯片分页规则 data-separator="^\n\n\n" 在3次换行之后是水平幻灯片
垂直幻灯片分页规则 data-separator-vertical="^\n\n" 在2次换行之后是垂直幻灯片
演讲者注释匹配规则 data-separator-notes="^Notes:" 以Notes开头的内容为演讲者注释
加载文件时的编码格式 data-charset="utf-8" 编码格式为utf-8

注意: 在Linux和macOS系统中,使用\n作为换行符,但Windows系统使用\r\n作为换行符,如果要支持所有操作系统,则需要使用正则表达式\r?\n。由于Web服务器并不会监控Markdown文件的修改情况,因此如果想查看最新修改效果,需要手动去刷新页面。

2. 配置幻灯片属性

  在HTML中配置幻灯片属性是非常方便的,在Markdown文件中可以通过HTML注释来配置幻灯片的属性。

# 第一页

通过HTML注释来配置幻灯片属性
<!-- .slide: data-background="#fa0" -->
  • 语法解释
  1. <!->是注释符号。
  2. .slide是指设置幻灯片。
  3. data-background="#fa0"是指定幻灯片的背景颜色。

3. 配置元素属性

  元素属性跟幻灯片属性一样,也是通过HTML注释来配置的。

# 第一页

通过HTML注释来配置幻灯片属性

* 我是一号  <!-- .element: class="fragment" data-fragment-index="1" -->
* 我是二号  <!-- .element: class="fragment" data-fragment-index="2" -->
* 我是三号  <!-- .element: class="fragment highlight-red" -->
  • 语法解释
  1. .element是指设置元素。
  2. class="fragment"是指分段加载。
  3. data-fragment-index是指加载顺序。
  4. class="fragment highlight-red"是指元素使用红色高亮显示。

4. 另一种分页规则

  另一种比较常用的分页规则,需要在<section>的属性中配置

<section data-markdown="另一个外部文件.md" 
        data-separator="^\n---\n$" 
        data-separator-vertical="^\n--\n$" 
        data-separator-notes="^Notes:" 
        data-charset="utf-8">

</section>

  这里定义的水平幻灯片的分页规则是:空行+-+空行,垂直幻灯片的分布规则是:空行+-空行,这种使用分隔线来分页的匹配规则看起来比只使用空行更加清晰,推荐使用。

5.3.8 高级进阶

1. 打印/导出PDF文件

1. 设置幻灯片的打印样式,在head中添加如下脚本
<script>
    var link = document.createElement('link');
    link.rel='stylesheet'
    link.type='text/css'
    link.href=window.location.search.match(/print-pdf/gi) ? 'css/print/pdf.css' : 'css/print/paper.css'
    document.getElementsByTagName('head')[0].appendChild(link);
</script>

  如果要打印/导出PDF格式的文件,就必须添加上面这段脚本,它通过匹配幻灯片地址中是否包含print-pdf来判断是否使用打印样式。

2. 在幻灯片地址中添加查询字符串print-pdf
http://localhost:8000/?print-pdf

  如果想把演讲者注释也一并导出,则还要添加showNotes=true。

http://localhost:8000/revealjs.html?print-pdf&showNotes=true#/
3. 设置幻灯片导出效果
  1. 进入浏览器的打印界面:Chrome(推荐)→打印(Ctrl/Command+P)。
  2. 如果要导出PDF格式的文件,把【目标打印机】通过【更改...】设置为【另存为PDF】即可;如果要打印文件,直接选择打印机就可以了。(本例演示的是导出PDF格式的文件。)
  3. 把【边距】设置为【无】。
  4. 【选项】勾选【背景图形】。
4. 保存幻灯片,单击【保存】后选择保存地址就可以了

2.插件

  插件可以增强幻灯片的功能,这里有很多好用的插件供选择:https://github.com/hakimel/reveal.js/wiki/Plugins,-Tools-and-Hardware

a. 自动生成导航菜单插件

  reveal.js-menu是一个自动生成幻灯片导航菜单的插件,还可以在菜单中切换主题和转场动画。

npm install --save reveal.js-menu
  • 依赖中添加
Reveal.initialize(
    dependencies:[{
        src: 'node_modules/reveal.js-menu/menu.js'
    }]
)

  刷新页面后,在幻灯片的左下角会显示一个菜单按钮。单击菜单按钮会在幻灯片的左边显示导航菜单。如果想让菜单显示在右边,可以进行设置。

Reveal.initialize(
    menu: {
        // 指定菜单显示在左边还是右边,使用 left 或者 right
        side: 'right'
    }
)

  导航菜单会自动提取幻灯片的标题,如果没有标题,则默认显示页数,也可以使用幻灯片内容的开头作为标题,需要进行设置。也可以不显示没有标题的幻灯片。更多配置请参考https://github.com/denehyg/reveal.js-menu

// 如果幻灯片没有匹配标题,是否尝试使用文本内容开头作为标题
useTextContentForMissingTitles: true,
// 没有标题的幻灯片
hideMissTitles: false,

b. 工具栏插件

  reveal.js-toolbar是一个工具栏插件,可以通过工具栏快速使用reveal.js的功能,如全屏、概览、暂停、演讲者注释等,其安装命令如下。

npm install --save reveal.js-toolbar
  • 依赖中添加
Reveal.initialize(
    ......
    toolbar: {
        postion: 'bottom',
        fullscreen: true,
        overview: true,
        pause: true,
        notes: true,
        help: true
    },
    dependencies:[{
        src: 'node_modules/reveal.js-menu/menu.js'
    }]
)

5.4 本章小结

  本章主要介绍了如何使用reveal.js来写幻灯片,相信你已经为它强大的功能感到震撼。reveal.js基本上满足了我们写幻灯片的所有常用需求,而且更美观、简洁和高效。学会使用reveal.js,希望你能更喜欢写幻灯片,也希望你能更好地进行分享。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容