最后更新日期:2014-06-18
现在 HTML slides 库实在太多了,Web-based slideshow 列举了一部分。传统的如 W3C 的 Slidy ,现代的如 deck.js ,还有炫酷的如 impress.js 。
HTML 幻灯片相对于 MS ppt / Google Docs 的好处:
- 纯文本,兼容性好,还可以使用版本控制
- 不需要安装额外软件:播放只需要浏览器,编辑只需要文本编辑器。没安装浏览器的电脑很少见,但没安装 Office 2010 的电脑你还是很有可能遇到的。
相对于直接用文本(比如直接 Vim)做幻灯片的好处:
- 可以展示图片
- 可以加入动画
- 可以用鼠标在上面涂画
HTML 幻灯片应该支持的其他功能:
- 能转换成 pdf
我尝试的第一个 HTML slides 库是 deck.js ,效果还是很不错的,自己添加一些 CSS 的话也可以比较容易地打印成 pdf 。
但我后来发现 deck.js 的最大问题是需要手写 html 。人总是追求更便利的,特别是出现了 Markdown 这种可以转换成 HTML 的格式之后。
于是我转到使用 pandoc 将 Markdown 生成 html slides 。pandoc 支持的 slides 格式见 pandoc 手册 。在这些格式中,我选择了 Slidy ,主要是因为它可以显示幻灯片大纲(下面的“contents?”按钮),其次是因为我是 W3C 的粉丝 > <。
pandoc 命令参数
- -t slidy // 指定输出格式
- –slide-level=2 // 一遇到一个 2 级标题就开始一个新的幻灯片
- -s // 输出完整的 html
- –css=simple.css // 加入自定义的样式表
样例
最后的效果是:Markdown 中一个 2 级标题会开始一张新的幻灯片,1 级标题将出来一个新的标题幻灯片。
美化和自定义
上面我加入了自定义的 CSS ,因为 Slidy 默认是什么都没有的白的。下面给出我自己的 simple.css ,参考了 deck.js 的 web-2.0 主题修改。
body {
    font-family: "DejaVu Sans", "Bitstream Vera Sans", Verdana, "微软雅黑", "WenQuanYi Zen Hei", sans-serif;
}
pre, code {
    font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", "AR PL New Sung Mono", monospace;
    white-space: pre-wrap;
    *white-space: pre;
    *word-wrap: break-word;
}
img {
    max-width: 100%;
}
table {
    border-collapse: collapse;
}
th, td {
    border: 1px solid black;
}
@media print {
    @page {
        size: 10in 7.5in;
        margin: 0;
        @bottom-right {
            content: counter(page) " / " counter(pages);
            margin-top: -2em;
            margin-right: 0.5em;
            font-size: 10pt;
        }
    }
}
html {
    height: 100%;
}
body {
    background-color: #f4fafe;
    background-image: -webkit-linear-gradient(top, #f4fafe, #ccf0f0);
    background-image: -moz-linear-gradient(top, #f4fafe, #ccf0f0);
    background-image: -o-linear-gradient(top, #f4fafe, #ccf0f0);
    -ms-filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#f4fafe', EndColorStr='#ccf0f0');
    filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#f4fafe', EndColorStr='#ccf0f0');
    *zoom: 1;
    background-image: -ms-linear-gradient(top, #f4fafe, #ccf0f0);
    background-image: linear-gradient(top, #f4fafe, #ccf0f0);
    background-attachment: fixed;
    height: 100%;
}
body.single_slide div.slide {
    position: static;
}
div.slide {
    padding: 1em 2em;
}
@media screen {
    div.slide {
        max-width: 1080px;
        margin: 0 auto;
    }
}
h1 {
    font-family: "DejaVu Sans", "Bitstream Vera Sans", Verdana, "微软雅黑", "WenQuanYi Zen Hei", sans-serif;
    color: #0B7495;
}
/* title slide */
div.slide.titleslide {
    text-align: center;
}
div.slide.titleslide h1 {
    padding-top: 20%;
}
/* code block */
pre.sourceCode {
    color: black;
}