Adobe 网站上的模块有一些非常酷的标题栏。标题栏被分成左右两部分。左边是说明性的标题,右边是相关的链接。但让我们从批判的角度来审视他们的做法。

首先,他们使用非精灵图片来实现它

这意味着仅仅为了标题就需要额外的 HTTP 请求。更糟糕的是,:hover 效果是完全独立的图片。这意味着还需要另一个 HTTP 请求,并在第一次悬停时出现“黑屏闪烁”,等待第二张图片加载。
我们可以做到完全不用图片!这是我们的版本

标题的标记只是一个包含链接的标题
<div class="module">
<h2>Community <a href="#">Blue</a></h2>
<!-- stuff in module -->
</div>
这是标题的基本设置,链接位于右侧,具有基本颜色,包括由边框创建的白色直线
.module h2 {
background: #ccc;
padding: 0 0 0 10px;
font-size: 16px;
/* Thickness of the bar more easily achieved with line-height
since padding would push link inward. */
line-height: 2;
}
.module h2 a {
float: right;
position: relative;
text-decoration: none;
color: #333;
padding: 0 10px;
border-left: 5px solid white;
}
现在,要在直线中创建箭头,只需要使用 CSS 三角形,并通过 非常有用的伪元素 应用。

.module h2 a:before,
.module h2 a:after {
content: "";
position: absolute;
/* Pushed down half way, will get pulled back up half height of triangle
ensures centering if font-size or line-height changes */
top: 50%;
width: 0;
height: 0;
}
.module h2 a:before {
left: -12px;
/* Triangle */
border-top: 8px solid transparent;
border-bottom: 8px solid transparent;
border-right: 8px solid white;
/* Pull-up */
margin-top: -8px;
}
.module h2 a:after {
/* Smaller and different position triangle */
left: -5px;
border-top: 6px solid transparent;
border-bottom: 6px solid transparent;
border-right: 6px solid #a2d6eb;
margin-top: -6px;
}
我们和他们的一个显著区别是,他们的渐变贯穿整个三角形。对于我们来说,这是不可能的,因为使用 CSS 三角形技术应用渐变并不实用。但这并不意味着渐变不可用,只是你需要确保三角形与主链接连接的部分颜色是实心的。

为了演示页面,我添加了一些不同的颜色、过渡,以及使用双三角形来模拟斜线的示例。
谢谢你,你做得很好,我在 Lynda.com 上看到了你的培训,你是一位非常优秀的老师。非常感谢...
对于较新的浏览器,你可以使用 transform 属性,将正方形旋转 45 度。尽管我认为你需要确保正方形位于左侧标题面板上方,但位于右侧标题面板下方,并使用一些 z-index 技巧。
是的 - 此外,你可以使用 :before 并为它应用边框(或带扩展的 box-shadow),然后仍然使用 :after 执行其他操作。
确保将其放在代码片段中!
非常好 - 非常适合面包屑。我需要检查一下我们朋友 IE 对此有何看法。
非常酷,谢谢!
两个字,赞爆了…
谢谢…
我同意你的热情,Daniel,只是不同意你的补充。
使用相同的概念,我最近在链接/按钮中添加了一个箭头。效果很好… 除了我无法摆脱透明侧面的第二个 1 像素边框。你的演示在我的浏览器中也有相同的虚线边框。似乎与 FF8 和字体颜色有关,我认为。
不幸的是,我仍然没有找到解决方案。
尝试将元素透明侧面的边框样式更改为“inset”。
查看我下面关于
transparent的评论,以及它为什么是错误的值。将边框样式设置为“inset”是错误的解决方案。你可以将伪元素旋转 45 度,并在(我认为仅在 webkit 中)为它分配斜向渐变。
非常好!
两点评论
1) 我在 FF 7 中看到了 Jeremy 提到的相同边框
2) 以上回复与这个演示有什么关系?另一个可恶的垃圾邮件发送者!(编辑注意:已删除)
我稍微调整了一下,使小三角形也包含渐变。告诉我你的想法,Chris
http://jsfiddle.net/PFWbs/
哇,太棒了 :(o)
请不要使用
transparent!使用高级浏览器(例如 Firefox)的人会遇到问题,因为它们会进行抗锯齿处理,而transparent并不是你的本意。请记住,transparent等同于rgba(0,0,0,0)(透明黑色)。在 Firefox 中查看演示页面,你就会明白为什么你需要不使用transparent,而是使用rgba(255,255,255,0)(透明白色)之类值。我在 Firefox 中没有看到“transparent”和 rgba(255,255,255,0) 之间的区别。你的意思是?
啊… 我终于搞明白了抗锯齿问题。黑色阴影在 Firefox 上一直困扰着我。
非常感谢,Chris!
@JK: 这是抗锯齿问题。如果你从颜色 X 转换为无色,你需要另一侧是透明 X,而不是透明黑色。只有在斜边上才会显示出来。在填充区域,
rgba(255,255,255,0)将始终与rgba(0,0,0,0)看起来一样 - 透明。一种帮助你理解的方法是,从#ccc到transparent创建一个较大的渐变(抗锯齿基本上是一个长度最大为 3 像素的渐变),并将其与从#ccc到rgba(204,204,204,0)的渐变进行比较。结果会有很大不同。在当前的演示中,斜边的效果在 Firefox 中非常难看,而在 Chrome 或 IE 中则只是不太理想(因为它们没有进行抗锯齿处理)。
我已经快完成一篇关于这个主题的详细博文了,我会尽量记住,当博文发布时在这里发布一个链接。
太棒了。这起作用了。谢谢
这就是 SenchaTouch 中后退按钮的样式。让人困惑,但一旦你掌握了它,就会变得非常清晰!很棒的文章!
它很棒,但我只是想知道… 你使用什么字体来显示 before 和 after 伪元素部分?
很棒的文章,Chris。我喜欢从评论中学习的额外内容,例如 FF 抗锯齿问题。
Enrique,字体看起来像是 Light up the World.
很棒的文章… 对我来说仍然很困惑… 但我会多读几遍,以了解 before 和 after 的功能…
谢谢!
是的,我仍在努力理解 :before 和 :after。我认为我只需要练习一些伪元素,而不是仅仅阅读关于它们的相关文章。
我真的很喜欢这个!做得很好!
难道你不能简单地添加一个 45 度线性渐变来模仿链接中间部分的任何渐变,并在旋转后使其对齐吗?这需要一些数学运算,但除此之外,这似乎是一个简单的解决方案。
使用图片,更容易,而且你不必支持那么多浏览器。
但这是一种很棒的技术
伪元素在浏览器中的支持率非常高。IE6 和 IE7 无法显示箭头,但会有足够的回退方案。
使用图片意味着更多的 HTTP 请求和更长的加载时间(虽然差别很小,但还是有)。
所以问题归结为,对于当前项目来说,什么更重要、更合适:速度和资源,还是向后兼容性。
在我的 0.6 Mbps 的互联网连接下,这种差异会变得更大。
@Ludwig: 演示页面在 IE6 中根本无法很好地降级,链接最终会出现在横幅下方,而且整体看起来不太好。但如果你是在为 IE6 设计,你就会知道你面临着一些挑战。:-) 幸运的是,大多数人不再需要为 IE<8 设计,即使是大公司和政府部门也终于开始至少使用 IE8,因此即使这个细分市场也将很快摆脱 IE6/7 的束缚。不过,针对中国市场的网站设计师似乎还需要继续忍受它们一段时间。但我们已经快到了!
这个教程真的很不错,谢谢!有人能告诉我关于最佳 JavaScript 书籍或教程网站的信息吗……提前谢谢!
哇!太棒了。我今天偶然发现了你的网站,感觉太幸运了。绝对不会是最后一次。
来自德国的问候 :)
这些很棒,感谢你的教程!
一篇很棒的帖子。谢谢!
不错的点子。我已将你的网站添加到我的每日早间咖啡列表中 :)
关于渐变,你是否可以将箭头设置为透明,并将非箭头元素设置为白色,然后将其放在具有背景渐变的 div 中?我自己也在研究这个问题,非常喜欢你的例子。谢谢
以下方法可能不如这种方法整洁,但它提供了渐变箭头。对任何人有用吗?
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>untitled</title> <meta name="generator" content="TextMate http://macromates.com/"> <meta name="author" content="Web Developer"> <!-- Date: 2011-12-22 --> <style> * {margin:0; border:0; padding:0} .left-arrow-bottom { border-color: transparent transparent #cacaca #cacaca; border-style: solid; border-width:5px; width:0; height:0; } .left-arrow-top { border-color: #cacaca transparent transparent #cacaca; border-style: solid; border-width:5px; width:0; height:0; } .link-left{ float:left; width:8px; margin-left:2px; } .link{ float:left; color:white; margin-top:8px; background-color:transparent; background-image:url("images/vgradient.gif"); background-position:2px; background-repeat: y-repeat; width:120px; } .link-right{ float:right; width:8px; } .button { background-color:transparent; margin-left:2px; padding-left:2px; padding-right:4px; } </style> </head> <body bgcolor="#cacaca"> <div class="link"> <div class="link-left"> <div class="left-arrow-top"> </div> <div class="left-arrow-bottom"> </div> </div> <span class="button">Home</span> </div> </div> <div class="link"> <div class="link-left"> <div class="left-arrow-top"> </div> <div class="left-arrow-bottom"> </div> </div> <span class="button">About Us</span> </div> </div> <div class="link"> <div class="link-left"> <div class="left-arrow-top"> </div> <div class="left-arrow-bottom"> </div> </div> <span class="button">Contact</span> </div> </div> </body> </html>仅供参考
演示在 IE8 中无法正常工作
(虽然令人难过,但这是事实)
我不得不说,我真的很喜欢这种东西。@Paul 它在 IE8 中会优雅地回退吗?我得启动一个虚拟机来确认一下,但我确信可以通过条件语句处理,或者甚至使用 Modernizer?
@Chris Morgan
你是我的英雄!当我创建 CSS 对话框时,我遇到了 Firefox 反锯齿问题。我绞尽脑汁也无法弄清楚为什么 Firefox 会添加额外的线条。使用 rgba(255,255,255,0) 就解决了!