Animated 3D Flipping Menu with CSS

By on  
3D Menu

CSS animations aren't just for basic fades or sliding elements anymore -- CSS animations are capable of much more.  I've showed you how you can create an exploding logo (applied with JavaScript, but all animation is CSS), an animated Photo Stack, a sweet 3D CSS flip card, and much more.  Today's we'll create a simple but awesome 3D flipping menu as featured here!


The HTML structure consists of a list with links, as you would expect from a navigation menu, however there are a few extra SPAN elements to aid the 3D effect:

<ul class="block-menu">
	<li><a href="/" class="three-d">
		<span aria-hidden="true" class="three-d-box">
			<span class="front">Home</span>
			<span class="back">Home</span>
	<li><a href="/demos" class="three-d">
		<span aria-hidden="true" class="three-d-box">
			<span class="front">Demos</span>
			<span class="back">Demos</span>
	<!-- more items here -->

Beside the basic A element, a series of SPANs are used to represent the "front" and "back" faces of the 3D box during animation.  Each should be given the same text as the A element.


The animation centers around transitions and transforms.  The actual A element wont move -- the parent SPAN element will. Each inner SPAN is initialized to its position and doesn't change. Each element animates upward and backward, using CSS transforms and CSS transitions, though one is on the rotation back while the other animates up into view.

/* basic menu styles */
.block-menu {
	display: block;
	background: #000;

.block-menu li {
	display: inline-block;

.block-menu li a {
	color: #fff;
	display: block;
	text-decoration: none;
	font-family: 'Passion One', Arial, sans-serif;
	font-smoothing: antialiased;
	text-transform: uppercase;
	overflow: visible;
	line-height: 20px;
	font-size: 24px;
	padding: 15px 10px;

/* animation domination */
.three-d {
	perspective: 200px;
	transition: all .07s linear;
	position: relative;
	cursor: pointer;
	/* complete the animation! */
	.three-d:hover .three-d-box, 
	.three-d:focus .three-d-box {
		transform: translateZ(-25px) rotateX(90deg);

.three-d-box {
	transition: all .3s ease-out;
	transform: translatez(-25px);
	transform-style: preserve-3d;
	pointer-events: none;
	position: absolute;
	top: 0;
	left: 0;
	display: block;
	width: 100%;
	height: 100%;

	put the "front" and "back" elements into place with CSS transforms, 
	specifically translation and translatez
.front {
	transform: rotatex(0deg) translatez(25px);

.back {
	transform: rotatex(-90deg) translatez(25px);
	color: #ffe7c4;

.front, .back {
	display: block;
	width: 100%;
	height: 100%;
	position: absolute;
	top: 0;
	left: 0;
	background: black;
	padding: 15px 10px;
	color: white;
	pointer-events: none;
	box-sizing: border-box;

If you want to a glimpse into which ways the front and back elements move (which I highly recommend you do), set one of them to display: none and hover over the element;  you'll see what role each plays in the animation.

The only downfall of this technique is the repeated menu label;  it's easy to duplicate from a technical perspective, but screen readers may read said text three times, even with the aria-hidden="true" directive.  The visual effect, however, is flawless in its style and silky smooth animation.  No JavaScript, Flash, or canvas needed to create this effect -- just a few simple CSS directives.  CSS animations...something to be very thankful for.

Track.js Error Reporting

Recent Features

  • Write Better JavaScript with Promises

    You've probably heard the talk around the water cooler about how promises are the future. All of the cool kids are using them, but you don't see what makes them so special. Can't you just use a callback? What's the big deal? In this article, we'll...

  • 6 Things You Didn&#8217;t Know About Firefox OS

    Firefox OS is all over the tech news and for good reason:  Mozilla's finally given web developers the platform that they need to create apps the way they've been creating them for years -- with CSS, HTML, and JavaScript.  Firefox OS has been rapidly improving,...

Incredible Demos

  • CSS Circles

    A while back I shared a clever technique for creating triangles with only CSS. Over the past year, I've found CSS triangles incredibly effective, especially when looking to create tooltips or design elements with a likewise pointer pattern. There's another common shape...

  • CSS Animations Between Media Queries

    CSS animations are right up there with sliced bread. CSS animations are efficient because they can be hardware accelerated, they require no JavaScript overhead, and they are composed of very little CSS code. Quite often we add CSS transforms to elements via CSS during...


  1. This is a good approach but can be achieved even better using pseudo-elements, just like Webdesign Depot does for external links.
    You have a single span inside with a data-title attribute, and then set the content of the css pseudo element using attr(data-title). Rotate the pseudo element -90deg, then on hover you rotate the span 90deg thus exposing the pseudo element that was rotate -90deg, creating a rotating effect.

    • Only Firefox animates generated content at the moment, so this is the “safer” approach.

    • I actually have tried @browniefed’s suggestion on chrome 26.0.14 and safari 5.1.10, and it works! Don’t know about explorer, tho…

  2. Chinwag

    Very clever code, no need for specific images!

    Similar to the menu by the great Soh Tanaka.

    Great job.

  3. Looks a lot like the http://www.pukkelpop.be menu

  4. Jesus

    @Tom Schuermans.

    It looks exactly like that one.

  5. Credit is provided….

  6. Really nice but it is not working in ie9 :(

  7. Kimberley D.C. Schroder

    Which CSS tags need vendor prefixes in this example?


  8. Personally, I’ve never understood the reasoning behind this sort of effect ( besides showing off ;) ). I remember a similar version being popular a few years ago where on hover, the text would drop down from above.

    I think it would make more sense if something related but different from the text was revealed. For an example, an icon that when hovered rotates to reveal the text describing the icon. Thoughts?

  9. I like this animation, and I want to practice on my blog

  10. Now this is what I was looking for
    Just a small query
    Can you tell me how do I add hover and active color effect in this?

    Looking for answer

  11. Arjun

    The flipping effect is not working for me in chrome. But the demo in your website is working in all browsers.
    Can you please point me to some place where I can learn to make css3 animation work in all browsers (At least in Opera Chrome and Firefox).
    I tried adding webkit to each and every special css properties, but it doesn’t seems to be working.
    I really appreciate if you point me in right direction.

  12. Why on Mac in Firefox, Chrome 3D menu works perfectly… but on Windows only works in Firefox, in Chrome doesn’t work. I have the same version of Chrome on Mac and Windows… Chrome on Mac is better than Win version? :P

  13. Zayd

    can u pls make a dropdown list for at least to one of them

  14. Srinivas

    I copy pasted this code. I see the back background but the animation is not working. I am new to web programming and I wish to know how I specify the file is css3 or by other means so that I can get the animating effect ?

    • Make sure you add vendor prefixes to properties that need them, like transform and transition

  15. Srinivas

    The overflow appears for me. I changed the overflow attribute to hidden and the animation is not good. Can you please check with the code again. Thanks

  16. This good in Chrome and Mozilla Firefox. Whereas in IE6+ this will not work.
    Always use Jquery for the menu and will work in all browsers.


  17. Nice! I’ll have to work this into my jQuery menuFlip plugin, http://www.grimmdude.com/2011/08/11/jquery-menu-flip


  18. rajesh kumar

    Actually this effect looks gr8. but i need flip image automatically means with out mouse over also.
    please explain me how to do that….?

  19. borbor

    just something i added to this nice css code

    @ ".block-menu" li a line
    .block-menu li a {
                   outline: 0;

    disabling dirty dashed box when clicking the link


  20. Jessica

    Hello Everyone,
    I was playing with this menu and I thought it would be really neat to put an image of a wood plank behind the image so that it would look like parts of the plank were twisting. I tried adding the background image to the list items which works pretty well but the image is not seamless. If I don’t have a background color or image behind the list items the navigation 3d effect does not work well. Does anyone have any ideas or suggestions as to how I could make the image seamless?

  21. changing colors on flip would be more awesome. Thanks tho

  22. Hi David!

    Thank you very much for your code! It was really helpful for me when I needed to do a flip card in my site in a quick way!

    I hope you read this post, I wanted to ask you about the way you solved the problem, to know if you used the containers and the CSS in a particular way for a particular reason.

    I needed a simpler version (with not that many containers or that much CSS code) so I modified a little your version to suit up my needs.

    If you could take a look at it I would appreciate your thoughts on the code.

    Thanks again!


    CODE: http://jsfiddle.net/3r092wgf/

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!

Recently on David Walsh Blog

  • Chris Coyierâs Favorite CodePen Demos II

    Hey everyone! Before we get started, I just want to say it’s damn hard to pick this few favorites on CodePen. Not because, as a co-founder of CodePen, I feel like a dad picking which kid he likes best (RUDE). But because there is just so...

  • GSAP + SVG For Power Users: Motion Along A Path

    Now that the GreenSock API is picking up steam, there are many tutorials and Getting Started guides out there to provide good introductions to the library, not to mention GreenSock’s own Forum and Documentation. This article isn’t intended for beginners, but rather a...

  • Copy a Directory from Command Line

    Copying a directory for the sake of backup is something I do often, especially when I'm trying to figure out why something isn't working when I use an external library.  I'll copy the directory structure as a backup, mess around with the original source until I find a solution,...

  • Hotjar &#8211; All-in-one Analytics and Feedback

    Website analytics are a massive business -- the more data you can collect with regard to your users' behaviors on your site, the more you can increase and maximise conversion...and increased conversion is always good.  Sometimes increase conversion means more money, improved user experience, viewer retention,...

  • Crafting a 3D React Carousel

    There is something in me that is amazed but beautiful 3D interfaces. And it doesn’t matter whether they’re functional like Gyroscope features menu, technology demonstrators like the amazing periodic table demo from famous or they’re artistic representation pushing the limits of...