
Today we’ll talk about the CSS Perspective property, then we’ll go to the CSS Perspective-origin property and in the end, we’ll create the 3d cube using pure CSS.
- CSS Perspective property
- CSS Perspective-origin property
- 3d Cube
Click on/ drag to rotate the Cube:
CSS Perspective Property
The CSS perspective property is used to give a 3D-positioned element some perspective.
The perspective property defines how far the object is away from the user. So, a lower value will result in a more intensive 3D effect than a higher value.
When defining the perspective property for an element, it is the CHILD elements that get the perspective view, NOT the element itself.
CSS Syntax:
perspective: length|none;
Where:
length– how far the element is placed from the view.
none– default value. Same as 0. The perspective is not set.
Example:
<!DOCTYPE html>
<html>
<head>
<style>
#el1 {
position: relative;
height: 100px;
width: 100px;
margin-left: 60px;
border: 5px solid #2a9d8f;
perspective: 100px;
}
#el2, #el4 {
padding: 35px;
position: absolute;
border: 5px solid #e76f51;
background-color: #e9c46a;
transform-style: preserve-3d;
transform: rotateX(45deg);
opacity:0.5;
}
#el3 {
position: relative;
height: 100px;
width: 100px;
margin-left: 60px;
border: 5px solid #2a9d8f;
perspective: none;
}
</style>
</head>
<body>
<h4>perspective: 100px:</h4>
<div id="el1">1
<div id="el2">2</div>
</div>
<h4>perspective: none:</h4>
<div id="el3">3
<div id="el4">4</div>
</div>
</body>
Output:
perspective: 100px:
perspective: none:
CSS Perspective-origin Property
The perspective-origin property defines at which position the user is looking at the 3D-positioned element.
When defining the perspective-origin property for an element, it is the CHILD elements that will get the effect, NOT the element itself.
CSS Syntax:
perspective-origin: x-axis y-axis;
Where:
x-axis – defining where the view is placed at the x-axis (left, center, right, length, %). Default value: 50%.
y-axis – defining where the view is placed at the y-axis (top, center, bottom, length, %). Default value: 50%.
Example:
<!DOCTYPE html>
<html>
<head>
<style>
#element1 {
position: relative;
height: 100px;
width: 100px;
margin-left: 150px;
margin-top:30px;
border: 5px solid #2a9d8f;
perspective: 100px;
perspective-origin: right;
}
#element2, #element4, #element6 {
padding: 50px;
position: absolute;
border: 5px solid #e76f51;
background-color: #e9c46a;
opacity:0.5;
transform-style: preserve-3d;
transform: rotateX(45deg);
}
#element3 {
position: relative;
height: 100px;
width: 100px;
margin-left: 150px;
margin-top:60px;
border: 5px solid #2a9d8f;
perspective: 150px;
perspective-origin: top left;
}
#element5 {
position: relative;
height: 100px;
width: 100px;
margin-top:60px;
margin-left: 150px;
border: 5px solid #2a9d8f;
perspective: 100px;
perspective-origin: -80%;
}
</style>
</head>
<body>
<h4>perspective-origin: right:</h4>
<div id="element1">1
<div id="element2">2</div>
</div>
<h4>perspective-origin: top left:</h4>
<div id="element3">3
<div id="element4">4</div>
</div>
<h4>perspective-origin: -80%:</h4>
<div id="element5">5
<div id="element6">6</div>
</div>
</body>
</html>
Output:
perspective-origin: right:
perspective-origin: top left:
perspective-origin: -80%:
3d Cube
Using all knowledge from above we can create now a 3d cube.
We can create cubes setting different perspectives. In the first example, the CSS perspective property is set to 200px, in the second example 900px.
Example1:
Perspective: 200px;
<!DOCTYPE html>
<html>
<head>
<style>
.cube-content {
perspective: 200px;
}
.cube {
font-size: 4em;
width: 2em;
margin: 1.5em auto;
transform-style: preserve-3d;
transform: rotateX(-45deg) rotateY(30deg);
}
.side {
position: absolute;
width: 2em;
height: 2em;
background-color: #e9c46a;
color: #264653;
opacity:0.5;
border: 1px solid #264653;
text-align: center;
line-height: 2em;
}
.front {transform: translateZ(1em);}
.top {transform: rotateX(90deg) translateZ(1em);}
.right {transform: rotateY(90deg) translateZ(1em);}
.left {transform: rotateY(-90deg) translateZ(1em);}
.bottom {transform: rotateX(-90deg) translateZ(1em);}
.back {transform: rotateY(-180deg) translateZ(1em);}
</style>
</head>
<body>
<div class="cube-content">
<div class="cube">
<div class="side front">1</div>
<div class="side back">6</div>
<div class="side right">4</div>
<div class="side left">3</div>
<div class="side top">5</div>
<div class="side bottom">2</div>
</div>
</div>
</body>
</html>
Output:
Example2:
Perspective: 900px:
<!DOCTYPE html>
<html>
<head>
<style>
.cube-container {
perspective: 900px;
}
.cube {
font-size: 4em;
width: 2em;
margin: 1.5em auto;
transform-style: preserve-3d;
transform: rotateX(-45deg) rotateY(30deg);
}
.side {
position: absolute;
width: 2em;
height: 2em;
background-color: #e9c46a;
opacity:0.5;
border: 1px solid #264653;
color: #264653;
text-align: center;
line-height: 2em;
}
.front {transform: translateZ(1em);}
.top {transform: rotateX(90deg) translateZ(1em);}
.right {transform: rotateY(90deg) translateZ(1em);}
.left {transform: rotateY(-90deg) translateZ(1em);}
.bottom {transform: rotateX(-90deg) translateZ(1em);}
.back {transform: rotateY(-180deg) translateZ(1em);}
</style>
</head>
<body>
<div class="cube-container">
<div class="cube">
<div class="side front">1</div>
<div class="side back">6</div>
<div class="side right">4</div>
<div class="side left">3</div>
<div class="side top">5</div>
<div class="side bottom">2</div>
</div>
</div>
</body>
</html>
Output:
Enjoy coding!
Read also:
CSS Door Animation (Open/Close on Hover)