可以在CSS中设置边框不透明度吗?


409

是否有一种简单的CSS方法可以使像这样的元素的边界半透明?

border-opacity: 0.7;

如果没有,是否有人知道我不使用图像怎么办?

Answers:


626

不幸的是,该opacity元素使整个元素(包括任何文本)都是半透明的。使边框半透明的最佳方法是使用rgba颜色格式。例如,这将给出不透明度为50%的红色边框:

div {
    border: 1px solid rgba(255, 0, 0, .5);
    -webkit-background-clip: padding-box; /* for Safari */
    background-clip: padding-box; /* for IE9+, Firefox 4+, Opera, Chrome */
}

这种方法的问题在于,rgba如果这是整个声明,则某些浏览器将无法理解该格式,并且根本不会显示任何边框。解决方案是提供两个边界声明。第一个具有假的不透明性,第二个具有实际的不透明性。如果浏览器有能力,它将使用第二个浏览器,否则将使用第一个。

div {
    border: 1px solid rgb(127, 0, 0);
    border: 1px solid rgba(255, 0, 0, .5);
    -webkit-background-clip: padding-box; /* for Safari */
    background-clip: padding-box; /* for IE9+, Firefox 4+, Opera, Chrome */
}

第一个边框声明将与白色背景上50%不透明的红色边框具有相同的颜色(尽管边框下的任何图形都不会渗出)。

更新:我添加了“ background-clip:padding-box;” 此答案(根据注释中SooDesuNe的建议),以确保即使应用纯色背景,边框也保持透明。


是的,然后我们回到他最初遇到的问题^^“我曾考虑过将rgba用作边框颜色,但是在现代浏览器中效果很差。” 而我的解决方案几乎可在所有浏览器中使用
Breezer 2010年

23
实际上,rgba在现代浏览器中表现出色(除非您认为IE6-8是“现代”的)。
kingjeffrey 2010年

4
好吧,它们应该是:P,当您使用它们时,当您获得50%+的支持时,您应该看到它至少对ie7 +也适用于ie imo
Breezer 2010年

42
这就是为什么“假不透明”回退的原因。当我接受了并不是每个浏览器都需要相同的渲染效果时,我作为网页设计师的生活变得轻松了很多。如果他们支持border-radius,那么他们将陷入困境。如果没有,他们就不会。内容仍然可以访问,看起来仍然不错,如果他们使用的是功能强大的浏览器,它将看起来更好。在过去的1.5年中,每个项目的这种方式我从未有一个客户抱怨过。
kingjeffrey 2010年

23
如果您尝试使边框内容后面的内容发光(而不是边框​​元素本身的背景颜色),则也需要进行设置background-clip:padding-box;
SooDesuNe

134

很简单,使用偏移量为0的纯色阴影:

#foo {
  border-radius: 1px;
  box-shadow: 0px 0px 0px 8px rgba(0,0,0,0.3);       
}

另外,如果您为元素设置了边框半径,它会为您提供漂亮的圆角边框

jsFiddle演示

在此处输入图片说明


这将始终有效。感谢您的摘要:)对于每个只想对一个或多个站点设置边框的人,您都必须更改两个类似框阴影的第一个参数:-1px -1px 0px 0px 0px rgba(0,0,0,0.1 )以实现例如最高境界
Thomas Richter

请谨慎使用!box-shadow没有尺寸,可能会破坏您的布局,从而使页边距不均匀!jsfiddle.net/bj81hew7/2
威廉

14

正如其他人提到的那样:CSS-3说,您可以使用rgba(...)语法来指定具有不透明度(alpha)值的边框颜色。

如果您想检查一下,这是一个简单的例子

  • 它适用于Safari和Chrome(可能适用于所有Webkit浏览器)。

  • 可以在Firefox中使用

  • 我怀疑它在IE中根本无法工作,但我怀疑有一些过滤器或行为可以使它工作。

还有一个stackoverflow帖子,它提出了其他一些问题-即,边框会在您指定的任何背景色(或背景图片)上方显示;因此在许多情况下限制了边界alpha的用途。


4
边界问题可以通过解决background-clip: padding-box;(在得到支持之前,您可以使用-webkit和-moz供应商扩展)。
kingjeffrey 2010年

我已将此答案添加到您链接到的问题中。
kingjeffrey

6

如果使用W3C验证器检查CSS编码,即使您的CSS代码在主要浏览器中都可以使用,您也会看到CSS代码是否可以接受。

如上所述,通过CSS创建透明边框,

border: 1px solid rgba(255, 0, 0, .5);

不被W3C标准接受,甚至CSS3也不接受。我将直接输入验证器与以下CSS代码结合使用,

.test { border: 1px solid rgba(255, 0, 0, .5); }

结果是

值错误:边界太多值或无法识别的值:1px固体rgba(255,0,0,0.5)

不幸的是,W3C尚未接受Alpha值(“ rgb”末尾的字母“ a”)作为边框颜色值的一部分。我确实想知道为什么它不是标准化的,因为它在所有浏览器中都能工作。唯一的障碍是您是要坚持W3C标准还是要脱离CSS在CSS中创建内容。

要使用W3C在线CSS验证器/直接输入

使用验证器来检查您的工作始终是一个好主意,这确实有助于在编码工作数小时后不知所措地发现编码中的小错误甚至大错误。


11
错误,这是W3C标准完全可以接受的,并且是验证程序中的错误。看到这个答案。是的,使用验证器是一个好主意,是的,但不要对所有内容都信任它。
BoltClock

5

*据我所知,在这种情况下我通常不做的是在下面创建一个更大的((bordersize * 2)+ originalsize)块,并使用

filter:alpha(opacity=50);
-moz-opacity:0.5;
-khtml-opacity: 0.5;
opacity: 0.5;

这是一个例子

#main{
    width:400px;
    overflow:hidden;
    position:relative;
}
.border{
    width:100%;
    position:absolute;
    height:100%;
    background-color:#F00;
    filter:alpha(opacity=50);
    -moz-opacity:0.5;
    -khtml-opacity: 0.5;
    opacity: 0.5;
}
.content{
    margin:15px;/*size of border*/
    background-color:black;
}
<div id="main">
    <div class="border">
    </div>
    <div class="content">
        testing
    </div>
</div>

更新:

这个答案已经过时了,因为毕竟这个问题已经超过8年了。如今,所有最新的浏览器都支持rgba,框阴影等。但这是8年前的例子。


是的,这实际上是我最终要做的,只是对元素的位置感到困惑。
mcbeav 2010年

添加了一个示例,以便您可以更清楚地了解我的想法:)
Breezer 2010年

可以做-但不具有广泛的跨浏览器支持。但是,任何在背景颜色上支持CSS不透明度的浏览器也有可能rgba(...)在边框颜色中提供支持。 您可以在这里尝试
李2010年

@ Lee,IE支持“过滤器”不透明度,但不支持任何形式的rgba(直到IE9)。
kingjeffrey

2

作为替代方案,可以在工作某些情况:改变border-styledotted

在前景色和背景色之间交替排列的像素组与部分透明像素的连续线不同。另一方面,这需要更少的CSS,并且不需要任何特定于浏览器的指令就可以在每个浏览器中更兼容。


0

其他答案涉及边界不透明问题的技术方面,而我想提出一个技巧(仅限纯CSS和HTML)。基本上创建一个容器div,它具有一个边框div,然后是内容div。

<div class="container">
  <div class="border-box"></div>
  <div class="content-box"></div>
</div>

然后是CSS :(将内容边框设置为none,注意定位,以便考虑边框的厚度)

.container {
  width: 20vw;
  height: 20vw;
  position: relative;
}
.border-box {
  width: 100%;
  height: 100%;
  border: 5px solid black;
  position: absolute;
  opacity: 0.5;
}
.content-box {
  width: 100%;
  height: 100%;
  border: none;
  background: green;
  top: 5px;
  left: 5px;
  position: absolute;
}

0

不,没有办法使用css设置边框的不透明度。

例如,如果您不知道颜色,则无法仅通过使用来更改边框的不透明度rgba()


-1

尝试这个:

<h2>Snippet for making borders transparent</h2>
<div>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta.
    Mauris massa. Vestibulum lacinia arcu eget nulla. <b>Lorem ipsum dolor sit amet, consectetur adipiscing elit</b>. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim
    lacinia nunc. <i>Lorem ipsum dolor sit amet, consectetur adipiscing elit</i>. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor.
    <i>Lorem ipsum dolor sit amet, consectetur adipiscing elit</i>. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod
    in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis
    turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. <b>Nam nec ante</b>. Suspendisse in justo eu magna luctus suscipit. Sed lectus. <i>Sed convallis tristique sem</i>.
    Integer euismod lacus luctus magna. <b>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos</b>. Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum
    ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. Donec lacus nunc,
    viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. <b>Suspendisse in justo eu magna luctus suscipit</b>. Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. </p>
</div>
<div id="transparentBorder">
  This &lt;div&gt; has transparent borders.
</div>

我们神奇的CSS来了。

* {
  padding: 10pt;
  font: 13px/1.5 Helvetica Neue, Arial, Helvetica, 'Liberation Sans', FreeSans, sans-serif;
}

b {
  font-weight: bold;
}

i {
  font-style: oblique;
}

H2 {
  font-size: 2em;
}

div[id='transparentBorder'] {
  height: 100px;
  width: 200px;
  padding: 10px;
  position: absolute;
  top: 40%;
  left: 30%;
  text-align: center;
  background: Black;
  border-radius: 4px;
  border: 10pt solid rgba(0, 0, 0, 0.5);
  -moz-background-clip: border;
  /* Firefox 3.6 */
  -webkit-background-clip: border;
  /* Safari 4? Chrome 6? */
  background-clip: border-box;
  /* Firefox 4, Safari 5, Opera 10, IE 9 */
  -moz-background-clip: padding;
  /* Firefox 3.6 */
  -webkit-background-clip: padding;
  /* Safari 4? Chrome 6? */
  background-clip: padding-box;
  /* Firefox 4, Safari 5, Opera 10, IE 9 */
  text-align: center;
  margin: 0;
  color: #fff;
  cursor: pointer;
}

在此处查看演示

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.