Changing SVG Icon Colour on Hover
In today's post, I will share several techniques to change SVG colour on hover. Let's dive right in.
Recently, I was working on a project that required building a testimonial carousel using a third-party library.
Firstly, let's look at how to change the SVG colour on hover when you're using inline SVG. Here's the HTML structure:
I will use a simple example of testimonial navigation arrows.
<div class="testimonials"> <div class="testimonial"> Discovering 'Brew Bliss' was a game-changer for me. Their single-origin Ethiopian blend was bold, smooth, and unforgettable. Excellent customer service and commitment to sustainability further impressed me. It's not just about buying coffee, it's a sensory experience. Don't miss out! </div> <div class="navigation"> <button class="button previous"> <svg viewBox="0 0 24 24"><path d="M16.7 23.5a2 2 0 0 1-1.4-.6l-9.5-9.5a2 2 0 0 1 0-2.8l9.5-9.5a2 2 0 0 1 2.8 0c.8.8.8 2 0 2.8l-8 8.1 8.1 8.1c.8.8.8 2 0 2.8-.4.4-1 .6-1.5.6z"/></svg> </button> <button class="button next"> <svg viewBox="0 0 24 24"><path d="M16.7 23.5a2 2 0 0 1-1.4-.6l-9.5-9.5a2 2 0 0 1 0-2.8l9.5-9.5a2 2 0 0 1 2.8 0c.8.8.8 2 0 2.8l-8 8.1 8.1 8.1c.8.8.8 2 0 2.8-.4.4-1 .6-1.5.6z"/></svg> </button> </div> </div>
The above HTML structure has a single testimonial and navigation arrow buttons for transitioning between the previous and next testimonials.
Now, let's style these elements:
.testimonials { display: flex; flex-direction: column; max-width: 600px; margin: auto; } .testimonial { padding: 34px; font-family: sans-serif; line-height: 1.4; } .navigation { display: flex; justify-content: space-between; } .button { display: flex; padding: 4px; justify-content: space-between; width: 36px; height: 36px; border: none; border-radius: 8px; background: #F8F8F2; svg { fill: #D5D5D5; } &:hover { background: #D5D5D5; svg { fill: #5290BF; } } } .next { svg { transform: rotate(180deg); } }
In the above style file, we change the SVG fill on hover. You can play around with this example on Fiddle
However, while working on my project, I noticed that the carousel library used CSS content property to add SVG arrows. This posed a challenge, and I had two options to resolve it.
Using SVG in CSS content property and changing it on hover
Here is an updated style for the same HTML structure.
.testimonials { display: flex; flex-direction: column; max-width: 600px; margin: auto; } .testimonial { padding: 34px; font-family: sans-serif; line-height: 1.4; } .navigation { display: flex; justify-content: space-between; } .arrow { display: flex; padding: 4px; justify-content: center; align-items: center; width: 36px; height: 36px; border: none; border-radius: 8px; background: #F8F8F2; content: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M16.7 23.5a2 2 0 0 1-1.4-.6l-9.5-9.5a2 2 0 0 1 0-2.8l9.5-9.5a2 2 0 0 1 2.8 0c.8.8.8 2 0 2.8l-8 8.1 8.1 8.1c.8.8.8 2 0 2.8-.4.4-1 .6-1.5.6z' fill='%23d5d5d5'/%3E%3C/svg%3E"); &:hover { content: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M16.7 23.5a2 2 0 0 1-1.4-.6l-9.5-9.5a2 2 0 0 1 0-2.8l9.5-9.5a2 2 0 0 1 2.8 0c.8.8.8 2 0 2.8l-8 8.1 8.1 8.1c.8.8.8 2 0 2.8-.4.4-1 .6-1.5.6z' fill='%235290BF'/%3E%3C/svg%3E"); background: #D5D5D5; } } .arrow-next { transform: rotate(180deg); }
In this example I am using encoded SVG in the CSS content property and replacing it on hover.
You can play around with this example on Fiddle
Leveraging CSS mask property
In this example I am using the CSS mask property and the color of the SVG is controlled by the background property. You can also use and image and gradient.
Because I want to keep the button background I need to do some changes to the HTML:
... <button class="arrow arrow-previous"><span class="arrow-icon"></span></button> <button class="arrow arrow-next"><span class="arrow-icon"></span></button> ...
Here is updated style file:
.testimonials { display: flex; flex-direction: column; max-width: 600px; margin: auto; } .testimonial { padding: 34px; font-family: sans-serif; line-height: 1.4; } .navigation { display: flex; justify-content: space-between; } .arrow-icon { display: block; width: 24px; height: 24px; background: black; -webkit-mask: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M16.7 23.5a2 2 0 0 1-1.4-.6l-9.5-9.5a2 2 0 0 1 0-2.8l9.5-9.5a2 2 0 0 1 2.8 0c.8.8.8 2 0 2.8l-8 8.1 8.1 8.1c.8.8.8 2 0 2.8-.4.4-1 .6-1.5.6z'/%3E%3C/svg%3E") no-repeat center; mask: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M16.7 23.5a2 2 0 0 1-1.4-.6l-9.5-9.5a2 2 0 0 1 0-2.8l9.5-9.5a2 2 0 0 1 2.8 0c.8.8.8 2 0 2.8l-8 8.1 8.1 8.1c.8.8.8 2 0 2.8-.4.4-1 .6-1.5.6z'/%3E%3C/svg%3E") no-repeat center; mask-size: cover; } .arrow { display: flex; padding: 4px; justify-content: center; align-items: center; width: 36px; height: 36px; border: none; border-radius: 8px; background: #F8F8F2; &:hover { background: #D5D5D5; .arrow-icon { background: #5290BF; } } } .arrow-next { transform: rotate(180deg); }
You can play around with this example on Fiddle
And there you have it! Three handy tricks to make your SVGs change color on hover. Until next time, happy coding!