新的 CSS3 属性 border-image 有点棘手,但它允许您使用单个 div 和单个图像创建具有自定义边框(或阴影,如果您需要)的灵活框。 在本文中,我解释了border-image简写属性在当今浏览器中的工作原理。
基本思路
border-image 简写属性包含 3 部分
border-image: url(border-image.png) 25% repeat;
本质上,这些允许您指定
- 用作边框的图像
- 将图像切片的位置,将图像划分为 9 个部分
- 浏览器应如何将这些部分应用于元素的边缘
相关细节
让我们更详细地看一下流程的每个部分。 第一部分很容易,并且来自background-image属性。 出于演示目的,我将使用此图像,其尺寸为 100px x 100px

切片您的图像
第二部分可以包含一个到四个值,类似于border-width属性,它们按相同顺序指定:上、右、下、左。 您可以使用百分比或像素。 奇怪的是,百分比需要“%”,而像素应该不带“px”
border-image: url(my-image.gif) 25% 30% 10% 20% repeat;
border-image: url(my-image.gif) 25 30 10 20 repeat;
在这种情况下,由于我的图像尺寸为 100px x 100px,因此上面的两条规则是等效的——它们在相同位置切片图像。 我在我的图像上添加了一些尺寸以进行演示

重复、圆形、拉伸
border-image
始终将图像的角部分放置在元素框的对应角,但简写规则的第三部分告诉浏览器如何处理图像的中间部分——即沿着元素边缘的部分。
Repeat
(重复或平铺图像)和stretch
(拉伸或缩放图像)是相当直观的。
Round
表示平铺图像,但仅平铺到适合整数个平铺,否则缩放图像。 现在,Safari 和 Chrome 将 round
解释为 repeat
。 最多可以有两个值:一个用于元素的顶部和底部边缘,一个用于左右边缘。
以下是一个示例,其中顶部/底部值设置为 repeat
,而左/右值设置为 stretch
#example-one {
border-width: 25px 30px 10px 20px;
border-image: url("border-image.png") 25 30 10 20 repeat stretch;
}

实时演示,RSS 阅读器点击查看。Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu arcu non dui consequat vestibulum non vitae eros. Donec imperdiet lorem at mi rhoncus lacinia. Phasellus porttitor ligula eu justo condimentum eget placerat arcu pharetra. Proin fringilla vulputate eros in accumsan. Sed mi nibh, pulvinar eu sollicitudin ut, feugiat non ipsum. In ornare, quam sit amet tempor suscipit, erat odio suscipit nisi, eu gravida nisl orci ut arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
边框宽度
如果您没有为边框指定宽度,border-image
不会执行任何操作。 对于理解border-image的浏览器,您的图像切片将按指定宽度进行缩放。 如果您使用border简写属性,它为不支持
#example-two {
border: 50px double orange;
border-image: url("border-image.png") 25 30 10 20 repeat;
}

或者,您可以分别指定每个宽度(在此示例中,我指定了宽度,这样图像切片就不会进行缩放)
#example-three {
border-color: orange;
border-style: double;
border-width: 25px 30px 10px 20px;
border-image: url("border-image.png") 25 30 10 20 repeat;
}

但是,使用与边框图像具有相同宽度的普通边框并不总是理想的,因此您可能希望使用条件样式表为 IE 提供完全不同的边框样式。
浏览器怪癖
可以预见的是,IE 不理解任何内容border-image。 支持 border-image 的浏览器仅支持简写属性,而不支持所有规范中描述的单个属性。 一些可能非常有用的属性根本不受支持,尤其是border-image-outset,它将解决这个问题。
此外,默认行为应该是丢弃图像的中心部分,并在border-image-slice属性上使用“fill”关键字来保留它
如果存在
fill
关键字,则会导致边框图像的中间部分被保留。(默认情况下,它会被丢弃,即被视为为空。) (阅读规范)
但是,当前的浏览器行为是保留中间部分,并且没有办法将其关闭。 因此,如果您不希望元素的内容区域具有背景,则图像的中心部分必须为空。 但是,您可以利用这种填充行为,仅使用一个图像来创建 具有精美边框和背景的框。
交互式演示
我构建了一个 border-image
演示页面,帮助我了解这套复杂的 CSS3 属性。 您可以选择图像,指定重复、圆形或拉伸,并调整边框宽度和切片。 尽情享受吧!

实际示例
- Chris Spooner 使用它来很好地效果地为图像提供自定义边框。
- 在我最近构建的旅行博客 Go Pink Boots (更新:现在已离线) 上,我使用它为图像添加了撕裂的纸张背景。
- 我在我的网站 The Web Designers’ Review of Books (更新:现在已离线) 上使用它来突出显示块引用。
如果您在实时网站上还有其他示例,我很乐意看到它们。 在评论中留下链接!
这些东西我以前不知道。 非常感谢您帮助我们提供我们。
非常有用的文章
这篇文章非常有帮助
Chris,你开始让我毛骨悚然了。 我的意思是最好的方式……你的文章真是太及时了。 我昨天才刚刚调查了这个,但没有多少成果。
谢谢!
谢谢。 信息量很大。
非常有用的文章。
继续努力!
我不知道为什么,但这对我来说比线性渐变和径向渐变要混乱得多。我需要再读 4 或 5 次才能真正理解。当然,还要尽可能多地进行练习。感谢您提供了另一个很棒的资源/参考。
感谢您阐明了一个难以理解的属性。
题外话:浏览“Go pink boots”时,我注意到标签页面无法正常工作。由于您构建了它,我认为此信息可能对您有所帮助。
非常感谢伊丽莎。该网站仍然是一个正在进行中的项目。我将立即查看标签故障!
不用谢!无论如何,干得好。我喜欢您使用 border-image 属性的方式,我会尝试在我的下一个项目中实施它,您的指南会让它更容易…
伊丽莎,你是阿尔巴尼亚人吗?:-) 只是一个想法…
顺便说一句,很棒的文章…
不,我是意大利人 :-)
哇,我已经习惯使用背景图片创建边框效果了,所以这似乎不太直观。
感谢您的评论,汤姆。当 IE 支持它,以及其他浏览器扩展其支持时,我们将能够用单个 border-image 替换各种多 div、多背景图像滑门类型的东西。迫不及待!
太棒了。很高兴有像您这样的人,他们有足够的雄心壮志来解决它并向社区解释它。
好文章。克里斯,你可能想在上面显示“客座作者”的地方给诺拉署名。
好文章。
可以看看:http://css3pie.com/ 尝试为 IE 提供 css3 支持。
哇,那http://css3pie.com/ 看起来太棒了!我会试试的 :)
这是 IE 的解决方案。我真的对此感到兴奋。
解释得很好。我认为这会对我有帮助 :-)
哇,很多内容我都理解不了,但你在这里确实做了一个非常深入的教程,我向你致敬。
我想我得一小段一小段地看,这样才能理解它!
非常感谢,silvers。如果您有任何问题,请与我联系,也许我可以提供帮助!(在我的网站上找到我的电子邮件:norabrowndesign.com)。
哦,哇,很棒的文章。
它确实帮助我理解了 CSS3 属性中一个最难、最混乱(在我看来)的属性。一定要继续!
顺便说一句,我只是想称赞你,诺拉,你的网站设计非常优雅。
谢谢,阿米特 - 我真的很感谢你的赞美。我同意 border-image 是 CSS3 中最令人困惑的新功能之一,但它也充满了潜力!
不错的文章。我之前做过一个演示,使用“圆角”边框图像,方法是首先使用圆角图像作为边框,然后在 div 中添加一个边框半径声明。
http://blog.darkcrimson.com/samples/css3/
嘿,很棒的演示页面。我喜欢“查看 css”选项……这是解释您所实现的功能的完美方法。是否有关于这方面的教程?
谢谢诺拉,也喜欢交互式演示。
好的,外边距会很棒,但是您不能将边框和 border-image 宽度缩小到例如 80px,而不是 213px,以减少空白吗?解决提到的
这个问题
非常感谢您提供这些信息,我同意那位说这比渐变更难的人(这来自一个在 PS 和 Illy 中也对渐变有问题的用户!)。
另外,那是一个看起来很酷的旅行博客,设计很棒。
今天读到这些内容并了解这些内容对我来说非常有趣。非常感谢您。我只是想知道这将/可以被使用多少次?
谢谢,alpaproductions。我会将 border-image 放入那个不断增长的类别中,这些类别可以被实现为“渐进增强”——你可以为理解它们的浏览器添加一些漂亮的效果。
我想这是真的。我用圆角的方式与您在这里提到的方式相同。
您也可以使用 :before 和 :after 的技巧,并使用绝对定位为它们设置背景图像。当然,我不知道这方面的确切跨兼容性,但我相信它比 border-image 更好。
不过解释得很好,当这成为更普遍的事情时,我会回头看看它。
这是我在网上找到的最好的 border-image 教程!我一直想知道克里斯·斯普纳是如何在他的图像上实现那种很酷的效果的。很高兴我学到了这些!
CSS 太酷了,不是吗?
感谢您如此清晰地解释它。
另一篇很棒的文章!很有趣……但是,有一点需要注意:(在我看来)它将渐变边框的应用限制在具有非渐变背景的元素上。如果您想要一个具有某种渐变背景的元素,并为其添加不同的渐变边框……?然后它将不起作用,对吗?或者我理解错了……?