首页 > 其他分享 >网页幻灯片演示框架:Reveal.js

网页幻灯片演示框架:Reveal.js

时间:2024-04-19 16:55:59浏览次数:27  
标签:Reveal 动画 js 我们 幻灯片 reveal

网页幻灯片演示框架:Reveal.js

网页幻灯片演示框架:Reveal.js

谢小飞 谢小飞 北京京东方能源科技有限公司 前端开发工程师   63 人赞同了该文章

在生活和工作中,我们经常需要用到幻灯片进行演示或者汇报工作等,传统的幻灯片在排版、代码、动效和多媒体等方面操作起来需要一定的基础;而Reveal.js提供了简单易上手的方案,将幻灯片搬到网页中,提供了丰富的模板和效果,让我们来看下如何来制作一个精美的网页幻灯片吧。

一、Reveal.js是什么

Reveal.js是一个运行在浏览器上的幻灯片展示框架,我们可以在任何浏览器上展示我们想要的幻灯片,并且可以自己定义行为、动画等。

reveal.js是一个开源的HTML展示框架。它是一种工具,可让任何拥有Web浏览器的人免费创建功能齐全且精美的演示文稿。

和传统的幻灯片相比,Reveal.js有以下优势:

  • 界面优美:UI风格简介优美,对数学公式、代码、多媒体扩展支持。
  • 运行简单:因为是一个HTML文件,那么只要双击,就能在浏览器中展示。也可以通过url分享。
  • 功能强大:因为是在浏览器中运行的,可以用HTML+CSS+JS,做各种想要的东西
广告 vivo iQOO 8 5G手机新品 骁龙888 120W闪充 电竞游戏手 京东 ¥4199.00 去购买​

安装

首先我们需要将reveal.js克隆到本地:

> git clone https://github.com/hakimel/reveal.js.git
> cd reveal.js && npm install
> npm start

这样就将整个仓库作为一个静态资源服务器启动了,开发服务器的默认端口8000;可以使用port参数切换到不同的端口:

# 切换端口
> npm start -- --port=8001

我们可以复制一份仓库中的index.html,新建自己的html,就可以通过地址访问到我们自己的幻灯片了;或者将仓库中的distplugin两个文件夹拷贝到自己仓库的静态资源中,通过外链方式引入。

第二种方式是通过npm的方式进行安装,不过需要注意的是,reveal.js只是针对浏览器环境:

npm install reveal.js
# or
yarn add reveal.js

安装后我们就可以将reveal.js作为模块引入了:

import Reveal from 'reveal.js';
import Markdown from 'reveal.js/plugin/markdown/markdown.esm.js';

let deck = new Reveal({
   plugins: [ Markdown ]
})
deck.initialize();

但是样式并不会随模块一起引入,我们还需要在页面中包含样式:

<link rel="stylesheet" href="/node_modules/reveal.js/dist/reveal.css">
<link rel="stylesheet" href="/node_modules/reveal.js/dist/theme/black.css">

编辑内容

安装完成后,我们就可以来编辑幻灯片内容了,他的内容就是一个HTML文件,来看一下它的标准结构:

<html>
  <head>
    <link rel="stylesheet" href="dist/reveal.css">
    <link rel="stylesheet" href="dist/theme/black.css">
  </head>
  <body>
    <div class="reveal">
      <div class="slides">
        <section>这是第一张幻灯片</section>
        <section>这是第二张幻灯片</section>
      </div>
    </div>
    <script src="dist/reveal.js"></script>
    <script>
      Reveal.initialize();
    </script>
  </body>
</html>

我们看到页面的层级为`.reveal > .slides > section``,位于最里面的section元素就是我们需要呈现出来的幻灯片,可以是连续多张。

 

动图封面  

 

如果有某张幻灯片我们需要对其内容进行更详细的阐述,那么可以通过垂直幻灯片的方式,将多个section元素包含在一页幻灯片内容中:

<div class="reveal">
  <div class="slides">
    <section>这是水平幻灯片</section>
    <section>
      <section>这是第一张垂直幻灯片</section>
      <section>这是第二张垂直幻灯片</section>
    </section>
  </div>
</div>

 

广告 小米平板5 Pro 2.5K 120HZ 11英寸大屏 骁龙870 影音娱 京东 ¥2499.00 去购买​ 动图封面  

 

滑动效果

我们切换幻灯片时,默认都是从右到左进行幻灯片的切换过渡,默认是滑动的效果;我们可以在每页幻灯片上添加data-transition属性来制动过渡的效果:

<div class="slides">
  <section data-transition="zoom">第一页幻灯片</section>
  <section data-transition="fade">第二页幻灯片</section>
  <section data-transition="convex">第三页幻灯片</section>
  <section>第四页幻灯片</section>
</div>

 

动图封面  

 

如果我们想统一改变默认的过渡效果,在全局初始化的时候配置backgroundTransition属性:

Reveal.initialize({
  backgroundTransition: 'slide'
});

内置主题

在上面代码中我们发现,引入了两个不同的css,第一个reveal.css是依赖的基础的样式文件,而引入的第二个theme/black.css就是在基础样式上的主题样式,可以根据我们自己的喜好,选择不同主题。

需要更改主题,我们只需要从theme中引入对应主题的css即可。

广告 Redmi 9A 5000mAh大电量 1300万AI相机 八核处理器 人 京东 ¥599.00 去购买​

Markdown支持

Revealjs也支持使用Markdown来编写幻灯片内容,对于简单的内容,会更加方便简洁;首先我们需要引入Markdown的插件:

<script src="plugin/markdown/markdown.js"></script>
<script>
  Reveal.initialize({
    plugins: [ RevealMarkdown ]
  });
</script>

然后将Markdown编写的内容放到section > textarea中,同时需要在标签上加上特殊的属性进行标识:

<div class="slides">
  <section data-markdown>
    <textarea data-template>
      ## 这是第一张幻灯片
      我是一段说明性的文字
      ---
      ## 这是第二张幻灯片
      ---
      ## 这是第三张幻灯片
    </textarea>
  </section>
</div>

 

动图封面  

 

不过要注意的是,Markdown语法对空格缩进和换行符(避免连续中断)的检测很严格。

背景

一般情况下,我们的背景颜色是跟随主题的,我们可以通过在每页上设置data-background属性,来手动的设置某页幻灯片的背景颜色。

<div class="slides">
  <section>
    <h2>我是第一页</h2>
  </section>
  <section data-background-color="aquamarine">
    <h2>我是第二页</h2>
  </section>
  <section data-background-color="rgb(70, 70, 255)">
    <h2>我是第三页</h2>
  </section>
</div>

 

动图封面  

 

除了设置背景纯色,我们还可以设置为背景图片

<div class="slides">
  <section data-background-image="./1.jpg">
    <h2>我是第一页</h2>
  </section>
  <section data-background-image="./2.jpg">
    <h2>我是第二页</h2>
  </section>
  <section data-background-image="./3.jpg">
    <h2>我是第三页</h2>
  </section>
</div>
动图封面  

 

 

自动动画

有些幻灯片中我们想实现一些简单的动画效果,比如渐变、滑动等;Reveal.js会自动为幻灯片中的元素设置动画效果;我们需要做的就是在相邻的两页section元素上添加data-auto-animate属性,这样Reveal.js会为所有匹配的元素设置动画。

<div class="slides">
  <section data-auto-animate>
    <h1>自动动画</h1>
  </section>
  <section data-auto-animate>
    <h1 style="margin-top: 100px; color: red;">自动动画</h1>
  </section>
  <section data-auto-animate>
    <h1 style="margin-top: 200px; color: blue;">自动动画</h1>
  </section>
</div>

 

动图封面  

 

我们看一个简单的例子,在页面上的h1标签,我们在不同幻灯片中设置了不同的样式,Reveal.js会自动为这个元素设置动画效果。

广告 Apple iPhone 13 (A2634) 256GB 午夜色 支持移动联通 京东 ¥6799.00 去购买​

对于幻灯片上新增或者删除的元素,Reveal.js在排列内容时也会自动为其添加动画效果:

<div class="slides">
  <section data-auto-animate>
    <h3>Reveal.js的优点</h3>
  </section>
  <section data-auto-animate>
    <h3>Reveal.js的优点</h3>
    <ul>
      <li>界面优美</li>
    </ul>
  </section>
  <section data-auto-animate>
    <h3>Reveal.js的优点</h3>
    <ul>
      <li>界面优美</li>
      <li>运行简单</li>
    </ul>
  </section>
  <section data-auto-animate>
    <h3>Reveal.js的优点</h3>
    <ul>
      <li>界面优美</li>
      <li>运行简单</li>
      <li>功能强大</li>
    </ul>
  </section>
</div>

我们可以用ul > li的布局来生成多条排列整齐的论述列表,每页幻灯片内容都有新增的列表内容;Reveal.js会自动为元素的增加和删减添加动画。

 

动图封面  

 

那么Reveal.js是如何来自动匹配相同的元素的呢?对于文本元素,如果节点的类型和文本内容相同,我们就认为它是相同的,对于图片、视频和iframe等多媒体元素,Reveal.js通过比较他们的src属性。

回到我们最开始的那个动画例子,如果我们将文本内容进行改变,那么动画效果就会失效;在自动匹配元素不可行的情况下,我们可以在元素上添加data-id属性来强制进行动画效果,这样Reveal.js就会优先考虑元素的data-id属性:

<div class="slides">
  <section data-auto-animate>
    <h1>自动动画</h1>
  </section>
  <section data-auto-animate>
    <h1 data-id="box" style="margin-top: 100px; color: red;">自动动画1</h1>
  </section>
  <section data-auto-animate>
    <h1 data-id="box" style="margin-top: 200px; color: blue;">自动动画2</h1>
  </section>
</div>

 

动图封面  

 

我们看到第一个动画到第二个动画之间,由于自动匹配失效,因此没有动画;第二个动画到第三个动画之间由于我们强制加上了data-id属性,因此动画效果依然是生效的。

有时候我们会存在多个动画,相邻的动画有可能会互相干扰,可以通过data-auto-animate-iddata-auto-animate-restart对动画进行分组。

我们可以对相邻分组的幻灯片上加上data-auto-animate-id属性,属性的值可以是任意的,相同组保证值相同即可;这样,相邻的幻灯片会识别相同的id进行动画效果。

<div class="slides">
  <section data-auto-animate>
    <h1>第一组动画</h1>
  </section>
  <section data-auto-animate>
    <h1 style="color: #3B82F6;">第一组动画</h1>
  </section>
  <section data-auto-animate data-auto-animate-id="two">
    <h1>第二组动画</h1>
  </section>
  <section data-auto-animate data-auto-animate-id="two">
    <h1 style="color: #10B981;">第二组动画</h1>
  </section>
  <section data-auto-animate data-auto-animate-id="three">
    <h1>第三组动画</h1>
  </section>
  <section data-auto-animate data-auto-animate-id="three">
    <h1 style="color: #EC4899;">第三组动画</h1>
  </section>
</div>

 

动图封面  

 

如果同一组的幻灯片比较多,我们需要加上很多的id,上面的方式显得比较繁琐;因此Reveal.js提供另一种控制动画的方式:data-auto-animate-restart属性;这个属性会阻止上一张幻灯片和本组幻灯片之间的动画效果(即使他们有相同的id)。

<div class="slides">
  <section data-auto-animate>
    <h1>第一组动画</h1>
  </section>
  <section data-auto-animate>
    <h1 style="color: #3B82F6;">第一组动画</h1>
  </section>
  <section data-auto-animate data-auto-animate-restart>
    <h1>第二组动画</h1>
  </section>
  <section data-auto-animate>
    <h1 style="color: #10B981;">第二组动画</h1>
  </section>
  <section data-auto-animate data-auto-animate-restart>
    <h1>第三组动画</h1>
  </section>
  <section data-auto-animate>
    <h1 style="color: #EC4899;">第三组动画</h1>
  </section>
</div>

代码

Reveal.js在呈现代码方面也比普通的PPT更有优势,可以显示语法突出显示的代码,这个功能需要引入highlight.js插件;我们写的代码需要包含在pre > code标签中:

<div class="slides">
  <section>
    <pre><code data-trim data-noescape>
    export function isObject(obj) {
      return Object.prototype.toString.call(obj) === "[object Object]"
    }
    export function isArray(obj) {
      return Object.prototype.toString.call(obj) === "[object Array]"
    }
    export function isNull(param) {
      return Object.prototype.toString.call(param) === "[object Null]"
    }
    export function isUndefined(param) {
      return Object.prototype.toString.call(param) === "[object Undefined]"
    }
      </code></pre>
  </section>
</div>

然后引入highlight.js插件,插件中默认包含了monokai.css的样式:

<link rel="stylesheet" href="./plugin/highlight/monokai.css" />
<body></body>
<script src="./plugin/highlight/highlight.js"></script>
<script>
  Reveal.initialize({
    plugins: [RevealHighlight],
  });
</script>

 

 

我们可以在highlight.js的demo中找到更多的高亮主题。

通过在code标签添加data-line-numbers属性,可以启用代码的行号;如果要突出显示特定的行号,可以提供逗号分隔的行号列表,在下面的例子中,第3行和第8-10行就被高亮显示:

<pre><code data-line-numbers="3,8-10">
<table>
  <tr>
    <td>Apples</td>
    <td>$1</td>
    <td>7</td>
  </tr>
  <tr>
    <td>Oranges</td>
    <td>$2</td>
    <td>18</td>
  </tr>
</table>
</code></pre>

 

 

我们还可以将高亮的代码进行分步骤显示,用|分隔每一个步骤;例如下面的3-5|8-10|13-15将产生3个步骤:

广告 荣耀 Magic3 骁龙888 6.76英寸超曲屏 多主摄计算摄影 京东 ¥4999.00 去购买​
<pre><code data-line-numbers="3-5|8-10|13-15">
<table>
  <tr>
    <td>Apples</td>
    <td>$1</td>
    <td>7</td>
  </tr>
  <tr>
    <td>Oranges</td>
    <td>$2</td>
    <td>18</td>
  </tr>
  <tr>
    <td>Kiwi</td>
    <td>$3</td>
    <td>1</td>
  </tr>
</table>
</code></pre>

 

动图封面  

 

数学公式

如果我们想要幻灯片中展示数学公式,可以借助于MathJax插件轻松的实现;它是一个开源的基于 Ajax 的数学公式显示的解决方案,结合多种先进的Web技术,支持主流的浏览器;首先我们需要引入本地仓库的math.js插件和远程加载MathJax插件:

<script src="./plugin/math/math.js"></script>
<script>
  Reveal.initialize({
    math: {
      mathjax: 'https://cdn.jsdelivr.net/gh/mathjax/[email protected]/MathJax.js',
      config: 'TeX-AMS_HTML-full',
      TeX: {
        Macros: {
          RR: "{\\bf R}"
        }
      }
    },
    plugins: [RevealMath],
  });
</script>

然后我们就可以尽情使用想要的数学符号和公式了:

<div class="slides">
  <section>
    When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are
    $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$
  </section>
</div>

 

 

PDF导出

我们的演示文稿最后可能需要存档或者发给领导,如果直接存档项目则需要打包整个项目,别人可能也不知道怎么用;Reveal.js提供了特殊的打印样式,可以让我们将文稿导出为PDF。

  1. 首先将我们的html包含在查询字符串中,例如http://localhost:8080/index.html?print-pdf
  2. 然后调出打印对话框 (CTRL/CMD+P)
  3. 将目标设置更改为另存为 PDF
  4. 将布局更改为横向。
  5. 将边距更改为无。
  6. 启用背景图形选项。
  7. 点击保存按钮

 

 

然后就能看到我们保存到本地的pdf文件了。

本文所有的demo代码均在下面仓库:

GitHub - acexyf/revealjs-demo​github.com/acexyf/revealjs-demo.git

如果觉得写得还不错,请关注我的专栏,定期前端好文分享

前端壹读​zhuanlan.zhihu.com/c_1188483126786293760

更多文章请访问我的网站

谢小飞的博客​xieyufei.com

 

发布于 2021-09-19 19:04

标签:Reveal,动画,js,我们,幻灯片,reveal
From: https://www.cnblogs.com/sexintercourse/p/18146371

相关文章

  • 2024-04-19 前端常见面试题汇总(js篇)
    以下是前端面试中关于JavaScript的一些常见问题及其答案,共包含超过50个问题:1.解释一下JavaScript中的变量提升(Hoisting)。变量提升是指在JavaScript中,变量和函数的声明会被提升到其所在作用域的最顶部。但需要注意,只有声明会被提升,赋值操作不会。2.解释一下JavaScript中的闭包(C......
  • 数仓的两种轻量级数据交换格式:json与jsonb
    本文分享自华为云社区《GaussDB(DWS)——探究JSON,JSONB》,作者:yd_283975606。1.前言适用版本:【8.1.1(及以上)】JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于将数据从服务器发送到Web应用程序。它采用人类易读和机器易解析的文本格式,基于键值对的集合,用于......
  • jspdf 打印成pdf后模糊不清晰
    constpdfDPI=300;importhtml2canvasfrom'html2canvas'//设置截图的分辨率(单位为dpi)constdpi=300;html2canvas(document.querySelector('#app'),{dpi:dpi,//设置截图的分辨率scale:dpi/96,//设置截图缩放比例,以适应pdf的dpi}).then(canvas=>......
  • React 简单登录平台Demo(1):Next.js配置
    目录前言体验Next.js中文文档路径问题创建项目启动报错测试TailWindCSS热重载如何添加路由第三方库引入tailwindcss配置相关链接布局新建布局布局也是嵌套影响的根节点layout配置路由跳转Link跳转Hook跳转简单的登录页面前言我之前的那个项目写到后面,发现还不如直接用Next.js呢......
  • 30 天精通 RxJS (25):Subject 总结
    Subject其实在RxJS中最常被误解的一部份,因为Subject可以让你用命令式的方式虽送值到一个observable的串流中。很多人会直接把这个特性拿来用在不知道如何建立Observable的状况,比如我们在30天精通RxJS(23)中提到的可以用在ReactJS的Event中,来建立event的observab......
  • [01] JS-概述
    1.JavaScriptJavaScript与ECMAScript的关系:ECMAScript(简称“ES”)是根据ECMA-262标准实现的通用脚本语言,ECMA-262标准主要规定了这门语言的语法、类型、语句、关键字、保留字、操作符、对象等几个部分,目前ECMAScript的最新版是ECMAScript6(简称“ES6”)。至于JavaScrip......
  • [02] JS-基础语法(一)
    1.几个概念本文我们讲解一下JS中的几个简单的概念,包括标识符、关键字、保留字、大小写和字面量。这些基本概念虽然不能直接提升我们的编程能力,但它们是JS的基本组成元素。1.1标识符所谓标识符(Identifier),就是名字。JavaScript中的标识符包括变量名、函数名、参数名、属性......
  • [03] JS-基础语法(二)
    1.判断、循环1.1if-elseif语句ifelse语句ifelseifelse语句e.g.编写一个程序,获取一个用户输入的整数,然后显示这个数是奇数还是偶数。//编写一个程序,获取一个用户输入的整数//letnum=+prompt("请输入一个整数")letnum=parseInt(prompt("请输入一个整数"......
  • Jmeter如何判断请求的数据是Json还是表单格式
    就我个人而言,最简单的是使用curl命令执行下就知道了,比如我自己写的图书管理系统,flask框架图书管理系统服务器端-加个小鸡腿-博客园(cnblogs.com) ,python命令启动后是这样的 其中查询所有图书的接口是127.0.0.1:5000/books,我们打开浏览器输入这条url显示的数据是json格式......
  • pytest + yaml 框架 -62.执行yaml和json2种格式用例
    前言v1.5.7版本开始新增json格式用例支持,本次版本改动内容1.支持.json文件用例2.优化日志中文件后缀名称.yml.yaml.json3.ruamel.yaml版本兼容0.18.6yaml格式用例yaml格式用例示例,test_a.ymltest_demo:name:postrequest:method:POSTurl:http:......