使用伪元素
您可以定位伪元素,使其位于元素的后面且更大,从而通过其自身的背景创建边框效果;或者更小且位于内部(但要确保内容位于顶部)。
需要多重边框的元素应该有它自己的边框和相对定位。
.borders {
position: relative;
border: 5px solid #f00;
}
次要边框使用伪元素添加。它使用绝对定位设置,并使用 top/left/bottom/right 值内嵌。通过赋予它负的 z-index 值,它也将具有边框,并保持在内容的下方(例如,保留文本的可选择性和链接的可点击性)。注意使用负的 z-index,如果它位于另一个具有自身背景颜色的元素中,这可能不起作用。
.borders:before {
content: " ";
position: absolute;
z-index: -1;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border: 5px solid #ffea00;
}
查看 CodePen 上 Chris Coyier 的 gbgRqZ。
您也可以使用 `:after` 伪类来创建第三个边框。特别要注意,Firefox 3(3.6 之前的版本)会搞砸,因为它支持 `:after` 和 `:before`,但不允许它们使用绝对定位(因此看起来很奇怪)。
使用轮廓
虽然比边框限制更多(无论如何都围绕整个元素),但轮廓是一个额外的自由边框。
.borders {
border: 5px solid blue;
outline: 5px solid red;
}
使用阴影
您可以通过设置阴影偏移量和 0 模糊来使用阴影创建边框效果。此外,通过用逗号分隔值,您可以创建任意数量的“边框”。
.blur {
box-shadow:
0 0 0 10px hsl(0, 0%, 80%),
0 0 0 15px hsl(0, 0%, 90%);
}
查看 CodePen 上 Chris Coyier 的 xbgreX。
使用裁剪的背景
您可以使元素的背景在填充之前停止。这样一来,元素的普通边框就可以在某种程度上看起来像双重边框。
.borders {
border: solid 1px #f06d06;
padding: 5px;
background-clip: content-box; /* support: IE9+ */
background-color: #ccc;
}
在输入框上
查看 CodePen 上 Chris Coyier 的 在 `<input>` 上创建双重边框效果。
很高兴你在这里有这些东西,它们应该是显而易见的,但在工作日的过程中却让人摸不着头脑。感谢 Chris - 非常感谢
嗯,
我正在寻找一种简便的方法使一个 div 盒子看起来缩进,所以我偶然发现了这篇文章。我以为它能帮助我实现这些缩进的效果,但在 Firefox 中看起来很奇怪,并且在 IE 中不起作用。我使用了一种方法,它结合了 border 和 outline 属性,在 Firefox 中运行良好,但在 IE 中不行。有什么建议吗?
感谢这篇文章,Chris - 很棒。
我今天试了一下(我第一次使用伪元素)。
但我不得不通过繁琐的反复试验来调整 :before 伪元素的大小、边距和填充。还没有弄清楚将来避免反复试验所需的数学运算,但我很高兴我最终成功了。
我认为在伪元素上使用负定位效果更好。然后您可以在框本身设置背景颜色,并设置边距来抵消伪元素的定位。
降级效果稍微好一些
这不是多重边框的问题,但我因为这个页面才想出来,所以我想在这里分享一下。我之前没有意识到您可以使用多重阴影效果,我一直都在疯狂地试图弄清楚如何在按钮上创建仅使用 CSS 的斜角效果。多亏了你,我现在可以了!
这看起来真的很好看。我玩了一段时间,最后添加了一个活动标志,以产生一个漂亮的按钮按下效果。填充用于将内容从原始填充向下和向左移动 1 像素。
Chris,我认为使用阴影从语义上来说有点偏离主题。我的意思是,毕竟,我们编写的代码应该符合用户的预期 **语义**,如果他们能理解我们的代码。想象一下,有人正在阅读你的代码,然后遇到了
我认为他期望在你的网站上看到阴影(或发光),而不是实心的、类似边框的轮廓。
根本不存在“语义 CSS”。CSS 是表现,而标记是语义。长期以来一直在努力将两者分开。不存在“语义美学”这种东西。
好吧,你给的例子实际上是阴影或发光,而不是实心轮廓。
我想你指的是
这会产生一个实心的 3 像素轮廓。
如果用户理解 CSS,他就会知道这一点并相应地预期。
然后你的预处理器会把这些努力都抹杀掉……
实际上,我现在使用的是图像而不是多重边框,感谢这篇文章,它对我的帮助很大,我打算使用这些技巧。
为了获得双重边框,`outline` 属性非常适合方形 div 或页面容器。您还可以将圆角添加到轮廓以匹配元素边框的圆角,例如
您也可以尝试这些 `outline-style` 属性
感谢你的所有技巧,Chris。
我刚看了演示,效果真的很酷。有点像相框的东西……感谢发布这些技巧。我可以利用它为我的图片作品集创建漂亮的边框。:D
就我个人而言,阴影对我有用。完全忘记了它的存在,但设法用它在盒子左右两侧创建了金属条。看起来很棒,感谢这个指南 :)
非常感谢。我以前也使用过类似的东西,但没有 `z-index: -1;`,因此无法选择该 div 中的任何内容。
`z-index: -1;` 规则会导致额外的边框隐藏在具有普通 z-index 和非透明背景的任何父元素之下。要解决此问题,为每个非透明父元素创建 z-index 规则。您还需要为每个父元素添加一个非静态位置,例如 `position:relative`。妙招!
我无法完成 CSS 多重边框的任务
非常感谢,这个技巧很巧妙。但是,有没有其他 CSS 简写方法可以用于为所有 4 个边框赋值,而不是必须使用 border-left、border-top 等?
我建议使用一个额外的 div 或其他块级元素。跨浏览器支持,效率更高。
对于那些对更多选项感兴趣的人,我有一篇帖子列出了 5 种使用演示进行多重边框的方法。
http://www.impressivewebs.com/multiple-borders-css/
非常有用的工具,几乎满足我的需求——有没有办法在单个边框上创建相同的效果?例如,我想在每个文本块的底部创建一个分隔线,它具有一个 4px 的实线,一个 3px 的间隙,然后是一个 2px 的细线,而无需创建另一个 div 容器。
是的,可以使用多个 box shadows 和 bottom margin。box shadows 可以没有模糊效果并直接向下偏移。
现在,如果你有圆角或想要小于全宽的边框,你可能需要使用不同的方法——伪元素和巧妙的定位可能会帮你实现目标。
如果我不想让线条覆盖整个元素,我会使用 :before 和 :after。box-shadow 方法也很可靠:) 谢谢!
还有 -moz-border-{top,right,bottom,left}-colors 查看 MDN 上的信息
但它只适用于 FF…
哇,background-clip 正是我需要的,但我从未知道它的存在!谢谢,Chris!
感谢演示,使用了一些填充获得了多重边框。
.borders {
border: 5px solid blue;
outline: 5px solid red;
outline-offset :20px;
}
在伪元素示例中,可以使用
pointer-events: none;
而不是z-index: -1;
。这样你就不用担心父元素是否有背景颜色,以及其他任何意想不到的z-index
问题。谢谢!你拯救了我的夜晚(我使用了解决方案:#使用 box-shadow)!
轮廓——当然!
box-shadow 在支持 border-radius 方面优于 outline。
我会在两个元素之间创建一个 div,然后添加一个 border-top 和一个 border-bottom。
当然,这取决于使用场景。