利用 revealjs 快速寫出漂亮的 PPT

背景

日常工作匯報(bào)蝴韭、演講經(jīng)常需要制作PPT衙傀,一般使用這些標(biāo)準(zhǔn)工具 Microsoft PowerPoint勇皇、Apple KeynoteGoogle Slides 佛呻。但這些工具對我來說過于繁瑣嗡靡,我希望有一個(gè)簡單且支持 markdown 的工具跺撼,很幸運(yùn)我找到了RevealJS,它是一個(gè)開源的 HTML 幻燈片框架讨彼,制作出精美的PPT歉井,對于web開發(fā)人員來說更是首選。

入門

reveal.js 使用 nodejs 構(gòu)建哈误,需要提前安裝好 nodejs哩至。下載啟動(dòng)訪問http://localhost:8000 就可以看到一個(gè)演示PPT。

git clone git@github.com:hakimel/reveal.js.git
mv reveal.js slides-demo
cd slides-demo
npm install
npm start

使用 Vscode 打開 index.html 制作蜜自,一個(gè) section 就是一頁幻燈片菩貌。

<div class="reveal">
  <div class="slides">
    <section>Slide 1</section>
    <section>Slide 2</section>
  </div>
</div>

每張幻燈片是從左到右線性切換,如果需要在同一頁垂直過渡切換重荠,可以嵌套section 箭阶。

        <div class="reveal">
            <div class="slides">
                <section>Slide 1</section>
                <section>
                        <p>這里有一些內(nèi)容</p>
                        <section>1</section>
                        <section>2</section>
                        <section>2</section>
                </section>
            </div>
        </div>

添加 data-background 可以給幻燈片添加一個(gè)背景。

<section data-background="https://blogs-on.oss-cn-beijing.aliyuncs.com/imgs/202206201857325.jpeg">
  <h2>來吧戈鲁!展示</h2>
</section>

添加 fragment 設(shè)置內(nèi)容動(dòng)畫仇参,每次展示一個(gè)內(nèi)容。比如以此呈現(xiàn)列表婆殿,只需添加 class="fragment".

<section>
  <h2>片段順序</h2>
  <ul>
    <li class="fragment">第一個(gè)</li>
    <li class="fragment">第二個(gè)</li>
    <li class="fragment">最后一個(gè)</li>
  </ul>
</section>

添加圖片诈乒,在項(xiàng)目里創(chuàng)建 assets 目錄存放圖片,然后引入婆芦。

<section>
  <h2>插入</h2>
  <img src="assets/img.png" alt="img">
</section>

Reveal-md

直接編輯 Html 比較麻煩怕磨,我還是習(xí)慣在 markdown 里編輯內(nèi)容。使用reveal-md 可以將 markdown 轉(zhuǎn)換成 Html消约,或?qū)С鯬DF肠鲫。

安裝

npm install -g reveal-md

npm 6.x 版本安裝會(huì)出現(xiàn)權(quán)限錯(cuò)誤,需要添加 --unsafe-perm=true

sudo npm install -g reveal-md --unsafe-perm=true

--unsafe-perm=true:“false if running as root, true otherwise”荆陆,大體意思是 npm 的安全限制滩届,root身份運(yùn)行時(shí)不會(huì)查詢 root 的上下文,所以 sudo 運(yùn)行時(shí)還需要指定 --unsafe-perm=true 來忽略這種限制。

相關(guān)命令

# 啟動(dòng)
reveal-md slides.md -w 
# 生成 Html 默認(rèn)目錄_static
reveal-md slides.md --static
# 生成 Html 默認(rèn)目錄_static帜消,指定圖片目錄 assets
reveal-md slides.md --static --static-dirs=assets
# 導(dǎo)出PDF
reveal-md slides.md --print slides.pdf
reveal-md slides.md --print slides.pdf --print-size 1024x768
reveal-md slides.md --print slides.pdf --print-size A4

幻燈片主題

默認(rèn)主題

名稱 效果
black 黑色背景棠枉,白色文本,藍(lán)色鏈接(默認(rèn))
white 白色背景泡挺,黑色文本辈讶,藍(lán)色鏈接
league 灰色背景,白色文字娄猫,藍(lán)色鏈接
beige 米色背景贱除,深色文字,棕色鏈接
sky 藍(lán)色背景媳溺,細(xì)暗文本月幌,藍(lán)色鏈接
night 黑色背景,厚白色文字悬蔽,橙色鏈接
serif 卡布奇諾背景扯躺,灰色文本,棕色鏈接
simple 白色背景蝎困,黑色文本录语,藍(lán)色鏈接
solarized 高分辨率照片
blood 深色背景,厚白文字禾乘,紅色鏈接
moon 高分辨率照片

自定義主題

  1. 下載 reveal git clone git@github.com:hakimel/reveal.js.git 澎埠;
  2. 在 /css/theme/coder.scss 中復(fù)制一個(gè)文件;
  3. 運(yùn)行 npm run build -- css-themes 生成css dist/coder.css始藕;
  4. 運(yùn)行指定主題 reveal-md slides.md -w --theme theme/coder.css蒲稳。

切換時(shí)動(dòng)畫

名稱 效果
none 瞬間切換背景
fade 交叉淡入淡出 - 背景轉(zhuǎn)換的默認(rèn)值
slide 在背景之間滑動(dòng) — 幻燈片過渡的默認(rèn)設(shè)置
convex 以凸角滑動(dòng)
concave 以凹角滑動(dòng)
zoom 向上縮放傳入的幻燈片,使其從屏幕中心向內(nèi)擴(kuò)展

配置

我們可以在Markdown文件里通過 yaml 進(jìn)行配置

title: Slides # 幻燈片名稱
theme: solarized # 幻燈片主題
highlightTheme: github # 代碼高亮主題
revealOptions: 
  transition: 'convex' # 動(dòng)畫效果

reveal 其它配置項(xiàng)

{
  // 顯示控制箭頭
  controls: true,
  // 循環(huán)播放
  loop: false
  // 更多參考 https://revealjs.com/config/
}

reveal-md 其它配置項(xiàng)

{
  // 幻燈片橫行切割標(biāo)志
  "separator": "^\n\n\n",
  // 幻燈片垂直切割標(biāo)志
  "verticalSeparator": "^\n\n"
}

用法

當(dāng)需要在 section 中添加屬性時(shí)鳄虱,Markdown 的寫法如下

<!-- .slide: 屬性=屬性值 -->

當(dāng)需要在其它元素插入屬性時(shí)弟塞,Markdown 的寫法如下

<!-- .element: 屬性=屬性值 -->

一些例子,設(shè)置背景色或背景圖

<!-- .slide: data-background="#fff" -->
<!-- .slide: data-background="./bg.png" -->
<!-- .slide: data-background-image="https://xxx.jpg" data-background-opacity=.1 data-background-repeat="no-repeat" -->

設(shè)置 fragment

- Item1 <!-- .element: class="fragment" data-fragment-index="1" -->
- Item2 <!-- .element: class="fragment fade-in-then-out" data-fragment-index="2" -->

指定代碼的高亮順序

```js [1-2|3|4|5]
let a = 1;
let b = 2;
let c = x => 1 + 2 + x;
c(3);
c(2);
```

地址跳轉(zhuǎn)

<!-- .slide: id=0 -->
[跳轉(zhuǎn)0](#/0)

部署到Netlify

我喜歡將一些靜態(tài)html托管到netlify拙已,它免費(fèi)比較好用决记。先在 Github 創(chuàng)建一個(gè)倉庫 coder_slides,然后創(chuàng)建如下目錄

├── README.md
└── content
    ├── assets
    │   └── bg.jpeg
    ├── template
    │   ├── listing.html
    │   └── reveal.html
    └── coder.md
  • content 放MD文件集合倍踪;
  • assets 本地圖片資源系宫;
  • template 是渲染后的 HTML 模版,包含列表頁面和詳情頁面扩借,可以自行修改潮罪。

默認(rèn)的 listing.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>{{pageTitle}}</title>
    <link rel="stylesheet" href="{{{themeUrl}}}" id="theme" />
  </head>

  <body>
    <ul>
      {{#files}}
      <li>
        <a href="{{filePath}}" title="{{title}}">
          {{#title}}{{.}} ({{filePath}}){{/title}}{{^title}}{{filePath}}{{/title}}
        </a>
      </li>
      {{/files}}
    </ul>
  </body>
</html>

默認(rèn)的 reveal.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

    <title>{{{title}}}</title>
    {{#absoluteUrl}}
    <meta property="og:title" content="{{{title}}}" />
    <meta property="og:type" content="website" />
    <meta property="og:image" content="{{{absoluteUrl}}}/featured-slide.jpg" />
    <meta property="og:url" content="{{{absoluteUrl}}}" />
    {{/absoluteUrl}}
    <link rel="shortcut icon" href="{{{base}}}/favicon.ico" />
    <link rel="stylesheet" href="{{{base}}}/dist/reset.css" />
    <link rel="stylesheet" href="{{{base}}}/dist/reveal.css" />
    <link rel="stylesheet" href="{{{themeUrl}}}" id="theme" />
    <link rel="stylesheet" href="{{{base}}}{{{highlightThemeUrl}}}" />

    {{#cssPaths}}
    <link rel="stylesheet" href="{{{.}}}" />
    {{/cssPaths}}

    {{#watch}}

    <script>
      document.write(
        '<script src="http://' +
          (location.host || 'localhost').split(':')[0] +
          ':35729/livereload.js?snipver=1"></' +
          'script>'
      );
    </script>
    {{/watch}}
  </head>
  <body>
    <div class="reveal">
      <div class="slides">{{{slides}}}</div>
    </div>

    <script src="{{{base}}}/dist/reveal.js"></script>

    <script src="{{{base}}}/plugin/markdown/markdown.js"></script>
    <script src="{{{base}}}/plugin/highlight/highlight.js"></script>
    <script src="{{{base}}}/plugin/zoom/zoom.js"></script>
    <script src="{{{base}}}/plugin/notes/notes.js"></script>
    <script src="{{{base}}}/plugin/math/math.js"></script>
    <script>
      function extend() {
        var target = {};
        for (var i = 0; i < arguments.length; i++) {
          var source = arguments[i];
          for (var key in source) {
            if (source.hasOwnProperty(key)) {
              target[key] = source[key];
            }
          }
        }
        return target;
      }

      // default options to init reveal.js
      var defaultOptions = {
        controls: true,
        progress: true,
        history: true,
        center: true,
        transition: 'default', // none/fade/slide/convex/concave/zoom
        plugins: [
          RevealMarkdown,
          RevealHighlight,
          RevealZoom,
          RevealNotes,
          RevealMath
        ]
      };

      // options from URL query string
      var queryOptions = Reveal().getQueryHash() || {};

      var options = extend(defaultOptions, {{{revealOptionsStr}}}, queryOptions);
    </script>

    {{#scriptPaths}}
    <script src="{{{.}}}"></script>
    {{/scriptPaths}}

    <script>
      Reveal.initialize(options);
    </script>
  </body>
</html>

運(yùn)行本地調(diào)試

reveal-md content/ --template template/reveal.html --listing-template template/listing.html
list

如何部署部署到netlify?

注冊一個(gè)netlify盛撑,然后創(chuàng)建一個(gè)站點(diǎn)關(guān)聯(lián)上github倉庫钓株。

在配置/部署里面添加構(gòu)建命令

npm install -g reveal-md && reveal-md content/ --static --static-dirs=content/assets --template template/reveal.html --listing-template template/listing.html

然后在域名管理添加一個(gè)自己的域名

domain

配置成功如下

https://slides.onlythinking.com

參考

https://github.com/hakimel/reveal.js

https://github.com/webpro/reveal-md

https://revealjs.com/

https://app.netlify.com/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末题涨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖营曼,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門邀窃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞍历,“玉大人扇救,你說我怎么就攤上這事÷有郑” “怎么了汤锨?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長撵摆,這世上最難降的妖魔是什么暑中? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鲫剿,結(jié)果婚禮上鳄逾,老公的妹妹穿的比我還像新娘。我一直安慰自己牵素,他們只是感情好严衬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笆呆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粱挡。 梳的紋絲不亂的頭發(fā)上赠幕,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音询筏,去河邊找鬼榕堰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嫌套,可吹牛的內(nèi)容都是我干的逆屡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼踱讨,長吁一口氣:“原來是場噩夢啊……” “哼魏蔗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痹筛,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤莺治,失蹤者是張志新(化名)和其女友劉穎廓鞠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谣旁,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡床佳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榄审。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砌们。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搁进,靈堂內(nèi)的尸體忽然破棺而出怨绣,到底是詐尸還是另有隱情,我是刑警寧澤拷获,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布篮撑,位于F島的核電站,受9級(jí)特大地震影響匆瓜,放射性物質(zhì)發(fā)生泄漏赢笨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一驮吱、第九天 我趴在偏房一處隱蔽的房頂上張望茧妒。 院中可真熱鬧,春花似錦左冬、人聲如沸桐筏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梅忌。三九已至,卻和暖如春除破,著一層夾襖步出監(jiān)牢的瞬間牧氮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工瑰枫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踱葛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓光坝,卻偏偏與公主長得像尸诽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子盯另,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容