¿Es posible cambiar solo el alfa de un color de fondo rgba al pasar el mouse?

100

Tengo un conjunto de <a>etiquetas con diferentes colores de fondo rgba pero con el mismo alfa. ¿Es posible escribir un solo estilo CSS que cambie solo la opacidad del atributo rgba?

Un ejemplo rápido del código:

 <a href="#"><img src="" /><div class="brown">Link 1</div></a>
 <a href="#"><img src="" /><div class="green">Link 2</div></a> 

Y los estilos

a {display: block; position: relative}
.brown {position: absolute; bottom: 0; background-color: rgba(118,76,41,.8);}
.green {position: absolute; bottom: 0; background-color: rgba(51,91,11,.8);}

Lo que me gustaría hacer es escribir un estilo único que cambie la opacidad cuando se <a>pasa el cursor sobre él, pero que mantenga el color sin cambios.

Algo como

a:hover .green, a:hover .brown {background-color: rgba(inherit,inherit,inherit,1);}
Fireflight
fuente
Por cierto, ¿qué están divhaciendo tus aelementos en tus elementos?
BoltClock
@mercator: Muy bien. Me lo perdí.
BoltClock
@BoltClock Parecía la forma más sencilla de codificar el efecto, una sola aetiqueta en lugar de una alrededor del texto imgy otra alrededor del texto. El hecho de que sea compatible con HTML 5 es una buena ventaja.
Fireflight
Cuando se hizo esta pregunta, esto no fue posible con CSS. Ahora esto es posible , con variables CSS , como lo he mostrado en mi propia respuesta
Danield

Respuestas:

51

Esto ahora es posible con propiedades personalizadas:

.brown { --rgb: 118, 76, 41; }
.green { --rgb: 51, 91, 11; }

a { display: block; position: relative; }
div { position: absolute; bottom: 0; background-color: rgba(var(--rgb), 0.8); }
a:hover div { background-color: rgba(var(--rgb), 1); }

Para comprender cómo funciona esto, consulte ¿Cómo aplico opacidad a una variable de color CSS?

Si las propiedades personalizadas no son una opción, consulte la respuesta original a continuación.


Desafortunadamente, no, tendrá que especificar los valores rojo, verde y azul nuevamente para cada clase individual:

a { display: block; position: relative; }

.brown { position: absolute; bottom: 0; background-color: rgba(118, 76, 41, 0.8); }
a:hover .brown { background-color: rgba(118, 76, 41, 1); }

.green { position: absolute; bottom: 0; background-color: rgba(51, 91, 11, 0.8); }
a:hover .green { background-color: rgba(51, 91, 11, 1); }

Solo puede usar la inheritpalabra clave sola como valor para la propiedad, e incluso entonces el uso de inheritno es apropiado aquí.

BoltClock
fuente
15

Puede hacer varias cosas para evitar tener que codificar los números si lo desea. Algunos de estos métodos solo funcionan si usa un fondo blanco liso, ya que en realidad agregan blanco en la parte superior en lugar de reducir la opacidad. El primero debería funcionar bien para todo lo proporcionado:

  • aún no estás usando el elemento psuedo para algo; y
  • se puede establecer positionen relativo o absoluto en la <div>etiqueta

Opción 1: ::beforepsuedo-elemento:

.before_method{
  position:relative;
}
.before_method:before{
  display:block;
  content:" ";
  position:absolute;
  z-index:-1;
  background:rgb(18, 176, 41);
  top:0;
  left:0;
  right:0;
  bottom:0;
  opacity:0.5;
}
.before_method:hover:before{
  opacity:1;
}

Opción 2: superposición de gif blanco:

.image_method{
  background-color: rgb(118, 76, 41);
  background-image: url(https://upload.wikimedia.org/wikipedia/commons/f/fc/Translucent_50_percent_white.png)
}
.image_method:hover{
  background-image:none;
}

Opción 3: box-shadowmétodo:

Una variación del método gif, pero puede tener problemas de rendimiento.

.shadow_method{
  background-color: rgb(18, 176, 41);
  box-shadow:inset 0 0 0 99999px rgba(255,255,255,0.2);
}
.shadow_method:hover{
  box-shadow:none;
}

Ejemplos de CodePen: http://codepen.io/chrisboon27/pen/ACdka

Chris Boon
fuente
Buena respuesta, gracias. Encontré la tercera opción útil y más simple si invierto este método: no use nada adicional sin hover, y al hover use: box-shadow: inset 0 0 0 99999px rgba (128,128,128,0.2). Esto fue necesario para mí porque mis filas alternan el blanco y el gris claro, por lo que la respuesta original no cambió el blanco.
Dovev Hefetz
12

No, no es posible.

Sin embargo, podrías probar un preprocesador CSS si quieres hacer este tipo de cosas.

Por lo que pude ver, al menos LESS y Sass tienen funciones que pueden hacer que los colores sean más o menos transparentes.

mercator
fuente
1
Siempre me olvido de SCSS / LESS. Siempre. Quizás necesito comenzar a usarlos realmente.
BoltClock
En SCSS, es transparente ([color], 0.8). Ver sass-lang.com/documentation/Sass/Script/…
Arian Acosta
6

No, eso no es posible.

Si desea utilizar rgba, debe establecer cada valor juntos. No hay forma de cambiar solo el alfa.

treinta y dos
fuente
5

Ahora es 2017 y esto ahora es posible con

Propiedades personalizadas CSS / Variables CSS ( Caniuse )

Un caso de uso clásico de las variables CSS es la capacidad de individualizar partes del valor de una propiedad.

Entonces, aquí, en lugar de repetir toda la expresión rgba una vez más, dividimos o 'individualizamos' los rgbavalores en 2 partes / variables (una para el valor rgb y otra para el alfa)

.brown { 
  --rgb: 118, 76, 41; 
}
.green {
  --rgb: 51, 91, 11;
}
.brown, .green {
  --alpha: 0.3;
  background-color: rgba(var(--rgb), var(--alpha));
}

Luego, al pasar el mouse, ahora podemos modificar la variable --alpha:

a:hover .green, a:hover .brown {
  --alpha: 1;
}

Codepen

Otras lecturas:

Individualización de propiedades CSS con variables CSS (Dan Wilson)

Danield
fuente
3

hay una alternativa, puede agregar una imagen de fondo de degradado lineal al color original.

a{
  background: green
}
a:hover{
  background-image:linear-gradient(hsla(0,0%,0%,.2) 100%,transparent 100%) // darker
}
a:hover{
  background-image:linear-gradient(hsla(255,100%,100%,.2) 100%,transparent 100%) // lighter
}

también, con la propiedad de filtro css3, también puede hacer eso, pero parece que cambiará el color del texto

a:hover{
   filter: brightness(80%) //darker
}
a:hover{
   filter: brightness(120%) //lighter
}

aquí hay un jsfiddle: https://jsfiddle.net/zhangyu911013/epwyL296/2/

Yu Zhang
fuente
hasta ahora la única respuesta satisfactoria para mí.
Andre Elrico
3

Solución simple :

a
{
    position: relative;
    display:inline-block;
    background: rgba(red, 0.75);
    padding: 20px;


   &:before
   {
     content: ' ';
     position: absolute;
     left: 0;
     top: 0;
     width: 100%;
     height: 100%;
   }

   &:hover
   {
     &:before
     {
       background-color: rgba(#000, 0.25); 
     }
   }
}

ejemplo: https://jsfiddle.net/epwyL296/14/

solo juega con alfa de fondo. si desea luz en lugar de oscuridad, simplemente reemplace # 000 por #fff

Matriz
fuente
2

¿Por qué no usar :hovery especificar una opacidad diferente en la clase de desplazamiento?

a:hover {
     opacity:0.6
}
Diodeus - James MacFarlane
fuente
13
Porque eso afecta a todo el elemento.
BoltClock
3
con objetos SVG, es posible usarfill-opacity
Aprillion
1
no solo el elemento completo, sino también todos los elementos secundarios.
Daniel F
2

Tuve un problema similar. Tenía 18 divs diferentes trabajando como botones, y cada uno con un color diferente. En lugar de averiguar los códigos de color para cada uno o usar un selector div: hover para cambiar la opacidad (que afecta a todos los niños), usé la pseudo-clase: antes como en la respuesta de @Chris Boon.

Como quería colorear los elementos individuales, usé: before para crear un div blanco transparente en: hover. Este es un lavado muy básico.

#categories div {
    position:relative;
    width:100px;
    height:100px;
    float:left;
    border:1px solid black;
    display:table-cell;
}

#categories div:before{
    content:"";
    position:absolute;
    top:0px;
    left:0px;
    width:100px;
    height:100px;
}

#categories div:hover:before {
    background-color:white;
    opacity:0.2;
}

#a_Particular_Div {
    background-color:red;
}

Según CanIUse.com, esto debería tener un soporte del 92% a principios de 2014. ( http://caniuse.com/#feat=css-gencontent )

Josías
fuente
2

Puede hacer esto con variables CSS, aunque es un poco complicado.

Primero, configure una variable que contenga solo los valores RGB, en orden, del color que desea usar:

:root {
  --color-success-rgb: 80, 184, 60; 
}

Luego, puede asignar un valor RGBA para un color y extraer todo menos el valor alfa de esta variable:

.button--success {
  background: rgba(var(--color-success-rgb), 0.8);
}

Esto no es muy bonito, pero te permite usar los mismos valores RGB pero diferentes valores alfa para un color.

Adam Hollett
fuente
1
Ésta es una solución razonable al problema. Y, la variable con color no tiene que estar activada :root, puede estar en la clase de elemento, estableciendo su color base. ¡Gracias!
Brad
1

Actualización: Lamentablemente, no es posible hacer eso. Deberá escribir dos selectores separados de:


a.green:hover {background-color: rgba(118,76,41,1);}
a.brown:hover {background-color: rgba(118,76,41,1);}

Según el W3C, la rgbapropiedad no tiene / soporta el inheritvalor.

ayyp
fuente
El problema es que inheritno es un argumento de función válido. Notarás que no funciona con ninguna otra función CSS.
BoltClock
¿Por función te refieres a cosas como rgbay transitions? Porque sé que es compatible con bastantes de las propiedades.
ayyp
Sí, junto con url(), attr()etc. también. inherites un valor de propiedad solamente.
BoltClock
Ya sabía sobre las url()transiciones. Simplemente no estaba 100% seguro rgbaporque se usa para colores. ¡Gracias por educarme :)!
ayyp
1

Enfrenté un problema similar. Esto es lo que hice y funciona bien ( only alpha changes on hover and also the text is not affected) siguiendo los siguientes pasos:

1) Aplique una clase resaltada (o cualquiera de su elección) a cualquier elemento del que desee cambiar el alfa de fondo.

2) Obtenga el color de fondo rgba

3) Guárdelo en una cadena y manipúlelo (cambie alfa) como desee al pasar el mouse (mouseenter y mouseleave)

Código HTML:

<div class="highlighted brown">Link 1</div><br><br>
<div class="highlighted green">Link 1</div>

Código CSS:

.brown {background-color: rgba(118,76,41,.8);}
.green {background-color: rgba(51,91,11,.8);}

Código Javascript:

$(document).on({

            mouseenter: function() {

            var rgba_str = $(this).css("background-color");
            var new_rgba_str ="rgba(" + rgba_str.substring(rgba_str.lastIndexOf("(")+1,rgba_str.lastIndexOf(",")) + ", 0.5)";   

                $(this).css("background-color",new_rgba_str ); 
               },

             mouseleave: function(){

                 var rgba_str = $(this).css("background-color");

            var new_rgba_str ="rgba(" + rgba_str.substring(rgba_str.lastIndexOf("(")+1,rgba_str.lastIndexOf(",")) + ", 0.8)";               
                $(this).css("background-color",new_rgba_str ); 

               }

        },'.highlighted');

Violín de trabajo: http://jsfiddle.net/HGHT6/1/

Rakhi
fuente
0

Solución alternativa simple opacitysi puede adaptarse a un ligero cambio en background-color:

.yourClass {
    // Your style here //
    opacity: 0.9;
}

.yourClass:hover, .yourClass:focus {
    opacity: 0.7;
}

.yourClass:active {
    opacity: 1;
    box-shadow: none;
}

.yourClass:hover, .yourClass:focus, .yourClass:active {
    text-decoration: none;
    outline: none;
}
Alfred Wallace
fuente
-5

Esta es la forma más sencilla; pon esto en tu hoja de estilo CSS:

a:hover { color : #c00; } 

¡hecho!

Dr. nulo
fuente
- Simplemente haga coincidir el color con algo parecido. la opacidad no funciona en todos los navegadores.
dr. null
Tu respuesta tiene un buen truco, pero tu comentario es totalmente irrelevante.
BoltClock