Skip to content

Tailwind CSS - Translate

# Tailwind CSS: Mastering Translate & Transforms

Section titled “# Tailwind CSS: Mastering Translate & Transforms”

Translate utilities allow you to move an element on the X or Y axis. This is a type of CSS transform, meaning it moves the element visually without affecting the position of other elements in the layout flow, unlike margins. This makes it ideal for animations and interactive UI effects.

The naming convention is simple: translate-{axis}-{amount}. The {amount} is pulled from the spacing scale defined in your tailwind.config.js.

Class PatternExamples
translate-x-{amount}translate-x-4 (moves 1rem right), translate-x-1/2 (moves 50% right), -translate-x-full (moves 100% left)
translate-y-{amount}translate-y-8 (moves 2rem down), translate-y-px (moves 1px down), -translate-y-1/2 (moves 50% up)

You can use negative values by adding a - prefix to the class, which reverses the direction of the translation.

One of Tailwind’s most powerful features is how it intelligently combines multiple transform utilities (translate, scale, rotate, skew) into a single CSS transform property. This lets you compose complex transformations declaratively.

<!-- This button will move up, scale up, and rotate slightly on hover -->
<button class="transition-transform duration-300
hover:-translate-y-1 hover:scale-110 hover:rotate-3">
Transform Me
</button>

A classic use case for translate is creating an off-canvas sidebar that slides into view. This example combines translate utilities with transitions and a small amount of JavaScript to toggle the menu’s state.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Off-Canvas Menu</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-slate-100">
<div class="p-8">
<button id="open-menu" class="rounded-lg bg-blue-600 px-5 py-2.5 text-white font-medium hover:bg-blue-700">
Open Menu
</button>
</div>
<!-- The menu container -->
<div id="menu-backdrop" class="fixed inset-0 bg-black/30 z-40 hidden"></div>
<!-- The off-canvas menu itself -->
<div id="menu"
class="fixed top-0 right-0 bottom-0 z-50 w-80 bg-white shadow-lg
transform transition-transform duration-300 ease-in-out translate-x-full">
<div class="p-6">
<h2 class="text-lg font-semibold">Menu</h2>
<ul class="mt-4 space-y-2">
<li><a href="#" class="block p-2 rounded hover:bg-gray-100">Home</a></li>
<li><a href="#" class="block p-2 rounded hover:bg-gray-100">About</a></li>
<li><a href="#" class="block p-2 rounded hover:bg-gray-100">Contact</a></li>
</ul>
<button id="close-menu" class="mt-6 w-full rounded-lg bg-gray-200 py-2">Close</button>
</div>
</div>
<script>
const menu = document.getElementById('menu');
const backdrop = document.getElementById('menu-backdrop');
const openBtn = document.getElementById('open-menu');
const closeBtn = document.getElementById('close-menu');
const openMenu = () => {
backdrop.classList.remove('hidden');
menu.classList.remove('translate-x-full');
};
const closeMenu = () => {
backdrop.classList.add('hidden');
menu.classList.add('translate-x-full');
};
openBtn.addEventListener('click', openMenu);
closeBtn.addEventListener('click', closeMenu);
backdrop.addEventListener('click', closeMenu);
</script>
</body>
</html>

For translations that require a specific pixel value not present in your theme, use arbitrary values.

<div class="translate-x-[17px] -translate-y-[23px]">
Precisely positioned.
</div>

For silky-smooth animations, you can hint to the browser that it should use the GPU for rendering the transform. Tailwind provides the transform-gpu utility for this. It’s often a good idea to add this alongside your transition utilities for elements that move.

<!-- transform-gpu promotes the element to its own compositing layer -->
<div class="transition transform-gpu hover:-translate-y-2">
Smoothly animated card
</div>