Learn how to make elements zoom/scale-up on hover with pure CSS by using the transform
property’s transformation method: scale()
.
Zoom/Scale-Up on hover
Try moving your mouse over this box:
It scales up exactly 1.5 times the original size — so it becomes 50% bigger when you move your mouse over (hover) it.
The CSS
transform
property’s scale method can either increase or decrease the size of elements. It works in both 3D and 2D. In this simple example, we use 2D.
To recreate the example above, we need 1 HTML element and 2 CSS rule-sets.
The HTML
First create your HTML element with a class called zoom-box
:
<div class="zoom-box"></div>
The CSS
Then add this CSS to your stylesheet:
.zoom-box {
background-color:#CF4B32;
width: 100px;
height: 100px;
margin: 32px auto;
transition: transform .2s; /* Animation */
}
.zoom-box:hover {
transform: scale(1.5);
}
That’s it!
How the code works
- First, we create an HTML div element with a class attribute called
zoom-box
. - Then we create two rule-sets for the zoom box class, one for the static default state,
.zoom-box
and one for the dynamic hover state,.zoom-box:hover
. - The first rule-set gets some cosmetic/size properties (
height, width, color
). Themargin
property is just to center align the box (optional). - The important part of the
.zoom-box
class is thetransition
property with the value oftransform
and duration of.2s
(200 milliseconds). - In the second rule-set
.zoom-box:hover
we add thetransform
property, with thescale()
method as a value. It takes a parameter1.5
which is what dictates how much the box element should scale up on hover. 1.5 is like saying 150% of the original size.
Browser compatibility
Here’s the code from this tutorial with added browser vender prefixes, so it works in all the mainstream browsers, Chrome, Firefox, Safari, Opera:
.zoom-box {
background-color: #cf4b32;
width: 100px;
height: 100px;
margin: 32px auto;
-webkit-transition: -webkit-transform 0.2s;
transition: -webkit-transform 0.2s;
transition: transform 0.2s;
transition: transform 0.2s, -webkit-transform 0.2s; /* Animation */
}
.zoom-box:hover {
-webkit-transform: scale(1.5);
transform: scale(1.5);
}
Good to know
Notice that the box element scales up and down with the same transition duration/timing, even though we only added the transition
property to the .zoom-box
class.
This happens because when the transition
property is added to the original class selector (.zoom-box
), its values are automatically added to every additional selector attached to the class, in this case, it’s :hover
(also called a pseudo-class)
If you only add the transition
property to the :hover
(pseudo) selector class, then it only animates the scale-up part — not scale down. As soon as you move outside of the box element, it abruptly scales down with zero (0s) duration — which you rarely want, since it’s harsh on the eyes.
If you want to use different animation types and duration on the different states of your element (up/down), you simply add a transition
property to the :hover
pseudo-class selector, and give it different values.