DEV Community

Cover image for Bringing this 2-D Nebula Drawing to Life With Code
Gabe
Gabe

Posted on

Bringing this 2-D Nebula Drawing to Life With Code

A few weeks back, after wrapping up my space-themed drawing, I thought about how cool it would be if I could somehow go the extra step and potentially make my new scene interactive.

After some digging, I realized the easiest way to go about this would be to make my drawing a parallax-like experience using Matthew Wagerfield's Parallax.js

My goal was to turn this...

Alt Text

...into this

Alt Text

Preparing the assets

Before I could dive into my code, I had to prepare my assets. I had to export each layer of my drawing as its own image, or PNG in this case. I ended up with a total of 9 PNGs.

Alt Text

My assets were also pretty large in terms of file size, so to solve that, I used TinyPNG to help reduce file size without compromising too much on the image quality.

Project Structure

After optimizing my assets, I moved them into their own folder for the sake of organization. I downloaded the minified version of Parallax.js I found in the GitHub repository and placed it in the root of my project directory like so

Alt Text

Development

With my files in place, I opened up index.html and set up my images

      <div id="scene">
        <div><img src="images/background.png" /></div>
        <div><img src="images/Nebula.png" /></div>
        <div><img src="images/Pink Haze_.png" /></div>
        <div><img src="images/Dark Haze.png" /></div>
        <div><img src="images/Stars.png" /></div>
        <div><img src="images/bottom.png" /></div>
        <div><img src="images/top.png" /></div>
        <div>
          <img id="small-planets" src="images/Smallest Planets.png" />
        </div>
        <div>
          <img id="main-planet" src="images/Main Planet.png" />
        </div>
      </div>

Enter fullscreen mode Exit fullscreen mode

With the images in place, I needed to add the data-depth attributes to their parent divs. The closer something was to the foreground, the higher its data-depth value.

The movement applied to each layer will be multiplied by its depth attribute.

      <div id="scene">
        <div data-depth="0.00"><img src="images/background.png" /></div>
        <div data-depth="0.00"><img src="images/Nebula.png" /></div>
        <div data-depth="0.00"><img src="images/Pink Haze_.png" /></div>
        <div data-depth="0.10"><img src="images/Dark Haze.png" /></div>
        <div data-depth="0.40"><img src="images/Stars.png" /></div>
        <div data-depth="0.60"><img src="images/bottom.png" /></div>
        <div data-depth="0.70"><img src="images/top.png" /></div>
        <div data-depth="1.00">
          <img id="small-planets" src="images/Smallest Planets.png" />
        </div>
        <div data-depth="0.80">
          <img id="main-planet" src="images/Main Planet.png" />
        </div>
      </div>

Enter fullscreen mode Exit fullscreen mode

I then targeted the scene with javascript and created a new parallax instance with that scene as the parameter.

      var scene = document.getElementById("scene");
      var parallax = new Parallax(scene);
Enter fullscreen mode Exit fullscreen mode

I now had a functioning parallax experience. However, it was too large, and things were a bit out of place

Alt Text

I resolved this by adding some CSS, though ideally, I should have resized my actual images.

.scene {
  margin: auto;
  padding: 0;
  max-width: 700px;
  max-height: 700px;
  overflow: hidden;
}

[data-depth="0.80"] {
  left: 25% !important;
  top: 20% !important;
}

[data-depth="1.00"] {
  left: 80% !important;
}

#main-planet {
  width: 50%;
}
Enter fullscreen mode Exit fullscreen mode

Alt Text

and with that, I had my end product. If you'd like to see it for yourself, head on over to my site on a desktop browser and hover over the canvas. Enjoy!

Top comments (1)

Collapse
 
eerk profile image
eerk • Edited

Looks sweet! You might even be able to get it working on mobile! From the docs: "Where no gyroscope or motion detection hardware is available, the position of the cursor is used instead".