一个好看的选项卡控件通常有一个特性,我一直发现无法在不使用图像的情况下重现:在每个选项卡底部向外弯曲的边框。在本文中,我将展示如何使用 CSS 的 :before
和 :after
伪元素在不使用图像的情况下创建此效果。首先,让我们从一些基本的标记开始。
标记
<ul class="tabrow">
<li>Lorem</li>
<li>Ipsum</li>
<li class="selected">Sit amet</li>
<li>Consectetur adipisicing</li>
</ul>
这将是尽可能基本的。这里没有很多元素可供使用,但足够了。
入门
要开始,让我们摆脱默认的 <ul>
和 <li>
样式,并让这些元素排成一行。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow {
text-align: center;
list-style: none;
margin: 0;
padding: 0;
line-height: 24px;
}
.tabrow li {
margin: 0 10px;
padding: 0 10px;
border: 1px solid #AAA;
background: #ECECEC;
display: inline-block;
}
选择选项卡
当然,选定的选项卡应该清晰可见。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow li.selected {
background: #FFF;
color: #000;
}
了解事情的底层
每个选项卡控件都需要一个明确定义的底部边缘。现在它不会做什么,但稍后它将有助于强调选定选项卡位于顶部的效果。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow {
position: relative;
}
.tabrow:after {
position: absolute;
content: "";
width: 100%;
bottom: 0;
left: 0;
border-bottom: 1px solid #AAA;
z-index: 1;
}
在这里,我们介绍了第一个 :after
伪元素。基本上,:after
在元素上追加另一个子元素。它不在 DOM 中(这就是它被称为伪元素的原因),所以它不是一个真正的子元素,但它是完全可样式化的,只要您添加一些 content
,在这种情况下是一个空格字符。
在我看来,术语 :before
和 :after
有点令人困惑,因为伪元素实际上不是添加到它们应用到的元素之前或之后,而是作为子元素插入的。这也是为什么您不能将 :before
和 :after
应用于不能包含子元素的元素(“无内容”元素)的原因,例如 <input>
。
在本例中,我们使用伪元素创建一个底部边框,它不会影响选项卡的定位。我们本可以在 <ul>
上添加一个底部边框,但这会让下一步变得更棘手。
超越
现在,一个令人信服的选项卡控件的必要部分是,选定的选项卡位于边缘前面,而其他选项卡位于边缘后面。为此,我们改变其底部边框,并进行一些 z-index
魔术。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow:before {
z-index: 1;
}
.tabrow li {
position: relative;
z-index: 0;
}
.tabrow li.selected {
z-index: 2;
border-bottom-color: #FFF;
}
弯曲
现在是时候添加难以捉摸的向外弯曲的边框了,我们将为此使用 :before
和 :after
。让我们一步一步地进行,首先只将所有内容都放在适当的位置。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow li:before,
.tabrow li:after {
position: absolute;
bottom: -1px;
width: 6px;
height: 6px;
content: " ";
}
.tabrow li:before {
left: -6px;
}
.tabrow li:after {
right: -6px;
}
.tabrow li:after, .tabrow li:before {
border: 1px solid #AAA;
}
不要那么方
您可能已经猜到会发生什么。让我们删除我们不想要的边框,并添加一些圆角。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow li {
border-top-left-radius: 6px;
border-top-right-radius: 6px;
}
.tabrow li:before {
border-bottom-right-radius: 6px;
border-width: 0 1px 1px 0;
}
.tabrow li:after {
border-bottom-left-radius: 6px;
border-width: 0 0 1px 1px;
}
切角
这个结果有点不对劲。让我们仔细看看。正如您所看到的,原始的直角和圆角都是可见的。我们需要以某种方式摆脱直角。为此,我们将用阴影将其遮盖起来。为了说明正在发生的事情,让我们让阴影更突出一些。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow li:before {
box-shadow: 2px 2px 0 red;
}
.tabrow li:after {
box-shadow: -2px 2px 0 red;
}
快到了
正如您所看到的,红色阴影完全覆盖了我们想要隐藏的方形角。如果我们给阴影赋予正确的颜色,幻觉就完成了。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow li:before {
box-shadow: 2px 2px 0 #ECECEC;
}
.tabrow li:after {
box-shadow: -2px 2px 0 #ECECEC;
}
.tabrow li.selected:before {
box-shadow: 2px 2px 0 #FFF;
}
.tabrow li.selected:after {
box-shadow: -2px 2px 0 #FFF;
}
点缀
现在剩下的就是添加一些渐变和阴影,让它更精致一些。
- Lorem
- Ipsum
- Sit amet
- Consectetur adipisicing
.tabrow li {
background: linear-gradient(to bottom, #ECECEC 50%, #D1D1D1 100%);
box-shadow: 0 3px 3px rgba(0, 0, 0, 0.4), inset 0 1px 0 #FFF;
text-shadow: 0 1px #FFF;
margin: 0 -5px;
padding: 0 20px;
}
如果您想知道浏览器兼容性,它与您预期的一样:除了 IE 之外。IE10 可能也能正常工作,但我没有机会使用预览版进行测试。由于 IE8 和 IE9 支持 :before
和 :after
,但不支持 border-radius
,因此如果您想为这些用户的提供良好的视觉体验,您需要为它们创建一个 单独的样式表。
编辑说明:我在演示中的选项卡内添加了锚链接,因为我认为这是使用这种选项卡导航的最有可能的情况。最有可能的是,它们会有一个 href
属性,该属性会链接到它们通过 id
关联的内容,而这种行为将由 JavaScript 控制。这个教程不需要锚链接来实现额外的伪元素,这进一步证明它比我的原始版本更好。
更新:Allan Watkins 向我发送了这些选项卡的变体,它们指向下方
查看 Chris Coyier 的 CodePen 上的笔 指向下方的圆角选项卡 (@chriscoyier) on CodePen.
哇。它们太棒了!
这真的很好。感谢分享。
但我遇到了一些问题。可能是因为我尝试将它与
JQuery-Tabs 一起使用。
如果我点击链接区域之外的选项卡,则会发生视觉变化,但它不会
改变选项卡页。
如果我点击链接区域内的选项卡,则会改变选项卡页,但我会失去视觉变化。
有人能给我一些建议吗?
太棒了!!
嘿!
非常好的技巧,这在 W8 上的 IE10 中完美运行!
嘿!
在 Opera 11 上似乎也运行良好;)
感谢 Chris,但是如何在旧浏览器中实现这种效果?我 75% 的访客使用 IE6-IE7-IE8。
那么有什么简单的想法呢?!!!
尝试一下 PIE,它有一些 CSS3 的东西不能做,但它允许你使用渐变和外部阴影。它也可以动态工作,所以非常无缝。
http://css3pie.com
我的团队在一个相当大的网站上使用了 CSS3 pie,IE7 的渲染性能变得非常差。它会降低运行它的 PC 的速度,点击某些东西需要一整秒或更长时间才能改变状态的外观。要坚持不支持 IE7。我们迟早都要做,所以真的没有选择。如果你真的必须,可以使用 JS Shim 来支持 :before 和 :after。IE8 降级到方形角和平坦渐变——这很好。IE9 具有圆角,但没有渐变。所有这些都很好。不同的浏览器可以获得不同的设计。更好的浏览器会奖励用户升级的努力,提供一个更好的网站。这是一个我们需要鼓励的奖励系统。
漂亮 :)
内部选项卡的顶部怎么样?外部选项卡看起来很漂亮,但内部选项卡不够干净。
嘿,克里斯!
选项卡在 IE9 中工作得很好……IE9 支持 border-radius。
确实如此。虽然很多人可能不知道你必须指定所有四个角才能使其生效。例如,快捷方式
你应该这样做
我认为这不对,史蒂夫。border-radius 属性在 IE9 中使用单个值就可以正常工作。话虽如此,我没有 IE9 的原生安装(我有 IE8 和 IE10,它允许“IE9 模式”),但我使用 Adobe 浏览器实验室进行了一次快速测试,圆角工作正常。此外,像 caniuse.com 这样的网站通常会对这种部分支持类型进行注释,但我没有看到关于此的任何内容。
在文章中提到 border-radius 不支持的那一部分,我认为他指的是不支持 IE8,而不是 IE9。克里斯可能想更正这句话。
我认为有人会认为 IE9 不支持 border-radius 的唯一方法是,他们不小心在他们的 IE9 安装中使用了“IE8 模式”(我之前在 IE8 中使用过 IE7),或者他们正在测试的文档在头部使用了“IE7”元标记。
我确实安装了 IE9 的原生版本,我可以确认
工作正常。对于圆角相同的角落,不需要四个值。
我喜欢!你使用所有这些技术的做法很巧妙。
简洁干净。谢谢克里斯。
哇,这些选项卡太棒了。我想我可能_不得不_在接下来的项目中使用它们!非常感谢!
哇!
这是一个关于我原本以为更复杂的事情的清晰简洁的解释。最终的结果非常清晰简洁,但并不无聊。我一定会很快将圆角选项卡加入到某个项目中,感谢代码和设计理念!
它们在 IE9 中工作得很好!唯一不显示的是 IE9 中非活动选项卡上的轻微渐变阴影,但边框工作正常。
你好
IE9 支持 border-radius。选项卡看起来很棒!
你忘了添加边框
.tabrow li:before, .tabrow li:after { border: 1px solid #AAA; }
很棒的文章,谢谢!
很棒的教程。我用它创建了类似于 Google Chrome 使用的梯形选项卡,这是我的结果
http://dabblet.com/gist/1590824
看起来不错 :)
太棒了。我一直停留在超越步骤(也许在选项卡的顶部加上圆角和一点渐变)。但最后的润色确实起到了作用。干杯
感谢大家的所有积极评论!
@islam barakh:在 IE6-8 中实现这种效果并不难,只需要更多的 HTML、CSS 和(更重要的是)图像。
@Maurycy:我会要求克里斯进行更正,谢谢!
@Tom:这确实很巧妙,而且它们看起来很棒。我一定会使用它。
更改了边框,谢谢!
不错!
不错…
使用 CSS3 Pie,你就可以在 IE 中获得这些圆角。
http://css3pie.com/
很棒的教程,谢谢。
我建议增加一点——在演示中,我会让选项卡中的整个区域都可点击——而不仅仅是文本。
在演示中,它们是可以点击的。
选项卡看起来很酷。
但我认为我可能漏掉了什么,使用 Safari 4.1.3 时,底部圆角选项卡仍然清楚地显示了你试图用阴影“隐藏”的垂直线。
而在 Firefox 3.6.23(在 Mac 上)中,所有选项卡都没有圆角——它们仍然都是方形角!
干杯
我
对于 Firefox 3.6,需要 -moz- 前缀。
border-radius
(无前缀)仅适用于 Firefox 4 及更高版本。关于选项卡中的整个区域都可点击。
将 .tabrow li {} 中的填充
移动到
.tabrow a{color:#555;text-decoration:none; padding:2px 20px;}
真不错,一如既往的优秀作品!
多么棒的效果。我相信我可以在一两个网站上使用它。
选项卡看起来很酷。
但在 Safari 4.1.3 中,底部的圆形凸缘仍然显示了你试图用阴影“隐藏”的垂直线。
而在 Firefox 3.6.25(Mac)中,所有选项卡都显示为方形角,根本没有圆角。
那个阴影,用来隐藏角落?喜欢!它!
出现问题:在 Android 上,模糊值为 0 的 CSS 阴影根本不显示。
至少在 2.3 版本上。我不知道这个错误是否出现在其他版本中。一个**非常**老的错误。
也许你期望太多。只有营销能力强的 Android 很差。
哇,太棒了,太清晰了
啊,不错。
终于!感谢分享,克里斯。
我喜欢演示就在页面上的这个事实!
不支持 IE :(
漂亮!不只是
border-radius
阻止它在 IE8 中工作,还有box-shadow
(链接)。使用伪元素,从而抛弃 IE6 和 IE7,对于现在不针对中国的用户来说可能没问题,但我们很可能在一段时间内仍然需要使用 IE8。尝试使用 CSS3 PIE
http://css3pie.com/
在 IE6 及更高版本中启用使用 border-radius 和 box-shadow。
请注意,许多服务器不允许直接使用 PIE.htc 脚本,您需要使用 PIE.php 脚本加载它。
谢谢克里斯。这真的很有用…
哇,太漂亮了
第一个和最后一个伪类可以使用 polyfill Selectivizr 在 IE 6-8 中使用
http://selectivizr.com/
实际上 Selectivr 非常棒,但它不处理 :before 和 :after
Before 和 After 在 javascript 中将不存在!!!
作者在撰写这篇文章时,旨在介绍 HTML 中的“:AFTER”和“:BEFORE”…。
令人印象深刻!我上周尝试完成相同的效果,但我使用了 3 个伪元素:http://www.swordair.com/blog/2012/01/747。使用 box -shadow 来隐藏方形角非常有创意。很棒的作品!
确实是顶级的东西。我总是对 CSS 能做到的事情感到惊讶。
停止在网站构建中使用太多图像的第 485 个理由!
这个技巧真的很巧妙,以前从未见过这么好的东西,我已经把它加入书签(在我的网站上),以便以后参考 :)
干得好。
你的解释非常清晰简洁。我简直能感觉到这种技术带来的可能性所带来的兴奋!无需图像!!耶!
这么久以来,我一直不得不处理不必要的标记,但这种方法在不需要的情况下创建了如此美丽的选项卡。
对于所有抱怨 IE8 的人来说——请记住,网站并非总是需要在每个浏览器中看起来完全一样。我通常喜欢为那些拥有功能强大的浏览器的人添加这些细节,并提供一个“足够接近”的回退。
我认为我将从现在开始采用你的分步样式方法。它似乎确实避免了不必要的代码。很棒的作品!一种灵感。
阴影在底部角落仍然有一点显示。不多,但还是可以察觉的。更糟糕的是,边框等于背景颜色技巧。它隐藏了可能是 css 中选项卡最难的部分之一,并且当你的背景颜色不是一个值时会失效。
真的很棒!
很狡猾!:)
很棒的文章!
我在 css 峰会 11 上使用了相同的概念(自我开发的)来应对克里斯的挑战——我想我不太原创……
我不得不将 .tabrow li 更改为 margin: 0 5px; 并且 .tabrow li:before 和 :after 更改为 left: -8px;。但角落仍然显示在选项卡之间的小方框上。由于某种原因,将左上角和右上角的边框宽度设置为 0 不会隐藏边框。我在 Safari 和 Firefox 中测试了这一点。
此外,最终结果非常难看,因为选项卡下方有一个大阴影,使方框阴影脱颖而出。我可以删除阴影,但这样选项卡就不会有那么好的阴影。令人失望的解决方案!
删除元素的结束标签(因此没有)或删除它们之间的任何空格(如果你想与 xhtml 兼容)——关于使用内联块元素的一件事
哦,抱歉,忽略帖子——我认为我没有正确理解你的问题 :-P
做得很好,而且易于理解。很高兴看到这可以用不使用图像和一些 CSS3 来完成。可惜 IE 还没有支持...很遗憾。
亚伦,IE9 支持得很好。所以,也许你因为这样的信息和知识而感到羞愧。
是的,它不支持 IE9 - 但在 IE9 中非常不错…
嗨!
非常不错的选项卡,但我遇到了一点问题!!
删除选中状态的脚本会杀死页面上的所有其他“选中”链接。
有人知道如何解决吗??
非常感谢!
CENCO
试试这个
这很花哨。不错的演示。
谢谢克里斯 ..
很棒的教程 ..
期待更多教程 ..
无法在表格格式中使用他的作品... 而不是在 上使用 :after 或 :before,例如在 上使用它。我简要尝试过,没有成功,所以如果有人比我更了解,可以回答这个问题,将不胜感激。
以下是在 上使用 :before 和 :after 的示例
http://jsfiddle.net/3zvHF/2/
克里斯,我是你的忠实粉丝,这仅仅是大师级作品。我只是想知道,你是从哪里得到用 css 来做这个的想法的?其他人都会用图像来做,但你真是 css 大师
这是一种很棒的技术!我不会想到这个。
这真的很好。感谢分享。
不过,有两点需要澄清。你说
我认为这实际上具有误导性。W3C 说它们在 DOM 树中位于后面,而不是作为后代子元素。见
http://www.w3.org/TR/CSS2/generate.html
然后你又说
这是完全错误的。试试
在 上...
但是它与 IE7 不兼容 :) 并且您为此使用了一些 lib js?
这很酷,太好了,您还展示了如何仅使用 CSS 来完成,这将使它更容易集成到我的几个客户 CMS 中。
我现在要开始玩它了
如果您使用 `<label>` 标签和一组单选按钮,您可以完全不使用 JavaScript 来执行选项卡切换。
使用 jsFiddle 演示
这太棒了。唯一的问题是缩放 - 即使是轻微的改变也会使选项卡的底部看起来很糟糕。除了告诉用户不要缩放之外,还有其他方法吗?
@stryju
太棒了!非常感谢您的帮助,它完美地工作了!
此致
CENCO
外观很棒,但在本地主机上无法使用 e.preventdefault。尝试了此页面上的脚本以及下载的脚本。否则,超级好主意!
嗨,Brad。在你关于本地主机启用“e.preventDefault”的评论后,你刚刚解决了我的问题。我删除了“e.preventDefault”,它可以正常工作。当我准备上传使用“(Better) Tabs with Round Out Borders”的页面时,我是否需要替换“e.preventDefault?”
任何评论将不胜感激。
我不知道,Jack,我从来没有在服务器上设置过它,因为一些其他的事情出现了。据我所知,本地主机应该像网络上一样。我仍然在我的本地页面上使用选项卡,只是没有 js。我注意到它对其他人有效,所以它是一个不错的选择,并且外观出色。
谢谢,Brad,是的,你说得对,本地主机就像网络上一样。只是刚开始使用本地主机,愚蠢的问题。无论如何,这个 CSS 让我想了一整夜,我喜欢它,自从有了这样的网站,我已经好几个星期没有碰过表格了!
真的很棒,Chris!每次我想使用这种带有几种状态的漂亮导航时,我都使用过时的巨大图像精灵 Apple 技术,它工作得很好,但不用图像就能做到几乎一样,这真是一个成就!干得好!
我为这个示例创建了一个 dabblet
http://dabblet.com/gist/1633247
所以你可以在浏览器中玩转 css
Robin
很棒的东西!
不过,我建议在选定的选项卡上使用 `border-bottom: 2px solid white;`。额外的边框像素将覆盖选项卡下方的难看的边框(至少对我来说,在 Chrome 中是这样)。
感谢您的提示,这里有一些很棒的文章!
非常感谢你。关于这方面的“小”教程真是太棒了!而且令人震惊的是:它在早期版本的 IE 上不工作......呃。
尽管如此,再次感谢!
简洁明了,谢谢!
感谢这篇文章,太棒了。我必须说你的博客提供了很多有用的信息。我认为这篇文章真的很有趣。事实上,我喜欢阅读这篇文章。继续分享更多迷人的博客。
嗨
不错的选项卡......有没有办法左对齐选项卡?(如果我尝试操作 .tabrow text-align: left;)
第一个选项卡失去了左侧......
感谢 Chris Coyier 和 Menno van Slooten 的这项出色的工作。Chris,您的网站很棒!在多年来一直使用表格后,我刚刚开始意识到并利用 CSS 的强大功能。我遇到的最大问题是对齐,但我正在通过这样的网站取得进展。
Menno van Slooten,我已经将你的网站添加书签,当我浏览更多我添加书签的网站时,我会更多地探索它。:)
谢谢!
Jack
您好,这真是出色的工作。
我该如何让 href 工作?我是一个 CSS 新手,真的想知道该怎么做,以便选项卡链接到其他 html 页面?
谢谢
Martin
您好,我找到了解决我的问题的方法......我在 javascript 中删除了“e.preventDefault();”,现在它像魅力一样工作......
我有两个问题
测试页面:http://www.employeeuniversity.com/videos/customer-service-viral.htm
当我打开这个测试页面时,选项卡没有格式化。没有形状,选项卡内容框也乱七八糟。在 Chrome 和 IE8 中看起来很好(至少形状存在),在 IE10 中也很好,但在 IE9 中,我必须点击“兼容性视图”按钮才能让选项卡“成形”并执行它们的操作。是什么导致了这种情况?
在 CSS 中,我需要添加什么内容才能让活动选项卡(加载页面时显示的选项卡)显示为白色选项卡,就像您单击选项卡时它们看起来一样。
提前感谢 - IE9 问题至关重要
在我看来,选项卡在 Firefox 和 Chromium 下都略微损坏。如果您在伪元素上设置“-5px”而不是“-6px”,它们看起来就很完美!
现在,我已经创建了一个与 JQuery-Tabs 完美配合的版本。
您是否有什么提示可以让我将其从居中对齐到左侧,这样它就不会失去左侧的边框(填充或边距参数)?
来自德国的许多感谢