css – Smooth change of button background from gradient to transparent

Question:

I have a button with a linear gradient background, orange border and text.

When hovering over the button, I want the background to become transparent without changing the other properties of the button. I tried to set the opacity to zero, but obviously that will hide the border and the text.

I also tried to move the background , but that doesn't work because I don't have an endpoint for the transition , since the background needs to be transparent.

body {
    background-color: darkblue;
}

.button {
    background-image: linear-gradient(red,yellow);
    border: solid orange 2px;
    border-radius: 10px;
    color: white;
    padding: 15px 25px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 24px;
}
<button class="button">Submit</button>

CSS button transition linear-gradient background into transparent background]( https://stackoverflow.com/q/54855781/7394871 ) by @Nick .

Answer:

When using a pseudo element for the background, you can easily do this:

body {
  background-color: darkblue;
}

.button {
  border: solid orange 2px;
  border-radius: 10px;
  color: white;
  padding: 15px 25px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 24px;
  position: relative;
  overflow: hidden;
  z-index:0;
  background:transparent;
}

.button::before {
  content: "";
  position: absolute;
  z-index:-1;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-image: linear-gradient(red, yellow);
  transition:1s;
}
.button:hover::before {
  opacity:0;
}
<button class="button">Submit</button>

Here is another idea without using pseudo element where you can use background-color and background-size change.

The trick is to keep one of the gradient colors transparent so we can see background-color (you can have a transition to transparent).

Then you increase the background-size to hide the bottom color and we only see the transparent one.

body {
  background-color: darkblue;
}

.button {
  border: solid orange 2px;
  background-image: linear-gradient(transparent, yellow);
  background-size:100% 100%;
  background-color:red;
  border-radius: 10px;
  color: white;
  padding: 15px 25px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 24px;
  transition:1s;
}

.button:hover {
  background-color:transparent;
  background-size:100% 500%;
}
<button class="button">Submit</button>

Or consider adjusting the background size to have a different kind of transition :

body {
  background-color: darkblue;
}

.button {
  border: solid orange 2px;
  background: 
    linear-gradient(red, yellow),
    transparent;
  background-size:100% 100%;
  background-position:left; /*change this to change the way the transtion happen*/
  background-repeat:no-repeat;
  border-radius: 10px;
  color: white;
  padding: 15px 25px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 24px;
  transition:1s;
}

.button:hover {
  background-size:0% 100%;
}
<button class="button">Submit</button>

A loose translation of the CSS button transition linear-gradient background into transparent background answer by @Temani Afif .

Scroll to Top