118

我有一组<a>具有不同 rgba 背景颜色但具有相同 alpha 的标签。是否可以编写一个仅更改 rgba 属性的不透明度的 CSS 样式?

代码的快速示例:

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

还有款式

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);}

我想做的是编写一个样式,当<a>鼠标悬停在上面时会改变不透明度,但保持颜色不变。

就像是

a:hover .green, a:hover .brown {background-color: rgba(inherit,inherit,inherit,1);}
4

15 回答 15

66

现在可以使用自定义属性:

.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); }

要了解其工作原理,请参阅如何将不透明度应用于 CSS 颜色变量?

如果自定义属性不是一个选项,请参阅下面的原始答案。


不幸的是,不,您必须为每个单独的类再次指定红色、绿色和蓝色值:

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); }

您只能inherit单独使用关键字作为属性的值,即使如此,inherit这里也不适合使用。

于 2011-08-05T20:52:49.223 回答
16

如果您愿意,您可以做各种事情来避免对数字进行硬编码。其中一些方法仅在您使用纯白色背景时才有效,因为它们实际上是在顶部添加白色而不是降低不透明度。第一个应该适用于提供的所有内容:

  • 您还没有使用伪元素做某事;和
  • 您可以在标签上设置position为相对或绝对<div>

选项 1:::before伪元素:

.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;
}

选项 2:白色 gif 叠加:

.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;
}

选项3:box-shadow方法:

gif 方法的一种变体,但可能存在性能问题。

.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;
}

CodePen 示例:http ://codepen.io/chrisboon27/pen/ACdka

于 2013-06-04T05:05:12.873 回答
13

不,这是不可能的。

不过,如果您想做这种事情,您可以尝试使用CSS 预处理器。

据我所知,至少LESSSass具有可以使颜色更加透明或更加透明的功能。

于 2011-08-05T21:03:33.610 回答
8

现在是 2017 年,现在可以通过

CSS 自定义属性/CSS 变量( Caniuse )

CSS 变量的一个经典用例是能够个性化属性值的各个部分。

因此,在这里,我们不再重复整个 rgba 表达式 - 我们将rgba值拆分或“个性化”为 2 个部分/变量(一个用于 rgb 值,一个用于 alpha)

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

然后,在悬停时,我们现在可以修改 --alpha 变量:

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

a {
  display: block;
  position: relative;
}
.brown { 
  --rgb: 118, 76, 41; 
}
.green {
  --rgb: 51, 91, 11;
}
.brown, .green {
  display: inline-block;
  --alpha: 0.3;
  background-color: rgba(var(--rgb), var(--alpha));
  font-size: 40px;
  margin: 20px;
}

a:hover .green, a:hover .brown {
  --alpha: 1;
}
<a href="#">
  <div class="brown">Link 1</div>
</a>
<a href="#">
  <div class="green">Link 2</div>
</a>

密码笔

进一步阅读:

使用 CSS 变量个性化 CSS 属性 (Dan Wilson)

于 2017-08-02T14:25:50.820 回答
6

不,那是不可能的。

如果要使用rgba,则必须将每个值设置在一起。没有办法只更改 alpha。

于 2011-08-05T20:52:15.263 回答
4

还有一种替代方法,您可以在原始颜色上添加线性渐变背景图像。

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
}

另外,使用 css3 过滤器属性,你也可以这样做,但它似乎会改变文本颜色

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

这是一个jsfiddle:https ://jsfiddle.net/zhangyu911013/epwyL296/2/

于 2017-06-13T07:40:08.823 回答
3

为什么不在:hover悬停类中使用并指定不同的不透明度?

a:hover {
     opacity:0.6
}
于 2011-08-05T20:51:27.977 回答
3

简单的解决方案:

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); 
     }
   }
}

示例:https ://jsfiddle.net/epwyL296/14/

只是玩背景的阿尔法。如果你想要光明而不是黑暗,只需将#000 替换为#fff

于 2018-02-28T10:48:17.460 回答
2

我有一个类似的问题。我有 18 个不同的 div 作为按钮,每个都有不同的颜色。我没有找出每个颜色代码或使用 div:hover 选择器来更改不透明度(这会影响所有孩子),而是使用伪类 :before 就像@Chris Boon 的回答一样。

因为我想对单个元素进行着色,所以我使用 :before 在 :hover 上创建了一个透明的白色 div。这是一个非常基本的冲洗。

#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;
}

根据 CanIUse.com 的说法,截至 2014 年初,这应该有 92% 的支持。(http://caniuse.com/#feat=css-gencontent

于 2014-01-31T17:09:00.223 回答
2

您可以使用 CSS 变量来执行此操作,尽管它有点混乱。

首先,按顺序设置一个仅包含要使用的颜色的 RGB 值的变量:

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

然后,您可以为颜色分配 RGBA 值,并从此变量中提取除 alpha 值之外的所有内容:

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

这不是超级漂亮,但它允许您使用相同的 RGB 值但不同的 alpha 值作为颜色。

于 2017-05-05T13:15:34.020 回答
1

更新:不幸的是,这是不可能的。您需要编写两个单独的选择器:


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

根据 W3C,该rgba属性不具有/不支持该inherit值。

于 2011-08-05T20:48:06.517 回答
1

我遇到了类似的问题。这是我所做的,only alpha changes on hover and also the text is not affected通过以下步骤可以正常工作():

1)将突出显示(或您选择的任何)类应用于您希望更改背景 alpha 的任何元素。

2)获取背景色rgba

3)将它存储在一个字符串中并在悬停时根据需要操作它(更改alpha)(mouseenter和mouseleave)

HTML 代码:

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

CSS 代码:

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

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');

工作小提琴:http: //jsfiddle.net/HGHT6/1/

于 2014-07-08T12:04:58.823 回答
0

简单的解决方法,opacity如果您可以适应以下方面的轻微变化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;
}
于 2018-07-24T16:27:02.603 回答
0

基于张宇的回答:

在 :root 中(或 Blazor 中的父组件)设置 css 变量:

--bg-img-light: linear-gradient(hsla(255,100%,100%,.2) 100%, transparent 100%);
--bg-img-dark: linear-gradient(hsla(0,0%,0%,.2) 100%, transparent 100%);

然后在要应用悬停效果的任何元素上:

.buttontomakelighter:hover {
  background-image: var(--bg-img-light);
}

.buttontomakedarker:hover {
  background-image: var(--bg-img-dark);
}
于 2021-05-08T19:32:22.383 回答
-5

这是最简单的方法;把它放在你的 CSS 样式表中:

a:hover { color : #c00; } 

完毕!

于 2011-08-05T20:52:35.043 回答