README.md 35.8 KB
Newer Older
1
# reveal.js [![Build Status](https://travis-ci.org/hakimel/reveal.js.svg?branch=master)](https://travis-ci.org/hakimel/reveal.js)
2

Hakim El Hattab's avatar
Hakim El Hattab committed
3
A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://lab.hakim.se/reveal-js/).
Hakim El Hattab's avatar
Hakim El Hattab committed
4

Hakim El Hattab's avatar
Hakim El Hattab committed
5
reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). It's best viewed in a browser with support for CSS 3D transforms but [fallbacks](https://github.com/hakimel/reveal.js/wiki/Browser-Support) are available to make sure your presentation can still be viewed elsewhere.
Hakim El Hattab's avatar
Hakim El Hattab committed
6
7


Hakim El Hattab's avatar
typos    
Hakim El Hattab committed
8
#### More reading:
Hakim El Hattab's avatar
Hakim El Hattab committed
9
- [Installation](#installation): Step-by-step instructions for getting reveal.js running on your computer.
Hakim El Hattab's avatar
Hakim El Hattab committed
10
- [Changelog](https://github.com/hakimel/reveal.js/releases): Up-to-date version history.
Hakim El Hattab's avatar
Hakim El Hattab committed
11
- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own!
Hansi's avatar
Hansi committed
12
- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks.
Hakim El Hattab's avatar
Hakim El Hattab committed
13

Hakim El Hattab's avatar
Hakim El Hattab committed
14
## Online Editor
Hakim El Hattab's avatar
Hakim El Hattab committed
15

Hakim El Hattab's avatar
Hakim El Hattab committed
16
Presentations are written using HTML or markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [http://slid.es](http://slid.es).
Hakim El Hattab's avatar
Hakim El Hattab committed
17
18


Hakim El Hattab's avatar
Hakim El Hattab committed
19
## Instructions
20

21
### Markup
22

danse's avatar
typo    
danse committed
23
Markup hierarchy needs to be ``<div class="reveal"> <div class="slides"> <section>`` where the ``<section>`` represents one slide and can be repeated indefinitely. If you place multiple ``<section>``'s inside of another ``<section>`` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and it will be included in the horizontal sequence. For example:
24

25
```html
26
<div class="reveal">
hakimel's avatar
hakimel committed
27
	<div class="slides">
28
29
30
31
32
33
34
35
36
		<section>Single Horizontal Slide</section>
		<section>
			<section>Vertical Slide 1</section>
			<section>Vertical Slide 2</section>
		</section>
	</div>
</div>
```

Hakim El Hattab's avatar
Hakim El Hattab committed
37
38
### Markdown

Hakim El Hattab's avatar
Hakim El Hattab committed
39
It's possible to write your slides using Markdown. To enable Markdown, add the ```data-markdown``` attribute to your ```<section>``` elements and wrap the contents in a ```<script type="text/template">``` like the example below.
Hakim El Hattab's avatar
Hakim El Hattab committed
40

41
This is based on [data-markdown](https://gist.github.com/1343518) from [Paul Irish](https://github.com/paulirish) modified to use [marked](https://github.com/chjj/marked) to support [Github Flavoured Markdown](https://help.github.com/articles/github-flavored-markdown). Sensitive to indentation (avoid mixing tabs and spaces) and line breaks (avoid consecutive breaks).
Hakim El Hattab's avatar
Hakim El Hattab committed
42
43
44

```html
<section data-markdown>
45
46
	<script type="text/template">
		## Page title
hakimel's avatar
hakimel committed
47

48
49
		A paragraph with some text and a [link](http://hakim.se).
	</script>
Hakim El Hattab's avatar
Hakim El Hattab committed
50
51
52
</section>
```

53
54
#### External Markdown

55
You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file. The ```data-charset``` attribute is optional and specifies which charset to use when loading the external file.
56

57
58
When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup).

59
```html
60
61
62
63
64
65
<section data-markdown="example.md"  
         data-separator="^\n\n\n"  
         data-vertical="^\n\n"  
         data-notes="^Note:"  
         data-charset="iso-8859-15">
</section>
66
67
```

Hakim El Hattab's avatar
Hakim El Hattab committed
68
69
#### Element Attributes

70
Special syntax (in html comment) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things.
Hakim El Hattab's avatar
Hakim El Hattab committed
71
72
73
74

```html
<section data-markdown>
	<script type="text/template">
75
76
		- Item 1 <!-- .element: class="fragment" data-fragment-index="2" -->
		- Item 2 <!-- .element: class="fragment" data-fragment-index="1" -->
Hakim El Hattab's avatar
Hakim El Hattab committed
77
78
79
80
	</script>
</section>
```

Hakim El Hattab's avatar
Hakim El Hattab committed
81
#### Slide Attributes
Hakim El Hattab's avatar
Hakim El Hattab committed
82

83
Special syntax (in html comment) is available for adding attributes to the slide `<section>` elements generated by your Markdown.
Hakim El Hattab's avatar
Hakim El Hattab committed
84
85
86
87

```html
<section data-markdown>
	<script type="text/template">
Hakim El Hattab's avatar
Hakim El Hattab committed
88
	<!-- .slide: data-background="#ff0000" -->
89
		Markdown content
Hakim El Hattab's avatar
Hakim El Hattab committed
90
91
92
93
	</script>
</section>
```

Hakim El Hattab's avatar
Hakim El Hattab committed
94

95
96
### Configuration

Hakim El Hattab's avatar
Hakim El Hattab committed
97
At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below.
98

99
```javascript
100
Reveal.initialize({
101

102
	// Display controls in the bottom right corner
103
104
105
106
107
	controls: true,

	// Display a presentation progress bar
	progress: true,

108
109
110
	// Display the page number of the current slide
	slideNumber: false,

111
112
	// Push each slide change to the browser history
	history: false,
113

114
115
116
	// Enable keyboard shortcuts for navigation
	keyboard: true,

117
118
119
	// Enable the slide overview mode
	overview: true,

120
	// Vertical centering of slides
121
	center: true,
122

123
124
125
	// Enables touch navigation on devices with touch input
	touch: true,

126
	// Loop the presentation
127
128
	loop: false,

Hakim El Hattab's avatar
Hakim El Hattab committed
129
130
131
	// Change the presentation direction to be RTL
	rtl: false,

132
133
134
135
136
137
138
	// Turns fragments on and off globally
	fragments: true,

	// Flags if the presentation is running in an embedded mode,
	// i.e. contained within a limited portion of the screen
	embedded: false,

Hakim El Hattab's avatar
Hakim El Hattab committed
139
	// Number of milliseconds between automatically proceeding to the
140
	// next slide, disabled when set to 0, this value can be overwritten
141
	// by using a data-autoslide attribute on your slides
142
143
	autoSlide: 0,

144
145
146
	// Stop auto-sliding after user input
	autoSlideStoppable: true,

147
	// Enable slide navigation via mouse wheel
148
	mouseWheel: false,
149

150
151
152
153
154
155
	// Hides the address bar on mobile devices
	hideAddressBar: true,

	// Opens links in an iframe preview overlay
	previewLinks: false,

156
	// Transition style
157
158
159
160
	transition: 'default', // default/cube/page/concave/zoom/linear/fade/none

	// Transition speed
	transitionSpeed: 'default', // default/fast/slow
161

162
	// Transition style for full page slide backgrounds
163
	backgroundTransition: 'default', // default/none/slide/concave/convex/zoom
164
165

	// Number of slides away from the current that are visible
166
	viewDistance: 3,
167

168
	// Parallax background image
169
	parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
170

171
	// Parallax background size
172
	parallaxBackgroundSize: '' // CSS syntax, e.g. "2100px 900px"
173

174

175
176
177
});
```

178
179
Note that the new default vertical centering option will break compatibility with slides that were using transitions with backgrounds (`cube` and `page`). To restore the previous behavior, set `center` to `false`.

Hakim El Hattab's avatar
Hakim El Hattab committed
180

wtw's avatar
wtw committed
181
The configuration can be updated after initialization using the ```configure``` method:
182
183
184
185
186
187
188
189
190

```javascript
// Turn autoSlide off
Reveal.configure({ autoSlide: 0 });

// Start auto-sliding every 5s
Reveal.configure({ autoSlide: 5000 });
```

191

Hakim El Hattab's avatar
Hakim El Hattab committed
192
193
194
195
196
197
198
### Dependencies

Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example:

```javascript
Reveal.initialize({
	dependencies: [
Hakim El Hattab's avatar
Hakim El Hattab committed
199
		// Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/
200
		{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
hakimel's avatar
hakimel committed
201

Hakim El Hattab's avatar
Hakim El Hattab committed
202
		// Interpret Markdown in <section> elements
203
		{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
204
		{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
hakimel's avatar
hakimel committed
205

206
207
		// Syntax highlight for <code> elements
		{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
hakimel's avatar
hakimel committed
208

Dan Dascalescu's avatar
Dan Dascalescu committed
209
		// Zoom in and out with Alt+click
210
		{ src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
211

212
		// Speaker notes
213
214
215
		{ src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } },

		// Remote control your reveal.js presentation using a touch device
Hakim El Hattab's avatar
Hakim El Hattab committed
216
217
218
219
		{ src: 'plugin/remotes/remotes.js', async: true, condition: function() { return !!document.body.classList; } },

		// MathJax
		{ src: 'plugin/math/math.js', async: true }
Hakim El Hattab's avatar
Hakim El Hattab committed
220
221
222
223
224
225
226
227
228
229
230
	]
});
```

You can add your own extensions using the same syntax. The following properties are available for each dependency object:
- **src**: Path to the script to load
- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false
- **callback**: [optional] Function to execute when the script has loaded
- **condition**: [optional] Function which must return true for the script to be loaded


231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
### Presentation Size

All presentations have a normal size, that is the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport.

See below for a list of configuration options related to sizing, including default values:

```javascript
Reveal.initialize({

	...

	// The "normal" size of the presentation, aspect ratio will be preserved
	// when the presentation is scaled to fit different resolutions. Can be
	// specified using percentage units.
	width: 960,
	height: 700,

	// Factor of the display size that should remain empty around the content
	margin: 0.1,

	// Bounds for smallest/largest possible scale to apply to content
	minScale: 0.2,
	maxScale: 1.0

});
```

258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278

### Auto-sliding

Presentations can be configure to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides:

```javascript
// Slide every five seconds
Reveal.configure({
  autoSlide: 5000
});
```

When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Sliding is also paused automatically as soon as the user starts navigating. You can disable these controls by specifying ```autoSlideStoppable: false``` in your reveal.js config.

You can also override the slide duration for individual slides by using the ```data-autoslide``` attribute on individual sections:

```html
<section data-autoslide="10000">This will remain on screen for 10 seconds</section>
```


279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
### Keyboard Bindings

If you're unhappy with any of the default keyboard bindings you can override them using the ```keyboard``` config option:

```javascript
Reveal.configure({
  keyboard: {
    13: 'next', // go to the next slide when the ENTER key is pressed
    27: function() {}, // do something custom when ESC is pressed
    32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding)
  }
});
```


294
295
### API

296
The ``Reveal`` class provides a JavaScript API for controlling navigation and reading state:
297

Hakim El Hattab's avatar
Hakim El Hattab committed
298
```javascript
299
// Navigation
Federico Fissore's avatar
Federico Fissore committed
300
Reveal.slide( indexh, indexv, indexf );
301
302
303
304
305
306
Reveal.left();
Reveal.right();
Reveal.up();
Reveal.down();
Reveal.prev();
Reveal.next();
307
308
Reveal.prevFragment();
Reveal.nextFragment();
Hakim El Hattab's avatar
Hakim El Hattab committed
309
Reveal.toggleOverview();
Hakim El Hattab's avatar
Hakim El Hattab committed
310
Reveal.togglePause();
311
312
313
314
315
316

// Retrieves the previous and current slide elements
Reveal.getPreviousSlide();
Reveal.getCurrentSlide();

Reveal.getIndices(); // { h: 0, v: 0 } }
Hakim El Hattab's avatar
Hakim El Hattab committed
317
318
319
320
321
322

// State checks
Reveal.isFirstSlide();
Reveal.isLastSlide();
Reveal.isOverview();
Reveal.isPaused();
Hakim El Hattab's avatar
Hakim El Hattab committed
323
```
324

325
### Ready Event
Hakim El Hattab's avatar
Hakim El Hattab committed
326
327
328
329
330
331
332
333
334

The 'ready' event is fired when reveal.js has loaded all (synchronous) dependencies and is ready to start navigating.

```javascript
Reveal.addEventListener( 'ready', function( event ) {
	// event.currentSlide, event.indexh, event.indexv
} );
```

335
### Slide Changed Event
336

337
An 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes.
338

Hakim El Hattab's avatar
Hakim El Hattab committed
339
340
Some libraries, like MathJax (see [#226](https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609)), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback.

341
```javascript
342
Reveal.addEventListener( 'slidechanged', function( event ) {
343
	// event.previousSlide, event.currentSlide, event.indexh, event.indexv
344
345
346
} );
```

347
348
349
350
351
352
353
354
355
356
357
358
359
360

### States

If you set ``data-state="somestate"`` on a slide ``<section>``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide.

Furthermore you can also listen to these changes in state via JavaScript:

```javascript
Reveal.addEventListener( 'somestate', function() {
	// TODO: Sprinkle magic
}, false );
```

### Slide Backgrounds
361

Hakim El Hattab's avatar
Hakim El Hattab committed
362
Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page background colors or images by applying a ```data-background``` attribute to your ```<section>``` elements. Below are a few examples.
363
364
365
366
367
368
369
370
371
372
373
374
375

```html
<section data-background="#ff0000">
	<h2>All CSS color formats are supported, like rgba() or hsl().</h2>
</section>
<section data-background="http://example.com/image.png">
	<h2>This slide will have a full-size background image.</h2>
</section>
<section data-background="http://example.com/image.png" data-background-size="100px" data-background-repeat="repeat">
	<h2>This background image will be sized to 100px and repeated.</h2>
</section>
```

376
Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing ```backgroundTransition: 'slide'``` to the ```Reveal.initialize()``` call. Alternatively you can set ```data-background-transition``` on any section with a background to override that specific transition.
377

378

379
380
### Parallax Background

381
If you want to use a parallax scrolling background, set the two following config properties when initializing reveal.js (the third one is optional).
382
383
384

```javascript
Reveal.initialize({
385

386
	// Parallax background image
387
	parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg"
388

389
	// Parallax background size
390
	parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto)
391

392
393
394
395
396
397
	// This slide transition gives best results:
	transition: linear

});
```

398
Make sure that the background size is much bigger than screen size to allow for some scrolling. [View example](http://lab.hakim.se/reveal-js/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg&parallaxBackgroundSize=2100px%20900px).
399
400


401

402
403
### Slide Transitions
The global presentation transition is set using the ```transition``` config value. You can override the global transition for a specific slide by using the ```data-transition``` attribute:
Hakim El Hattab's avatar
Hakim El Hattab committed
404

405
406
407
408
```html
<section data-transition="zoom">
	<h2>This slide will override the presentation transition and zoom!</h2>
</section>
Hakim El Hattab's avatar
Hakim El Hattab committed
409

410
411
412
<section data-transition-speed="fast">
	<h2>Choose from three transition speeds: default, fast or slow!</h2>
</section>
Hakim El Hattab's avatar
Hakim El Hattab committed
413
414
```

415
416
Note that this does not work with the page and cube transitions.

Hakim El Hattab's avatar
Hakim El Hattab committed
417

Hakim El Hattab's avatar
Hakim El Hattab committed
418
419
420
421
422
423
424
425
### Internal links

It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```<section id="some-slide">```):

```html
<a href="#/2/2">Link</a>
<a href="#/some-slide">Link</a>
```
426

Dan Dascalescu's avatar
Dan Dascalescu committed
427
You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an ```enabled``` class when it's a valid navigation route based on the current slide.
428
429
430
431
432
433

```html
<a href="#" class="navigate-left">
<a href="#" class="navigate-right">
<a href="#" class="navigate-up">
<a href="#" class="navigate-down">
Hakim El Hattab's avatar
Hakim El Hattab committed
434
<a href="#" class="navigate-prev"> <!-- Previous vertical or horizontal slide -->
435
436
437
438
<a href="#" class="navigate-next"> <!-- Next vertical or horizontal slide -->
```


Hakim El Hattab's avatar
Hakim El Hattab committed
439
### Fragments
440
Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://lab.hakim.se/reveal-js/#/fragments
Hakim El Hattab's avatar
Hakim El Hattab committed
441
442
443
444
445
446
447
448
449

The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment:

```html
<section>
	<p class="fragment grow">grow</p>
	<p class="fragment shrink">shrink</p>
	<p class="fragment roll-in">roll-in</p>
	<p class="fragment fade-out">fade-out</p>
450
451
	<p class="fragment current-visible">visible only once</p>
	<p class="fragment highlight-current-blue">blue only once</p>
Hakim El Hattab's avatar
Hakim El Hattab committed
452
453
454
455
456
457
	<p class="fragment highlight-red">highlight-red</p>
	<p class="fragment highlight-green">highlight-green</p>
	<p class="fragment highlight-blue">highlight-blue</p>
</section>
```

458
459
Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second.

Hakim El Hattab's avatar
Hakim El Hattab committed
460
```html
461
<section>
462
	<span class="fragment fade-in">
463
464
465
466
467
		<span class="fragment fade-out">I'll fade in, then out</span>
	</span>
</section>
```

468
469
470
471
472
473
474
475
476
477
The display order of fragments can be controlled using the ```data-fragment-index``` attribute.

```html
<section>
	<p class="fragment" data-fragment-index="3">Appears last</p>
	<p class="fragment" data-fragment-index="1">Appears first</p>
	<p class="fragment" data-fragment-index="2">Appears second</p>
</section>
```

478
479
480
481
### Fragment events

When a slide fragment is either shown or hidden reveal.js will dispatch an event.

Hakim El Hattab's avatar
Hakim El Hattab committed
482
483
Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback.

484
```javascript
485
486
487
488
489
490
491
492
Reveal.addEventListener( 'fragmentshown', function( event ) {
	// event.fragment = the fragment DOM element
} );
Reveal.addEventListener( 'fragmenthidden', function( event ) {
	// event.fragment = the fragment DOM element
} );
```

wtw's avatar
wtw committed
493
### Code syntax highlighting
494

495
By default, Reveal is configured with [highlight.js](http://softwaremaniacs.org/soft/highlight/en/) for code syntax highlighting. Below is an example with clojure code that will be syntax highlighted. When the `data-trim` attribute is present surrounding whitespace is automatically removed.
496
497
498

```html
<section>
499
	<pre><code data-trim>
500
501
502
503
504
(def lazy-fib
  (concat
   [0 1]
   ((fn rfib [a b]
        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
505
	</code></pre>
506
507
508
</section>
```

509
510
511
512
513
514
515
### Slide number
If you would like to display the page number of the current slide you can do so using the ```slideNumber``` configuration value.

```javascript
Reveal.configure({ slideNumber: true });
```

516

Hakim El Hattab's avatar
Hakim El Hattab committed
517
518
### Overview mode

519
Press "Esc" or "o" keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides,
520
521
522
523
524
525
526
527
528
as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks:

```javascript
Reveal.addEventListener( 'overviewshown', function( event ) { /* ... */ } );
Reveal.addEventListener( 'overviewhidden', function( event ) { /* ... */ } );

// Toggle the overview mode programmatically
Reveal.toggleOverview();
```
Hakim El Hattab's avatar
Hakim El Hattab committed
529
530
531
532

### Fullscreen mode
Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode.

533

Hakim El Hattab's avatar
Hakim El Hattab committed
534
### Embedded media
Hakim El Hattab's avatar
typo    
Hakim El Hattab committed
535
Embedded HTML5 `<video>`/`<audio>` and YouTube iframes are automatically paused when you navigate away from a slide. This can be disabled by decorating your element with a `data-ignore` attribute.
Hakim El Hattab's avatar
Hakim El Hattab committed
536
537
538
539

Add `data-autoplay` to your media element if you want it to automatically start playing when the slide is shown:

```html
Hakim El Hattab's avatar
Hakim El Hattab committed
540
<video data-autoplay src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
Hakim El Hattab's avatar
Hakim El Hattab committed
541
542
```

543
544
Additionally the framework automatically pushes two [post messages](https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) to all iframes, ```slide:start``` when the slide containing the iframe is made visible and ```slide:stop``` when it is hidden.

Hakim El Hattab's avatar
Hakim El Hattab committed
545

Hakim El Hattab's avatar
Hakim El Hattab committed
546
### Stretching elements
Hakim El Hattab's avatar
Hakim El Hattab committed
547
Sometimes it's desirable to have an element, like an image or video, stretch to consume as much space as possible within a given slide. This can be done by adding the ```.stretch``` class to an element as seen below:
Hakim El Hattab's avatar
Hakim El Hattab committed
548
549
550
551
552
553
554
555
556

```html
<section>
	<h2>This video will use up the remaining space on the slide</h2>
    <video class="stretch" src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
</section>
```

Limitations:
Hakim El Hattab's avatar
Hakim El Hattab committed
557
558
- Only direct descendants of a slide section can be stretched
- Only one descendant per slide section can be stretched
Hakim El Hattab's avatar
Hakim El Hattab committed
559
560


561
562
## PDF Export

Hakim El Hattab's avatar
Hakim El Hattab committed
563
Presentations can be exported to PDF via a special print stylesheet. This feature requires that you use [Google Chrome](http://google.com/chrome).
564
565
Here's an example of an exported presentation that's been uploaded to SlideShare: http://www.slideshare.net/hakimel/revealjs-13872948.

566
1. Open your presentation with [css/print/pdf.css](https://github.com/hakimel/reveal.js/blob/master/css/print/pdf.css) included on the page. The default index HTML lets you add *print-pdf* anywhere in the query to include the stylesheet, for example: [lab.hakim.se/reveal-js?print-pdf](http://lab.hakim.se/reveal-js?print-pdf).
567
568
2. Open the in-browser print dialog (CMD+P).
3. Change the **Destination** setting to **Save as PDF**.
Hakim El Hattab's avatar
Hakim El Hattab committed
569
4. Change the **Layout** to **Landscape**.
570
571
572
573
574
5. Change the **Margins** to **None**.
6. Click **Save**.

![Chrome Print Settings](https://s3.amazonaws.com/hakim-static/reveal-js/pdf-print-settings.png)

Hakim El Hattab's avatar
Hakim El Hattab committed
575
576
577
578
579
580
581
582
583
584
## Theming

The framework comes with a few different themes included:

- default: Gray background, white text, blue links
- beige: Beige background, dark text, brown links
- sky: Blue background, thin white text, blue links
- night: Black background, thick white text, orange links
- serif: Cappuccino background, gray text, brown links
- simple: White background, black text, blue links
585
- solarized: Cream-colored background, dark green text, blue links
Hakim El Hattab's avatar
Hakim El Hattab committed
586
587
588
589
590
591
592
593
594
595

Each theme is available as a separate stylesheet. To change theme you will need to replace **default** below with your desired theme name in index.html:

```html
<link rel="stylesheet" href="css/theme/default.css" id="theme">
```

If you want to add a theme of your own see the instructions here: [/css/theme/README.md](https://github.com/hakimel/reveal.js/blob/master/css/theme/README.md).


596
## Speaker Notes
597

Hakim El Hattab's avatar
Hakim El Hattab committed
598
reveal.js comes with a speaker notes plugin which can be used to present per-slide notes in a separate browser window. The notes window also gives you a preview of the next upcoming slide so it may be helpful even if you haven't written any notes. Press the 's' key on your keyboard to open the notes window.
599

600
Notes are defined by appending an ```<aside>``` element to a slide as seen below. You can add the ```data-markdown``` attribute to the aside element if you prefer writing notes using Markdown.
601

602
603
When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup).

604
605
606
```html
<section>
	<h2>Some Slide</h2>
607

608
609
610
611
612
	<aside class="notes">
		Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard).
	</aside>
</section>
```
613

614
615
If you're using the external Markdown plugin, you can add notes with the help of a special delimiter:

616
```html
617
<section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n" data-notes="^Note:"></section>
618
619
620
621
622

# Title
## Sub-title

Here is some content...
623
624
625

Note:
This will only display in the notes window.
626
627
```

wtw's avatar
wtw committed
628
## Server Side Speaker Notes
629

wtw's avatar
wtw committed
630
In some cases it can be desirable to run notes on a separate device from the one you're presenting on. The Node.js-based notes plugin lets you do this using the same note definitions as its client side counterpart. Include the required scripts by adding the following dependencies:
631

Hakim El Hattab's avatar
Hakim El Hattab committed
632
```javascript
633
634
635
636
637
638
639
640
Reveal.initialize({
	...

	dependencies: [
		{ src: 'socket.io/socket.io.js', async: true },
		{ src: 'plugin/notes-server/client.js', async: true }
	]
});
641
642
643
644
645
646
647
648
```

Then:

1. Install [Node.js](http://nodejs.org/)
2. Run ```npm install```
3. Run ```node plugin/notes-server```

649

650
651
## Multiplexing

652
The multiplex plugin allows your audience to view the slides of the presentation you are controlling on their own phone, tablet or laptop. As the master presentation navigates the slides, all client presentations will update in real time. See a demo at [http://revealjs.jit.su/](http://revealjs.jit.su).
653

654
The multiplex plugin needs the following 3 things to operate:
655

656
657
658
659
660
661
662
663
664
665
666
667
1. Master presentation that has control
2. Client presentations that follow the master
3. Socket.io server to broadcast events from the master to the clients

More details:

#### Master presentation
Served from a static file server accessible (preferably) only to the presenter. This need only be on your (the presenter's) computer. (It's safer to run the master presentation from your own computer, so if the venue's Internet goes down it doesn't stop the show.) An example would be to execute the following commands in the directory of your master presentation: 

1. ```npm install node-static```
2. ```static```

Hakim El Hattab's avatar
Hakim El Hattab committed
668
If you want to use the speaker notes plugin with your master presentation then make sure you have the speaker notes plugin configured correctly along with the configuration shown below, then execute ```node plugin/notes-server``` in the directory of your master presentation. The configuration below will cause it to connect to the socket.io server as a master, as well as launch your speaker-notes/static-file server.
669
670
671
672

You can then access your master presentation at ```http://localhost:1947```

Example configuration:
673
```javascript
674
Reveal.initialize({
Hakim El Hattab's avatar
Hakim El Hattab committed
675
	// other options...
676
677

	multiplex: {
Hakim El Hattab's avatar
Hakim El Hattab committed
678
		// Example values. To generate your own, see the socket.io server instructions.
679
680
681
		secret: '13652805320794272084', // Obtained from the socket.io server. Gives this (the master) control of the presentation
		id: '1ea875674b17ca76', // Obtained from socket.io server
		url: 'revealjs.jit.su:80' // Location of socket.io server
682
683
	},

Hakim El Hattab's avatar
Hakim El Hattab committed
684
	// Don't forget to add the dependencies
685
	dependencies: [
686
		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
687
		{ src: 'plugin/multiplex/master.js', async: true },
688
689
690

		// and if you want speaker notes
		{ src: 'plugin/notes-server/client.js', async: true }
Hakim El Hattab's avatar
Hakim El Hattab committed
691

Hakim El Hattab's avatar
Hakim El Hattab committed
692
		// other dependencies...
693
694
695
696
697
698
699
700
701
702
	]
});
```

#### Client presentation
Served from a publicly accessible static file server. Examples include: GitHub Pages, Amazon S3, Dreamhost, Akamai, etc. The more reliable, the better. Your audience can then access the client presentation via ```http://example.com/path/to/presentation/client/index.html```, with the configuration below causing them to connect to the socket.io server as clients.

Example configuration:
```javascript
Reveal.initialize({
Hakim El Hattab's avatar
Hakim El Hattab committed
703
	// other options...
704
705

	multiplex: {
Hakim El Hattab's avatar
Hakim El Hattab committed
706
		// Example values. To generate your own, see the socket.io server instructions.
707
708
709
710
711
		secret: null, // null so the clients do not have control of the master presentation
		id: '1ea875674b17ca76', // id, obtained from socket.io server
		url: 'revealjs.jit.su:80' // Location of socket.io server
	},

Hakim El Hattab's avatar
Hakim El Hattab committed
712
	// Don't forget to add the dependencies
713
714
715
	dependencies: [
		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
		{ src: 'plugin/multiplex/client.js', async: true }
Hakim El Hattab's avatar
Hakim El Hattab committed
716

Hakim El Hattab's avatar
Hakim El Hattab committed
717
		// other dependencies...
718
719
720
721
	]
});
```

722
723
724
725
726
727
728
729
730
731
732
#### Socket.io server
Server that receives the slideChanged events from the master presentation and broadcasts them out to the connected client presentations. This needs to be publicly accessible. You can run your own socket.io server with the commands:

1. ```npm install```
2. ```node plugin/multiplex```

Or you use the socket.io server at [http://revealjs.jit.su](http://revealjs.jit.su).

You'll need to generate a unique secret and token pair for your master and client presentations. To do so, visit ```http://example.com/token```, where ```http://example.com``` is the location of your socket.io server. Or if you're going to use the socket.io server at [http://revealjs.jit.su](http://revealjs.jit.su), visit [http://revealjs.jit.su/token](http://revealjs.jit.su/token).

You are very welcome to point your presentations at the Socket.io server running at [http://revealjs.jit.su](http://revealjs.jit.su), but availability and stability are not guaranteed. For anything mission critical I recommend you run your own server. It is simple to deploy to nodejitsu, heroku, your own environment, etc.
733

734
##### socket.io server as file static server
735

736
737
738
739
740
The socket.io server can play the role of static file server for your client presentation, as in the example at [http://revealjs.jit.su](http://revealjs.jit.su). (Open [http://revealjs.jit.su](http://revealjs.jit.su) in two browsers. Navigate through the slides on one, and the other will update to match.) 

Example configuration:
```javascript
Reveal.initialize({
Hakim El Hattab's avatar
Hakim El Hattab committed
741
	// other options...
742
743

	multiplex: {
Hakim El Hattab's avatar
Hakim El Hattab committed
744
		// Example values. To generate your own, see the socket.io server instructions.
745
746
747
748
749
		secret: null, // null so the clients do not have control of the master presentation
		id: '1ea875674b17ca76', // id, obtained from socket.io server
		url: 'example.com:80' // Location of your socket.io server
	},

Hakim El Hattab's avatar
Hakim El Hattab committed
750
	// Don't forget to add the dependencies
751
752
753
	dependencies: [
		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
		{ src: 'plugin/multiplex/client.js', async: true }
Hakim El Hattab's avatar
Hakim El Hattab committed
754

Hakim El Hattab's avatar
Hakim El Hattab committed
755
		// other dependencies...
756
757
758
759
760
761
762
763
	]
```

It can also play the role of static file server for your master presentation and client presentations at the same time (as long as you don't want to use speaker notes). (Open [http://revealjs.jit.su](http://revealjs.jit.su) in two browsers. Navigate through the slides on one, and the other will update to match. Navigate through the slides on the second, and the first will update to match.) This is probably not desirable, because you don't want your audience to mess with your slides while you're presenting. ;)

Example configuration:
```javascript
Reveal.initialize({
Hakim El Hattab's avatar
Hakim El Hattab committed
764
	// other options...
765
766

	multiplex: {
Hakim El Hattab's avatar
Hakim El Hattab committed
767
		// Example values. To generate your own, see the socket.io server instructions.
768
769
770
771
772
		secret: '13652805320794272084', // Obtained from the socket.io server. Gives this (the master) control of the presentation
		id: '1ea875674b17ca76', // Obtained from socket.io server
		url: 'example.com:80' // Location of your socket.io server
	},

Hakim El Hattab's avatar
Hakim El Hattab committed
773
	// Don't forget to add the dependencies
774
775
776
777
	dependencies: [
		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
		{ src: 'plugin/multiplex/master.js', async: true },
		{ src: 'plugin/multiplex/client.js', async: true }
Hakim El Hattab's avatar
Hakim El Hattab committed
778

Hakim El Hattab's avatar
Hakim El Hattab committed
779
		// other dependencies...
780
781
782
	]
});
```
783

Rory Hardy's avatar
Rory Hardy committed
784
785
786
## Leap Motion
The Leap Motion plugin lets you utilize your [Leap Motion](https://www.leapmotion.com/) device to control basic navigation of your presentation. The gestures currently supported are:

Rory Hardy's avatar
Rory Hardy committed
787
##### 1 to 2 fingers
Hakim El Hattab's avatar
Hakim El Hattab committed
788
Pointer &mdash; Point to anything on screen. Move your finger past the device to expand the pointer.
Rory Hardy's avatar
Rory Hardy committed
789

Hakim El Hattab's avatar
Hakim El Hattab committed
790
##### 1 hand + 3 or more fingers (left/right/up/down)
Rory Hardy's avatar
Rory Hardy committed
791
792
Navigate through your slides. See config options to invert movements.

Hakim El Hattab's avatar
Hakim El Hattab committed
793
##### 2 hands upwards
Rory Hardy's avatar
Rory Hardy committed
794
795
796
797
Toggle the overview mode. Do it a second time to exit the overview.

#### Config Options
You can edit the following options:
Hakim El Hattab's avatar
Hakim El Hattab committed
798
799
800
801
802
803
804
805
806
807
808

| Property          | Default           | Description
| ----------------- |:-----------------:| :-------------
| autoCenter        | true              | Center the pointer based on where you put your finger into the leap motions detection field.
| gestureDelay      | 500               | How long to delay between gestures in milliseconds.
| naturalSwipe      | true              | Swipe as though you were touching a touch screen. Set to false to invert.
| pointerColor      | #00aaff           | The color of the pointer.
| pointerOpacity    | 0.7               | The opacity of the pointer.
| pointerSize       | 15                | The minimum height and width of the pointer.
| pointerTolerance  | 120               | Bigger = slower pointer.

Rory Hardy's avatar
Rory Hardy committed
809
810
811
812

Example configuration:
```js
Reveal.initialize({
Hakim El Hattab's avatar
Hakim El Hattab committed
813

Hakim El Hattab's avatar
Hakim El Hattab committed
814
	// other options...
Hakim El Hattab's avatar
Hakim El Hattab committed
815

Rory Hardy's avatar
Rory Hardy committed
816
817
818
819
	leap: {
		naturalSwipe   : false,    // Invert swipe gestures
		pointerOpacity : 0.5,      // Set pointer opacity to 0.5
		pointerColor   : '#d80000' // Red pointer
Hakim El Hattab's avatar
Hakim El Hattab committed
820
	},
Hakim El Hattab's avatar
Hakim El Hattab committed
821
822
823
824
825
826
827
828

	dependencies: [
		{ src: 'plugin/leap/leap.js', async: true }
	]

});
```

Hakim El Hattab's avatar
Hakim El Hattab committed
829
## MathJax
Hakim El Hattab's avatar
Hakim El Hattab committed
830

Hakim El Hattab's avatar
Hakim El Hattab committed
831
If you want to display math equations in your presentation you can easily do so by including this plugin. The plugin is a very thin wrapper around the [MathJax](http://www.mathjax.org/) library. To use it you'll need to include it as a reveal.js dependency, [find our more about dependencies here](#dependencies).
Hakim El Hattab's avatar
Hakim El Hattab committed
832

Hakim El Hattab's avatar
Hakim El Hattab committed
833
834
835
The plugin defaults to using [LaTeX](http://en.wikipedia.org/wiki/LaTeX) but that can be adjusted through the ```math``` configuration object. Note that MathJax is loaded from a remote server. If you want to use it offline you'll need to download a copy of the library and adjust the ```mathjax``` configuration value. 

Below is an example of how the plugin can be configured. If you don't intend to change these values you do not need to include the ```math``` config object at all.
Hakim El Hattab's avatar
Hakim El Hattab committed
836
837
838
839
840
841
842
843

```js
Reveal.initialize({

	// other options ...

	math: {
		mathjax: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js',
Hakim El Hattab's avatar
Hakim El Hattab committed
844
845
		config: 'TeX-AMS_HTML-full'  // See http://docs.mathjax.org/en/latest/config-files.html
	},
Rory Hardy's avatar
Rory Hardy committed
846
	
Hakim El Hattab's avatar
Hakim El Hattab committed
847
848
849
	dependencies: [
		{ src: 'plugin/math/math.js', async: true }
	]
Hakim El Hattab's avatar
Hakim El Hattab committed
850
851

});
Rory Hardy's avatar
Rory Hardy committed
852
853
```

Hakim El Hattab's avatar
Hakim El Hattab committed
854
Read MathJax's documentation if you need [HTTPS delivery](http://docs.mathjax.org/en/latest/start.html#secure-access-to-the-cdn) or serving of [specific versions](http://docs.mathjax.org/en/latest/configuration.html#loading-mathjax-from-the-cdn) for stability.
855

Hakim El Hattab's avatar
Hakim El Hattab committed
856

Hakim El Hattab's avatar
Hakim El Hattab committed
857
858
## Installation

859
The **basic setup** is for authoring presentations only. The **full setup** gives you access to all reveal.js features and plugins such as speaker notes as well as the development tasks needed to make changes to the source.
Hakim El Hattab's avatar
Hakim El Hattab committed
860
861
862

### Basic setup

Hakim El Hattab's avatar
Hakim El Hattab committed
863
The core of reveal.js is very easy to install. You'll simply need to download a copy of this repository and open the index.html file directly in your browser.
Hakim El Hattab's avatar
Hakim El Hattab committed
864

Hakim El Hattab's avatar
Hakim El Hattab committed
865
1. Download the latest version of reveal.js from <https://github.com/hakimel/reveal.js/releases>
Hakim El Hattab's avatar
Hakim El Hattab committed
866

Hakim El Hattab's avatar
typos    
Hakim El Hattab committed
867
2. Unzip and replace the example contents in index.html with your own
Hakim El Hattab's avatar
Hakim El Hattab committed
868
869
870
871
872
873

3. Open index.html in a browser to view it


### Full setup

874
Some reveal.js features, like external markdown and speaker notes, require that presentations run from a local web server. The following instructions will set up such a server as well as all of the development tasks needed to make edits to the reveal.js source code.
Hakim El Hattab's avatar
Hakim El Hattab committed
875
876
877
878
879

1. Install [Node.js](http://nodejs.org/)

2. Install [Grunt](http://gruntjs.com/getting-started#installing-the-cli)

880
4. Clone the reveal.js repository
881
882
883
   ```sh
   $ git clone https://github.com/hakimel/reveal.js.git
   ```
Hakim El Hattab's avatar
Hakim El Hattab committed
884

885
5. Navigate to the reveal.js folder
886
887
888
   ```sh
   $ cd reveal.js
   ```
Hakim El Hattab's avatar
Hakim El Hattab committed
889

890
6. Install dependencies
891
892
893
   ```sh
   $ npm install
   ```
Hakim El Hattab's avatar
Hakim El Hattab committed
894

895
7. Serve the presentation and monitor source files for changes
896
897
898
   ```sh
   $ grunt serve
   ```
Hakim El Hattab's avatar
Hakim El Hattab committed
899

Hakim El Hattab's avatar
Hakim El Hattab committed
900
8. Open <http://localhost:8000> to view your presentation
Hakim El Hattab's avatar
Hakim El Hattab committed
901

902
   You can change the port by using `grunt serve --port 8001`.
Hakim El Hattab's avatar
Hakim El Hattab committed
903

Hakim El Hattab's avatar
Hakim El Hattab committed
904
905
906
907
908
909
910
911

### Folder Structure
- **css/** Core styles without which the project does not function
- **js/** Like above but for JavaScript
- **plugin/** Components that have been developed as extensions to reveal.js
- **lib/** All other third party assets (JavaScript, CSS, fonts)


Hakim El Hattab's avatar
Hakim El Hattab committed
912
913
### Contributing

Hakim El Hattab's avatar
Hakim El Hattab committed
914
Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. If you are reporting a bug make sure to include information about which browser and operating system you are using as well as the necessary steps to reproduce the issue.
Hakim El Hattab's avatar
Hakim El Hattab committed
915
916
917
918
919
920

If you have personal support questions use [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js).


#### Pull requests

Hakim El Hattab's avatar
Hakim El Hattab committed
921
- Should follow the coding style of the file you work in, most importantly:
Hakim El Hattab's avatar
Hakim El Hattab committed
922
923
924
925
  - Tabs to indent
  - Single-quoted strings
- Should be made towards the **dev branch**
- Should be submitted from a feature/topic branch (not your master)
Hakim El Hattab's avatar
Hakim El Hattab committed
926
- Should not include the minified **reveal.min.js** file
Hakim El Hattab's avatar
Hakim El Hattab committed
927

928

929
## License
Hakim El Hattab's avatar
Hakim El Hattab committed
930
931
932

MIT licensed

Hakim El Hattab's avatar
Hakim El Hattab committed
933
Copyright (C) 2014 Hakim El Hattab, http://hakim.se