Fir*_*ght 92 css hover css3 background-color rgba
我有一组<a>
标签具有不同的rgba背景颜色但相同的alpha.是否可以编写单个css样式,仅更改rgba属性的不透明度?
代码的快速示例:
<a href="#"><img src="" /><div class="brown">Link 1</div></a>
<a href="#"><img src="" /><div class="green">Link 2</div></a>
Run Code Online (Sandbox Code Playgroud)
和风格
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);}
Run Code Online (Sandbox Code Playgroud)
我想要做的是写一个单一的样式,它会在<a>
悬停时改变不透明度,但保持颜色不变.
就像是
a:hover .green, a:hover .brown {background-color: rgba(inherit,inherit,inherit,1);}
Run Code Online (Sandbox Code Playgroud)
Bol*_*ock 44
现在可以使用自定义属性:
.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); }
Run Code Online (Sandbox Code Playgroud)
要了解其工作原理,请参阅如何将不透明度应用于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); }
Run Code Online (Sandbox Code Playgroud)
您只能将inherit
关键字单独用作属性的值,即使这样使用inherit
也不合适.
小智 14
如果你愿意,你可以做各种事情以避免硬编码.其中一些方法仅在使用纯白色背景时才有效,因为它们实际上是在顶部添加白色而不是降低不透明度.第一个应该适用于所提供的一切:
position
在<div>
标签上设置为相对或绝对::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;
}
Run Code Online (Sandbox Code Playgroud)
.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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
CodePen示例:http://codepen.io/chrisboon27/pen/ACdka
还有一种替代方法,您可以在原始颜色上添加线性渐变背景图像。
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
}
Run Code Online (Sandbox Code Playgroud)
另外,使用css3过滤器属性,你也可以这样做,但它似乎会改变文本颜色
a:hover{
filter: brightness(80%) //darker
}
a:hover{
filter: brightness(120%) //lighter
}
Run Code Online (Sandbox Code Playgroud)
这是一个jsfiddle:https ://jsfiddle.net/zhangyu911013/epwyL296/2/
它现在是2017年,现在可以实现
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));
}
Run Code Online (Sandbox Code Playgroud)
然后,在悬停时我们现在可以修改--alpha变量:
a:hover .green, a:hover .brown {
--alpha: 1;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
<a href="#">
<div class="brown">Link 1</div>
</a>
<a href="#">
<div class="green">Link 2</div>
</a>
Run Code Online (Sandbox Code Playgroud)