How to Use the CSS rotateY() Function to Rotate Elements in 3D
Introduction
The CSS rotateY() function is a powerful tool for adding depth and motion to your web designs. It rotates an element around its vertical Y-axis, creating a horizontal flip effect—imagine a door swinging open or a card flipping over. This function is part of the transform property and works best when combined with 3D perspective settings. In this guide, you'll learn step by step how to apply rotateY() effectively, from basic syntax to smooth animations.

What You Need
- Basic HTML and CSS knowledge – familiarity with selectors, properties, and values.
- A code editor (e.g., VS Code, Sublime Text, or online playground like CodePen).
- A modern browser that supports CSS 3D transforms (all major browsers do).
- An HTML element to rotate (e.g., a
div, image, or card).
Step-by-Step Guide
Step 1: Understand How rotateY() Works
The Y-axis runs vertically through the center of an element. When you rotate around this axis, the element turns horizontally—left edge moves away or toward you depending on the angle. Picture a pin stuck through the top and bottom center of a piece of paper; the paper can only spin left or right. This understanding is crucial for predicting the visual outcome.
Step 2: Set Up the Parent with Perspective
For rotateY() to create a true 3D effect, you must add the perspective property to the parent container. Perspective defines the distance from the viewer's eyes to the element. Without it, the rotation will look flat and shrunken.
.parent {
perspective: 1000px;
}
Lower values (e.g., 400px) make the element appear closer and exaggerate the 3D effect. Higher values (e.g., 2000px) push it farther away, reducing the visible depth. A good starting point is 1000px.
Step 3: Apply rotateY() to the Child Element
On the element you want to rotate, use the transform property with the rotateY() function:
.card {
transform: rotateY(45deg);
}
This rotates the card 45 degrees to the right. Positive angles rotate the right edge away from you; negative angles rotate the left edge away.
Step 4: Choose an Angle Value
The function accepts a single <angle> argument, which can be expressed in four units:
- deg – degrees.
90deg= quarter turn. - turn – full rotations.
0.5turn= 180 degrees. - rad – radians.
1.57rad≈ 90 degrees. - grad – gradians.
100grad= 90 degrees (less common).
Examples:

/* Degrees */
rotateY(45deg);
rotateY(-180deg);
/* Turns */
rotateY(0.25turn);
rotateY(1turn);
/* Radians */
rotateY(3.14rad); /* ≈ 180° */
Remember: positive = right edge away, negative = left edge away.
Step 5: Add a Smooth Transition
To animate the rotation, add the transition property, often on a hover state:
.card {
transition: transform 0.3s ease;
}
.card:hover {
transform: rotateY(180deg);
}
This creates a 3D flip effect. You can also trigger the rotation with JavaScript for more complex interactions.
Step 6: Test and Refine the Perspective Value
Experiment with different perspective values on the parent to control the intensity of the 3D effect. A lower value (e.g., 500px) makes the rotation more dramatic; a higher value (e.g., 2000px) makes it more subtle. Also consider the transform-style: preserve-3d if you have nested 3D transforms.
Tips for Best Results
- Always set
perspectiveon a parent container – otherwiserotateY()results in a flat 2D shrink. - Use
backface-visibility: hidden;when creating flip cards to hide the element's back when rotated beyond 90 degrees. - Avoid large perspective values – they can make the 3D effect nearly invisible. Stick to
600px–1500pxfor most cases. - Combine with other transforms like
translateX()orscale()for richer animations. - Test on touch devices – 3D transforms can impact performance on mobile; use hardware acceleration (e.g.,
will-change: transform) if needed. - Accessibility – ensure the rotation does not cause motion sickness; provide reduced motion alternatives.
Now you're ready to add stunning 3D rotations to your projects. Start with a simple card flip and experiment from there!
Related Articles
- Simulating ::nth-letter: A Step-by-Step Guide to Styling Individual Letters with CSS
- Unlocking the Web's Potential: The Block Protocol Revolution
- GCC 16.1: What's New in the Latest GNU Compiler Collection Release
- How to Migrate to React Native 0.80's New JavaScript API: Deep Imports Deprecation & Strict TypeScript
- Unlocking the Web's Potential: The Quest for Simple Structured Data
- 7 Facts Every Developer Should Know About Bun After the Anthropic Acquisition
- From Hacks to Native: 10 Key Insights on CSS Randomness
- Faster Copilot Studio with .NET 10 and WebAssembly: Key Questions Answered