Set header and footer reveal.js presentation
Asked Answered
S

2

17

I want to set a header and footer in my presentation. I used the following issue as a starting point: https://github.com/hakimel/reveal.js/issues/806 and http://www.ciges.net/revealjs_demo/#/

My current implementation gives the following output: enter image description here

Now as far as I have understand reveal.js uses fixed size for the presentation by default with a width of 960px and height of 700px. This size is completely fine to me. However, I want the headers and footer not to be fixed in this window. They need to adapt to the actual screen size. That is to say, I want the left header to be aligned to the top left corner of the screen. Likewise for the other header and footers, see also the image. How can I achieve this? Currently it seems that my headers and footers are fixed within the default window (960x700).

I use the following code (index.html) with reveal.js 3.2.0

<!doctype html>
<html lang="en">

    <head>
        <meta charset="utf-8">

        <title>reveal.js – The HTML Presentation Framework</title>

        <meta name="description" content="A framework for easily creating beautiful presentations using HTML">
        <meta name="author" content="Hakim El Hattab">

        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">

        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">

        <link rel="stylesheet" href="css/reveal.css">
        <link rel="stylesheet" href="css/theme/simple.css" id="theme">

        <!-- Code syntax highlighting -->
        <link rel="stylesheet" href="lib/css/zenburn.css">

        <!-- Printing and PDF exports -->
        <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>

        <!--[if lt IE 9]>
        <script src="lib/js/html5shiv.js"></script>
        <![endif]-->

        <style type="text/css">
            .reveal div.header-left {
                position: absolute;
                top: 0;
                left: 0;
                padding: 0;
                margin: 0;
            }
            .reveal div.header-right {
                position: absolute;
                top: 0;
                right: 0;
                padding: 0;
                margin: 0;
            }
            .reveal div.footer-left {
                position: absolute;
                bottom: 0;
                left: 0;
                padding: 0;
                margin: 0;
            }
            .reveal div.footer-right {
                position: absolute;
                bottom: 0;
                right: 0;
                padding: 0;
                margin: 0;
            }
        </style>

    </head>

    <body>

        <div id="hidden" style="display:none;">
            <div id="header">
                <div class="header-left">test header left</div>
                <div class="header-right">test header right</div>
                <div class="footer-left">test footer left</div>
                <div class="footer-right">test footer right</div>
            </div>
        </div>

        <div class="reveal">

            <!-- Any section element inside of this container is displayed as a slide -->
            <div class="slides">
                <section>
                    <h1>Reveal.js</h1>
                    <h3>The HTML Presentation Framework</h3>
                    <p>
                        <small>Created by $x^2$ <a href="http://hakim.se">Hakim El Hattab</a> / <a href="http://twitter.com/hakimel">@hakimel</a></small>
                    </p>
                </section>

                <section>
                    <h2>Hello There</h2>
                    <p>
                        reveal.js enables you to create beautiful interactive slide decks using HTML. This presentation will show you examples of what it can do.
                    </p>
                </section>

                <!-- Example of nested vertical slides -->
                <section>
                    <section>
                        <h2>Vertical Slides</h2>
                        <p>Slides can be nested inside of each other.</p>
                        <p>Use the <em>Space</em> key to navigate through all slides.</p>
                        <br>
                        <a href="#" class="navigate-down">
                            <img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
                        </a>
                    </section>
                    <section>
                        <h2>Basement Level 1</h2>
                        <p>Nested slides are useful for adding additional detail underneath a high level horizontal slide.</p>
                    </section>
                    <section>
                        <h2>Basement Level 2</h2>
                        <p>That's it, time to go back up.</p>
                        <br>
                        <a href="#/2">
                            <img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Up arrow" style="transform: rotate(180deg); -webkit-transform: rotate(180deg);">
                        </a>
                    </section>
                </section>

            </div>

        </div>

        <script src="lib/js/head.min.js"></script>
        <script src="js/reveal.js"></script>

        <script>

            // Full list of configuration options available at:
            // https://github.com/hakimel/reveal.js#configuration
            Reveal.initialize({
                controls: false,
                progress: true,
                slideNumber: true,
                history: true,
                center: false, 
                transition: 'slide', // none/fade/slide/convex/concave/zoom
                math: {
                    mathjax: 'https://cdn.mathjax.org/mathjax/latest/MathJax.js',
                    config: 'TeX-AMS_HTML-full'  // See http://docs.mathjax.org/en/latest/config-files.html
                },
                // Optional reveal.js plugins
                dependencies: [
                    { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
                    { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
                    { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
                    { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
                    { src: 'plugin/zoom-js/zoom.js', async: true },
                    { src: 'plugin/notes/notes.js', async: true },
                    { src: 'plugin/math/math.js', async: true }
                ]
            });

        </script>

        <script src="//code.jquery.com/jquery-2.2.0.min.js"></script>

        <script type="text/javascript">
            var header = $('#header').html();
            if ( window.location.search.match( /print-pdf/gi ) ) {
                $('.slides > section').prepend(header);
            } else {
                $('.slides').prepend(header);
            }
        </script>

    </body>

</html>
Szymanski answered 10/1, 2016 at 15:0 Comment(1)
No header issues present on demo url. If you found solution just put answer to your question and accept it. To help other members. The solution must be put header and footer outside the slider and style it in absolute positions.Vagrancy
F
23

Here is a slightly more complicated answer that also works with the pdf-export print version:

Add the elements to the slide-background <div> (instead of section, slides, or reveal). This <div> is dynamically generated, so we must wait for the Reveal.js ready event. When printing there is a slight delay followed by unnecessary animation of the headers and footers moving into place, but all the headers/footers are rendered in the PDF as desired.

Pseudo-code:

  1. Style header/footer <div> so they are positioned as desired.
  2. Create hidden header/footer <div>
  3. On Reveal.js ready event, copy header/footer <div> into each .slide-background <div>

Code: this can be copy-pasted into the end of a reveal.js file (right before the end </body> tag):

<style type="text/css">
    /* 1. Style header/footer <div> so they are positioned as desired. */
    #header-left {
        position: absolute;
        top: 0%;
        left: 0%;
    }
    #header-right {
        position: absolute;
        top: 0%;
        right: 0%;
    }
    #footer-left {
        position: absolute;
        bottom: 0%;
        left: 0%;
    }
</style>

<!-- 2. Create hidden header/footer <div> -->
<div id="hidden" style="display:none;">
    <div id="header">
        <div id="header-left">HEADER-LEFT</div>
        <div id="header-right">HEADER-RIGHT</div>
        <div id="footer-left">FOOTER-LEFT</div>
    </div>
</div>

<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script type="text/javascript">
    // 3. On Reveal.js ready event, copy header/footer <div> into each `.slide-background` <div>
    var header = $('#header').html();
    if ( window.location.search.match( /print-pdf/gi ) ) {
        Reveal.addEventListener( 'ready', function( event ) {
            $('.slide-background').append(header);
        });
    }
    else {
        $('div.reveal').append(header);
   }
</script>
Faunia answered 30/5, 2016 at 6:18 Comment(0)
F
1

Insert the header/footer elements into the div.reveal element instead of the .slides slides element.

The position within the DOM tree you where insert the header/footer elements affects which CSS is applied, which in turn affects their positioning.

  • $('.slides').prepend(header) adds the elements inside the slides <div>. The elements will be fixed to the default (960x700) window because that is how the slides <div> is sized.
  • $('div.reveal').append(header) adds the elements inside the reveal <div>. The elements will be fixed to the screen because the reveal <div> is sized to take up the entire browser view port.

Note this does not work for the print/pdf version... I'm still trying to figure that one out...

Faunia answered 30/5, 2016 at 4:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.