Creating Visual Interest: How to Use MouseMove Hover to Reveal Background Images

Creating Visual Interest: How to Use MouseMove Hover to Reveal Background Images


5 min read

Canva celebrated 15 billion designs on its platform on February 15, 2023, marking a huge milestone for the company. To celebrate the event, the company created a special background image featuring designs made on the platform. When you move your mouse around the page, the image gets revealed, creating a cool effect. I found it interesting and decided to recreate it using HTML, CSS, and JavaScript. This article will show you how to recreate the effect step by step.

Canva homepage celebrating 15 billion designs


This article assumes you have a basic knowledge of HTML, CSS and JavaScript. You'll also need a code editor and a web browser. I'll be using VS Code and Chrome, but you can use whatever you like.

To follow along, clone or download the starter files here

Getting Started

First, create the HTML markup for the container and background image. The container is where the background image will be revealed on hover.

<div class="container">
  <h1>Thanks for <u>15 billion designs!</u></h1>
  <input type="text" placeholder="Search your content or Canva's" />
  <div class="hover"></div>

The container is where all the content will be. The hover div is empty for now, but we will add the background image using CSS.

Styling the Container

Next, copy the following CSS into the styles.css file. This will style the container and the other elements in the app.

.container {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  margin: auto;
  width: 100%;
  height: 25rem;
  background: linear-gradient(
    #cc00c4 8.94%,
    #7d2ae8 54.02%,
    #00c4cc 95.49%
  border-radius: 8px;
  text-align: center;
  padding: 0.5rem;
  overflow: hidden;

h1 {
  color: #fff;
  font-size: 3rem;
  position: relative;
  z-index: 10;
  margin-top: 1rem;

input {
  position: relative;
  margin-top: 2rem;
  padding: 9px 4px 9px 40px;
  border: 1px solid #2b3b4a4d;
  outline: none;
  color: #0d1216;
  padding: 0 12px;
  font-size: 1rem;
  border-radius: 4px;
  height: 2.5rem;
  width: 40rem;
  max-width: 100%;
  z-index: 10;

In the CSS above, we set the container to position: relative so that we can position the background image inside it. We also set the overflow property to hidden so that the background image doesn't overflow the container.

We also set the z-index property of the h1 and input elements to 10 so that they appear above or on top of the background image.

Here is what we have so far:

Static website Design that reads Thanks for 15 billion designs!

Adding the Background Image

Next, we'll target the .hover class and add the background image. We'll also set the position property to absolute so that we can position the image inside the container.

Copy the following CSS into the styles.css file:

.hover {
  opacity: 0;
  position: absolute;
  transition: all 0.5s ease;
  width: 10rem;
  height: 10rem;
  background: url(img/giphy.gif) 50% 50% fixed;
  border-radius: 50%;
  box-shadow: 0 0 30px 30px rgba(255, 255, 255, 0.15);
  filter: blur(1px);
  z-index: 5;

The opacity property is set to 0 so that the image is hidden by default. We'll use JavaScript to change the opacity to 1 when the user hovers over the container.

Additionally, for the background property, we used the shorthand syntax to set the background image, position, size and repeat. We also set the fixed value for the background-attachment property so that the image stays in place when the mouse moves around.

If you prefer, you can use the longhand syntax to set the background image, position, size and repeat:

background-image: url(img/giphy.gif);
background-position: 50% 50%;
background-attachment: fixed;

Revealing the Background Image

To reveal the background image, we'll use JavaScript to track the movement of the user's mouse cursor and change the opacity of the background image.

Create a new file called app.js and add the following code:

const hover = document.querySelector(".hover");
const hoverWHalf = hover.offsetWidth / 1.5;
const container = document.querySelector(".container");

container.addEventListener("mousemove", (e) => { = e.pageX - hoverWHalf + "px"; = e.pageY - hoverWHalf + "px"; = "1";

In the code above, we first select the .hover and .container elements using the querySelector method.

Then, we add an event listener to the container element. The event listener listens for the mousemove event, so that whenever the user moves their mouse over the container, the code will calculate the position of the .hover element and update its position and opacity dynamically.

Specifically, it calculates the horizontal and vertical midpoint of the .hover element using the offsetWidth property and then subtracts half of this value from the pageX and pageY properties of the mousemove event to determine the position of the .hover element relative to the mouse cursor.

Don't forget to link the app.js file inside the index.html file ;)

<script src="app.js"></script>

With this, we have successfully created the mousemove hover effect. Here is the final result:

Check out the live demo and source code on Github.

Our Replica of the background image reveal effect


And there you have it! You've made it to the end of this article on creating visual interest using the MouseMove hover effect with HTML, CSS, and JavaScript. By now, you should have a good understanding of how to use this technique to add some excitement and creativity to your website.

Remember, there are countless ways to customize this effect and make it your own. Don't be afraid to experiment with different images, colours, and animations to create a look that perfectly matches your brand or personal style.

As you continue to develop your web design skills, be sure to keep an eye out for new and exciting trends in the industry. Who knows, you might just discover the next big thing :)

Thank you for reading! I hope you found this article helpful. If you did, kindly like and share it with your friends and colleagues :)

I would love to connect with you on Twitter | LinkedIn | Github | Portfolio.