<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>前端思考：专注前端开发，关注用户体验 &#187; css按钮</title>
	<atom:link href="http://www.artcss.com/archives/tag/css%e6%8c%89%e9%92%ae/feed" rel="self" type="application/rss+xml" />
	<link>http://www.artcss.com</link>
	<description>一个像素的距离...</description>
	<lastBuildDate>Sat, 12 Feb 2011 03:34:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>如何制作一个漂亮的 CSS 按钮</title>
		<link>http://www.artcss.com/archives/140.html</link>
		<comments>http://www.artcss.com/archives/140.html#comments</comments>
		<pubDate>Mon, 20 Jul 2009 06:48:30 +0000</pubDate>
		<dc:creator>Artcss</dc:creator>
				<category><![CDATA[Xhtml+css]]></category>
		<category><![CDATA[css按钮]]></category>

		<guid isPermaLink="false">http://www.artskin.cn/blog/?p=140</guid>
		<description><![CDATA[如今 Web Application 横行，在 Web 2.0 网站的各种设计元素中，按钮是无法或缺的。如何用最简洁的方法制作最漂亮的按钮就成为了一个问题。本文讲述的方法，代码上简洁，符合 XHTML 标准，不需要 Javascript，只需要纯 CSS 即可完成，而且通用性很好，使用起来也很方便。上图即为最终成品的例子，您也可以通过演示页面体验一下。下面我将详述整个制作过程，相信通过这个教程您肯定可以学会。 第一步：准备图片 对于一个好的 UI，一个很重要的方面就是要能及时的与用户发生交互。对于按钮来说，我们需要让按钮相应各种鼠标事件，让用户知道它是可以按下的。如上图，我们要制作的按钮共有三种状态：正常状态、鼠标划过、鼠标按下。通常情况下，我们会想到利用 onclick、onmouseover 这样的事件来控制，而事实上，我们完全可以利用通用性、便捷性更好的 CSS 代替 Javascript 来完成这个过程。尽可能将表现的事情交给 CSS 来做，这也是良好设计的原则之一。 为了能够实现这种效果，我们需要准备三个状态的图片。利用 CSS 的 background-position 属性，我们完全可以将三种状态的图片放在一张图片中，这样可以获得更好的缓存效果。 此外，按钮两侧的圆角也是比较烦人的问题。因为我们要制作的按钮需要能够自动适应内部文字的长度，因此我们需要应用一种叫做“拉门技术 (Sliding door technique)”的 CSS 技巧。具体原理不讲了，这里只介绍具体做法： 我们使用超链接来生成按钮，为了使用 Sliding door technique，我们需要按照如下方式书写 HTML 代码： [coolcode lang="javascript" linenum="on" download="button.html"] Button Text [/coolcode] 随后，我们需要准备两张图片，作为按钮的背景（分别为 span 标签和 a 标签的），具体示意图如下： 这里需要指出，280px 并不是绝对的，它代表了这个按钮在您的应用中可能用到的最大值。此外，所有的值都可以根据您实际的背景图做出更改。 第二步：书写 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.artskin.cn/blog/wp-content/uploads/2009/07/2007-5-9.jpg"><img src="http://www.artskin.cn/blog/wp-content/uploads/2009/07/2007-5-9.jpg" alt="2007-5-9" title="2007-5-9" width="356" height="117" class="alignnone size-full wp-image-143" /></a></p>
<p>如今 Web Application 横行，在 Web 2.0 网站的各种设计元素中，按钮是无法或缺的。如何用最简洁的<span id="more-140"></span>方法制作最漂亮的按钮就成为了一个问题。本文讲述的方法，代码上简洁，符合 XHTML 标准，不需要 Javascript，只需要纯 CSS 即可完成，而且通用性很好，使用起来也很方便。上图即为最终成品的例子，您也可以通过<a href="http://blog.istef.info/demo/cssbutton">演示页面</a>体验一下。下面我将详述整个制作过程，相信通过这个教程您肯定可以学会。</p>
<h4>第一步：准备图片</h4>
<p><a href="http://www.artskin.cn/blog/wp-content/uploads/2009/07/2007-5-9-11.jpg"><img src="http://www.artskin.cn/blog/wp-content/uploads/2009/07/2007-5-9-11.jpg" alt="2007-5-9-1" title="2007-5-9-1" width="433" height="95" class="alignnone size-full wp-image-142" /></a></p>
<p>对于一个好的 UI，一个很重要的方面就是要能及时的与用户发生交互。对于按钮来说，我们需要让按钮相应各种鼠标事件，让用户知道<strong>它是可以按下的</strong>。如上图，我们要制作的按钮共有三种状态：<strong>正常状态</strong>、<strong>鼠标划过</strong>、<strong>鼠标按下</strong>。通常情况下，我们会想到利用 onclick、onmouseover 这样的事件来控制，而事实上，我们完全可以利用通用性、便捷性更好的 CSS 代替 Javascript 来完成这个过程。尽可能将表现的事情交给 CSS 来做，这也是良好设计的原则之一。</p>
<p>为了能够实现这种效果，我们需要准备三个状态的图片。利用 CSS 的 background-position 属性，我们完全可以将三种状态的图片放在一张图片中，这样可以获得更好的缓存效果。</p>
<p>此外，按钮两侧的圆角也是比较烦人的问题。因为我们要制作的按钮需要<strong>能够自动适应内部文字的长度</strong>，因此我们需要应用一种叫做“<a href="http://alistapart.com/articles/slidingdoors/">拉门技术 (Sliding door technique)</a>”的 CSS 技巧。具体原理不讲了，这里只介绍具体做法：</p>
<p>我们使用超链接来生成按钮，为了使用 Sliding door technique，我们需要按照如下方式书写 HTML 代码：</p>
<p>[coolcode lang="javascript" linenum="on" download="button.html"]<br />
 <a class="button" href="http://some_where"><span>Button Text</span></a><br />
[/coolcode]</p>
<p>随后，我们需要准备两张图片，作为按钮的背景（分别为 span 标签和 a 标签的），具体示意图如下：</p>
<p>这里需要指出，280px 并不是绝对的，它代表了这个按钮在您的应用中可能用到的最大值。此外，所有的值都可以根据您实际的背景图做出更改。</p>
<h4>第二步：书写 CSS 代码</h4>
<p>为了能够让 A 标签准确的显示我们需要的效果，我们需要设定其 display 属性为 block，但是，很多情况下，我们需要在同一行中显示多个按钮，我们可以通过设定 float:left 或 float:right 来达到。提醒一下，这样设定後，当您放置完按钮后不要忘记 clear 一下 :)。</p>
<p>首先看看显示基本布局的代码，本例中，两侧圆角部分为 10px，按钮高度为 24px，保留区域为 1px：</p>
<p>[coolcode lang="javascript" linenum="on" download="style.css"]<br />
a.button{<br />
     background:transparent url(a.gif) no-repeat scroll right top;<br />
     color: White;<br />
     display: block;<br />
     float: left;<br />
     height: 24px;<br />
     padding-right: 10px;<br />
     font: normal 12px sans-serif;<br />
     margin-right: 10px;<br />
     text-decoration: none;<br />
    }<br />
    a.button span {<br />
     background: transparent url(span.gif) no-repeat;<br />
     display: block;<br />
     padding: 5px 1px 5px 11px;<br />
     line-height: 14px;<br />
    }<br />
[/coolcode]</p>
<p>这里需要指出的是：1. 保留区 (1px) 是包含在 SPAN 中的，具体可以注意看 padding 的设置；2. SPAN  的 <em>line-height</em> + <em>padding-top</em> + <em>padding-bottom</em>  = A 的 <em>height</em>。</p>
<p>经过这样设定后，我们的按钮的基本样式就完成了，但它还没有交互效果，我们通过设定 a:hover 和 a:active 来实现：</p>
<p>[coolcode lang="javascript" linenum="on" download="style2.css"]<br />
a.button:hover {<br />
     background-position: right -24px;<br />
    }<br />
    a.button:hover span {<br />
      background-position: left -24px;<br />
     }<br />
     a.button:active {<br />
      background-position: right -48px;<br />
    }<br />
    a.button:active span {<br />
      background-position: left -48px;<br />
      padding: 6px 0 4px 12px;<br />
    }<br />
[/coolcode]</p>
<p>我们看到，主要是应用了 background-position 属性调整背景图片的位置，这比使用多张图片效果更好。在 <em>a.button:active span</em> 中，我们重新设定了 padding 的值，使字符向右下方移动 1px，按下的效果更明显，这也是之前提到的保留区的作用。</p>
<h4>第三部：最后完善</h4>
<p>其实做完上面两部，我们的按钮基本上已经完工了。但是在各种浏览器中都有一个讨厌的问题，就是当超链接被点击后，会留下一个讨厌的虚线框。这个破坏美观的东西，我们当然要干掉它。</p>
<p>Firefox、Safari 等支持 W3C CSS2 的浏览器，可以通过设定 CSS 的 outline 属性来做到这一点。在我们这个例子中，只需做如下改动：</p>
<p>[coolcode lang="javascript" linenum="on" download="style3.css"]<br />
a.button:active {<br />
      background-position: right -48px;<br />
      outline: none;<br />
     }<br />
[/coolcode]</p>
<p>在 Firefox 中看看，虚框已经消失了。</p>
<p>但 Internet Explore 不吃这一套，对付它就比较麻烦了，单单 CSS 无法解决问题，需要从 HTML 下手。我们需要将按钮的 HTML 代码改为以下形式：</p>
<p>[coolcode lang="javascript" linenum="on" download="button2.html"]<br />
<a class="button" href="http://some_where" onclick="this.blur();"><span>Button Text</span></a><br />
[/coolcode]</p>
<p>这样，我们可以让超链接在点击后迅速失去焦点，从而避免虚框的出现。当然，如果我们应用中按钮比较少，这个方法还不错。但按钮比较多的情况下，我们还是应该用 DOM 方法来为 className 为 button 的 A 修改 onclick 事件（用 jQuery 或 Prototype 实现会很省心），不过这不在本文讨论的范围内了。</p>
<p>到这里，我们的按钮就算做好了，我相信您一定已经学会了。如果还有什么不明白的地方，您可以参考这个简单的范例，查看它的源代码来解决。当然，您也可以直接在本文後提问，我很乐意为您解答。</p>
<p>UPDATE:谢谢 Dan Li 发来邮件提醒，我确实发现本文与这篇文章如出一辙。早看到直接转过来就好了，白白折腾了两个小时。不知道留言中 DV 大侠所指的是不是这篇。不过我在写本文时并没有看过这篇文章，而且本文与原文还是有很大不同，而且原文中 CSS 有误 (background-position 的参数顺序不对)，虽然可以实现它所叙述的效果，但不符合 CSS 标准，也不能够进一步扩展，希望看了原文的朋友能够注意。</p>
<p>如需在 CC-BY-NC 协议下引用，请保留以下链接，商业网站引用请与我联系，谢谢合作。<br />http://blog.istef.info/2007/05/09/how-to-make-a-sexy-css-button</p>
]]></content:encoded>
			<wfw:commentRss>http://www.artcss.com/archives/140.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

