2018 年更新:虽然我们仍然没有像 background-opacity 这样的东西,但我们现在有了 rgba() 和 hsla(),这将是本文中纯色解决方案的简单方法。
读者 Shane 发表了评论
如果在块级元素上使用透明度,它也会使内部文本变得透明。有没有办法防止这种情况发生?我尝试将文本放在另一个 div 中并将不透明度设置为 100%,但这并没有奏效。虽然,从逻辑上讲,我认为它会起作用!

从逻辑上讲,这对我来说是有道理的。它在实践中是这样运作的吗?当然不是。在我看来,这是 CSS 的一个主要缺陷。人们只是**期望**这成为可能。这在印刷设计中是一种非常常见的特效。不幸的是,在网络上并非如此简单。以下是一种解决此问题的方法。
首先,您创建一个条形,确保使用所有浏览器的 CSS 设置。这是该条形
<div class="bar">
<h2>Some mild-mannered text trapped inside a bar.</h2>
</div>
这是您对其进行样式设置的方式
.bar {
height: 4em;
padding-top: 2em;
opacity: 0.5;
background: black;
border-top: 3px solid #ccc;
border-bottom: 3px solid #ccc;
margin-top: 5.0em;
}
在这里,您会注意到条形内的文本采用了条形本身的透明度。您不希望这样,它会使文本难以阅读!因此,您变得聪明,将 div 内部的文本应用 100% 的透明度。不起作用,对吧?
您必须诉诸一些技巧。
据我所知,没有办法强制这些子元素的透明度**低于**其父元素。而解决方案就在其中。如果该子元素在技术上不是子元素会怎样。
如您所知,仅仅因为一个元素占据了与另一个元素相同的空间,并不意味着一个元素是另一个元素的子元素。这就是 CSS 定位的魅力所在。因此,将我们的非透明文本放入透明 div 的技巧只是将该文本放在div 的外部,并使用一些 CSS 定位将其视觉上推入内部。
我们将按照以下步骤操作
<h2 class="ontop">Haha! I'm free of my transparent prison.</h2>
<div class="bar"></div>
注意应用于文本的类。现在,您必须使用 CSS 定位执行任何需要执行的操作,以将其放置在需要的位置。负边距是一种流行的方法。在这里,我只是设置了顶部位置
h2.ontop {
position: relative;
top: 4.7em;
}
不错,Chris。您总是袖藏更多“技巧”。
偶然发现!
一个更简单的技巧是将背景设置为一个非常小的透明 png 正方形。例如
#bar{
background: url('black50.png');
}
当然,加载浏览器需要多花费几纳秒,但这可以节省麻烦。在设计时,我会保留一个常用颜色的不同透明 png 库。
Tom
@Tom:这是一个不错的技巧!这实际上在条形解决方案中可以完美地工作,因为它是一种纯色。实际上,利用图像透明度而不是 CSS 透明度是解决此问题的任何版本的良好解决方案。它有点打开了需要使用 PNG 技巧来保证结果的大门,但这没关系。
使文本保持不透明更有用!!
做得好。
PNG 将提供更好的兼容性(您必须对 IE6 使用 filter: 语句,但您无论如何都在这样做),但更好的 CSS3 方法只是使用 RGBA 颜色(例如 background: rgba(0,0,0,0.5); 将为您提供 50% alpha 的黑色),这消除了任何继承的不透明度。
巧妙的解决方案!
当您不知道正在处理的元素的大小时,此解决方案也有效,它简单快捷。
感谢提示!
Safari 的渲染效果似乎与 Firefox 不同
正是我需要的!
漂亮;)
干得好!很长时间以来我一直试图弄清楚这一点……
这适用于图像吗?我需要在我的不透明 div 中使图像不透明
@Jamie:当然,它适用于图像,也许它甚至更容易,因为您通常知道图像的确切高度和宽度,因此您确切地知道需要多少偏移量。
谢谢
透明元素内部的非透明元素
在 IE7 中有效,但在 Mozilla 中无效
请帮忙
感谢分享..我需要透明元素背景内部的非透明图像示例……
#bar{
background: url('black50.png'); /* <– 更好,更通用 */
}
刚刚使用了它,是的,通过使用它,您不必担心嵌套的 div 继承任何父 div 的透明度。非常感谢!
-Yep
有些人会说我是一个讨厌鬼,我之前已经遇到过这个问题,解决了,但是……
总是有个但是。
以下是我没有解决的问题
如果您有一个包含段落的 div,并且当然,您需要将透明度应用于 div 的背景并保持段落的文本不透明怎么办?
你会告诉我,很简单:使用你之前使用的方法!
如果您选择使用段落元素的大小来调整 div 的大小,则您无法做到这一点,不幸的是我必须这样做(网络是动态的!)
我以为我可以第二次重写段落的内容,覆盖第一个(带有透明度),这样我就可以得到一些不透明的文本;但我并不满意在我的 Html 代码中重复相同内容两次……
因此,如果有人对如何解决此问题有任何想法,我很乐意听取。
再见
嗨,伙计,
我想要一个带有不透明度的框,但框内内容的文本没有不透明度。
我想要文本颜色为白色,并且带有不透明度的框的结果是文本颜色不是白色
拜托……
我与 empe 有相同的请求 - 我想要透明的文本,但背景是不透明的。这可能吗?
@empe:本文介绍了如何执行此操作。
@黑天鹅:您要求的是相反的事情。幸运的是,这更容易。只需设置文本的不透明度,而不是其容器。如
感谢您的回复,但我认为我在上一篇文章中没有正确解释自己。
我有一个背景图片,以及一个在其上带有背景颜色的文本。当我尝试使文本透明时,背景颜色的颜色会透出来 - 但我希望*背景图片*透出来。
我想要的效果示例显示在下面的网站上,但该网站使用的是图形文件,而不是 css。我不确定我想要实现的目标是否可以使用 css 实现,但当我在您的帖子中遇到这个问题时,我认为询问一下不会有什么坏处。
http://www.karneval-berlin.de/de/
@黑天鹅:是的,我现在明白了您的意思。CSS 无法做到这一点。那是剔除,而不是透明度。不过,效果很不错。
您认为可以使用此方法创建透明悬停效果吗?…我见过一个使用 JavaScript 的效果,非常漂亮。
请删除我之前的评论。
不是…
[div style=”border: 1px solid black;”]
[div style=” float:left”]bla bla bla..[/div]
[div style=”background-color: #91E391; opacity: 0.2″ ]{此处为空格}[/div]
[/div]
…另一种获得相同效果的好方法?
实际上,继承透明度的行为是完全合乎逻辑的。
您在 CSS 中指定某个块不完全不透明,您没有指定仅其背景的不透明度(您可以使用 CSS3 rgba 颜色或透明 png 来实现,如前所述)。从实际角度来看,整个块(包括文本)都绘制在一个单独的画布上,然后将此画布以指定的透明度绘制到父块上。
这就像绘图软件中的图层一样,如果您指定图层的不透明度,则会影响该图层内的所有内容(包括子图层)。如果您希望在其上绘制具有更高不透明度的某些内容,则需要在其上创建一个单独的图层来放置您的不透明内容(这正是您使用额外 div 所做的事情)。
好人;)
有没有办法让我在博客上发布的每张图片都不会自动变成透明?我对这方面非常陌生,所以希望使用简单的术语。
目前我的博客上只有一张图片,但它的背景是白色的,它变得透明确实使理解变得更加困难。
@hachaifair
没错,自从他们引入 opacity 属性以来,我就一直在使用这种技术。除了我使用一个容器 div 并相对定位元素,然后分别为每个元素设置不透明度。我认为这是显而易见的。
@alex
使用 RGBA 很简单,谢谢!但是有没有什么简单的技巧可以用于 IE6/IE7?
png 对我来说也更有效,至少当您只想为容器(图像、文本、图像 + 文本等)设置透明背景时。
我喜欢 PNG 的想法,但是如何准确地创建具有 50% 透明度的 PNG 图像?我在 Paint Shop Pro 中创建了这样的图像,但是当我将其保存为 PNG 时,图像被保存为不透明的。
我尝试了 PNG 技巧。在 Firefox 中效果很好,但在 IE 6 中不起作用……
嗯,嗯,嗯,看来这个小技巧对我们中的一些人可能有用……但我试图在一个应该滑动进出且根本不起作用的 div 上使用它 :/ 谁说“是的,嵌套的 div 应该遵循透明度”?这太愚蠢了,该死。
当您尝试使用“overflow:hidden”声明在容器内滑动对象时,您不能使用此“技巧”——确实如此。但是,您也可以解决此问题,只需创建一个伪 :after 或 :before 元素,使其相对于父元素进行相对定位,然后根据需要使用 CSS 调整其不透明度并进行放置。在我的用例中效果很好。
我经常访问您的网站。感谢所有好的内容!它帮助我成为一名更好的程序员,并节省了我很多时间!
此致
您还可以将一个 1px x 1px 的透明图像分配给 div,这样您就可以忘记相对/绝对定位。
这可能是一篇旧文章,但将颜色分配给 div,例如 rgba(255,255,255,0.5) 也可以解决问题(刚刚发现)。