您是否曾经在页面上看到过带有透明边框的元素?我认为 Facebook 最初推广了这种效果,催生了像 Facebox 这样的灯箱插件。我认为 Facebook 现在不再使用这种外观了,但它仍然相当简洁。

您可能会认为这很简单,就像这样
#lightbox {
background: white;
border: 20px solid rgba(0, 0, 0, 0.3);
}
但是,在元素上设置透明边框将显示边框下元素自身的背景。

在上图截图中,边框使用 RGBa 设置为透明,但它们显示为实心灰色,因为它们只显示了其下方自身的纯白色背景。
幸运的是,有一个 CSS3 属性可以拯救我们!它被称为 background-clip
,专门用于指定应使用哪个盒子模型部分来显示背景。它做的事情正如它的字面意思,它在盒子模型的指定部分切断了背景。它可以有三个值,并且需要使用供应商前缀。以下是它可以具有的三个设置。您不会一次使用它们全部,这只是为了方便显示
#lightbox {
-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 */
-moz-background-clip: content; /* Firefox 3.6 */
-webkit-background-clip: content; /* Safari 4? Chrome 6? */
background-clip: content-box; /* Firefox 4, Safari 5, Opera 10, IE 9 */
}
以下是示意图

所以,我确定您知道我要说什么了……如果我们将 background-clip
设置为 padding-box
,白色背景将在边框之前结束,并且透明度将覆盖其他内容,从而实现我们想要的效果!

相关:background-origin
在我们的灯箱示例中,背景很可能是纯色。在这种情况下,background-origin
基本上无关紧要,因为没有人能够分辨出颜色是从哪里“开始”的。但是,如果元素的背景是图像,那么背景的起始点就非常重要了。
这与 background-clip
相关,因为如果 background-clip
是 padding-box 但 background-origin 保持默认的 border-box
,则一些 background-image
将被切掉,这可能是或可能不是我们想要的。
以下是示意图

以及一个可视化示例

浏览器兼容性
适用于:Safari 5、Chrome 7、Firefox 3.6+、Opera 10、IE 9
我仅测试了这些现代浏览器,并且支持良好。它可能(并且很可能)在非 IE 浏览器中可以追溯到更早的版本。
如果您需要更完整的浏览器兼容性,则始终可以使用双 div 方法。
<div id="lightbox">
/* Set transparent background with PNG
add padding to push inside box inward */
<div id="lightbox-inside">
/* Set white background in here */
</div>
</div>
双 div 方法的另一个优点是您可以实现真正的圆角边框。不幸的是,使用 background-clip 方法,外边框是圆形的,但背景边缘保持直角。

可惜我们没有类似 background-radius
的东西来修复它
#lightbox
border-radius: 16px;
padding: 8px;
/* NOT REAL */
background-radius: 8px;
}
奇怪之处

20px 的边框没问题,但是当我尝试 30px 时,这些**死亡小方块**出现在 Safari 5 中。

在 Chrome 中,任何边框宽度(最多 20px)都会出现小的对角线。

超过 20px 边框,角完全变暗。

没有 border-radius,变暗的角框始终可见。
致谢
感谢 Alex Hall 提供最初的想法和帮助。
这是一个简单的演示,也显示了 background-clip 的不同值
Check out this Pen!
以及 background-origin
Check out this Pen!
Chris,
很棒的文章,这个技巧肯定很有用!
谢谢,
David
Chris –
最后两张截图,我假设与它们上方的截图相关。意思是最后两个是在 Chrome 中。只是想稍微说明一下。
谢谢
漂亮。真疯狂,我昨天才尝试了 rgba,想知道为什么透明度不起作用。
您是否有 IE 7/8 中的外观的截图?
在 IE8 中,边框是实心的。
“适用于:Safari 5、Chrome 7、Firefox 3.6+、Opera 10、IE 9”
这很不错。但缺点真的很奇怪。这些黑线和方块是一个奇怪的问题。我想这可能是浏览器端渲染 CSS 的问题
这是一个非常酷的想法。我可以想到通过文本链接显示数据,例如字典定义、照片详细信息等。不幸的是,IE 在这些酷炫的视觉样式方面被抛在了后面。但是我偶然发现了 IE 的 PIE CSS3!它允许支持 RGBA 值和其他 CSS3 属性。我还没有机会自己测试它,但我正在努力,并期待着它!
Chris,要解决内角不圆角的问题,请将 border-radius 设置为边框大小的两倍。
金星++
同样的 CSS 也出现在我的脑海中。为什么不使用 border、RGBa 颜色和 border-radius 呢?
关于这一点还有一个需要注意的地方;您需要确保设置了 background-color 属性,而不仅仅是 background 属性,否则背景将继续贯穿边框。(至少在 Firefox 3.6.10 上是这样)
所以
background: #fff;
不起作用,而
background-color: #fff;
会起作用!
很棒的文章,Chris,谢谢。:-)
是的,确实如此。演示示例在 CSS 中包含了这一点,但感谢您特别指出来。您也可以通过以下方式使其在 WebKit 中工作
但目前这会破坏 Gecko,因此最好单独使用。
啊哈,这很好知道。我不知道 box-sizing 值可以在 background 属性中使用。
不错。:-)
在我的示例中,我仅使用 background: #fff,它可以正常工作?
http://www.devseo.co.uk/examples/facebook-style-overlay-css/
您还在 background 属性中指定了 padding-box,这在我之前不知道,直到 Christ 在上面提到它。
不过,你们两个的想法都不错,我确实会记住这一点!
Chris,不是 christ。抱歉,Chris。
死亡小方块!
我太高兴 IE9 支持所有这些了。这会让我们的工作更容易。
“……元素上的透明边框将显示元素自身的背景……”
使用 outline 而不是 border 是否可以解决此问题?
但是,我意识到 outline 不会允许通过添加 radius 来实现圆角。
您可以将 outline radius(至少在 Mozilla 中)应用于 outline 属性
https://mdn.org.cn/en/CSS/-moz-outline-radius
以及
http://blogs.sitepoint.com/2010/04/13/towards-a-cooler-focus-caret/
然而,我发现使用边框实际上更容易,因为outline属性会产生一些奇怪的效果,比如完全超出元素区域!
非常酷,为了兼容性,我之前用半透明的div来实现这些效果,但一旦我们摆脱了那些IE<9的家伙(愿望,没人能从我这里夺走!:D),这个方法就会很简洁。
顺便说一下,Facebook没有开发Facebox。
他说他认为FB最初启动了“透明边框”这回事(我也不确定),这导致了像Facebox这样的东西。
非常棒,Chris。
顺便说一句。从与Chris合作的过程中,我发现他在撰写教程之前会仔细研究事物的方方面面,因此他教授的几乎所有内容都是最佳实践。
这个网站是网页设计师和开发人员的宝贵资源。我非常喜欢它!谢谢Chris。
不错的技巧;不过我认为在IE中使用带有透明png边框的双div可能更优雅;RGBA值是问题属性。使用PNG双div,您至少可以保留透明效果,但考虑到优雅降级,您可以用这种方法制作一些非常漂亮的模态窗口,或者:focus和:hover效果。
我赞同这个观点。Chris关于透明边框的想法非常棒,但对于拥有大量遗留用户的网站来说,它过于前沿了。
抱歉,
但我就是不明白有什么大不了的,以及为什么要使用透明边框?
透明度就是新的投影。仅此而已。
更重要的是,rgba不能简单地添加到边框中并正常工作,因为背景颜色位于边框下方(实际上不是透明的,而是改变了阴影)。使用上述方法可以解决此问题。
太棒了,很棒,极好的文章…………………………帮助更多感兴趣的人员学习此类文章……敬佩,真的太棒了
嗨,Chris,
你是否分别向Chrome和Safari团队报告了这些错误(如果它们还没有被报告)?:)
顺便说一句,文章阐述得很好,我自己永远也无法解释得这么好。:)
透明边框效果极佳,尤其是在内部圆角的情况下!感谢您提供的CSS3。LT
非常棒的技巧,我一直在尝试在我的一个lightbox开发中实现透明边框…我尝试的另一种方法是将一个透明的div作为父元素…它还有在圆角内部添加圆角的额外好处。
反复研究之后,我不得不说,这里存在太多的跨浏览器怪异行为。
这是我的版本。适用于IE6+、FF、Safari和Chrome。
http://blog.pressedweb.com/demos/facebook_border/
印象深刻。非常印象深刻。
但是您使用三个元素来创建那个框,而Chris使用的方法只有一个元素。
但是,我意识到这种方法只适用于最新的浏览器,而您的版本是我能想到的在所有平台上都能正常工作的最简洁的方法,所以做得非常好!
使用图像很好地解释了background-clip和background-origin。
非常好,非常有帮助
如果我的问题与您文章的初衷无关,我深表歉意,但如果可以的话,我想请问Facebook最初的解决方案是什么,以及它是否优雅地降级?
好的,这很有道理,伙计。哇。
Lou
http://www.online-privacy.eu.tc
感谢分享您的专业知识。我希望有一种更好的方法来实现这个很棒的CSS功能,而无需开发者绕弯子。我已经可以看到大多数设计师会使用双div方法。
感谢兼容性截图
它是否比使用background:url(whitealpha.png);更兼容或一样兼容?
谢谢…
我唯一需要的就是一个客户,他们足够想要透明边框,并且愿意为此付费让我去做所有这些?总有一天!
我无论如何都无法让它工作。我甚至复制了您演示中的css,我总是得到这个结果 - http://drp.ly/1TXs
将那个内部白色块(我相信是blockquote p)设置为具有该描边的背景颜色。
现在它正在获取其默认背景或其他内容。
CSS 日新月异,越来越棒。如果不存在浏览器大战会怎么样?我们仍然需要考虑旧样式,以确保我们的 Web 应用程序在浏览器之间具有统一的外观。一些客户非常疯狂(或者我们?),喜欢使用 IE6。感谢您的帖子。
喜欢您的文章。
非常感谢!
太神奇了!
感谢分享。
虽然有点笨拙,但出于兼容性原因,您可以创建两个div吗?
#border(将背景图像设置为透明的黑色png,并使其填充与边框宽度相同。)
#popup(白色背景,位于边框div内部。)
并非所有IE版本都支持此功能,但我猜在某些情况下这可能是一个简单的解决方案。
不错的实现方式:),但我无法在IE7上重现它。
非常好,感谢分享。
确实很棒!一些新的东西可以用来玩。
使用rgba定义更好。最后,这也只受现代浏览器支持。
我在任何地方都找不到这个,所以我认为我应该分享一下…这会在框周围提供一个半透明的边框轮廓,同时保留内部框的100%透明度…本质上是提供一个“窗口”来透过50%透明度的框查看。
使用SASS允许您仅通过更改一行代码来更改“边框”的宽度。必须热爱SASS
设置“窗口”
SASS/CSS(为了清楚起见,我包含了边框的长版本)。这使用了一个具有50%透明度的白色png图像。
代码行数相当多,但结果很漂亮。
享受:)
嗨,chris,谢谢分享 :)
我发现background-origin图片中有一点小错误,background-origin的默认值应该是“padding-box”,而不是“border-box”。
另一种方法是使用没有模糊的盒阴影
border-radius: 10px;
background: #FFFFFF;
box-shadow: 0px 0px 0px 10px rgba(0,0,0,0.30);
我有没有忽略什么缺点?