The backface-visibility property sets whether the back of an element is drawn when a 3D turn points that side at you. The back is a mirror image of the front. Flat layout never shows it.
hidden is the value used on a flip card, so each side shows its own text. The initial value is visible. It is not inherited. Set it on the element you rotate with transform, usually rotateY() or rotateX(). The keyword changes in one step. There is no fade.
Standard-track.
Not deprecated and not experimental. Baseline widely available since March 2022. It belongs to CSS Transforms, and it only affects a 3D turn.
Turn the element in 3D, then choose whether the back face is painted.
Turn the element with transform: rotateY(), rotateX(), or rotate3d(). The rotate property can do the same job with rotate: y 180deg. A flat rotate(180deg) has no back face.
Set backface-visibility on that same element. The initial value is visible, and the property is not inherited.
Use hidden when the back should stay undrawn, such as each side of a card.
Frame the card.inline-block, padding, and the border draw a stage that hugs the card. perspective: 400px is the viewing distance for the turn.
Turn it around.rotateY(180deg) points the back face at you.
Paint that face.backface-visibility: visible draws it, so the word Front is a mirror image. visible is the default, so leaving the line out looks the same.
Center the word. Width, height, color, and line-height make one readable line. The keyword is what chooses the face.
Stack the faces.position: relative on the card and absolute with inset: 0 on each face put Front and Back in the same 140 by 90 box.
Prepare the back label.rotateY(180deg) on .back turns that face so its text reads normally after the card turns.
Hide each back, then turn the card.backface-visibility: hidden is on both faces, and rotateY(180deg) is on .card. Front's back points at you, so Front is not painted. You read Back.
Keep the faces in 3D.transform-style: preserve-3d on .card lets each face hide on its own. perspective on the section is the viewing distance. A hidden face also lets clicks through to the face that is showing.
Edge Cases & Pitfalls
If the face does not hide, one of these is usually why.
flat
A flat turn has no back face
rotate() and rotateZ() stay in the screen plane. hidden changes nothing. Use rotateY(), rotateX(), or rotate3d() on transform.
inherit
The parent value stays on the parent
The property is not inherited. A rotated child still shows its mirror until that child sets hidden, or sets inherit.
faces
Two faces need preserve-3d
The default transform-style is flat. Children are painted into the parent's plane first, so you see a mirrored Front. Set preserve-3d on the element that turns.
overflow
overflow can cancel preserve-3d
On the same element, overflow other than visible makes preserve-3d compute to flat. The two faces then collapse into one mirrored layer.
motion
A spin should respect reduced motion
Keep hidden on the faces either way. When the turn is animated with transition, a prefers-reduced-motion query should show the end state without the spin.
Compatibility
Browser Support
backface-visibility is a browser painting property for 3D transforms. Node.js, Deno, and Bun do not apply it.
✓ Baseline · Since March 2022
backface-visibility
Unprefixed: Chrome 36+, Firefox 16+, Safari 15.4+, Edge 12+, Opera 23+. Internet Explorer 10 supports the property. Older WebKit builds need a prefix.
97%Unprefixed support
Google Chrome36+ · 12+ with -webkit-
Full support
Mozilla Firefox16+ · 10+ with -moz-
Full support
Apple Safari15.4+ · 5.1+ with -webkit-
Full support
Microsoft Edge12+
Full support
Opera23+
Full support
Samsung Internet3+
Full support
Internet Explorer10+
Full support
backface-visibilityWidely supported
Bottom line: Current browsers use the unprefixed property. Safari 5.1 through 15.3 and Chrome 12 through 35 need -webkit-backface-visibility. Firefox 10 through 15 needs -moz-backface-visibility. Internet Explorer 10 paints a single rotated face, and it ignores transform-style: preserve-3d, so the two-face card stays flat there. Android WebView supports the unprefixed property from version 37.
Remember
Key Takeaways
Role: show or hide the back face when a 3D turn points it at the viewer.
Default:visible draws a mirror of the front. hidden leaves that face undrawn.
Two faces:preserve-3d on the parent, and hidden on each face.
Scope: set it on the rotated element. It is not inherited. A flat rotate() has no back face.
One line:hidden is how a flip card shows one readable side after rotateY(180deg).
Frequently Asked Questions
It decides whether the back of an element is drawn when a 3D turn points that side at you. The back is a mirror image of the front.
The element is probably still facing you, or the turn is flat. hidden applies after the back faces the viewer, which means a 3D rotation such as rotateY or rotateX past 90 degrees. rotate() and rotateZ() stay flat, so there is no back face to hide.
visible paints the back face, so the text looks mirrored. hidden leaves that face undrawn. visible is the initial value. At 0 degrees both keywords look the same, because the front is toward you.
perspective sets the viewing distance and makes the turn look 3D. The mirror at 180 degrees still happens without it. transform-style: preserve-3d is required when a parent holds separate faces, so each face can hide its own back.
No. A rotated child keeps the default visible until you set the property on that child, or until you set inherit. Put it on the element that turns.
Unprefixed support is Chrome 36, Firefox 16, Safari 15.4, and Edge 12. Internet Explorer 10 supports the property. It is a browser painting property, not a Node.js, Deno, or Bun feature. Older Safari and Chrome needed a -webkit- prefix.