CSS3D Transforms

3D Transforms

3D transforms extend 2D transforms into three-dimensional space with depth (Z-axis). Functions like translate3d(), rotateX(), rotateY(), scaleZ() add perspective and depth. Combined with perspective and transform-style: preserve-3d, they create impressive 3D effects without WebGL. Perfect for cards that flip, rotating cubes, and spatial layouts.

3D transform functions

Function

Purpose

Example

translate3d(x,y,z)

Move in 3D space

translate3d(50px, 20px, 30px)

translateX/Y/Z()

Move on single axis

translateZ(50px)

rotateX/Y/Z()

Rotate around axes

rotateX(45deg)

scaleZ()

Scale on Z-axis

scaleZ(2)

scale3d()

Scale all axes

scale3d(1.5, 1.5, 2)

matrix3d()

Full 3D matrix

matrix3d(...)

CSS
/* Basic 3D translate */
.translate-3d {
  transform: translate3d(50px, 20px, 30px);
  /* Moves 50px right, 20px down, 30px toward viewer */
}

/* Rotate around X axis (pitch) */
.rotate-x {
  transform: rotateX(45deg);
  /* Tips top toward viewer */
}

/* Rotate around Y axis (yaw) */
.rotate-y {
  transform: rotateY(45deg);
  /* Tilts right toward viewer */
}

/* Rotate around Z axis (roll - like 2D rotate) */
.rotate-z {
  transform: rotateZ(45deg);
  /* Spins in place */
}

/* Rotate around arbitrary 3D axis */
.rotate-3d-axis {
  transform: rotate3d(1, 1, 0, 45deg);
  /* Rotate 45deg around (1,1,0) vector */
}

/* 3D scale */
.scale-3d {
  transform: scale3d(1.5, 1.5, 2);
  /* Larger X and Y, even larger on Z-axis */
}

/* Scale just Z-axis */
.scale-z {
  transform: scaleZ(1.5);
  /* Affects apparent depth with perspective */
}
Perspective and depth

CSS
/* Perspective creates 3D effect */
.perspective-container {
  perspective: 1000px;
  /* Closer = more extreme 3D effect */
}

.perspective-item {
  transform: rotateY(30deg);
  /* Parent perspective affects child depth */
}

/* Different perspective distances */
.shallow {
  perspective: 2000px;
  /* Far away viewer, subtle depth */
}

.normal {
  perspective: 1000px;
  /* Medium distance, realistic depth */
}

.extreme {
  perspective: 500px;
  /* Close viewer, exaggerated 3D */
}

/* Perspective origin (viewer position) */
.perspective-origin-left {
  perspective: 1000px;
  perspective-origin: left center;
  /* Viewer on the left side */
}

.perspective-origin-top {
  perspective: 1000px;
  perspective-origin: center top;
  /* Viewer above */
}

/* Self perspective (element has its own perspective) */
.self-perspective {
  transform-style: preserve-3d;
  perspective: 1000px;
  /* Element applies perspective to itself */
}

/* Child depth relative to parent perspective */
.parent {
  perspective: 1000px;
}

.child {
  transform: translateZ(100px);
  /* Child appears closer to viewer */
}

.child-back {
  transform: translateZ(-100px);
  /* Child appears farther from viewer */
}
Preserve 3D and nested transforms

CSS
/* Important: preserve-3d for nested 3D elements */

/* Flat (default): children 2D in parent's plane */
.flat-container {
  transform: rotateX(30deg);
  transform-style: flat;
}

.flat-child {
  transform: rotateY(45deg);
  /* Child rotates in parent's plane, not true 3D */
}

/* Preserve-3d: children maintain 3D depth */
.preserve-3d-container {
  transform: rotateX(30deg);
  transform-style: preserve-3d;
}

.preserve-3d-child {
  transform: rotateY(45deg);
  /* Child rotates in true 3D space */
}

/* Building a 3D cube with preserve-3d */
.cube {
  width: 200px;
  height: 200px;
  position: relative;
  transform-style: preserve-3d;
  transform: rotateX(30deg) rotateY(45deg);
}

.cube-face {
  position: absolute;
  width: 200px;
  height: 200px;
  border: 2px solid #3498db;
  display: flex;
  align-items: center;
  justify-content: center;
}

.front {
  transform: translateZ(100px);
  background: rgba(52, 152, 219, 0.8);
}

.back {
  transform: rotateY(180deg) translateZ(100px);
  background: rgba(46, 204, 113, 0.8);
}

.left {
  transform: rotateY(-90deg) translateZ(100px);
  background: rgba(155, 89, 182, 0.8);
}

.right {
  transform: rotateY(90deg) translateZ(100px);
  background: rgba(230, 126, 34, 0.8);
}

.top {
  transform: rotateX(90deg) translateZ(100px);
  background: rgba(231, 76, 60, 0.8);
}

.bottom {
  transform: rotateX(-90deg) translateZ(100px);
  background: rgba(52, 73, 94, 0.8);
}
Common 3D patterns

CSS
/* Flipping card effect */
.flip-container {
  perspective: 1000px;
  width: 300px;
  height: 200px;
}

.flip-card {
  width: 100%;
  height: 100%;
  position: relative;
  transform-style: preserve-3d;
  transition: transform 0.6s;
}

.flip-container:hover .flip-card {
  transform: rotateY(180deg);
}

.flip-front, .flip-back {
  position: absolute;
  width: 100%;
  height: 100%;
  backface-visibility: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
}

.flip-front {
  background: #3498db;
  color: white;
}

.flip-back {
  background: #e74c3c;
  color: white;
  transform: rotateY(180deg);
}

/* 3D carousel */
.carousel-container {
  perspective: 1000px;
  width: 400px;
  height: 400px;
}

.carousel {
  width: 100%;
  height: 100%;
  position: relative;
  transform-style: preserve-3d;
  transform: rotateY(0deg);
  transition: transform 0.8s ease;
}

.carousel-item {
  position: absolute;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 24px;
}

/* Position 6 items in circle */
.item-0 { transform: rotateY(0deg) translateZ(200px); background: #3498db; }
.item-1 { transform: rotateY(60deg) translateZ(200px); background: #e74c3c; }
.item-2 { transform: rotateY(120deg) translateZ(200px); background: #2ecc71; }
.item-3 { transform: rotateY(180deg) translateZ(200px); background: #f39c12; }
.item-4 { transform: rotateY(240deg) translateZ(200px); background: #9b59b6; }
.item-5 { transform: rotateY(300deg) translateZ(200px); background: #1abc9c; }

/* 3D parallax scrolling */
.parallax-container {
  perspective: 1000px;
  overflow: hidden;
}

.parallax-layer {
  transform: translateZ(0px);
  transition: transform 0.3s ease;
}

.parallax-layer-1 {
  transform: translateZ(-50px) scale(1.05);
}

.parallax-layer-2 {
  transform: translateZ(-100px) scale(1.1);
}
3D animation examples

CSS
/* Spinning cube animation */
@keyframes spin-cube {
  0% { transform: rotateX(0deg) rotateY(0deg); }
  100% { transform: rotateX(360deg) rotateY(360deg); }
}

.spinning-cube {
  animation: spin-cube 10s linear infinite;
  transform-style: preserve-3d;
}

/* Floating in 3D space */
@keyframes float-3d {
  0% {
    transform: translateZ(0px) rotateX(0deg) rotateY(0deg);
  }
  50% {
    transform: translateZ(50px) rotateX(15deg) rotateY(15deg);
  }
  100% {
    transform: translateZ(0px) rotateX(0deg) rotateY(0deg);
  }
}

.floating-element {
  animation: float-3d 4s ease-in-out infinite;
}

/* Flip and flip back */
@keyframes flip-animation {
  0% { transform: rotateY(0deg); }
  50% { transform: rotateY(180deg); }
  100% { transform: rotateY(360deg); }
}

.flip-element {
  animation: flip-animation 2s ease-in-out infinite;
}

/* Tilt on mouse move (requires JavaScript) */
.tilt-element {
  transition: transform 0.3s ease;
  transform-style: preserve-3d;
}

/* Depth fade with Z position */
.depth-element {
  animation: move-depth 3s ease-in-out infinite;
}

@keyframes move-depth {
  0% { transform: translateZ(-100px); opacity: 0.5; }
  50% { transform: translateZ(0px); opacity: 1; }
  100% { transform: translateZ(-100px); opacity: 0.5; }
}
Performance and browser support

CSS
/* 3D transforms use GPU acceleration */
.gpu-accelerated {
  transform: translateZ(0);
  /* Forces hardware acceleration */
}

/* Use will-change for animated 3D */
.animated-3d {
  will-change: transform;
  animation: rotate-3d 3s infinite;
}

/* Optimize: use translateZ(0) to hint GPU */
.optimized {
  transform: rotateY(45deg) translateZ(0);
  /* translateZ(0) forces GPU without visual change */
}

/* Browser support is very good for 3D transforms */
.supported {
  transform: rotateX(45deg) rotateY(30deg);
  /* Works in all modern browsers */
}

/* Use -webkit prefix for older webkit browsers */
.prefixed {
  -webkit-perspective: 1000px;
  -webkit-transform-style: preserve-3d;
  -webkit-transform: rotateY(45deg);
  perspective: 1000px;
  transform-style: preserve-3d;
  transform: rotateY(45deg);
}

/* Test 3D support */
@supports (transform: rotateY(1deg)) {
  .has-3d-support {
    transform: rotateY(45deg);
  }
}

@supports not (transform: rotateY(1deg)) {
  .fallback-2d {
    transform: rotate(45deg);
  }
}
Note
3D transforms add depth and perspective to elements. Key concepts: `perspective` creates the 3D viewing distance, `transform-style: preserve-3d` enables nested 3D, `translateZ()` moves along Z-axis, `rotateX/Y/Z()` rotate around axes, `backface-visibility` hides/shows back faces. Use `will-change: transform` for animated 3D. Remember: Z-axis points toward the viewer, negative Z moves away. Browsers handle 3D well with GPU acceleration.
Next
Perspective and perspective-origin: [perspective](/css/perspective).