The backface-visibility
property relates to 3D transforms. With 3D transforms, you can manage to rotate an element so what we think of as the “front” of an element no longer faces the screen. For instance, this would flip an element away from the screen:
.flip {
transform: rotateY(180deg);
}
It will look as if you picked it up with a spatula and flipped it over like a pancake. That’s because the default for backface-visibility
is visible
. Instead of it being visible, you could hide it.
.flip {
transform: rotateY(180deg);
backface-visibility: hidden;
}
Syntax
backface-visibility: visible | hidden;
- Initial value:
visible
- Applies to: transformable elements
- Inherited: no
- Percentages: n/a
- Computed value: specific keyword
- Animation type: discrete
Values
visible
(default) – The element will always be visible even when not facing the screen.hidden
– The element is not visible when not facing the screen.inherit
– The property gets its value from the its parent element.initial
– Sets the property to its default, which isvisible
.
Demo
This is useful when doing 3D effects. For instance…
Works properly
<div class="container">
<div class="card">
<div class="face front">Front</div>
<div class="face back">Back</div>
<p> </p>
</div>
</div>
Problematic in WebKit because backface-visibility not hidden
<div class="container no-hide">
<div class="card">
<div class="face front">Front</div>
<div class="face back">Back</div>
<p> </p>
</div>
</div>
This isn’t problematic in Firefox for whatever reason, although the property works the same way.
Browser support
IE | Edge | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|---|
10 | All | 10 1 | 12 2 | 5.1 2 | 15 2 |
Android Chrome | Android Firefox | Android Browser | iOS Safari | Opera Mobile |
---|---|---|---|---|
All | All | 3 2 | 5 2 | 62 |
1 Supported in Firefox 10-15 with prefix
-moz-
2 Supported in Chrome 12-35, Safari, Safari iOS, and Opera 15-22 with prefix
-webkit-
Cool
This is very cool for menu designs.
Finally some other browsers have begun implementing this cool feature that’s been around in safari for a while now.
I’ve noticed this property doesn’t work on elements that have been absolutely positioned (in chrome anyway).
Is there anyway you could change the THICKNESS of the actual div ? to show that the div isn’t flat? like a Depth? I think that would be really cool!
but its still cool.
check this out
Kind of. You’d have to use additional elements as sides (front element + 4 side elements + back element)
Hey, very nice article. Helped me in some cases when i used this css rule.
But I am in big dilemma regarding this.
For last many days, i have been struggling canvas drawing operation(different shapes) in sencha touch(javascript) application.
The drawing of lines where a bit slow while the finger moved ahead of the line while drawing it in the IPAD in canvas.
I was not able to figure out that what made this application little slow. Then suddenly, when i added backface-visiblity: visible, propery in css of the body, the drawing become faster as it should be.
But what is the importance of this css in relation to canvas drawing, as there is no animation going on while drawing something on canvas?
Thanks.
Do you know why this would break my :active states?
If I remover the backface-visibility property, everything works fine. But once it’s included, I can no longer get any sort of :active pseudo state to work.
Thoughts?
I don’t think the backface-visiblity-hidden works on Android 3.0. Looking at it on a Xyboard tablet (running 3.2.2), and it doesn’t appear to do any hiding. Total bummer. I wish Google would get their version of webkit up to snuff.
I agree – I don’t believe this is supported in the Android browser for some reason.
Try this example: http://desandro.github.com/3dtransforms/examples/card-01.html
It works on Chrome/Safari on desktop, even works on Chrome browser app on iOS, but doesn’t work on Android browser (Jelly Bean).
Really useful use-case for a lesser known property!
I’ve just used
-webkit-backface-visibility: hidden
to solve text rendering inconsistencies in webkit where there were lot of animations on a page and text was being rendered thinner (and occasionally flickering) than other pages. This made all text thin but at least it was consistent.it can’t work in IE10 correctly. could you give any idea how to fix it?
See my comment here http://davidwalsh.name/css-flip
Thanks very much. I this is probably the 5th time I’ve fixed something on my site by getting advice from this site. You’re a site-saver, man.
You save my day! Thanks a lot :D
Do not use -webkit-backface-visibility, it’s extremely buggy, and in many cases causes the handle on the vertical scroll bar to disappear. Still buggy as of Chrome 23.
You’re right. …and is still not fixed in Chrome 30. Anyway, is there a better way to prevent the flickering issues Guy mentioned above? I have this issue quite often when working with transitions in Chrome, and I do not really see a pattern behind it…
Don’t work with Internet Explorer
For the record, with FF 16 (OSX 10.5.8) i see the “front” text on the problematic example. Could this property fix an issue on Android stock browser? My client is not doing any 3D rotation, but is experiencing a problem in which an hidden image that should be visible only on :hover, replaces the idle image.
Opera 15, the first Blink-version, supports 3D transforms, so you might want to update the “Browser Support” table.
Also, “Problematic in WebKit because backface-visibility not hidden” goes for Blink (Chrome and new Opera) as well.
Hi guys! Is there a workaround for Opera? maybe a js that will run this effect in Opera only?..
this property doesn’t properly work on iOS7, causes the content to dissapear while being scrolled
This little piece of css made my headings stretch on iOS 7, iOS 7 has been my hell for the last couple of weeks, what happily worked on 6 no longer functions the same on 7, thanks apple.
Even Your Page demo is not working in IE-10 .
FYI…This also caused iOS 7.0.2 chrome and safari to crash for me and took three hours to finally debug it. If you’r mobile browser is crashing this could be the cause if your using it.
Hey Scott! Do you care to say how you finally solved it? I think I’m experiencing crashes because of this.
I can also attest to the same experience as scott… NEVER put *{ backface-visibility:hidden; } NEVER target all elements, only the ones you need to. This was the cause of my site crashing on devices as well.
hey..
that’s property not work on IE.
:(
is there any solution to support it in IE..
I have tried much.. by adding -ms prefixes. and other stuff. but backface-visibility not supports..
problem with flipping on windows xp see the back above the front
Hi copying your tutorial does not reproduce the effect for me.
How to declare a front-face and back-face in html?
dont work on Safari
Thanks for the great article. A while back I followed this guide to create an HTML5 Solitaire game with 3d animations. I think it turned out pretty cool. I love that we can finally do this kind of thing.
I am having issues in chrome where the backface-visibility only works if I have dev-tools opened. I usually develop with them open anyway so it sucked to think I was done with this feature only to find out it’s not working at all.. Does anyone have any solid advice on how to get this to work in chrome… I mean obviously it has the capability if it displays correct with devtools open.
Has anyone ever seen a dead pixel line when using backface-visibility but only on retina screens ?
https://www.dropbox.com/s/eypem6jqhyok2w1/Screenshot%202015-03-11%2011.24.25.png?dl=0
I’m having this issue, too! Ruining a site on retina but removing the rule makes it a little stutter-ey on non-retina. If anyone has any genius solutions, would love to hear!
nice article
I’m trying to get this example because this make the effect every time you hover the element, because I found others that some times don’t make the effect without transition, but this example is not working in IE 10+, neither the page example… Any one could fix it? Thanks!
You save my day! Thanks very much.
Great explanation. I just read another explanation from a different resource and it just didn’t make sense. I think you properly cleared things up for me. Thank you!