Developing the Star Wars opening crawl in HTML/CSS
Tags: html, css, javascript
Published: 2018-01-31 23:57:56

---
title: Developing the Star Wars opening crawl in HTML/CSS
published: true
description: 
tags: html, css, javascript
cover_image: https://d2ffutrenqvap3.cloudfront.net/items/2J1o3S0r2H3z412b1z3n/Image%202018-01-31%20at%208.15.12%20PM.png
---

Even though Star Wars: The Last Jedi is a divisive movie (which is not the point of this article, I promise), it inspired me to develop the most useless thing of all: the franchise's famous opening crawl using solely HTML, CSS and a little bit of Javascript (but for a cool reason).

The crawl contains 5 essential elements:
- The background
- The intro phrase
- The logo
- The text
- The music

I'll simply go through the necessary steps, from building each element to some final touches such as adding John Williams' famous track.

# Step 1: Creating the background

Let's do something a bit more original than adding a picture of space. Let's generate stars randomly !

JS:
```javascript
// Sets the number of stars we wish to display
const numStars = 100;

// For every star we want to display
for (let i = 0; i < numStars; i++) {
  let star = document.createElement("div");  
  star.className = "star";
  var xy = getRandomPosition();
  star.style.top = xy[0] + 'px';
  star.style.left = xy[1] + 'px';
  document.body.append(star);
}

// Gets random x, y values based on the size of the container
function getRandomPosition() {	
  var y = window.innerWidth;
  var x = window.innerHeight;
  var randomX = Math.floor(Math.random()*x);
  var randomY = Math.floor(Math.random()*y);
  return [randomX,randomY];
}
```

CSS:
```css
body {
  margin: 0;
  background-color: black;
}

.star {
  position: absolute;
  width: 1px;
  height: 1px;
  background-color: white;
}
```

**Tada !** We now have a beautiful background to display the crawl on.

It looks like this (note that the stars on this picture are very hard to see as they are one pixel wide, but they'll look good once you actually implement them, you have my word):

![space](https://user-images.githubusercontent.com/15229355/34257748-c9afcda8-e663-11e7-8b3b-c9a0e0bd9119.png)

# Step 2: Adding the famous intro phrase

> A long time ago in a galaxy far, far away....

Everyone has already heard, seen or whispered this phrase in their lifetime, so let's add it (with the necessary effects).

HTML:
```html
...

<section class="intro">
  A long time ago, in a galaxy far,<br> far away....
</section>
```

CSS:
```css
...

/* Center it, set the color, size and hide the text */
.intro {
    position: absolute;
    top: 45%;
    left: 50%;
    z-index: 1;
    animation: intro 6s ease-out 1s;
    color: rgb(75, 213, 238);
    font-weight: 400;
    font-size: 300%;
    opacity: 0;
}

@keyframes intro {
    0% {
        opacity: 0;
    }
    20% {
        opacity: 1;
    }
    90% {
        opacity: 1;
    }
    100% {
        opacity: 0;
    }
}
```

Result:

![intro](https://user-images.githubusercontent.com/15229355/34257979-c9982382-e664-11e7-8453-8ed19a800c4c.png)

# Step 3: Displaying the logo

The logo is vital to this opening sequence, here's how I added it.

HTML:
```html
...

<section class="logo">
    <!-- SVG GOES HERE -->
</section>
```

The `SVG` being a very long file, I have uploaded it [here](https://gist.github.com/christopherkade/97fd94f20c3a4ffddfa5aba46261082f) for you to copy and paste.

CSS:
```css
...

/* Set the animation & hide the logo */
.logo {    
    position: absolute;
    top: 20%;
    left: 45%;
    z-index: 1;
    margin: auto;
    animation: logo 9s ease-out 9s;
    opacity: 0;
}

.logo svg {
    width: inherit;
}

/* Scale the logo down and maintain it centered */
@keyframes logo {
    0% {
        width: 18em;        
        transform: scale(2.75);
        opacity: 1;
    }
    50% {
        opacity: 1;
        width: 18em;      
    }
    100% {
        opacity: 0;
        transform: scale(0.1);
        width: 18em;        
    }
}
```

And there we go, our beautifully animated logo:

![logo](https://user-images.githubusercontent.com/15229355/34258253-ced4043c-e665-11e7-9393-3fe729f29a57.png)

# Step 4: Adding the scrolling text 

It's probably the most essential part of the crawl but it's rather easy to implement.

HTML:
```html
...

<!-- Change the text to your liking -->
<div id="board">  
  <div id="content">
    <p id="title">Episode I</p>
    <p id="subtitle">THE CODER'S MENACE</p>
    <br>
    <p>Turmoil has engulfed the Galactic Republic as Christopher Kade finishes studying to become a master in his trade.</p>    
    <!-- Add as many paragraphs as you want -->
    <!-- And make it cheesy ! -->
  </div>  
</div>
```

CSS:
```css
...

p {
  color: #FFFF82;
}

/* Set the font, lean the board, position it */
#board {
  font-family: Century Gothic, CenturyGothic, AppleGothic, sans-serif;
  transform: perspective(300px) rotateX(25deg);
  transform-origin: 50% 100%;
  text-align: justify;
  position: absolute;
  margin-left: -9em;
  font-weight: bold;
  overflow: hidden;
  font-size: 350%;
  height: 50em;
  width: 18em;
  bottom: 0;
  left: 50%;
}

#board:after {
  position: absolute;
  content: ' ';
  bottom: 60%;
  left: 0;
  right: 0;
  top: 0;
}

/* Set the scrolling animation and position it */
#content {
  animation: scroll 100s linear 16s;
  position: absolute;
  top: 100%;
}

#title, #subtitle {
  text-align: center;
}

@keyframes scroll {
    0% {
        top: 100%;
    }
    100% {
        top: -170%;
    }
}
```

And there we go !

![text](https://user-images.githubusercontent.com/15229355/34258462-bafd09a8-e666-11e7-8002-72b1ad71d343.png)

# Final touch: the music

What would Star Wars be without its music?

Since we have timed our animations in advance, it should be a piece of cake !

First, download the [following](https://s.cdpn.io/1202/Star_Wars_original_opening_crawl_1977.mp3) `.mp3` file and add it to your project's assets.

Then, in our HTML file, add:

```html
<audio preload="auto" autoplay>
  <source src="@/assets/audio/Star_Wars_original_opening_crawl_1977.mp3" type="audio/mpeg">
</audio>
```

Which preloads the music as the page is loaded and plays it automatically.

And voilà, everything should work as expected.

# Final thoughts

You can find the finished product on this [codepen](https://codepen.io/christopherkade/pen/rJVPjz) (without the music).

It's always fun to work on something random to explore the possibilities of vanilla web technologies. I hope this was a call to action for some of you and would love to hear all about it in the comments.

Thanks for reading,  
Christopher Kade