通过border-radius
实现圆角现在变得非常容易。但这只允许我们切入形状。如果我们想用圆形的向外角将一个形状连接到另一个形状,该怎么办?用图形解释更容易

border-radius
。底部角,不太容易。查看演示 下载文件
简洁的 HTML
当然,在网络上,几乎任何视觉效果都是可能的。最坏的情况是你可以使用图片。我们的目标,一如既往,是不使用图片(快速!易访问!易于更新!)并使用完全简洁的语义 HTML(快速!易访问!易于更新!)。所以这是标记
<ul class="tabs group">
<li class="active"><a href="#one">One</a></li>
<li><a href="#two">Two</a></li>
<li><a href="#three">Three</a></li>
<li><a href="#three">Four</a></li>
</ul>
active
类指示哪个选项卡反映当前页面。
实现方式
之所以棘手,是因为我们需要一个形状从选项卡元素中伸出来。为了在保持标记简洁的同时完成此操作,我们将使用伪元素。如果您需要复习,您可以这里和这里了解它们。本质上,它们可以向页面添加额外的元素,我们可以通过 CSS 直接对其进行样式设置。每个元素都可以有两个——:before
和:after
。最终我们将每个选项卡使用四个,这是可能的,因为每个选项卡由两个元素组成,列表项和锚链接。
让我们逐步可视化此步骤,暂时不要查看任何代码。
1) 自然状态

2) 浮动

3) 相同大小

4) 只看一个

5) 圆形

6) 正方形

7) 为选项卡和内容着色

8) 为伪元素着色

9) 堆叠

10) 无边框

11) 完成

border-radius
将顶部圆角化,就完成了!CSS
这是一大块 CSS 代码,但我已经尝试对其进行注释,以便每个部分都有意义。
.tabs li {
/* Makes a horizontal row */
float: left;
/* So the psueudo elements can be
abs. positioned inside */
position: relative;
}
.tabs a {
/* Make them block level
and only as wide as they need */
float: left;
padding: 10px 40px;
text-decoration: none;
/* Default colors */
color: black;
background: #ddc385;
/* Only round the top corners */
-webkit-border-top-left-radius: 15px;
-webkit-border-top-right-radius: 15px;
-moz-border-radius-topleft: 15px;
-moz-border-radius-topright: 15px;
border-top-left-radius: 15px;
border-top-right-radius: 15px;
}
.tabs .active {
/* Highest, active tab is on top */
z-index: 3;
}
.tabs .active a {
/* Colors when tab is active */
background: white;
color: black;
}
.tabs li:before, .tabs li:after,
.tabs li a:before, .tabs li a:after {
/* All pseudo elements are
abs. positioned and on bottom */
position: absolute;
bottom: 0;
}
/* Only the first, last, and active
tabs need pseudo elements at all */
.tabs li:last-child:after, .tabs li:last-child a:after,
.tabs li:first-child:before, .tabs li:first-child a:before,
.tabs .active:after, .tabs .active:before,
.tabs .active a:after, .tabs .active a:before {
content: "";
}
.tabs .active:before, .tabs .active:after {
background: white;
/* Squares below circles */
z-index: 1;
}
/* Squares */
.tabs li:before, .tabs li:after {
background: #ddc385;
width: 10px;
height: 10px;
}
.tabs li:before {
left: -10px;
}
.tabs li:after {
right: -10px;
}
/* Circles */
.tabs li a:after, .tabs li a:before {
width: 20px;
height: 20px;
/* Circles are circular */
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
background: #222;
/* Circles over squares */
z-index: 2;
}
.tabs .active a:after, .tabs .active a:before {
background: #ddc385;
}
/* First and last tabs have different
outside color needs */
.tabs li:first-child.active a:before,
.tabs li:last-child.active a:after {
background: #222;
}
.tabs li a:before {
left: -20px;
}
.tabs li a:after {
right: -20px;
}
就是这样!
应该可以在几乎所有像样的浏览器中使用,包括 IE 9 及更高版本。也应该在旧版浏览器中正常回退(只是没有圆角)。
Steve Smith 方法
大约在我创建此内容以将其包含在我关于伪元素的演讲中的同时,Ordered List 的 Steve Smith 发布了一种非常类似的方法。Steve 的方法在选项卡周围有边框,我的方法则将选项卡彼此并排放置。如果你问我,两者都很酷。
太棒了!我一定会用这个。
很棒的东西,Chris!
哇,不错。。
干得好,
我喜欢第6到第9步,你有一个很棒的想法;)
太棒了
太可惜了,我们不能使用负边框半径。如果可以,我们可以只使用每个选项卡的两个伪元素,以及更少的代码来有条件地更改背景颜色。
负边框半径不会产生票据角吗?示例
如果有许多边框半径形式(票据、普通形式、此处说明的形式等),那么可以选择更多的边框半径,尽管我知道这并不实用,但考虑起来很有趣。
顺便说一句,Chris,我想我在某个地方见过这个,但这种解释只在你网站上找到,干得好!太棒了!确实如此,一张图片胜过千言万语。
Chris,干得好,我实际上前几天晚上一直在尝试找到这种类型的选项卡导航。
我对 css - html 文件在文件夹中,css 样式表在外部,如何为 html 页面应用样式有疑问
这真是太棒的 CSS 了。一直都很喜欢你的作品!
为什么不只将“非活动”选项卡旁边活动选项卡的底部角圆角化?
哈哈,哇,这真的很聪明!我真不好意思,我没想到这一点。
在上面的示例中,它们将是黑色的。不是吗?我不知道你会如何处理第一个和最后一个选项卡,你可能只需要为它们添加一个额外的技巧,在这种情况下,可能更简单的方法是为每个选项卡使用一致的方法。
@Lee,
由于为 ul 标签着色背景会弄乱选项卡顶部的圆角,也许你可以给 ul 标签一个 :after 伪元素,使其高度与底部边框半径相同,使其颜色与活动选项卡相同,并将其定位在 ul 的底部,并使用正确的 z-index?实际上,我觉得这种方式有点更像黑客,而且不太优雅,但它会使用更少的 css。
非常聪明的思考方式…!喜欢它
看起来真的很棒!
好的提示 Chris 继续努力…
不错。
我会添加一个 outline:none 以避免在 IE 中点击时出现带边框的选项卡。
请停止这样做,大家。看到那些“丑陋的”焦点指示器实际上很重要。
这个不错 Cris!
嘿,你知道吗?一个 css 技巧!
不过,这个确实值得详细解释,看看你在 WordCamp SF 上解释的速度有多快 :)
非常好。感谢您为这篇帖子付出的努力;将代码放在这里会容易得多,而不是逐步进行视觉解释。喜欢 CSS Tricks 这里的气氛。
我完全同意你的看法,Melanie!我也感谢添加的视觉效果,这有助于我们更好地理解 CSS 的工作原理。感谢这篇文章,Chris!
杰出。
哇,真的很好 Chris。
我想我记得之前看过一篇关于这个的帖子,或者至少是类似的东西。再次浏览它也很有趣——一点点创造力和 CSS3 可以做到的事情真是太神奇了 :P
这可能是一个愚蠢的问题,但是您可以在正方形(伪元素)上使用背景图片吗?我之所以这样问,是因为我想使用它,但它叠加在背景标题上……
是的。
不错
绝对需要通读代码:]
这些看起来很棒,感谢你的提示 :)
唯一让我有点困扰的是,你无法点击相邻选项卡的正方形和圆形元素所在的选项卡。我想当选项卡上没有悬停状态时,这不算什么大问题,但我认为如果有一个悬停状态,它会变得更烦人?
我真的很喜欢这种说明你的思维过程的方式……请多来一些这样的内容 :)
+++ 会再次阅读
这是一种很棒的技术,但不幸的是,它有点依赖于使用纯色。曾经在一个项目中尝试过这样做,但没有成功,因为活动选项卡位于渐变之上,这会使圆形伪元素可见。
但我刚刚问你是否可以使用 bg-image,Chris 说可以。我想你可以将渐变用作一个?
此技术之所以有效,是因为圆形伪元素与它们后面的元素相同,使其看起来像是“负”空间(正空间是选项卡)的一部分,因此这一切都取决于您是否可以让圆圈看起来像是背景的一部分。对于非纯色背景,我不明白这怎么可能。
这是一个好主意,但您添加的圆圈和正方形链接到它们的父元素,而不是它们放置在上面的链接。它基本上会占用当前链接邻居的可点击区域。
非常酷的技巧!我将尝试用图像来实现,并且可能会失败。
干得好,这仅在 Firefox 浏览器中有效。有什么想法吗?
我同意 John 和 Emily 的观点:这不是一种很好的使用技巧,因为你基本上可以悬停在“Two”上,但仍然获得“One”的链接。
使用这种技巧,无论它多么漂亮,最终都会在某些时候将你的用户发送到错误的页面。你不应该为了某些花哨的角而牺牲可用性。
如果你要以这种方式使用它们,我建议在 li 元素上添加一些 margin,这样你的链接就不会重叠。
在你的伪元素上添加一些 pointer-events,你就搞定了。https://css-tricks.cn/6379-pointer-events-current-nav/ - 在 Firebug 中的演示上尝试过,效果很好。
很棒的帖子 Chris,感谢你的工作。
有趣的技巧,但我希望知道对于浏览器来说,创建这些伪元素在计算上的开销有多大,与使用单个背景图像(使用滑块和精灵)进行选项卡的 http 命中相比。
太棒了!简洁且大胆,仅用五分钟就完成了。我喜欢这个想法的简单和有效性。分享很棒。
给出的演示在IE6中无法运行。
为什么2011年发布的东西会关心IE6?这个浏览器已经完全过时了。网页设计师需要继续使用更新、更好的东西。此外,IE6的市场份额已降至10%以下,因此大多数人已经放弃了对它的支持,谢天谢地。
你好。
我将你的文章翻译成俄语,并为IE6、IE7和IE8添加了更好的回退方案。http://habrahabr.ru/blogs/webdev/128210/——翻译。
http://websaints.net/example/roundouttabsmagic/index.html——回退示例。
有没有办法在不禁用选项卡角上的点击的情况下实现这一点?(在其他选项卡中实际上是一个与之颜色相同的圆圈?)
我有点认为这是一个小故障,这会让潜在的客户在我耳边嗡嗡作响。
pointer-events – https://css-tricks.cn/6379-pointer-events-current-nav/
很棒的技术,以及关于技巧工作原理的分步解释。你应该写一本书 :)
如果书的质量像你所有的技巧、窍门和演示一样好,那将是一本很棒的书!
很棒的技术和教程。
@Rachid:它也适用于谷歌浏览器和Opera!!
为了让可能不知道的人更加清楚。由于缺乏对border-radius和/或:before/:after伪元素的支持,这在Internet Explorer 8及以下版本中将无法运行。
IE8支持伪元素但不支持border-radius,但您可以使用CSS3PIE之类的polyfill来解决此问题。
然后,如果您正在为IE8使用CSS3PIE,那么您也可以使用Dean Edwards IE8.js脚本为IE7缺少的伪元素支持添加polyfill。
这意味着您可以借助一些JavaScript polyfill使此示例在IE6/7/8中运行。
这听起来可能像个愚蠢的新手问题,但它可以被设置为与悬停/滚轮状态一起工作吗?
这听起来可能像个愚蠢的新手问题,但这可以被设置为与悬停/滚轮状态一起工作吗?
Chris,非常棒的文章,并提供了非常好的易于理解的分步指南。
我只是想提议一个小的更改…
如果你使用圆形div的底部和右侧边框结合45度的旋转,你实际上并不需要正方形。
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
如果你首先声明圆形及其边框为透明,然后添加一行只将右侧圆形的底部边框和左侧圆形的右下角颜色设置为白色,那么你只需要定位圆形,使其1/4的边框与其余部分对齐即可。
我参考了这里提到的一个技巧:https://css-tricks.cn/examples/ShapesOfCSS/
但感谢你写了这篇好文章!
并祝愿大家拥有一个大部分纯HTML/CSS的2014年!;)