在本教程中,我们将制作以下内容

基本 HTML
我们将使用 <nav>
标签内的简单无序列表1 来创建我们的按钮。
<nav>
<ul class="nav">
<li><a href="#" class="icon-home"></a></li>
<li><a href="#" class="icon-cog"></a></li>
<li><a href="#" class="icon-cw"></a></li>
<li><a href="#" class="icon-location"></a></li>
</ul>
</nav>
一些资源
- 按钮中的这些图标来自 Fontello 图标字体和 Web 应用程序。
- 纹理背景来自 Subtle Patterns。
图标字体的 CSS
有几种方法可以做到这一点,但我们将使用这种方法
@font-face {
font-family: 'fontello';
src: url('../fonts/fontello.eot');
src: url('../fonts/fontello.eot?#iefix') format('embedded-opentype'),
url('../fonts/fontello.woff') format('woff'),
url('../fonts/fontello.ttf') format('truetype'),
url('../fonts/fontello.svg#fontello') format('svg');
font-weight: normal; font-style: normal;
}
[class*=" icon-"] {
font-family: 'fontello';
font-style: normal;
font-size: 3em;
speak: none;
}
.icon-home:after { content: "\2302"; }
.icon-cog:after { content: "\2699"; }
.icon-cw:after { content: "\27f3"; }
.icon-location:after { content: "\e724"; }
按钮的 CSS
通过将列表项设置为 inline-block
,按钮将水平排列。 我们将使用一点负边距将它们彼此紧挨着(或者参见 其他技术)。
.nav {
list-style: none;
text-align: center;
}
.nav li {
position: relative;
display: inline-block;
margin-right: -4px;
}
按钮的美丽的三维效果来自于微妙的渐变和一对 box-shadow
(一个普通阴影,一个内阴影)带来的斜面和浮雕效果。 按钮的宽度和高度相同,形成一个正方形,然后通过 border-radius
变为圆形。 line-height
与高度匹配,text-align
设置为居中,因此图标将水平和垂直居中。
.nav a {
display: block;
background-color: #f7f7f7;
background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f7f7), to(#e7e7e7));
background-image: -webkit-linear-gradient(top, #f7f7f7, #e7e7e7);
background-image: -moz-linear-gradient(top, #f7f7f7, #e7e7e7);
background-image: -ms-linear-gradient(top, #f7f7f7, #e7e7e7);
background-image: -o-linear-gradient(top, #f7f7f7, #e7e7e7);
color: #a7a7a7;
margin: 36px;
width: 144px;
height: 144px;
position: relative;
text-align: center;
line-height: 144px;
border-radius: 50%;
box-shadow: 0px 3px 8px #aaa, inset 0px 2px 3px #fff;
}
我们可以通过在 :hover
状态下略微扁平化按钮来创建按下效果。 您可能希望将此保存为 :active
状态,并在 :hover
状态下执行其他操作,但我们将留给您决定。
.nav a:hover{
text-decoration: none;
color: #555;
background: #f5f5f5;
}
此时,我们的按钮应该看起来像这样

还不错,但我们还有很长的路要走。
现在到了有趣的部分,我们将使用伪元素为我们提供一些额外的元素来创建其他效果。 为了创建您在每个按钮之间看到的水平“凹槽”,我们将向列表项添加伪选择器 :before
。 使用负 z-index,我们可以将其保持在所有内容下方。 双 border
使其具有内陷效果。 我们之前在列表项上使用的负边距使此凹槽看起来是连续的。 我们利用绝对定位将线条居中。
.nav li:before {
content: "";
display: block;
border-top: 1px solid #ddd;
border-bottom: 1px solid #fff;
width: 100%;
height: 1px;
position: absolute;
top: 50%;
z-index: -1;
}
为了获得额外的三维效果,我们将在按钮所在的每个锚点周围创建一个“井”。 我们再次可以通过使用伪元素在没有额外 HTML 的情况下创建它。
.nav a:before {
content: "";
display: block;
background: #fff;
border-top: 2px solid #ddd;
position: absolute;
top: -18px;
left: -18px;
bottom: -18px;
right: -18px;
z-index: -1;
border-radius: 50%;
box-shadow: inset 0px 8px 48px #ddd;
}
井的大小(略大于按钮本身)来自于将其绝对定位在按钮后面,并通过使用负定位值(top/bottom/left/right)将其拉伸。 这次的三维效果来自于顶部 border
和内阴影 box-shadow
创建的内部阴影。
完成了!
是不是很简单?

浏览器支持
这些按钮使用了大量的 CSS3 和一些伪元素(CSS 2.1)。 虽然没有太过前沿的技术。 近几年 Safari、Chrome、Opera 或 Firefox 的任何版本都不会有任何问题。 IE 8 不支持 CSS3,因此它会回退到以下效果

IE 7 类似,只是没有“凹槽”线条,因为它不支持伪元素。 也没什么大不了的。
1 无序列表 可能并不适合导航。 我们在这里仍然使用它们,因为我们需要额外的元素。
非常聪明,按钮很漂亮!
我一直在制作类似的 3D 按钮,但这个井让它变得更好!
太棒了……我们该如何让它们响应式? 我们能使用百分比大小吗? 或者这根本不值得……我听到 Fiddle 的声音了…….
很流畅……但我只想按下它们! :)
我想知道为什么缺少
active
状态,我认为这是一个很棒的补充。Fontello 是一款很棒的开源软件。 :)
关于 Fontello:我希望我能访问他们的网站。 现在无法加载(6 月 13 日上午 9 点):fontello.com。 只是很高兴我现在不是一个时间敏感的项目。
不错,但不可访问!
不适用于爬虫,也不适用于禁用 CSS 的用户,
使用文本浏览器或屏幕阅读器的用户。
同意! 空的 a 标签对可用性和 SEO 来说很糟糕。 将链接文本放在一个具有类似于 HTML5 样板的 visuallyhidden 类别的 span 中,以保持可访问性和视觉吸引力。
好吧,您仍然可以在 和 之间插入标题以获取“a”元素或普通文本,并将文本缩进设置为 text-indent: -9999px 或其他值。 我认为这对 SEO 来说没有问题。 这些按钮与使用图像的按钮一样好。
这些很棒! 但它们非常非常非常地缺少 Active 状态!!!!
在我的 IE8 中,不仅效果没有出现,而且字形也不同!
Bill,
Chris 已经在文章中提到,IE8 不支持浏览器,但是有一些解决方法,只需为 IE9 以下的浏览器使用单独的样式表即可。 说实话,您真的应该升级到 IE9,或者干脆使用更好的浏览器,例如:Safari 或 Chrome。
Rob。
说实在的,您真的应该升级到 IE9,或者干脆使用更好的浏览器,例如:Safari 或 Chrome。
拜托,您有没有想过 Bill 可能已经在使用一台功能完备的浏览器? 毕竟,他是在这个网站上,我认为可以肯定地说,他在测试旧浏览器时可能会考虑到他的客户。
这使我想起上周末在圣彼得堡的前端设计大会上发生的一件事;一位更专注于“前沿”浏览器使用的演讲者被问到,对于需要支持旧版浏览器的开发人员/设计师,他建议什么?他的回答是建议这些用户升级。对于电子商务网站(我希望他们在那里完成交易,并且不太关心他们使用什么浏览器)来说,这并不实用,或者对于大多数其他想要吸引大量受众的网站来说也是如此。可悲的是,有些人似乎忘记了我们正在为设计师/开发人员之外更多的人构建这个“网络”,我们还必须牢记那些可能不会每天在电脑前花费 8 个小时以上的人。
Tommy,
我明白你的意思,你提出的观点很有道理。也许是我措辞错误,我没有暗示我们应该敷衍了事,希望人们只是使用更好的浏览器。我认为每个网站都应该能够在所有浏览器中正常工作,这就是为什么我建议为使用较低版本的 IE 的用户使用单独的样式表。
我在观点末尾的简短评论不是说开发人员不应该考虑我们在浏览器支持方面遇到的问题,它只是对 Bill 本人的建议。他可能已经拥有一个功能强大的浏览器,而说他需要升级可能很愚蠢;但是我的意图并不是贬低浏览器支持的重要性。
是的,我期待一些很棒的
:active
状态。我也是这么想的 - 释放 awesome!!!
你确定是 IE 的截图吗?演示按钮在 IE7 中似乎根本没有渲染(在 Adobe Browser Lab 和 Skytap 虚拟机中测试)。
@Scott
这是正常的,IE7 不支持 :before 和 :after 伪元素。
我使用这种按钮样式已经有一段时间了,之前我都是从原始 Photoshop 设计中作为图像提供它们……
一如既往的精彩帖子,Chris。美妙的作品。
刚重新阅读了原始帖子,我想我应该重新感谢!很棒的作品 _Brandon_ :)
我喜欢这个,非常简单。但是为了更好地与屏幕阅读器进行无障碍访问,在导航栏中使用文本,然后使用 text-indent:-9999 会更好吗?:)
这在 IE 中可以使用 <a href=”http://selectivizr.com”> selectivizr</a> 吗?
你可能喜欢一些这些赏心悦目的代码示例
https://code.google.com/p/css3-graphics/
https://code.google.com/p/css-shaders-graphics/
https://code.google.com/p/jquery-css3-graphics/
Brandon,这项工作很棒。
这里有一个带有简单 :active 状态的小提琴,有些人要求它
http://jsfiddle.net/kTnMJ/
根据我的测试,图标在 IE8 中可以正常工作,按钮是方形的,就像文章中的截图显示的那样,但 IE7 不起作用。我认为这是因为 IE7 不正确地支持 inline-block(但我没有对此进行太多调查)。
不错,谢谢 Louis!
我拿到了这个,把它搬到了 CodePen,并**解决了人们提到的无障碍问题**。
http://codepen.io/chriscoyier/pen/46/3
ala https://css-tricks.org.cn/html-for-icon-font-usage/
我认为在按钮处于活动状态时仅添加一个边框不会给界面增加太多,在我看来,当元素收到阴影时,适合活动状态的外观应该是应用与正常状态相同的阴影,但反转。
http://codepen.io/JCMais/pen/1/4
@chris
忍不住要笑,你居然给自己的评论加了星标。:)
@jonathan
我不确定阴影是否应该像那样反转。看起来还可以,但几乎看起来像是按钮被推得太低了。我认为我更喜欢我的,但也许两者之间的折衷方案(在活动状态下阴影没有那么大)会更好。
是啊,我通常不这样做,但我非常希望人们看到它,因为它解决了很多人提到的无障碍问题。
我也认为它应该有一些悬停效果 - 也许可以进入“按下”状态。
它们看起来很棒,在 IE9 上也很好看,除了渐变之外,这不是什么大问题。它们在旧版本的 IE 上看起来不好,但谁在乎呢?
老兄!这些真不错……我要看看我是否可以在黑色的按钮上实现相反的效果!太酷了!
哇,太棒了,绝对值得在未来的网站上使用。我看到的唯一问题是,一些图标似乎有点位置不对,但这很容易解决。感谢分享。
非常棒,即使 IE7 不支持 :before 和 :after 伪元素。此外,根据 w3schools.com 的说法,IE7 已经快要死了……https://w3schools.org.cn/browsers/browsers_explorer.asp
试着告诉现实世界的客户 IE7 已经死了。你为什么认为你的客户群的浏览器配置文件与 W3schools 访问者的配置文件相似呢?
如果你真的需要 IE 7 支持,就不要使用 :before,将图标放在标记中。或者使用一些 JavaScript(不是理想的,IE 7 已经很慢了)来读取数据属性并将其放入标记中。
我理解伪元素的工作原理,但我没有太多使用过它们。这是一个很好的演示。我想要更多关于这个元素的结构和效果的解释
谢谢!:-)
我相信这是一个 CSS3 属性选择器,用于识别任何“包含”前缀/属性“icon-”的类。
这证实了我的假设。我的意思是,根据后面的类,我认为它就是这样做的。我喜欢这种可以帮助减少编码的东西。我只是要记住并习惯实现它。:-)
我在 CSS 中使用它来对组件进行命名空间,而不是使用多个类,例如“icon icon-home”。你在这里已经看到了“icon-”的示例,还有“list-”、“btn-”或“pod-”等项目。
我在 [class*=”btn-“] 声明中设置基本样式,然后在后续声明中编写我的覆盖或扩展,例如“btn-primary”。
不过这里有一些注意事项。你必须确保没有其他类包含你使用“*=”选择器使用的关键字。另外,“*=”选择器可能是 CSS 选择器中性能最低的选择器之一。但公平地说,如果你担心性能,你可能最好将精力集中在其他地方,例如 gzip、缩小或优化图像,因为调整 CSS 选择器更多的是微优化。
伪元素告诉你,具有命名类的元素以 icon- 开头。
它在 IE 7-8 中不起作用,我们有针对 IE 的任何回退代码吗?
如果你使用 selectivizr,像 :before 和 :after 以及 :nth-child(1) 这样的伪元素将在 IE7 中起作用。
:nth-child 可以,:before/:after 不行
哎呀,你说得对。我忘记了我稍微调整了布局。
顺便说一句,我只想说声谢谢。我之前看过你的一个屏幕录制,你重做了朋友的网站,我想是一个喇叭手,这让我开始使用 WP(在那之前是 CI)。我成为你网站的常客,购买了你的书籍,在 lynda.com 上观看你的视频无数次,现在当初的兼职工作(我更多的是为了乐趣而做),正在严重地威胁要变成全职工作。我现在有四个网站正在进行中!
基于纯 CSS 的这种样式真的很棒。
现在,我遇到很多关于 IE 的案例(IE 真的太糟糕了,恕我直言)。这没什么大不了的,哈哈
Dude!这些真不错…
太棒了!
旁注:使用绝对定位时,display:block 是不必要的。元素不再是页面流的一部分。
可能有助于节省几行 css 代码;)
做得好,伙计,我有一个问题,代码“。
nav a:before {
position: absolute;
top: -18px;
left: -18px;
bottom: -18px;
right: -18px;
}
似乎四个定位参数都创建了宽度和高度,这两个参数都是通过 a 元素加上 nav a:before 伪元素的边距计算出来的。
评论永久链接#
我有一个关于这个示例代码的问题
.icon-home:after { content: “\2302”; }
.icon-cog:after { content: “\2699”; }
.icon-cw:after { content: “\d7c60”; }
.icon-location:after { content: “\e724”; }
我理解如何使用特定的 “{ content: “\2302″; }” (如上)生成图标。例如,这将是按钮本身的图标。
如何替换来自http://www.fontello.com的图标?下载后他们会提供数字内容 ID #,还是如何运作?