DEV Community

Cover image for Making a 3D Parallax Effect with CSS
Rashid Shamloo
Rashid Shamloo

Posted on

Making a 3D Parallax Effect with CSS

While it may seem complicated at first, making a 3D parallax effect with CSS is pretty easy and straightforward.

Let's say we have a div element with two nested div elements (children) and we want to apply the 3D parallax effect to them:

- HTML

<div id="container">
  <div id="child1" />
  <div id="child2" />
</div>
Enter fullscreen mode Exit fullscreen mode

- CSS

#container {
  width: 150px;
  height: 150px;
  background-color: green;
  display: grid;
  place-items: center;
  animation: rotate 5s ease-in-out infinite;
}
#child1 {
  width: 70%;
  height: 70%;
  background-color: blue;
  grid-area: 1/1/1/1;
}
#child2 {
  width: 30%;
  height: 30%;
  background-color: yellow;
  grid-area: 1/1/1/1;
}
Enter fullscreen mode Exit fullscreen mode

After applying a simple CSS @keyframes animation for demonstration purposes, it looks like this:

you can add the 3D parallax effect by following these steps:

1. Add transform-style: preserve-3d to the parent/container

For the 3D effect to work, you first need to set the transform-style: preserve-3d on the parent/container element. This will let the browser know that it should render the element and it's children in 3D space.

#container {
  ...
  transform-style: preserve-3d
}
Enter fullscreen mode Exit fullscreen mode

2. Add the perspective property to the parent/container (optional)

The next step is adding the perspective property to the parent/container element. the value of this property determines how close/far the elements are from the user. you can set the value using 'px', 'em', 'rem', etc. units.

#container {
  ...
  perspective: 1000px;
}
Enter fullscreen mode Exit fullscreen mode

3. Move/Translate the children along the Z axis

Even though the elements are now rendered in 3D space, all of the elements are on the same plane ( they all have translateZ of 0 which means they are stacked on top of each other). to really see the 3D effect you need to move them back and forth along the Z axis. you can do it in different ways:

- The translate property

translate: 0 0 100px;
Enter fullscreen mode Exit fullscreen mode

- ThetranslateZ() function of the transform property

transform: translateZ(100px);
Enter fullscreen mode Exit fullscreen mode

- The translate3d function of the transform property

transform: translate3d(0, 0, 100px);
Enter fullscreen mode Exit fullscreen mode

After following these steps, our CSS will look like this:

#container {
  ...
  transform-style: preserve-3d
  perspective: 1000px;
}
#child1 {
  ...
  translate: 0 0 50px;
}
#child2 {
  ...
  translateZ: 0 0 100px;
}
Enter fullscreen mode Exit fullscreen mode

And this is what it looks like in action:


While the 3D parallax effect is easy to set up, there are a few caveats.

When applying some CSS properties, the browser has to flatten the layers (remove the 3D effect), which means if you use these properties, the effect will not work. these properties include:

- overflow

- mix-blend-mode

- opacity

- filter

- clip-path

To read more about these properties and possible workarounds, you can read this article.

Top comments (1)

Collapse
 
artydev profile image
artydev

Nice, thank you