Usa transiciones CSS3 con fondos degradados

Intento hacer la transición al pasar el cursor sobre mi página con css sobre una miniatura para que al pasar el cursor, el degradado de fondo se desvanezca. La transición no funciona, pero si simplemente la cambio a un valor rgba (), funciona bien. ¿Los gradientes no son compatibles? Intenté usar una imagen también, tampoco hará la transición de la imagen.

Sé que es posible, ya que en otra publicación alguien lo hizo, pero no entiendo cómo exactamente. Cualquier ayuda> Aquí hay un CSS con el que trabajar:

#container div a { -webkit-transition: background 0.2s linear; -moz-transition: background 0.2s linear; -o-transition: background 0.2s linear; transition: background 0.2s linear; position:absolute; width:200px; height:150px;border: 1px #000 solid; margin:30px;z-index:2 } #container div a:hover { background:-webkit-gradient(radial, 100 75, 100, 100 75, 0, from(rgba(0,0,0,.7)), to(rgba(0,0,0,.4))) } 

Los degradados aún no son compatibles con las transiciones (aunque la especificación actual dice que deberían admitir gradientes para que les gusten las transiciones de gradiente mediante la interpolación).

Si desea un efecto de fundido de entrada con un degradado de fondo, debe establecer una opacidad en un elemento contenedor y ‘transición’ la opacidad.

(Hubo algunos lanzamientos de navegador que admitían transiciones en degradados (por ejemplo, IE 10. Probé las transiciones de gradiente el año pasado y parecían funcionar en ese momento, pero mi código de prueba ya no funciona, tal vez hubo un error en Matrix).

Una solución alternativa es hacer una transición de la posición de fondo para dar el efecto de que el degradado está cambiando: http://sapphion.com/2011/10/css3-gradient-transition-with-background-position/

Transición de gradiente CSS3 con posición de fondo

Aunque no puede animar degradados directamente utilizando la propiedad de transición CSS, es posible animar la propiedad de posición de fondo para lograr una animación de gradiente simple:

El código para esto es completamente simple:

 #DemoGradient{ background: -webkit-linear-gradient(#C7D3DC,#5B798E); background: -moz-linear-gradient(#C7D3DC,#5B798E); background: -o-linear-gradient(#C7D3DC,#5B798E); background: linear-gradient(#C7D3DC,#5B798E); -webkit-transition: background 1s ease-out; -moz-transition: background 1s ease-out; -o-transition: background 1s ease-out; transition: background 1s ease-out; background-size:1px 200px; border-radius: 10px; border: 1px solid #839DB0; cursor:pointer; width: 150px; height: 100px; } #DemoGradient:Hover{ background-position:100px; } 
 

Una solución es usar la posición de fondo para imitar la transición del degradado. Esta solución se utilizó en Twitter Bootstrap hace unos meses.

Actualizar

http://codersblock.blogspot.fr/2013/12/gradient-animation-trick.html?showComment=1390287622614

Aquí hay un ejemplo rápido:

Estado de enlace

  .btn { font-family: "Helvetica Neue", Arial, sans-serif; font-size: 12px; font-weight: 300; position: relative; display: inline-block; text-decoration: none; color: #fff; padding: 20px 40px; background-image: -moz-linear-gradient(top, #50abdf, #1f78aa); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#50abdf), to(#1f78aa)); background-image: -webkit-linear-gradient(top, #50abdf, #1f78aa); background-image: -o-linear-gradient(top, #50abdf, #1f78aa); background-image: linear-gradient(to bottom, #50abdf, #1f78aa); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff50abdf', endColorstr='#ff1f78aa', GradientType=0); background-repeat: repeat-y; background-size: 100% 90px; background-position: 0 -30px; -webkit-transition: all 0.2s linear; -moz-transition: all 0.2s linear; -o-transition: all 0.2s linear; transition: all 0.2s linear; } 

Estado de desplazamiento

 .btn:hover { background-position: 0 0; } 

Sé que es una vieja pregunta, pero si alguien quiere disfrutar de mi forma de solución en CSS puro. Gradiente se desvanece de izquierda a derecha.

 .contener{ background-image:url('http://www.imgbase.info/images/safe-wallpapers/digital_art/3d_landscape/9655_3d_landscape.jpg'); width:300px; height:200px; background-size:cover; border:solid 2px black; } .ed { width: 0px; height: 200px; background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.75)); position: relative; opacity:0; transition:width 20s, opacity 0.6s; } .contener:hover .ed{ width: 300px; background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.75)); position: relative; opacity:1; transition:width 0.4s, opacity 1.1s; transition-delay: width 2s; animation-name: gradient-fade; animation-duration: 1.1s; -webkit-animation-name: gradient-fade; /* Chrome, Safari, Opera */ -webkit-animation-duration: 1.1s; /* Chrome, Safari, Opera */ } /* ANIMACJA */ @-webkit-keyframes gradient-fade { 0% {background:linear-gradient(to right, rgba(0,0,255,0), rgba(255,0,0,0));} 2% {background:linear-gradient(to right, rgba(0,0,255,0.01875), rgba(255,0,0,0));} 4% {background:linear-gradient(to right, rgba(0,0,255,0.0375), rgba(255,0,0,0.0));} 6% {background:linear-gradient(to right, rgba(0,0,255,0.05625), rgba(255,0,0,0.0));} 8% {background:linear-gradient(to right, rgba(0,0,255,0.075), rgba(255,0,0,0));} 10% {background:linear-gradient(to right, rgba(0,0,255,0.09375), rgba(255,0,0,0));} 12% {background:linear-gradient(to right, rgba(0,0,255,0.1125), rgba(255,0,0,0));} 14% {background:linear-gradient(to right, rgba(0,0,255,0.13125), rgba(255,0,0,0));} 16% {background:linear-gradient(to right, rgba(0,0,255,0.15), rgba(255,0,0,0));} 18% {background:linear-gradient(to right, rgba(0,0,255,0.16875), rgba(255,0,0,0));} 20% {background:linear-gradient(to right, rgba(0,0,255,0.1875), rgba(255,0,0,0));} 22% {background:linear-gradient(to right, rgba(0,0,255,0.20625), rgba(255,0,0,0.01875));} 24% {background:linear-gradient(to right, rgba(0,0,255,0.225), rgba(255,0,0,0.0375));} 26% {background:linear-gradient(to right, rgba(0,0,255,0.24375), rgba(255,0,0,0.05625));} 28% {background:linear-gradient(to right, rgba(0,0,255,0.2625), rgba(255,0,0,0.075));} 30% {background:linear-gradient(to right, rgba(0,0,255,0.28125), rgba(255,0,0,0.09375));} 32% {background:linear-gradient(to right, rgba(0,0,255,0.3), rgba(255,0,0,0.1125));} 34% {background:linear-gradient(to right, rgba(0,0,255,0.31875), rgba(255,0,0,0.13125));} 36% {background:linear-gradient(to right, rgba(0,0,255,0.3375), rgba(255,0,0,0.15));} 38% {background:linear-gradient(to right, rgba(0,0,255,0.35625), rgba(255,0,0,0.16875));} 40% {background:linear-gradient(to right, rgba(0,0,255,0.375), rgba(255,0,0,0.1875));} 42% {background:linear-gradient(to right, rgba(0,0,255,0.39375), rgba(255,0,0,0.20625));} 44% {background:linear-gradient(to right, rgba(0,0,255,0.4125), rgba(255,0,0,0.225));} 46% {background:linear-gradient(to right, rgba(0,0,255,0.43125),rgba(255,0,0,0.24375));} 48% {background:linear-gradient(to right, rgba(0,0,255,0.45), rgba(255,0,0,0.2625));} 50% {background:linear-gradient(to right, rgba(0,0,255,0.46875), rgba(255,0,0,0.28125));} 52% {background:linear-gradient(to right, rgba(0,0,255,0.4875), rgba(255,0,0,0.3));} 54% {background:linear-gradient(to right, rgba(0,0,255,0.50625), rgba(255,0,0,0.31875));} 56% {background:linear-gradient(to right, rgba(0,0,255,0.525), rgba(255,0,0,0.3375));} 58% {background:linear-gradient(to right, rgba(0,0,255,0.54375), rgba(255,0,0,0.35625));} 60% {background:linear-gradient(to right, rgba(0,0,255,0.5625), rgba(255,0,0,0.375));} 62% {background:linear-gradient(to right, rgba(0,0,255,0.58125), rgba(255,0,0,0.39375));} 64% {background:linear-gradient(to right,rgba(0,0,255,0.6), rgba(255,0,0,0.4125));} 66% {background:linear-gradient(to right, rgba(0,0,255,0.61875), rgba(255,0,0,0.43125));} 68% {background:linear-gradient(to right, rgba(0,0,255,0.6375), rgba(255,0,0,0.45));} 70% {background:linear-gradient(to right, rgba(0,0,255,0.65625), rgba(255,0,0,0.46875));} 72% {background:linear-gradient(to right, rgba(0,0,255,0.675), rgba(255,0,0,0.4875));} 74% {background:linear-gradient(to right, rgba(0,0,255,0.69375), rgba(255,0,0,0.50625));} 76% {background:linear-gradient(to right, rgba(0,0,255,0.7125), rgba(255,0,0,0.525));} 78% {background:linear-gradient(to right, rgba(0,0,255,0.73125),,rgba(255,0,0,0.54375));} 80% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.5625));} 82% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.58125));} 84% {background:linear-gradient(to right, rgba(0,0,255,0.75),rgba(255,0,0,0.6));} 86% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.61875));} 88% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.6375));} 90% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.65625));} 92% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.675));} 94% {background:linear-gradient(to right, rgba(0,0,255,0.75),rgba(255,0,0,0.69375));} 96% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.7125));} 98% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.73125),);} 100% {background:linear-gradient(to right, rgba(0,0,255,0.75), rgba(255,0,0,0.75));} } 
 

A continuación, una etiqueta de anclaje tiene un hijo y un nieto. El nieto tiene el gradiente de fondo lejano. El niño en el fondo cercano es transparente, pero tiene el gradiente para la transición a. Al desplazarse, la opacidad del niño pasa de 0 a 1 durante un período de 1 segundo.

Aquí está el CSS:

 .bkgrndfar { position:absolute; top:0; left:0; z-index:-2; height:100%; width:100%; background:linear-gradient(#eee, #aaa); } .bkgrndnear { position:absolute; top:0; left:0; height:100%; width:100%; background:radial-gradient(at 50% 50%, blue 1%, aqua 100%); opacity:0; transition: opacity 1s; } a.menulnk { position:relative; text-decoration:none; color:#333; padding: 0 20px; text-align:center; line-height:27px; float:left; } a.menulnk:hover { color:#eee; text-decoration:underline; } /* This transitions child opacity on parent hover */ a.menulnk:hover .bkgrndnear { opacity:1; } 

Y este es el HTML:

 Transgradient 

Lo anterior solo se prueba en la última versión de Chrome. Estas son las imágenes anteriores al vuelo estacionario, a medio camino en vuelo estacionario y en transición completa:

antes deMedio caminoDespués

Puede FALSIFICAR transiciones entre degradados, usando transiciones en la opacidad de algunos degradados astackdos, como se describe en algunas de las respuestas aquí:

Animación CSS3 con degradados .

También puede hacer la transición de posición, como se describe aquí:

Transición de gradiente CSS3 con posición de fondo .

Algunas técnicas más aquí:

Animar gradientes CSS3 .

La solución parcial para la transición de degradado es usar sombreado de cuadro insertado: puede cambiar la sombra de cuadro o el color de fondo; por ejemplo, si crea una sombra de cuadro insertada del mismo color que el fondo y crea una transición en el color de fondo, crea ilusión ese fondo plano está cambiando a gradiente radial

 .button SPAN { padding: 10px 30px; border: 1px solid ##009CC5; -moz-box-shadow: inset 0 0 20px 1px #00a7d1; -webkit-box-shadow: inset 0 0 20px 1px#00a7d1; box-shadow: inset 0 0 20px 1px #00a7d1; background-color: #00a7d1; -webkit-transition: background-color 0.5s linear; -moz-transition: background-color 0.5s linear; -o-transition: background-color 0.5s linear; transition: background-color 0.5s linear; } .button SPAN:hover { background-color: #00c5f7; } 

FWIW, aquí está Sass mixin:

Uso:

@include gradientAnimation(red, blue, .6s);

Mixin:

@mixin gradientAnimation( $start, $end, $transTime ){ background-size: 100%; background-image: linear-gradient($start, $end); position: relative; z-index: 100; &:before { background-image: linear-gradient($end, $start); content: ""; display: block; height: 100%; position: absolute; top: 0; left: 0; opacity: 0; width: 100%; z-index: -100; transition: opacity $transTime; } &:hover { &:before { opacity: 1; } } }

Tomado de esta impresionante publicación en Medium de Dave Lunny: https://medium.com/@dave_lunny/animating-css-gradients-using-only-css-d2fd7671e759

Intente usar: antes y después (ie9 +)

 #wrapper{ width:400px; height:400px; margin:0 auto; border: 1px #000 solid; position:relative;} #wrapper:after, #wrapper:before{ position:absolute; top:0; left:0; width:100%; height:100%; content:''; background: #1e5799; background: -moz-linear-gradient(top, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#1e5799), color-stop(50%,#2989d8), color-stop(51%,#207cca), color-stop(100%,#7db9e8)); background: -webkit-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); background: -o-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); background: -ms-linear-gradient(top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); background: linear-gradient(to bottom, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); opacity:1; z-index:-1; -webkit-transition: all 2s ease-out; -moz-transition: all 2s ease-out; -ms-transition: all 2s ease-out; -o-transition: all 2s ease-out; transition: all 2s ease-out; } #wrapper:after{ opacity:0; background: #87e0fd; background: -moz-linear-gradient(top, #87e0fd 0%, #53cbf1 40%, #05abe0 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#87e0fd), color-stop(40%,#53cbf1), color-stop(100%,#05abe0)); background: -webkit-linear-gradient(top, #87e0fd 0%,#53cbf1 40%,#05abe0 100%); background: -o-linear-gradient(top, #87e0fd 0%,#53cbf1 40%,#05abe0 100%); background: -ms-linear-gradient(top, #87e0fd 0%,#53cbf1 40%,#05abe0 100%); background: linear-gradient(to bottom, #87e0fd 0%,#53cbf1 40%,#05abe0 100%); } #wrapper:hover:before{opacity:0;} #wrapper:hover:after{opacity:1;} 

Como se dijo. Los degradados actualmente no son compatibles con CSS Transitions. Pero podría evitarlo en algunos casos configurando uno de los colores como transparente, de modo que el color de fondo de algún otro elemento de envoltura brille y transite en su lugar.

Uso esto en el trabajo 🙂 IE6 + https://gist.github.com/GrzegorzPerko/7183390

No olvide Text si usa un elemento de texto.

 .ahover { display: block; /** text-indent: -999em; ** if u use only only img **/ position: relative; } .ahover:after { content: ""; height: 100%; left: 0; opacity: 0; position: absolute; top: 0; transition: all 0.5s ease 0s; width: 100%; z-index: 1; } .ahover:hover:after { opacity: 1; } .ahover span { display: block; position: relative; z-index: 2; } 

Encontré un buen truco en el codepen que modifica la propiedad de opacity pero logra ese desvanecimiento de un gradiente a otro mediante el aprovechamiento de pseudo-elementos. Lo que hace es establecer un :after modo que cuando cambies la opacidad del elemento real, el elemento :after aparezca para que parezca un fundido. Pensé que sería útil compartir.

Codepen original: http://codepen.io/sashtown/pen/DfdHh

 .button { display: inline-block; margin-top: 10%; padding: 1em 2em; font-size: 2em; color: #fff; font-family: arial, sans-serif; text-decoration: none; border-radius: 0.3em; position: relative; background-color: #ccc; background-image: linear-gradient(to top, #6d8aa0, #8ba2b4); -webkit-backface-visibility: hidden; z-index: 1; } .button:after { position: absolute; content: ''; top: 0; left: 0; width: 100%; height: 100%; border-radius: 0.3em; background-image: linear-gradient(to top, #ca5f5e, #d68584); transition: opacity 0.5s ease-out; z-index: 2; opacity: 0; } .button:hover:after { opacity: 1; } .button span { position: relative; z-index: 3; } body { text-align: center; background: #ddd; } 
 BUTTON 

No puede dejar de publicar otra vista, ya que todavía no hay una forma oficial de hacerlo. Escribió un plugin jQuery ligero con el que puede definir un degradado radial de fondo y una velocidad de transición. Este uso básico lo dejará fundirse, optimizado con requestAnimationFrame (muy suave):

 $('#element').gradientFade({ duration: 2000, from: '(20,20,20,1)', to: '(120,120,120,0)' }); 

http://codepen.io/Shikkediel/pen/xbRaZz?editors=001

Mantiene el fondo original y todas las propiedades intactas. También tiene un seguimiento de destacado como una configuración:

http://codepen.io/Shikkediel/pen/VYRZZY?editors=001

Basado en el código CSS de su pregunta, he intentado con el código de la siguiente manera y funciona para mí (ejecute el fragmento de código), y por favor intente por su cuenta:

 #container div a { display: inline-block; margin-top: 10%; padding: 1em 2em; font-size: 2em; color: #fff; font-family: arial, sans-serif; text-decoration: none; border-radius: 0.3em; position: relative; background-color: #ccc; background-image: linear-gradient(to top, #C0357E, #EE5840); -webkit-backface-visibility: hidden; z-index: 1; } #container div a:after { position: absolute; content: ''; top: 0; left: 0; width: 100%; height: 100%; border-radius: 0.3em; background-image: linear-gradient(to top, #6d8aa0, #343436); transition: opacity 0.5s ease-out; z-index: 2; opacity: 0; } #container div a:hover:after { opacity: 1; } #container div a span { position: relative; z-index: 3; } 
  

Quería que un div pareciera una esfera 3D y una transición a través de los colores. Descubrí que los colores de fondo degradados no tienen transición (aún). Coloqué un fondo de degradado radial delante del elemento (usando el índice z) con un fondo sólido en transición.

 /* overlay */ z-index : 1; background : radial-gradient( ellipse at 25% 25%, rgba( 255, 255, 255, 0 ) 0%, rgba( 0, 0, 0, 1 ) 100% ); 

entonces el div.ball debajo:

 transition : all 1s cubic-bezier(0.25, 0.46, 0.45, 0.94); 

luego cambió el color de fondo de div.ball y voila!

https://codepen.io/keldon/pen/dzPxZP